From 0ceb38e7a3759d1387035e2c62e763acd7cba113 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?MC=7E=E8=9B=9F=E9=BE=99?= <1610105206@qq.com> Date: Wed, 10 Jul 2024 20:22:34 +0800 Subject: [PATCH] Install Plugin & module-configuartion from Taboolib --- gradle.properties | 2 +- plugin/build.gradle.kts | 2 + plugin/platform-bukkit/build.gradle.kts | 5 + .../src/main/java/fr/xephi/authme/AuthMe.java | 474 +++++++++++++ .../java/fr/xephi/authme/ConsoleLogger.java | 287 ++++++++ .../fr/xephi/authme/api/v3/AuthMeApi.java | 397 +++++++++++ .../fr/xephi/authme/api/v3/AuthMePlayer.java | 65 ++ .../xephi/authme/api/v3/AuthMePlayerImpl.java | 93 +++ .../command/CommandArgumentDescription.java | 61 ++ .../authme/command/CommandDescription.java | 294 ++++++++ .../xephi/authme/command/CommandHandler.java | 186 +++++ .../authme/command/CommandInitializer.java | 652 ++++++++++++++++++ .../xephi/authme/command/CommandMapper.java | 207 ++++++ .../fr/xephi/authme/command/CommandUtils.java | 109 +++ .../authme/command/ExecutableCommand.java | 31 + .../authme/command/FoundCommandResult.java | 79 +++ .../authme/command/FoundResultStatus.java | 18 + .../xephi/authme/command/PlayerCommand.java | 45 ++ .../authme/command/TabCompleteHandler.java | 17 + .../command/executable/HelpCommand.java | 64 ++ .../executable/authme/AccountsCommand.java | 74 ++ .../executable/authme/AuthMeCommand.java | 24 + .../executable/authme/BackupCommand.java | 23 + .../authme/ChangePasswordAdminCommand.java | 41 ++ .../executable/authme/ConverterCommand.java | 95 +++ .../executable/authme/FirstSpawnCommand.java | 35 + .../executable/authme/ForceLoginCommand.java | 44 ++ .../executable/authme/GetEmailCommand.java | 35 + .../executable/authme/GetIpCommand.java | 41 ++ .../executable/authme/LastLoginCommand.java | 56 ++ .../authme/PurgeBannedPlayersCommand.java | 38 + .../executable/authme/PurgeCommand.java | 51 ++ .../authme/PurgeLastPositionCommand.java | 56 ++ .../executable/authme/PurgePlayerCommand.java | 47 ++ .../authme/RecentPlayersCommand.java | 55 ++ .../authme/RegisterAdminCommand.java | 86 +++ .../executable/authme/ReloadCommand.java | 77 +++ .../executable/authme/SetEmailCommand.java | 75 ++ .../authme/SetFirstSpawnCommand.java | 23 + .../executable/authme/SetSpawnCommand.java | 23 + .../executable/authme/SpawnCommand.java | 27 + .../authme/SwitchAntiBotCommand.java | 52 ++ .../authme/TotpDisableAdminCommand.java | 61 ++ .../authme/TotpViewStatusCommand.java | 38 + .../authme/UnregisterAdminCommand.java | 49 ++ .../authme/UpdateHelpMessagesCommand.java | 39 ++ .../executable/authme/VersionCommand.java | 99 +++ .../authme/debug/CountryLookup.java | 88 +++ .../authme/debug/DataStatistics.java | 81 +++ .../executable/authme/debug/DebugCommand.java | 85 +++ .../executable/authme/debug/DebugSection.java | 36 + .../authme/debug/DebugSectionUtils.java | 130 ++++ .../authme/debug/HasPermissionChecker.java | 138 ++++ .../authme/debug/InputValidator.java | 124 ++++ .../authme/debug/LimboPlayerViewer.java | 143 ++++ .../authme/debug/MySqlDefaultChanger.java | 327 +++++++++ .../authme/debug/PermissionGroups.java | 56 ++ .../authme/debug/PlayerAuthViewer.java | 117 ++++ .../authme/debug/SpawnLocationViewer.java | 87 +++ .../authme/debug/TestEmailSender.java | 125 ++++ .../executable/captcha/CaptchaCommand.java | 86 +++ .../changepassword/ChangePasswordCommand.java | 74 ++ .../executable/email/AddEmailCommand.java | 40 ++ .../executable/email/ChangeEmailCommand.java | 46 ++ .../executable/email/EmailBaseCommand.java | 29 + .../email/EmailSetPasswordCommand.java | 61 ++ .../executable/email/ProcessCodeCommand.java | 46 ++ .../executable/email/RecoverEmailCommand.java | 91 +++ .../executable/email/ShowEmailCommand.java | 48 ++ .../executable/login/LoginCommand.java | 34 + .../executable/logout/LogoutCommand.java | 22 + .../executable/register/RegisterCommand.java | 222 ++++++ .../executable/totp/AddTotpCommand.java | 43 ++ .../executable/totp/ConfirmTotpCommand.java | 74 ++ .../executable/totp/RemoveTotpCommand.java | 62 ++ .../executable/totp/TotpBaseCommand.java | 29 + .../executable/totp/TotpCodeCommand.java | 79 +++ .../unregister/UnregisterCommand.java | 62 ++ .../verification/VerificationCommand.java | 61 ++ .../authme/command/help/HelpMessage.java | 43 ++ .../command/help/HelpMessagesService.java | 117 ++++ .../authme/command/help/HelpProvider.java | 328 +++++++++ .../authme/command/help/HelpSection.java | 44 ++ .../authme/data/ProxySessionManager.java | 49 ++ .../data/QuickCommandsProtectionManager.java | 75 ++ .../fr/xephi/authme/data/TempbanManager.java | 138 ++++ .../authme/data/VerificationCodeManager.java | 194 ++++++ .../fr/xephi/authme/data/auth/PlayerAuth.java | 373 ++++++++++ .../xephi/authme/data/auth/PlayerCache.java | 74 ++ .../data/captcha/CaptchaCodeStorage.java | 94 +++ .../authme/data/captcha/CaptchaManager.java | 38 + .../data/captcha/LoginCaptchaManager.java | 95 +++ .../captcha/RegistrationCaptchaManager.java | 66 ++ .../data/limbo/AllowFlightRestoreType.java | 66 ++ .../authme/data/limbo/AuthGroupHandler.java | 114 +++ .../authme/data/limbo/AuthGroupType.java | 17 + .../authme/data/limbo/LimboMessageType.java | 11 + .../xephi/authme/data/limbo/LimboPlayer.java | 138 ++++ .../authme/data/limbo/LimboPlayerState.java | 9 + .../data/limbo/LimboPlayerTaskManager.java | 117 ++++ .../xephi/authme/data/limbo/LimboService.java | 188 +++++ .../authme/data/limbo/LimboServiceHelper.java | 115 +++ .../fr/xephi/authme/data/limbo/UserGroup.java | 45 ++ .../data/limbo/WalkFlySpeedRestoreType.java | 123 ++++ .../DistributedFilesPersistenceHandler.java | 228 ++++++ .../IndividualFilesPersistenceHandler.java | 92 +++ .../limbo/persistence/LimboPersistence.java | 82 +++ .../persistence/LimboPersistenceHandler.java | 39 ++ .../persistence/LimboPersistenceType.java | 34 + .../persistence/LimboPlayerDeserializer.java | 163 +++++ .../persistence/LimboPlayerSerializer.java | 71 ++ .../persistence/NoOpPersistenceHandler.java | 30 + .../limbo/persistence/SegmentNameBuilder.java | 73 ++ .../data/limbo/persistence/SegmentSize.java | 94 +++ .../datasource/AbstractSqlDataSource.java | 172 +++++ .../authme/datasource/CacheDataSource.java | 323 +++++++++ .../fr/xephi/authme/datasource/Columns.java | 59 ++ .../xephi/authme/datasource/DataSource.java | 286 ++++++++ .../authme/datasource/DataSourceType.java | 17 + .../java/fr/xephi/authme/datasource/H2.java | 422 ++++++++++++ .../fr/xephi/authme/datasource/MariaDB.java | 27 + .../fr/xephi/authme/datasource/MySQL.java | 524 ++++++++++++++ .../authme/datasource/MySqlMigrater.java | 116 ++++ .../datasource/PostgreSqlDataSource.java | 472 +++++++++++++ .../fr/xephi/authme/datasource/SQLite.java | 423 ++++++++++++ .../authme/datasource/SqLiteMigrater.java | 147 ++++ .../authme/datasource/SqlDataSourceUtils.java | 109 +++ .../columnshandler/AuthMeColumns.java | 86 +++ .../columnshandler/AuthMeColumnsFactory.java | 83 +++ .../columnshandler/AuthMeColumnsHandler.java | 227 ++++++ .../columnshandler/ColumnContext.java | 35 + .../columnshandler/DataSourceColumn.java | 57 ++ .../columnshandler/PlayerAuthColumn.java | 32 + .../AbstractDataSourceConverter.java | 85 +++ .../datasource/converter/Converter.java | 16 + .../converter/CrazyLoginConverter.java | 82 +++ .../datasource/converter/H2ToSqlite.java | 33 + .../converter/LoginSecurityConverter.java | 210 ++++++ .../datasource/converter/MySqlToSqlite.java | 31 + .../converter/RoyalAuthConverter.java | 61 ++ .../datasource/converter/SqliteToH2.java | 33 + .../datasource/converter/SqliteToSql.java | 32 + .../datasource/converter/XAuthConverter.java | 149 ++++ .../mysqlextensions/Ipb4Extension.java | 55 ++ .../mysqlextensions/MySqlExtension.java | 96 +++ .../MySqlExtensionsFactory.java | 39 ++ .../mysqlextensions/NoOpExtension.java | 14 + .../mysqlextensions/PhpBbExtension.java | 83 +++ .../mysqlextensions/WordpressExtension.java | 84 +++ .../mysqlextensions/XfBcryptExtension.java | 148 ++++ .../authme/events/AbstractTeleportEvent.java | 78 +++ .../events/AbstractUnregisterEvent.java | 33 + .../events/AuthMeAsyncPreLoginEvent.java | 70 ++ .../events/AuthMeAsyncPreRegisterEvent.java | 70 ++ .../authme/events/AuthMeTeleportEvent.java | 39 ++ .../fr/xephi/authme/events/CustomEvent.java | 27 + .../authme/events/EmailChangedEvent.java | 85 +++ .../xephi/authme/events/FailedLoginEvent.java | 46 ++ .../events/FirstSpawnTeleportEvent.java | 40 ++ .../fr/xephi/authme/events/LoginEvent.java | 58 ++ .../fr/xephi/authme/events/LogoutEvent.java | 49 ++ .../events/PasswordEncryptionEvent.java | 57 ++ .../authme/events/ProtectInventoryEvent.java | 85 +++ .../fr/xephi/authme/events/RegisterEvent.java | 47 ++ .../authme/events/RestoreInventoryEvent.java | 60 ++ .../authme/events/RestoreSessionEvent.java | 51 ++ .../authme/events/SpawnTeleportEvent.java | 51 ++ .../authme/events/UnregisterByAdminEvent.java | 67 ++ .../events/UnregisterByPlayerEvent.java | 36 + .../authme/initialization/DataFolder.java | 14 + .../initialization/DataSourceProvider.java | 115 +++ .../authme/initialization/HasCleanup.java | 16 + .../initialization/OnShutdownPlayerSaver.java | 75 ++ .../authme/initialization/OnStartupTasks.java | 114 +++ .../authme/initialization/Reloadable.java | 15 + .../initialization/SettingsDependent.java | 18 + .../initialization/SettingsProvider.java | 45 ++ .../authme/initialization/TaskCloser.java | 33 + .../listener/AdvancedShulkerFixListener.java | 20 + .../listener/BedrockAutoLoginListener.java | 54 ++ .../xephi/authme/listener/BlockListener.java | 28 + .../listener/DoubleLoginFixListener.java | 35 + .../xephi/authme/listener/EntityListener.java | 99 +++ .../listener/FailedVerificationException.java | 32 + .../authme/listener/ListenerService.java | 104 +++ .../listener/LoginLocationFixListener.java | 118 ++++ .../xephi/authme/listener/OnJoinVerifier.java | 223 ++++++ .../xephi/authme/listener/PlayerListener.java | 567 +++++++++++++++ .../authme/listener/PlayerListener111.java | 24 + .../authme/listener/PlayerListener19.java | 24 + .../listener/PlayerListener19Spigot.java | 36 + .../listener/PlayerListenerHigherThan18.java | 37 + .../xephi/authme/listener/PurgeListener.java | 89 +++ .../xephi/authme/listener/ServerListener.java | 79 +++ .../I18NGetLocalePacketAdapter.java | 36 + .../protocollib/InventoryPacketAdapter.java | 118 ++++ .../protocollib/ProtocolLibService.java | 159 +++++ .../protocollib/TabCompletePacketAdapter.java | 44 ++ .../fr/xephi/authme/mail/EmailService.java | 223 ++++++ .../fr/xephi/authme/mail/ImageGenerator.java | 40 ++ .../fr/xephi/authme/mail/OAuth2Provider.java | 28 + .../xephi/authme/mail/OAuth2SaslClient.java | 98 +++ .../authme/mail/OAuth2SaslClientFactory.java | 57 ++ .../fr/xephi/authme/mail/SendMailSsl.java | 158 +++++ .../message/AbstractMessageFileHandler.java | 170 +++++ .../message/HelpMessagesFileHandler.java | 67 ++ .../fr/xephi/authme/message/MessageKey.java | 399 +++++++++++ .../authme/message/MessagePathHelper.java | 77 +++ .../fr/xephi/authme/message/Messages.java | 201 ++++++ .../authme/message/MessagesFileHandler.java | 48 ++ .../message/updater/JarMessageSource.java | 59 ++ .../updater/MessageKeyConfigurationData.java | 53 ++ .../MessageMigraterPropertyReader.java | 126 ++++ .../message/updater/MessageUpdater.java | 202 ++++++ .../updater/MigraterYamlFileResource.java | 47 ++ .../updater/OldMessageKeysMigrater.java | 170 +++++ .../fr/xephi/authme/output/ConsoleFilter.java | 26 + .../authme/output/ConsoleLoggerFactory.java | 55 ++ .../fr/xephi/authme/output/Log4JFilter.java | 75 ++ .../xephi/authme/output/LogFilterHelper.java | 51 ++ .../java/fr/xephi/authme/output/LogLevel.java | 38 + .../authme/permission/AdminPermission.java | 166 +++++ .../permission/DebugSectionPermissions.java | 61 ++ .../authme/permission/DefaultPermission.java | 42 ++ .../authme/permission/PermissionNode.java | 21 + .../authme/permission/PermissionsManager.java | 466 +++++++++++++ .../permission/PermissionsSystemType.java | 91 +++ .../authme/permission/PlayerPermission.java | 112 +++ .../permission/PlayerStatePermission.java | 79 +++ .../permission/handlers/LuckPermGroup.java | 23 + .../permission/handlers/LuckPermsHandler.java | 227 ++++++ .../handlers/PermissionHandler.java | 114 +++ .../handlers/PermissionHandlerException.java | 16 + .../handlers/PermissionLoadUserException.java | 13 + .../handlers/PermissionsExHandler.java | 90 +++ .../permission/handlers/VaultHandler.java | 105 +++ .../handlers/ZPermissionsHandler.java | 79 +++ .../authme/process/AsynchronousProcess.java | 10 + .../fr/xephi/authme/process/Management.java | 107 +++ .../authme/process/SyncProcessManager.java | 62 ++ .../authme/process/SynchronousProcess.java | 10 + .../changepassword/AsyncChangePassword.java | 102 +++ .../authme/process/email/AsyncAddEmail.java | 95 +++ .../process/email/AsyncChangeEmail.java | 107 +++ .../authme/process/join/AsynchronousJoin.java | 246 +++++++ .../process/login/AsynchronousLogin.java | 395 +++++++++++ .../process/login/ProcessSyncPlayerLogin.java | 132 ++++ .../process/logout/AsynchronousLogout.java | 81 +++ .../logout/ProcessSyncPlayerLogout.java | 83 +++ .../authme/process/quit/AsynchronousQuit.java | 113 +++ .../process/quit/ProcessSyncPlayerQuit.java | 37 + .../process/register/AsyncRegister.java | 131 ++++ .../register/ProcessSyncEmailRegister.java | 52 ++ .../register/ProcessSyncPasswordRegister.java | 96 +++ .../register/RegisterSecondaryArgument.java | 20 + .../process/register/RegistrationType.java | 19 + .../AbstractPasswordRegisterExecutor.java | 99 +++ .../AbstractPasswordRegisterParams.java | 48 ++ .../ApiPasswordRegisterExecutor.java | 20 + .../executors/ApiPasswordRegisterParams.java | 35 + .../executors/EmailRegisterExecutor.java | 81 +++ .../executors/EmailRegisterParams.java | 43 ++ .../executors/PasswordRegisterExecutor.java | 17 + .../executors/PasswordRegisterParams.java | 32 + .../executors/PlayerAuthBuilderHelper.java | 37 + .../executors/RegistrationExecutor.java | 39 ++ .../executors/RegistrationMethod.java | 53 ++ .../executors/RegistrationParameters.java | 28 + .../executors/TwoFactorRegisterExecutor.java | 43 ++ .../executors/TwoFactorRegisterParams.java | 23 + .../unregister/AsynchronousUnregister.java | 155 +++++ .../xephi/authme/security/HashAlgorithm.java | 60 ++ .../fr/xephi/authme/security/HashUtils.java | 121 ++++ .../security/MessageDigestAlgorithm.java | 30 + .../authme/security/PasswordSecurity.java | 164 +++++ .../xephi/authme/security/crypts/Argon2.java | 51 ++ .../xephi/authme/security/crypts/BCrypt.java | 23 + .../authme/security/crypts/BCrypt2y.java | 20 + .../security/crypts/BCryptBasedHash.java | 48 ++ .../authme/security/crypts/BCryptHasher.java | 78 +++ .../authme/security/crypts/CmwCrypt.java | 14 + .../authme/security/crypts/CrazyCrypt1.java | 31 + .../authme/security/crypts/DoubleMd5.java | 17 + .../security/crypts/EncryptionMethod.java | 61 ++ .../security/crypts/HashedPassword.java | 48 ++ .../security/crypts/HexSaltedMethod.java | 40 ++ .../fr/xephi/authme/security/crypts/Ipb3.java | 25 + .../fr/xephi/authme/security/crypts/Ipb4.java | 67 ++ .../xephi/authme/security/crypts/Joomla.java | 29 + .../fr/xephi/authme/security/crypts/Md5.java | 16 + .../xephi/authme/security/crypts/Md5vB.java | 25 + .../fr/xephi/authme/security/crypts/MyBB.java | 26 + .../xephi/authme/security/crypts/NoCrypt.java | 15 + .../xephi/authme/security/crypts/Pbkdf2.java | 62 ++ .../authme/security/crypts/Pbkdf2Django.java | 51 ++ .../xephi/authme/security/crypts/PhpBB.java | 162 +++++ .../authme/security/crypts/PhpFusion.java | 48 ++ .../authme/security/crypts/RoyalAuth.java | 19 + .../authme/security/crypts/Salted2Md5.java | 37 + .../authme/security/crypts/SaltedSha512.java | 20 + .../security/crypts/SeparateSaltMethod.java | 32 + .../fr/xephi/authme/security/crypts/Sha1.java | 16 + .../xephi/authme/security/crypts/Sha256.java | 29 + .../xephi/authme/security/crypts/Sha512.java | 16 + .../fr/xephi/authme/security/crypts/Smf.java | 51 ++ .../authme/security/crypts/TwoFactor.java | 140 ++++ .../security/crypts/UnsaltedMethod.java | 43 ++ .../security/crypts/UsernameSaltMethod.java | 41 ++ .../fr/xephi/authme/security/crypts/Wbb3.java | 25 + .../fr/xephi/authme/security/crypts/Wbb4.java | 74 ++ .../authme/security/crypts/Whirlpool.java | 399 +++++++++++ .../authme/security/crypts/Wordpress.java | 123 ++++ .../xephi/authme/security/crypts/XAuth.java | 45 ++ .../authme/security/crypts/XfBCrypt.java | 35 + .../crypts/description/AsciiRestricted.java | 15 + .../security/crypts/description/HasSalt.java | 30 + .../crypts/description/Recommendation.java | 24 + .../security/crypts/description/SaltType.java | 17 + .../security/crypts/description/Usage.java | 29 + .../security/totp/GenerateTotpService.java | 70 ++ .../security/totp/TotpAuthenticator.java | 98 +++ .../xephi/authme/service/AntiBotService.java | 199 ++++++ .../xephi/authme/service/BackupService.java | 219 ++++++ .../xephi/authme/service/BukkitService.java | 440 ++++++++++++ .../xephi/authme/service/CommonService.java | 84 +++ .../fr/xephi/authme/service/GeoIpService.java | 188 +++++ .../service/HelpTranslationGenerator.java | 126 ++++ .../authme/service/JoinMessageService.java | 45 ++ .../authme/service/MigrationService.java | 54 ++ .../service/PasswordRecoveryService.java | 187 +++++ .../authme/service/PluginHookService.java | 197 ++++++ .../authme/service/RecoveryCodeService.java | 111 +++ .../xephi/authme/service/SessionService.java | 105 +++ .../fr/xephi/authme/service/SessionState.java | 13 + .../authme/service/TeleportationService.java | 200 ++++++ .../authme/service/ValidationService.java | 339 +++++++++ .../service/bungeecord/BungeeReceiver.java | 160 +++++ .../service/bungeecord/BungeeSender.java | 113 +++ .../service/bungeecord/MessageType.java | 42 ++ .../authme/service/velocity/VMessageType.java | 5 + .../service/velocity/VelocityReceiver.java | 89 +++ .../service/velocity/VelocitySender.java | 76 ++ .../yaml/YamlFileResourceProvider.java | 47 ++ .../service/yaml/YamlParseException.java | 28 + .../authme/settings/EnumSetProperty.java | 56 ++ .../fr/xephi/authme/settings/Settings.java | 113 +++ .../settings/SettingsMigrationService.java | 400 +++++++++++ .../xephi/authme/settings/SettingsWarner.java | 90 +++ .../fr/xephi/authme/settings/SpawnLoader.java | 378 ++++++++++ .../settings/commandconfig/Command.java | 67 ++ .../settings/commandconfig/CommandConfig.java | 76 ++ .../commandconfig/CommandManager.java | 192 ++++++ .../CommandMigrationService.java | 66 ++ .../commandconfig/CommandSettingsHolder.java | 77 +++ .../settings/commandconfig/Executor.java | 14 + .../commandconfig/OnLoginCommand.java | 49 ++ .../properties/AuthMeSettingsRetriever.java | 28 + .../settings/properties/BackupSettings.java | 29 + .../properties/ConverterSettings.java | 43 ++ .../settings/properties/DatabaseSettings.java | 172 +++++ .../settings/properties/EmailSettings.java | 76 ++ .../settings/properties/HooksSettings.java | 101 +++ .../settings/properties/LimboSettings.java | 83 +++ .../settings/properties/PluginSettings.java | 122 ++++ .../properties/ProtectionSettings.java | 66 ++ .../settings/properties/PurgeSettings.java | 46 ++ .../properties/RegistrationSettings.java | 108 +++ .../properties/RestrictionSettings.java | 217 ++++++ .../settings/properties/SecuritySettings.java | 203 ++++++ .../fr/xephi/authme/task/CleanupTask.java | 25 + .../fr/xephi/authme/task/MessageTask.java | 34 + .../fr/xephi/authme/task/TimeoutTask.java | 34 + .../java/fr/xephi/authme/task/Updater.java | 67 ++ .../authme/task/purge/PurgeExecutor.java | 227 ++++++ .../xephi/authme/task/purge/PurgeService.java | 123 ++++ .../fr/xephi/authme/task/purge/PurgeTask.java | 130 ++++ .../authme/util/AtomicIntervalCounter.java | 53 ++ .../fr/xephi/authme/util/ExceptionUtils.java | 46 ++ .../java/fr/xephi/authme/util/FileUtils.java | 173 +++++ .../authme/util/InternetProtocolUtils.java | 72 ++ .../fr/xephi/authme/util/PlayerUtils.java | 39 ++ .../xephi/authme/util/RandomStringUtils.java | 75 ++ .../fr/xephi/authme/util/StringUtils.java | 80 +++ .../fr/xephi/authme/util/TeleportUtils.java | 44 ++ .../main/java/fr/xephi/authme/util/Utils.java | 119 ++++ .../java/fr/xephi/authme/util/UuidUtils.java | 27 + .../xephi/authme/util/expiring/Duration.java | 72 ++ .../authme/util/expiring/ExpiringMap.java | 138 ++++ .../authme/util/expiring/ExpiringSet.java | 125 ++++ .../authme/util/expiring/TimedCounter.java | 70 ++ .../authme/util/lazytags/DependentTag.java | 35 + .../xephi/authme/util/lazytags/SimpleTag.java | 29 + .../fr/xephi/authme/util/lazytags/Tag.java | 22 + .../authme/util/lazytags/TagBuilder.java | 21 + .../authme/util/lazytags/TagReplacer.java | 102 +++ .../util/lazytags/WrappedTagReplacer.java | 61 ++ .../xephi/authme/util/message/I18NUtils.java | 102 +++ .../authme/util/message/MiniMessageUtils.java | 22 + .../src/main/resources/GeoLite2-Country.mmdb | Bin 0 -> 6452215 bytes .../src/main/resources/commands.yml | 55 ++ .../src/main/resources/email.html | 121 ++++ .../src/main/resources/messages/help_bg.yml | 335 +++++++++ .../src/main/resources/messages/help_br.yml | 46 ++ .../src/main/resources/messages/help_cz.yml | 45 ++ .../src/main/resources/messages/help_de.yml | 29 + .../src/main/resources/messages/help_en.yml | 45 ++ .../src/main/resources/messages/help_eo.yml | 31 + .../src/main/resources/messages/help_es.yml | 294 ++++++++ .../src/main/resources/messages/help_et.yml | 45 ++ .../src/main/resources/messages/help_eu.yml | 23 + .../src/main/resources/messages/help_fr.yml | 45 ++ .../src/main/resources/messages/help_hu.yml | 351 ++++++++++ .../src/main/resources/messages/help_it.yml | 151 ++++ .../src/main/resources/messages/help_ja.yml | 45 ++ .../src/main/resources/messages/help_ko.yml | 45 ++ .../src/main/resources/messages/help_lt.yml | 45 ++ .../src/main/resources/messages/help_nl.yml | 45 ++ .../src/main/resources/messages/help_pl.yml | 45 ++ .../src/main/resources/messages/help_pt.yml | 45 ++ .../src/main/resources/messages/help_ro.yml | 45 ++ .../src/main/resources/messages/help_ru.yml | 153 ++++ .../src/main/resources/messages/help_si.yml | 45 ++ .../src/main/resources/messages/help_sr.yml | 45 ++ .../src/main/resources/messages/help_vn.yml | 45 ++ .../src/main/resources/messages/help_zhcn.yml | 204 ++++++ .../src/main/resources/messages/help_zhhk.yml | 45 ++ .../src/main/resources/messages/help_zhtw.yml | 349 ++++++++++ .../main/resources/messages/messages_bg.yml | 173 +++++ .../main/resources/messages/messages_br.yml | 176 +++++ .../main/resources/messages/messages_cz.yml | 173 +++++ .../main/resources/messages/messages_de.yml | 173 +++++ .../main/resources/messages/messages_en.yml | 173 +++++ .../main/resources/messages/messages_eo.yml | 173 +++++ .../main/resources/messages/messages_es.yml | 174 +++++ .../main/resources/messages/messages_et.yml | 173 +++++ .../main/resources/messages/messages_eu.yml | 173 +++++ .../main/resources/messages/messages_fi.yml | 173 +++++ .../main/resources/messages/messages_fr.yml | 176 +++++ .../main/resources/messages/messages_gl.yml | 172 +++++ .../main/resources/messages/messages_hu.yml | 173 +++++ .../main/resources/messages/messages_id.yml | 172 +++++ .../main/resources/messages/messages_it.yml | 174 +++++ .../main/resources/messages/messages_ja.yml | 173 +++++ .../main/resources/messages/messages_ko.yml | 175 +++++ .../main/resources/messages/messages_lt.yml | 173 +++++ .../main/resources/messages/messages_nl.yml | 173 +++++ .../main/resources/messages/messages_pl.yml | 173 +++++ .../main/resources/messages/messages_pt.yml | 173 +++++ .../main/resources/messages/messages_ro.yml | 172 +++++ .../main/resources/messages/messages_ru.yml | 172 +++++ .../main/resources/messages/messages_si.yml | 173 +++++ .../main/resources/messages/messages_sk.yml | 179 +++++ .../main/resources/messages/messages_sr.yml | 173 +++++ .../main/resources/messages/messages_tr.yml | 173 +++++ .../main/resources/messages/messages_uk.yml | 173 +++++ .../main/resources/messages/messages_vn.yml | 173 +++++ .../main/resources/messages/messages_zhcn.yml | 181 +++++ .../main/resources/messages/messages_zhhk.yml | 176 +++++ .../main/resources/messages/messages_zhmc.yml | 173 +++++ .../main/resources/messages/messages_zhtw.yml | 175 +++++ .../src/main/resources/new_email.html | 127 ++++ .../src/main/resources/otheraccounts.yml | 0 .../src/main/resources/players.yml | 1 + .../src/main/resources/plugin.yml | 316 +++++++++ .../main/resources/recovery_code_email.html | 120 ++++ .../src/main/resources/shutdown.html | 118 ++++ .../src/main/resources/spawn.yml | 14 + .../resources/verification_code_email.html | 120 ++++ project/build.gradle.kts | 4 - project/module-configuration/build.gradle.kts | 22 + .../fr/xephi/authme/configruation/Comments.kt | 12 + .../xephi/authme/configruation/ConfigFile.kt | 103 +++ .../authme/configruation/ConfigSection.kt | 332 +++++++++ .../authme/configruation/Configuration.kt | 217 ++++++ .../configruation/ConfigurationSection.kt | 538 +++++++++++++++ .../fr/xephi/authme/configruation/Type.kt | 31 + project/module-util/build.gradle.kts | 3 + .../java/fr/xephi/authme/util/Coerce.java | 303 ++++++++ .../java/fr/xephi/authme/util/StringUtil.java | 27 + 479 files changed, 47707 insertions(+), 5 deletions(-) create mode 100644 plugin/platform-bukkit/build.gradle.kts create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/AuthMe.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/ConsoleLogger.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/api/v3/AuthMeApi.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/api/v3/AuthMePlayer.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/api/v3/AuthMePlayerImpl.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandArgumentDescription.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandDescription.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandHandler.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandInitializer.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandMapper.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandUtils.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/ExecutableCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/FoundCommandResult.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/FoundResultStatus.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/PlayerCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/TabCompleteHandler.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/HelpCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/AccountsCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/AuthMeCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/BackupCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/ChangePasswordAdminCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/ConverterCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/FirstSpawnCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/ForceLoginCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/GetEmailCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/GetIpCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/LastLoginCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/PurgeBannedPlayersCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/PurgeCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/PurgeLastPositionCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/PurgePlayerCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/RecentPlayersCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/RegisterAdminCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/ReloadCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SetEmailCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SetFirstSpawnCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SetSpawnCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SpawnCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SwitchAntiBotCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/TotpDisableAdminCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/TotpViewStatusCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/UnregisterAdminCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/UpdateHelpMessagesCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/VersionCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/CountryLookup.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/DataStatistics.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/DebugCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/DebugSection.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/DebugSectionUtils.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/HasPermissionChecker.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/InputValidator.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/LimboPlayerViewer.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/MySqlDefaultChanger.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/PermissionGroups.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/PlayerAuthViewer.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/SpawnLocationViewer.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/TestEmailSender.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/captcha/CaptchaCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/changepassword/ChangePasswordCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/AddEmailCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/ChangeEmailCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/EmailBaseCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/EmailSetPasswordCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/ProcessCodeCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/RecoverEmailCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/ShowEmailCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/login/LoginCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/logout/LogoutCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/register/RegisterCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/AddTotpCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/ConfirmTotpCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/RemoveTotpCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/TotpBaseCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/TotpCodeCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/unregister/UnregisterCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/verification/VerificationCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/help/HelpMessage.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/help/HelpMessagesService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/help/HelpProvider.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/help/HelpSection.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/ProxySessionManager.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/QuickCommandsProtectionManager.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/TempbanManager.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/VerificationCodeManager.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/auth/PlayerAuth.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/auth/PlayerCache.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/captcha/CaptchaCodeStorage.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/captcha/CaptchaManager.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/captcha/LoginCaptchaManager.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/captcha/RegistrationCaptchaManager.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/AllowFlightRestoreType.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/AuthGroupHandler.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/AuthGroupType.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboMessageType.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboPlayer.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboPlayerState.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboPlayerTaskManager.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboServiceHelper.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/UserGroup.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/WalkFlySpeedRestoreType.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/DistributedFilesPersistenceHandler.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/IndividualFilesPersistenceHandler.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPersistence.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPersistenceHandler.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPersistenceType.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerDeserializer.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/NoOpPersistenceHandler.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/SegmentNameBuilder.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/SegmentSize.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/AbstractSqlDataSource.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/Columns.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/DataSource.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/DataSourceType.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/H2.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/MariaDB.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/MySQL.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/MySqlMigrater.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/PostgreSqlDataSource.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/SQLite.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/SqLiteMigrater.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/SqlDataSourceUtils.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/AuthMeColumns.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/AuthMeColumnsFactory.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/AuthMeColumnsHandler.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/ColumnContext.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/DataSourceColumn.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/PlayerAuthColumn.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/AbstractDataSourceConverter.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/Converter.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/CrazyLoginConverter.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/H2ToSqlite.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/LoginSecurityConverter.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/MySqlToSqlite.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/RoyalAuthConverter.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/SqliteToH2.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/SqliteToSql.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/XAuthConverter.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/Ipb4Extension.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/MySqlExtension.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/MySqlExtensionsFactory.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/NoOpExtension.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/PhpBbExtension.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/WordpressExtension.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/XfBcryptExtension.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AbstractTeleportEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AbstractUnregisterEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AuthMeAsyncPreLoginEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AuthMeAsyncPreRegisterEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AuthMeTeleportEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/CustomEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/EmailChangedEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/FailedLoginEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/FirstSpawnTeleportEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/LoginEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/LogoutEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/PasswordEncryptionEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/ProtectInventoryEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/RegisterEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/RestoreInventoryEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/RestoreSessionEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/SpawnTeleportEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/UnregisterByAdminEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/UnregisterByPlayerEvent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/DataFolder.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/DataSourceProvider.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/HasCleanup.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/OnShutdownPlayerSaver.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/OnStartupTasks.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/Reloadable.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/SettingsDependent.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/SettingsProvider.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/TaskCloser.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/AdvancedShulkerFixListener.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/BedrockAutoLoginListener.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/BlockListener.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/DoubleLoginFixListener.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/EntityListener.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/FailedVerificationException.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/ListenerService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/LoginLocationFixListener.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListener.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListener111.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListener19.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListener19Spigot.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListenerHigherThan18.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PurgeListener.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/ServerListener.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/protocollib/I18NGetLocalePacketAdapter.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/protocollib/InventoryPacketAdapter.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/protocollib/ProtocolLibService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/protocollib/TabCompletePacketAdapter.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/mail/EmailService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/mail/ImageGenerator.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/mail/OAuth2Provider.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/mail/OAuth2SaslClient.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/mail/OAuth2SaslClientFactory.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/mail/SendMailSsl.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/AbstractMessageFileHandler.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/HelpMessagesFileHandler.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/MessageKey.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/MessagePathHelper.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/Messages.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/MessagesFileHandler.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/JarMessageSource.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/MessageKeyConfigurationData.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/MessageMigraterPropertyReader.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/MessageUpdater.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/MigraterYamlFileResource.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/OldMessageKeysMigrater.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/ConsoleFilter.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/ConsoleLoggerFactory.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/Log4JFilter.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/LogFilterHelper.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/LogLevel.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/AdminPermission.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/DebugSectionPermissions.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/DefaultPermission.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PermissionNode.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PermissionsManager.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PermissionsSystemType.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PlayerPermission.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PlayerStatePermission.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/LuckPermGroup.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/PermissionHandler.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/PermissionHandlerException.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/PermissionLoadUserException.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/PermissionsExHandler.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/VaultHandler.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/ZPermissionsHandler.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/AsynchronousProcess.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/Management.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/SyncProcessManager.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/SynchronousProcess.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/changepassword/AsyncChangePassword.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/email/AsyncAddEmail.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/email/AsyncChangeEmail.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/login/ProcessSyncPlayerLogin.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/logout/AsynchronousLogout.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/logout/ProcessSyncPlayerLogout.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/quit/ProcessSyncPlayerQuit.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/AsyncRegister.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/ProcessSyncEmailRegister.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/ProcessSyncPasswordRegister.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/RegisterSecondaryArgument.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/RegistrationType.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/AbstractPasswordRegisterExecutor.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/AbstractPasswordRegisterParams.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/ApiPasswordRegisterExecutor.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/ApiPasswordRegisterParams.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/EmailRegisterExecutor.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/EmailRegisterParams.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/PasswordRegisterExecutor.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/PasswordRegisterParams.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/PlayerAuthBuilderHelper.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/RegistrationExecutor.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/RegistrationMethod.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/RegistrationParameters.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/TwoFactorRegisterExecutor.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/TwoFactorRegisterParams.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/unregister/AsynchronousUnregister.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/HashAlgorithm.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/HashUtils.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/MessageDigestAlgorithm.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/PasswordSecurity.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Argon2.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/BCrypt.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/BCrypt2y.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/BCryptBasedHash.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/BCryptHasher.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/CmwCrypt.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/CrazyCrypt1.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/DoubleMd5.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/EncryptionMethod.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/HashedPassword.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/HexSaltedMethod.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Ipb3.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Ipb4.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Joomla.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Md5.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Md5vB.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/MyBB.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/NoCrypt.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Pbkdf2.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Pbkdf2Django.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/PhpBB.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/PhpFusion.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/RoyalAuth.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Salted2Md5.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/SaltedSha512.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/SeparateSaltMethod.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Sha1.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Sha256.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Sha512.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Smf.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/TwoFactor.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/UnsaltedMethod.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/UsernameSaltMethod.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Wbb3.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Wbb4.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Whirlpool.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Wordpress.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/XAuth.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/XfBCrypt.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/AsciiRestricted.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/HasSalt.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/Recommendation.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/SaltType.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/Usage.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/totp/GenerateTotpService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/totp/TotpAuthenticator.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/AntiBotService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/BackupService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/BukkitService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/CommonService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/GeoIpService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/HelpTranslationGenerator.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/JoinMessageService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/MigrationService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/PasswordRecoveryService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/PluginHookService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/RecoveryCodeService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/SessionService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/SessionState.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/TeleportationService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/ValidationService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/bungeecord/BungeeReceiver.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/bungeecord/BungeeSender.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/bungeecord/MessageType.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/velocity/VMessageType.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/velocity/VelocityReceiver.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/velocity/VelocitySender.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/yaml/YamlFileResourceProvider.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/yaml/YamlParseException.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/EnumSetProperty.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/Settings.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/SettingsMigrationService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/SettingsWarner.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/SpawnLoader.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/Command.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/CommandConfig.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/CommandManager.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/CommandMigrationService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/CommandSettingsHolder.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/Executor.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/OnLoginCommand.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/AuthMeSettingsRetriever.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/BackupSettings.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/ConverterSettings.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/DatabaseSettings.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/EmailSettings.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/HooksSettings.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/LimboSettings.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/PluginSettings.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/ProtectionSettings.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/PurgeSettings.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/RegistrationSettings.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/RestrictionSettings.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/SecuritySettings.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/CleanupTask.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/MessageTask.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/TimeoutTask.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/Updater.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/purge/PurgeExecutor.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/purge/PurgeService.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/AtomicIntervalCounter.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/ExceptionUtils.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/FileUtils.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/InternetProtocolUtils.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/PlayerUtils.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/RandomStringUtils.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/StringUtils.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/TeleportUtils.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/Utils.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/UuidUtils.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/expiring/Duration.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/expiring/ExpiringMap.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/expiring/ExpiringSet.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/expiring/TimedCounter.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/DependentTag.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/SimpleTag.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/Tag.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/TagBuilder.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/TagReplacer.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/WrappedTagReplacer.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/message/I18NUtils.java create mode 100644 plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java create mode 100644 plugin/platform-bukkit/src/main/resources/GeoLite2-Country.mmdb create mode 100644 plugin/platform-bukkit/src/main/resources/commands.yml create mode 100644 plugin/platform-bukkit/src/main/resources/email.html create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_bg.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_br.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_cz.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_de.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_en.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_eo.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_es.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_et.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_eu.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_fr.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_hu.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_it.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_ja.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_ko.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_lt.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_nl.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_pl.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_pt.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_ro.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_ru.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_si.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_sr.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_vn.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_zhcn.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_zhhk.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/help_zhtw.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_bg.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_br.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_cz.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_de.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_en.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_eo.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_es.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_et.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_eu.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_fi.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_fr.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_gl.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_hu.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_id.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_it.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_ja.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_ko.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_lt.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_nl.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_pl.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_pt.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_ro.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_ru.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_si.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_sk.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_sr.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_tr.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_uk.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_vn.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_zhcn.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_zhhk.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_zhmc.yml create mode 100644 plugin/platform-bukkit/src/main/resources/messages/messages_zhtw.yml create mode 100644 plugin/platform-bukkit/src/main/resources/new_email.html create mode 100644 plugin/platform-bukkit/src/main/resources/otheraccounts.yml create mode 100644 plugin/platform-bukkit/src/main/resources/players.yml create mode 100644 plugin/platform-bukkit/src/main/resources/plugin.yml create mode 100644 plugin/platform-bukkit/src/main/resources/recovery_code_email.html create mode 100644 plugin/platform-bukkit/src/main/resources/shutdown.html create mode 100644 plugin/platform-bukkit/src/main/resources/spawn.yml create mode 100644 plugin/platform-bukkit/src/main/resources/verification_code_email.html create mode 100644 project/module-configuration/build.gradle.kts create mode 100644 project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/Comments.kt create mode 100644 project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/ConfigFile.kt create mode 100644 project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/ConfigSection.kt create mode 100644 project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/Configuration.kt create mode 100644 project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/ConfigurationSection.kt create mode 100644 project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/Type.kt create mode 100644 project/module-util/build.gradle.kts create mode 100644 project/module-util/src/main/java/fr/xephi/authme/util/Coerce.java create mode 100644 project/module-util/src/main/java/fr/xephi/authme/util/StringUtil.java diff --git a/gradle.properties b/gradle.properties index 95a9328ad5..35049466d5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ -group=fr.xephi +group=fr.xephi.authme version=5.6.0-FORK-b50 \ No newline at end of file diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index dc6edf87ef..f811c88e23 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -20,6 +20,8 @@ subprojects { } dependencies { + implementation(project(":project:module-util")) + implementation(project(":project:module-configuration")) // Spigot API, https://www.spigotmc.org/ compileOnly("org.spigotmc:spigot-api:1.20.6-R0.1-SNAPSHOT") // Java Libraries diff --git a/plugin/platform-bukkit/build.gradle.kts b/plugin/platform-bukkit/build.gradle.kts new file mode 100644 index 0000000000..54b3cb5cca --- /dev/null +++ b/plugin/platform-bukkit/build.gradle.kts @@ -0,0 +1,5 @@ +description = "Fork of the first authentication plugin for the Bukkit API!" + +dependencies { + +} \ No newline at end of file diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/AuthMe.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/AuthMe.java new file mode 100644 index 0000000000..f2bff2dd78 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/AuthMe.java @@ -0,0 +1,474 @@ +package fr.xephi.authme; + +import ch.jalu.injector.Injector; +import ch.jalu.injector.InjectorBuilder; +import com.alessiodp.libby.BukkitLibraryManager; +import com.github.Anon8281.universalScheduler.UniversalScheduler; +import com.github.Anon8281.universalScheduler.scheduling.schedulers.TaskScheduler; +import fr.xephi.authme.api.v3.AuthMeApi; +import fr.xephi.authme.command.CommandHandler; +import fr.xephi.authme.command.TabCompleteHandler; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.initialization.DataSourceProvider; +import fr.xephi.authme.initialization.OnShutdownPlayerSaver; +import fr.xephi.authme.initialization.OnStartupTasks; +import fr.xephi.authme.initialization.SettingsProvider; +import fr.xephi.authme.initialization.TaskCloser; +import fr.xephi.authme.listener.AdvancedShulkerFixListener; +import fr.xephi.authme.listener.BedrockAutoLoginListener; +import fr.xephi.authme.listener.BlockListener; +import fr.xephi.authme.listener.DoubleLoginFixListener; +import fr.xephi.authme.listener.EntityListener; +import fr.xephi.authme.listener.LoginLocationFixListener; +import fr.xephi.authme.listener.PlayerListener; +import fr.xephi.authme.listener.PlayerListener111; +import fr.xephi.authme.listener.PlayerListener19; +import fr.xephi.authme.listener.PlayerListener19Spigot; +import fr.xephi.authme.listener.PlayerListenerHigherThan18; +import fr.xephi.authme.listener.PurgeListener; +import fr.xephi.authme.listener.ServerListener; +import fr.xephi.authme.mail.EmailService; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.security.crypts.Sha256; +import fr.xephi.authme.service.BackupService; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.MigrationService; +import fr.xephi.authme.service.bungeecord.BungeeReceiver; +import fr.xephi.authme.service.velocity.VelocityReceiver; +import fr.xephi.authme.service.yaml.YamlParseException; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.SettingsWarner; +import fr.xephi.authme.settings.properties.EmailSettings; +import fr.xephi.authme.settings.properties.HooksSettings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import fr.xephi.authme.task.CleanupTask; +import fr.xephi.authme.task.Updater; +import fr.xephi.authme.task.purge.PurgeService; +import fr.xephi.authme.util.ExceptionUtils; +import org.bukkit.Server; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import javax.inject.Inject; +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Objects; +import java.util.function.Consumer; + +import static fr.xephi.authme.service.BukkitService.TICKS_PER_MINUTE; +import static fr.xephi.authme.util.Utils.isClassLoaded; + +/** + * The AuthMe main class. + */ +public class AuthMe extends JavaPlugin { + + // Constants + private static final String PLUGIN_NAME = "AuthMeReloaded"; + private static final String LOG_FILENAME = "authme.log"; + private static final int CLEANUP_INTERVAL = 5 * TICKS_PER_MINUTE; + + // Version and build number values + private static String pluginVersion = "5.7.0-Fork"; + private static final String pluginBuild = "b"; + private static String pluginBuildNumber = "51"; + // Private instances + private EmailService emailService; + private CommandHandler commandHandler; + private static TaskScheduler scheduler; + @Inject + public static Settings settings; + private DataSource database; + private BukkitService bukkitService; + private Injector injector; + private BackupService backupService; + public static ConsoleLogger logger; + + /** + * Constructor. + */ + public AuthMe() { + } + + /** + * Get the plugin's build + * + * @return The plugin's build + */ + public static String getPluginBuild() { + return pluginBuild; + } + + + /** + * Get the plugin's name. + * + * @return The plugin's name. + */ + public static String getPluginName() { + return PLUGIN_NAME; + } + + /** + * Get the plugin's version. + * + * @return The plugin's version. + */ + public static String getPluginVersion() { + return pluginVersion; + } + + /** + * Get the plugin's build number. + * + * @return The plugin's build number. + */ + public static String getPluginBuildNumber() { + return pluginBuildNumber; + } + + /** + * Get the scheduler + */ + public static TaskScheduler getScheduler() { + return scheduler; + } + + /** + * The library manager + */ + public static BukkitLibraryManager libraryManager; + + /** + * Method called when the server enables the plugin. + */ + @Override + public void onEnable() { + // Load the plugin version data from the plugin description file + loadPluginInfo(getDescription().getVersion()); + scheduler = UniversalScheduler.getScheduler(this); + libraryManager = new BukkitLibraryManager(this); + + // Set the Logger instance and log file path + ConsoleLogger.initialize(getLogger(), new File(getDataFolder(), LOG_FILENAME)); + logger = ConsoleLoggerFactory.get(AuthMe.class); + logger.info("You are running an unofficial fork version of AuthMe!"); + + + // Check server version + if (!isClassLoaded("org.spigotmc.event.player.PlayerSpawnLocationEvent") + || !isClassLoaded("org.bukkit.event.player.PlayerInteractAtEntityEvent")) { + logger.warning("You are running an unsupported server version (" + getServerNameVersionSafe() + "). " + + "AuthMe requires Spigot 1.8.X or later!"); + stopOrUnload(); + return; + } + + // Prevent running AuthMeBridge due to major exploit issues + if (getServer().getPluginManager().isPluginEnabled("AuthMeBridge")) { + logger.warning("Detected AuthMeBridge, support for it has been dropped as it was " + + "causing exploit issues, please use AuthMeBungee instead! Aborting!"); + stopOrUnload(); + return; + } + + // Initialize the plugin + try { + initialize(); + } catch (Throwable th) { + YamlParseException yamlParseException = ExceptionUtils.findThrowableInCause(YamlParseException.class, th); + if (yamlParseException == null) { + logger.logException("Aborting initialization of AuthMe:", th); + th.printStackTrace(); + } else { + logger.logException("File '" + yamlParseException.getFile() + "' contains invalid YAML. " + + "Please run its contents through http://yamllint.com", yamlParseException); + } + stopOrUnload(); + return; + } + + // Show settings warnings + injector.getSingleton(SettingsWarner.class).logWarningsForMisconfigurations(); + + // Schedule clean up task + CleanupTask cleanupTask = injector.getSingleton(CleanupTask.class); + cleanupTask.runTaskTimerAsynchronously(this, CLEANUP_INTERVAL, CLEANUP_INTERVAL); + // Do a backup on start + backupService.doBackup(BackupService.BackupCause.START); + // Set up Metrics + OnStartupTasks.sendMetrics(this, settings); + if (settings.getProperty(SecuritySettings.SHOW_STARTUP_BANNER)) { + logger.info("\n" + " ___ __ __ __ ___ \n" + + " / | __ __/ /_/ /_ / |/ /__ \n" + + " / /| |/ / / / __/ __ \\/ /|_/ / _ \\\n" + + " / ___ / /_/ / /_/ / / / / / / __/\n" + + "/_/ |_\\__,_/\\__/_/ /_/_/ /_/\\___/ \n" + + " "); + } + //detect server brand with classloader + checkServerType(); + try { + Objects.requireNonNull(getCommand("register")).setTabCompleter(new TabCompleteHandler()); + Objects.requireNonNull(getCommand("login")).setTabCompleter(new TabCompleteHandler()); + } catch (NullPointerException ignored) { + } + logger.info("AuthMeReReloaded is enabled successfully!"); + // Purge on start if enabled + PurgeService purgeService = injector.getSingleton(PurgeService.class); + purgeService.runAutoPurge(); + logger.info("GitHub: https://github.com/HaHaWTH/AuthMeReReloaded/"); + if (settings.getProperty(SecuritySettings.CHECK_FOR_UPDATES)) { + checkForUpdates(); + } + } + + + /** + * Load the version and build number of the plugin from the description file. + * + * @param versionRaw the version as given by the plugin description file + */ + + private static void loadPluginInfo(String versionRaw) { + int index = versionRaw.lastIndexOf("-"); + if (index != -1) { + pluginVersion = versionRaw.substring(0, index); + pluginBuildNumber = versionRaw.substring(index + 1); + if (pluginBuildNumber.startsWith("b")) { + pluginBuildNumber = pluginBuildNumber.substring(1); + } + } + } + + /** + * Initialize the plugin and all the services. + */ + private void initialize() { + // Create plugin folder + getDataFolder().mkdir(); + + // Create injector, provide elements from the Bukkit environment and register providers + injector = new InjectorBuilder() + .addDefaultHandlers("fr.xephi.authme") + .create(); + injector.register(AuthMe.class, this); + injector.register(Server.class, getServer()); + injector.register(PluginManager.class, getServer().getPluginManager()); + injector.provide(DataFolder.class, getDataFolder()); + injector.registerProvider(Settings.class, SettingsProvider.class); + injector.registerProvider(DataSource.class, DataSourceProvider.class); + + // Get settings and set up logger + settings = injector.getSingleton(Settings.class); + ConsoleLoggerFactory.reloadSettings(settings); + OnStartupTasks.setupConsoleFilter(getLogger()); + + // Set all service fields on the AuthMe class + instantiateServices(injector); + + // Convert deprecated PLAINTEXT hash entries + MigrationService.changePlainTextToSha256(settings, database, new Sha256()); + + // If the server is empty (fresh start) just set all the players as unlogged + if (bukkitService.getOnlinePlayers().isEmpty()) { + database.purgeLogged(); + } + + // Register event listeners + registerEventListeners(injector); + + // Start Email recall task if needed + OnStartupTasks onStartupTasks = injector.newInstance(OnStartupTasks.class); + onStartupTasks.scheduleRecallEmailTask(); + } + + /** + * Instantiates all services. + * + * @param injector the injector + */ + void instantiateServices(Injector injector) { + database = injector.getSingleton(DataSource.class); + bukkitService = injector.getSingleton(BukkitService.class); + commandHandler = injector.getSingleton(CommandHandler.class); + emailService = injector.getSingleton(EmailService.class); + backupService = injector.getSingleton(BackupService.class); + + // Trigger instantiation (class not used elsewhere) + injector.getSingleton(BungeeReceiver.class); + injector.getSingleton(VelocityReceiver.class); + + // Trigger construction of API classes; they will keep track of the singleton + injector.getSingleton(AuthMeApi.class); + } + + /** + * Registers all event listeners. + * + * @param injector the injector + */ + void registerEventListeners(Injector injector) { + // Get the plugin manager instance + PluginManager pluginManager = getServer().getPluginManager(); + + // Register event listeners + pluginManager.registerEvents(injector.getSingleton(PlayerListener.class), this); + pluginManager.registerEvents(injector.getSingleton(BlockListener.class), this); + pluginManager.registerEvents(injector.getSingleton(EntityListener.class), this); + pluginManager.registerEvents(injector.getSingleton(ServerListener.class), this); + + + // Try to register 1.8+ player listeners + if (isClassLoaded("org.bukkit.event.entity.EntityPickupItemEvent") && isClassLoaded("org.bukkit.event.player.PlayerSwapHandItemsEvent")) { + pluginManager.registerEvents(injector.getSingleton(PlayerListenerHigherThan18.class), this); + } else if (isClassLoaded("org.bukkit.event.player.PlayerSwapHandItemsEvent")) { + pluginManager.registerEvents(injector.getSingleton(PlayerListener19.class), this); + } +// Try to register 1.9 player listeners(Moved to else-if) +// if (isClassLoaded("org.bukkit.event.player.PlayerSwapHandItemsEvent")) { +// pluginManager.registerEvents(injector.getSingleton(PlayerListener19.class), this); +// } + + // Try to register 1.9 spigot player listeners + if (isClassLoaded("org.spigotmc.event.player.PlayerSpawnLocationEvent")) { + pluginManager.registerEvents(injector.getSingleton(PlayerListener19Spigot.class), this); + } + + // Register listener for 1.11 events if available + if (isClassLoaded("org.bukkit.event.entity.EntityAirChangeEvent")) { + pluginManager.registerEvents(injector.getSingleton(PlayerListener111.class), this); + } + + //Register 3rd party listeners + if (settings.getProperty(SecuritySettings.FORCE_LOGIN_BEDROCK) && settings.getProperty(HooksSettings.HOOK_FLOODGATE_PLAYER) && getServer().getPluginManager().getPlugin("floodgate") != null) { + pluginManager.registerEvents(injector.getSingleton(BedrockAutoLoginListener.class), this); + } else if (settings.getProperty(SecuritySettings.FORCE_LOGIN_BEDROCK) && (!settings.getProperty(HooksSettings.HOOK_FLOODGATE_PLAYER) || getServer().getPluginManager().getPlugin("floodgate") == null)) { + logger.warning("Failed to enable BedrockAutoLogin, ensure hookFloodgate: true and floodgate is loaded."); + } + if (settings.getProperty(SecuritySettings.LOGIN_LOC_FIX_SUB_UNDERGROUND) || settings.getProperty(SecuritySettings.LOGIN_LOC_FIX_SUB_PORTAL)) { + pluginManager.registerEvents(injector.getSingleton(LoginLocationFixListener.class), this); + } + if (settings.getProperty(SecuritySettings.ANTI_GHOST_PLAYERS)) { + pluginManager.registerEvents(injector.getSingleton(DoubleLoginFixListener.class), this); + } + if (settings.getProperty(SecuritySettings.ADVANCED_SHULKER_FIX) && !isClassLoaded("org.bukkit.event.player.PlayerCommandSendEvent")) { + pluginManager.registerEvents(injector.getSingleton(AdvancedShulkerFixListener.class), this); + } else if (settings.getProperty(SecuritySettings.ADVANCED_SHULKER_FIX) && isClassLoaded("org.bukkit.event.player.PlayerCommandSendEvent")) { + logger.warning("You are running an 1.13+ minecraft server, AdvancedShulkerFix won't enable."); + } + if (settings.getProperty(SecuritySettings.PURGE_DATA_ON_QUIT)) { + pluginManager.registerEvents(injector.getSingleton(PurgeListener.class), this); + } + } + + /** + * Stops the server or disables the plugin, as defined in the configuration. + */ + public void stopOrUnload() { + if (settings == null || settings.getProperty(SecuritySettings.STOP_SERVER_ON_PROBLEM)) { + getLogger().warning("THE SERVER IS GOING TO SHUT DOWN AS DEFINED IN THE CONFIGURATION!"); + setEnabled(false); + getServer().shutdown(); + } else { + setEnabled(false); + } + } + + @Override + public void onDisable() { + // onDisable is also called when we prematurely abort, so any field may be null + OnShutdownPlayerSaver onShutdownPlayerSaver = injector == null + ? null + : injector.createIfHasDependencies(OnShutdownPlayerSaver.class); + if (onShutdownPlayerSaver != null) { + onShutdownPlayerSaver.saveAllPlayers(); + } + if (settings != null && settings.getProperty(EmailSettings.SHUTDOWN_MAIL)) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy'.'MM'.'dd'.' HH:mm:ss"); + Date date = new Date(System.currentTimeMillis()); + emailService.sendShutDown(settings.getProperty(EmailSettings.SHUTDOWN_MAIL_ADDRESS),dateFormat.format(date)); + } + + // Do backup on stop if enabled + if (backupService != null) { + backupService.doBackup(BackupService.BackupCause.STOP); + } + + // Wait for tasks and close data source + new TaskCloser(database).run(); + + // Disabled correctly + Consumer infoLogMethod = logger == null ? getLogger()::info : logger::info; + infoLogMethod.accept("AuthMe " + this.getDescription().getVersion() + " is unloaded successfully!"); + ConsoleLogger.closeFileWriter(); + } + + private void checkForUpdates() { + logger.info("Checking for updates..."); + Updater updater = new Updater(pluginBuild + pluginBuildNumber); + bukkitService.runTaskAsynchronously(() -> { + if (updater.isUpdateAvailable()) { + String message = "New version available! Latest:" + updater.getLatestVersion() + " Current:" + pluginBuild + pluginBuildNumber; + logger.warning(message); + logger.warning("Download from here: https://modrinth.com/plugin/authmerereloaded"); + } else { + logger.info("You are running the latest version."); + } + }); + } + + + private void checkServerType() { + if (isClassLoaded("io.papermc.paper.threadedregions.RegionizedServer")) { + logger.info("AuthMeReReloaded is running on Folia"); + } else if (isClassLoaded("com.destroystokyo.paper.PaperConfig")) { + logger.info("AuthMeReReloaded is running on Paper"); + } else if (isClassLoaded("catserver.server.CatServerConfig")) { + logger.info("AuthMeReReloaded is running on CatServer"); + } else if (isClassLoaded("org.spigotmc.SpigotConfig")) { + logger.info("AuthMeReReloaded is running on Spigot"); + } else if (isClassLoaded("org.bukkit.craftbukkit.CraftServer")) { + logger.info("AuthMeReReloaded is running on Bukkit"); + } else { + logger.info("AuthMeReReloaded is running on Unknown*"); + } + } + + + /** + * Handle Bukkit commands. + * + * @param sender The command sender (Bukkit). + * @param cmd The command (Bukkit). + * @param commandLabel The command label (Bukkit). + * @param args The command arguments (Bukkit). + * @return True if the command was executed, false otherwise. + */ + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, + @NotNull String commandLabel, String[] args) { + // Make sure the command handler has been initialized + if (commandHandler == null) { + getLogger().severe("AuthMe command handler is not available"); + return false; + } + + // Handle the command + return commandHandler.processCommand(sender, commandLabel, args); + } + + private String getServerNameVersionSafe() { + try { + Server server = getServer(); + return server.getName() + " v. " + server.getVersion(); + } catch (Throwable ignore) { + return "-"; + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/ConsoleLogger.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/ConsoleLogger.java new file mode 100644 index 0000000000..1b1d67887f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/ConsoleLogger.java @@ -0,0 +1,287 @@ +package fr.xephi.authme; + +import com.google.common.base.Throwables; +import fr.xephi.authme.output.LogLevel; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.PluginSettings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import fr.xephi.authme.util.ExceptionUtils; + +import java.io.Closeable; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.nio.charset.StandardCharsets; +import java.text.MessageFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.util.function.Supplier; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * AuthMe logger. + */ +public final class ConsoleLogger { + + private static final String NEW_LINE = System.getProperty("line.separator"); + /** Formatter which formats dates to something like "[08-16 21:18:46]" for any given LocalDateTime. */ + private static final DateTimeFormatter DATE_FORMAT = new DateTimeFormatterBuilder() + .appendLiteral('[') + .appendPattern("MM-dd HH:mm:ss") + .appendLiteral(']') + .toFormatter(); + + // Outside references + private static File logFile; + private static Logger logger; + + // Shared state + private static OutputStreamWriter fileWriter; + + // Individual state + private final String name; + private LogLevel logLevel = LogLevel.INFO; + + /** + * Constructor. + * + * @param name the name of this logger (the fully qualified class name using it) + */ + public ConsoleLogger(String name) { + this.name = name; + } + + // -------- + // Configurations + // -------- + + public static void initialize(Logger logger, File logFile) { + ConsoleLogger.logger = logger; + ConsoleLogger.logFile = logFile; + } + + /** + * Sets logging settings which are shared by all logger instances. + * + * @param settings the settings to read from + */ + public static void initializeSharedSettings(Settings settings) { + boolean useLogging = settings.getProperty(SecuritySettings.USE_LOGGING); + if (useLogging) { + initializeFileWriter(); + } else { + closeFileWriter(); + } + } + + /** + * Sets logging settings which are individual to all loggers. + * + * @param settings the settings to read from + */ + public void initializeSettings(Settings settings) { + this.logLevel = settings.getProperty(PluginSettings.LOG_LEVEL); + } + + public LogLevel getLogLevel() { + return logLevel; + } + + public String getName() { + return name; + } + + + // -------- + // Logging methods + // -------- + + /** + * Log a WARN message. + * + * @param message The message to log + */ + public void warning(String message) { + logger.warning(message); + writeLog("[WARN] " + message); + } + + /** + * Log a Throwable with the provided message on WARNING level + * and save the stack trace to the log file. + * + * @param message The message to accompany the exception + * @param th The Throwable to log + */ + public void logException(String message, Throwable th) { + warning(message + " " + ExceptionUtils.formatException(th)); + writeLog(Throwables.getStackTraceAsString(th)); + } + + /** + * Log an INFO message. + * + * @param message The message to log + */ + public void info(String message) { + logger.info(message); + writeLog("[INFO] " + message); + } + + /** + * Log a FINE message if enabled. + *

+ * Implementation note: this logs a message on INFO level because + * levels below INFO are disabled by Bukkit/Spigot. + * + * @param message The message to log + */ + public void fine(String message) { + if (logLevel.includes(LogLevel.FINE)) { + logger.info(message); + writeLog("[INFO:FINE] " + message); + } + } + + // -------- + // Debug log methods + // -------- + + /** + * Log a DEBUG message if enabled. + *

+ * Implementation note: this logs a message on INFO level and prefixes it with "DEBUG" because + * levels below INFO are disabled by Bukkit/Spigot. + * + * @param message The message to log + */ + public void debug(String message) { + if (logLevel.includes(LogLevel.DEBUG)) { + logAndWriteWithDebugPrefix(message); + } + } + + /** + * Log the DEBUG message. + * + * @param message the message + * @param param1 parameter to replace in the message + */ + // Avoids array creation if DEBUG level is disabled + public void debug(String message, Object param1) { + if (logLevel.includes(LogLevel.DEBUG)) { + debug(message, new Object[]{param1}); + } + } + + /** + * Log the DEBUG message. + * + * @param message the message + * @param param1 first param to replace in message + * @param param2 second param to replace in message + */ + // Avoids array creation if DEBUG level is disabled + public void debug(String message, Object param1, Object param2) { + if (logLevel.includes(LogLevel.DEBUG)) { + debug(message, new Object[]{param1, param2}); + } + } + + /** + * Log the DEBUG message. + * + * @param message the message + * @param params the params to replace in the message + */ + public void debug(String message, Object... params) { + if (logLevel.includes(LogLevel.DEBUG)) { + logAndWriteWithDebugPrefix(MessageFormat.format(message, params)); + } + } + + /** + * Log the DEBUG message from the supplier if enabled. + * + * @param msgSupplier the message supplier + */ + public void debug(Supplier msgSupplier) { + if (logLevel.includes(LogLevel.DEBUG)) { + logAndWriteWithDebugPrefix(msgSupplier.get()); + } + } + + private void logAndWriteWithDebugPrefix(String message) { + String debugMessage = "[INFO:DEBUG] " + message; + logger.info(debugMessage); + writeLog(debugMessage); + } + + // -------- + // Helpers + // -------- + + /** + * Closes the file writer. + */ + public static void closeFileWriter() { + if (fileWriter != null) { + try { + fileWriter.flush(); + } catch (IOException ignored) { + } finally { + closeSafely(fileWriter); + fileWriter = null; + } + } + } + + /** + * Write a message into the log file with a TimeStamp if enabled. + * + * @param message The message to write to the log + */ + private static void writeLog(String message) { + if (fileWriter != null) { + String dateTime = DATE_FORMAT.format(LocalDateTime.now()); + try { + fileWriter.write(dateTime); + fileWriter.write(": "); + fileWriter.write(message); + fileWriter.write(NEW_LINE); + fileWriter.flush(); + } catch (IOException ignored) { + } + } + } + + private static void closeSafely(Closeable closeable) { + if (closeable != null) { + try { + closeable.close(); + } catch (IOException e) { + logger.log(Level.SEVERE, "Failed to close resource", e); + } + } + } + + /** + * Populates the {@link #fileWriter} field if it is null, handling any exceptions that might + * arise during its creation. + */ + private static void initializeFileWriter() { + if (fileWriter == null) { + FileOutputStream fos = null; + try { + fos = new FileOutputStream(logFile, true); + fileWriter = new OutputStreamWriter(fos, StandardCharsets.UTF_8); + } catch (Exception e) { + closeSafely(fos); + logger.log(Level.SEVERE, "Failed to create writer to AuthMe log file", e); + } + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/api/v3/AuthMeApi.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/api/v3/AuthMeApi.java new file mode 100644 index 0000000000..27743d5d53 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/api/v3/AuthMeApi.java @@ -0,0 +1,397 @@ +package fr.xephi.authme.api.v3; + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.process.Management; +import fr.xephi.authme.process.register.executors.ApiPasswordRegisterParams; +import fr.xephi.authme.process.register.executors.RegistrationMethod; +import fr.xephi.authme.security.PasswordSecurity; +import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.service.GeoIpService; +import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.util.PlayerUtils; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; + +import javax.inject.Inject; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.Optional; + +import static fr.xephi.authme.listener.PlayerListener.PENDING_INVENTORIES; + +/** + * The current API of AuthMe. + * + * Recommended method of retrieving the AuthMeApi object: + * + * AuthMeApi authmeApi = AuthMeApi.getInstance(); + * + */ +@SuppressWarnings("unused") +public class AuthMeApi { + + private static AuthMeApi singleton; + private final AuthMe plugin; + private final DataSource dataSource; + private final PasswordSecurity passwordSecurity; + private final Management management; + private final ValidationService validationService; + private final PlayerCache playerCache; + private final GeoIpService geoIpService; + + /* + * Constructor for AuthMeApi. + */ + @Inject + AuthMeApi(AuthMe plugin, DataSource dataSource, PlayerCache playerCache, PasswordSecurity passwordSecurity, + Management management, ValidationService validationService, GeoIpService geoIpService) { + this.plugin = plugin; + this.dataSource = dataSource; + this.passwordSecurity = passwordSecurity; + this.management = management; + this.validationService = validationService; + this.playerCache = playerCache; + this.geoIpService = geoIpService; + AuthMeApi.singleton = this; + } + + /** + * Get the AuthMeApi object for AuthMe. + * + * @return The AuthMeApi object, or null if the AuthMe plugin is not enabled or not fully initialized yet + */ + public static AuthMeApi getInstance() { + return singleton; + } + + /** + * Return the plugin instance. + * + * @return The AuthMe instance + */ + public AuthMe getPlugin() { + return plugin; + } + + /** + * Gather the version number of the plugin. + * This can be used to determine whether certain AuthMeApi features are available or not. + * + * @return Plugin version identifier as a string. + */ + public String getPluginVersion() { + return AuthMe.getPluginVersion(); + } + + /** + * Return whether the given player is authenticated. + * + * @param player The player to verify + * @return true if the player is authenticated + */ + public boolean isAuthenticated(Player player) { + return playerCache.isAuthenticated(player.getName()); + } + + /** + * Check whether the given player is an NPC. + * + * @param player The player to verify + * @return true if the player is an npc + */ + public boolean isNpc(Player player) { + return PlayerUtils.isNpc(player); + } + + /** + * Check whether the given player is unrestricted. For such players, AuthMe will not require + * them to authenticate. + * + * @param player The player to verify + * @return true if the player is unrestricted + * @see fr.xephi.authme.settings.properties.RestrictionSettings#UNRESTRICTED_NAMES + */ + public boolean isUnrestricted(Player player) { + return validationService.isUnrestricted(player.getName()); + } + + /** + * Get the last location of an online player. + * + * @param player The player to process + * @return The location of the player + */ + public Location getLastLocation(Player player) { + PlayerAuth auth = playerCache.getAuth(player.getName()); + if (auth != null) { + return new Location(Bukkit.getWorld(auth.getWorld()), + auth.getQuitLocX(), auth.getQuitLocY(), auth.getQuitLocZ(), auth.getYaw(), auth.getPitch()); + } + return null; + } + + /** + * Returns the AuthMe info of the given player's name, or empty optional if the player doesn't exist. + * + * @param playerName The player name to look up + * @return AuthMe player info, or empty optional if the player doesn't exist + */ + public Optional getPlayerInfo(String playerName) { + PlayerAuth auth = playerCache.getAuth(playerName); + if (auth == null) { + auth = dataSource.getAuth(playerName); + } + return AuthMePlayerImpl.fromPlayerAuth(auth); + } + + /** + * Get the last ip address of a player. + * + * @param playerName The name of the player to process + * @return The last ip address of the player + */ + public String getLastIp(String playerName) { + PlayerAuth auth = playerCache.getAuth(playerName); + if (auth == null) { + auth = dataSource.getAuth(playerName); + } + if (auth != null) { + return auth.getLastIp(); + } + return null; + } + + /** + * Get user names by ip. + * + * @param address The ip address to process + * @return The list of user names related to the ip address + */ + public List getNamesByIp(String address) { + return dataSource.getAllAuthsByIp(address); + } + + /** + * Get the last (AuthMe) login date of a player. + * + * @param playerName The name of the player to process + * @return The date of the last login, or null if the player doesn't exist or has never logged in + * @deprecated Use Java 8's Instant method {@link #getLastLoginTime(String)} + */ + @Deprecated + public Date getLastLogin(String playerName) { + Long lastLogin = getLastLoginMillis(playerName); + return lastLogin == null ? null : new Date(lastLogin); + } + + /** + * Get the last (AuthMe) login timestamp of a player. + * + * @param playerName The name of the player to process + * + * @return The timestamp of the last login, or null if the player doesn't exist or has never logged in + */ + public Instant getLastLoginTime(String playerName) { + Long lastLogin = getLastLoginMillis(playerName); + return lastLogin == null ? null : Instant.ofEpochMilli(lastLogin); + } + + private Long getLastLoginMillis(String playerName) { + PlayerAuth auth = playerCache.getAuth(playerName); + if (auth == null) { + auth = dataSource.getAuth(playerName); + } + if (auth != null) { + return auth.getLastLogin(); + } + return null; + } + + /** + * Return whether the player is registered. + * + * @param playerName The player name to check + * @return true if player is registered, false otherwise + */ + public boolean isRegistered(String playerName) { + String player = playerName.toLowerCase(Locale.ROOT); + return dataSource.isAuthAvailable(player); + } + + /** + * Check the password for the given player. + * + * @param playerName The player to check the password for + * @param passwordToCheck The password to check + * @return true if the password is correct, false otherwise + */ + public boolean checkPassword(String playerName, String passwordToCheck) { + return passwordSecurity.comparePassword(passwordToCheck, playerName); + } + + /** + * Register an OFFLINE/ONLINE player with the given password. + * + * @param playerName The player to register + * @param password The password to register the player with + * + * @return true if the player was registered successfully + */ + public boolean registerPlayer(String playerName, String password) { + String name = playerName.toLowerCase(Locale.ROOT); + if (isRegistered(name)) { + return false; + } + HashedPassword result = passwordSecurity.computeHash(password, name); + PlayerAuth auth = PlayerAuth.builder() + .name(name) + .password(result) + .realName(playerName) + .registrationDate(System.currentTimeMillis()) + .build(); + return dataSource.saveAuth(auth); + } + + /** + * Open an inventory for the given player at any time. + * + * @param player The player to open the inventory for + * @param inventory The inventory to open + * @return The inventory view + */ + public InventoryView openInventory(Player player, Inventory inventory) { + PENDING_INVENTORIES.add(inventory); + return player.openInventory(inventory); + } + + /** + * Force a player to login, i.e. the player is logged in without needing his password. + * + * @param player The player to log in + */ + public void forceLogin(Player player) { + management.forceLogin(player); + } + + /** + * Force a player to login, i.e. the player is logged in without needing his password. + * + * @param player The player to log in + * @param quiet Whether to suppress the login message + */ + public void forceLogin(Player player, boolean quiet) { + management.forceLogin(player, quiet); + } + + /** + * Force a player to logout. + * + * @param player The player to log out + */ + public void forceLogout(Player player) { + management.performLogout(player); + } + + /** + * Force an ONLINE player to register. + * + * @param player The player to register + * @param password The password to use + * @param autoLogin Should the player be authenticated automatically after the registration? + */ + public void forceRegister(Player player, String password, boolean autoLogin) { + management.performRegister(RegistrationMethod.API_REGISTRATION, + ApiPasswordRegisterParams.of(player, password, autoLogin)); + } + + /** + * Register an ONLINE player with the given password. + * + * @param player The player to register + * @param password The password to use + */ + public void forceRegister(Player player, String password) { + forceRegister(player, password, true); + } + + /** + * Unregister a player from AuthMe. + * + * @param player The player to unregister + */ + public void forceUnregister(Player player) { + management.performUnregisterByAdmin(null, player.getName(), player); + } + + /** + * Unregister a player from AuthMe by name. + * + * @param name the name of the player (case-insensitive) + */ + public void forceUnregister(String name) { + management.performUnregisterByAdmin(null, name, Bukkit.getPlayer(name)); + } + + /** + * Change a user's password + * + * @param name the user name + * @param newPassword the new password + */ + public void changePassword(String name, String newPassword) { + management.performPasswordChangeAsAdmin(null, name, newPassword); + } + + /** + * Get all the registered names (lowercase) + * + * @return registered names + */ + public List getRegisteredNames() { + List registeredNames = new ArrayList<>(); + dataSource.getAllAuths().forEach(auth -> registeredNames.add(auth.getNickname())); + return registeredNames; + } + + /** + * Get all the registered real-names (original case) + * + * @return registered real-names + */ + public List getRegisteredRealNames() { + List registeredNames = new ArrayList<>(); + dataSource.getAllAuths().forEach(auth -> registeredNames.add(auth.getRealName())); + return registeredNames; + } + + /** + * Get the country code of the given IP address. + * + * @param ip textual IP address to lookup. + * + * @return two-character ISO 3166-1 alpha code for the country. + */ + public String getCountryCode(String ip) { + return geoIpService.getCountryCode(ip); + } + + /** + * Get the country name of the given IP address. + * + * @param ip textual IP address to lookup. + * + * @return The name of the country. + */ + public String getCountryName(String ip) { + return geoIpService.getCountryName(ip); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/api/v3/AuthMePlayer.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/api/v3/AuthMePlayer.java new file mode 100644 index 0000000000..4c64073b85 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/api/v3/AuthMePlayer.java @@ -0,0 +1,65 @@ +package fr.xephi.authme.api.v3; + +import java.time.Instant; +import java.util.Optional; +import java.util.UUID; + +/** + * Read-only player info exposed in the AuthMe API. The data in this object is copied from the + * database and not updated afterwards. As such, it may become outdated if the player data changes + * in AuthMe. + * + * @see AuthMeApi#getPlayerInfo + */ +public interface AuthMePlayer { + + /** + * @return the case-sensitive name of the player, e.g. "thePlayer3030" - never null + */ + String getName(); + + /** + * Returns the UUID of the player as given by the server (may be offline UUID or not). + * The UUID is not present if AuthMe is configured not to store the UUID or if the data is not + * present (e.g. older record). + * + * @return player uuid, or empty optional if not available + */ + Optional getUuid(); + + /** + * Returns the email address associated with this player, or an empty optional if not available. + * + * @return player's email or empty optional + */ + Optional getEmail(); + + /** + * @return the registration date of the player's account - never null + */ + Instant getRegistrationDate(); + + /** + * Returns the IP address with which the player's account was registered. Returns an empty optional + * for older accounts, or if the account was registered by someone else (e.g. by an admin). + * + * @return the ip address used during the registration of the account, or empty optional + */ + Optional getRegistrationIpAddress(); + + /** + * Returns the last login date of the player. An empty optional is returned if the player never logged in. + * + * @return date the player last logged in successfully, or empty optional if not applicable + */ + Optional getLastLoginDate(); + + /** + * Returns the IP address the player last logged in with successfully. Returns an empty optional if the + * player never logged in. + * + * @return ip address the player last logged in with successfully, or empty optional if not applicable + */ + Optional getLastLoginIpAddress(); + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/api/v3/AuthMePlayerImpl.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/api/v3/AuthMePlayerImpl.java new file mode 100644 index 0000000000..9ea0b643bb --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/api/v3/AuthMePlayerImpl.java @@ -0,0 +1,93 @@ +package fr.xephi.authme.api.v3; + +import fr.xephi.authme.data.auth.PlayerAuth; + +import java.time.Instant; +import java.util.Optional; +import java.util.UUID; + +/** + * Implementation of {@link AuthMePlayer}. This implementation is not part of the API and + * may have breaking changes in subsequent releases. + */ +class AuthMePlayerImpl implements AuthMePlayer { + + private String name; + private UUID uuid; + private String email; + + private Instant registrationDate; + private String registrationIpAddress; + + private Instant lastLoginDate; + private String lastLoginIpAddress; + + AuthMePlayerImpl() { + } + + /** + * Maps the given player auth to an AuthMePlayer instance. Returns an empty optional if + * the player auth is null. + * + * @param playerAuth the player auth or null + * @return the mapped player auth, or empty optional if the argument was null + */ + static Optional fromPlayerAuth(PlayerAuth playerAuth) { + if (playerAuth == null) { + return Optional.empty(); + } + + AuthMePlayerImpl authMeUser = new AuthMePlayerImpl(); + authMeUser.name = playerAuth.getRealName(); + authMeUser.uuid = playerAuth.getUuid(); + authMeUser.email = nullIfDefault(playerAuth.getEmail(), PlayerAuth.DB_EMAIL_DEFAULT); + Long lastLoginMillis = nullIfDefault(playerAuth.getLastLogin(), PlayerAuth.DB_LAST_LOGIN_DEFAULT); + authMeUser.registrationDate = toInstant(playerAuth.getRegistrationDate()); + authMeUser.registrationIpAddress = playerAuth.getRegistrationIp(); + authMeUser.lastLoginDate = toInstant(lastLoginMillis); + authMeUser.lastLoginIpAddress = nullIfDefault(playerAuth.getLastIp(), PlayerAuth.DB_LAST_IP_DEFAULT); + return Optional.of(authMeUser); + } + + @Override + public String getName() { + return name; + } + + public Optional getUuid() { + return Optional.ofNullable(uuid); + } + + @Override + public Optional getEmail() { + return Optional.ofNullable(email); + } + + @Override + public Instant getRegistrationDate() { + return registrationDate; + } + + @Override + public Optional getRegistrationIpAddress() { + return Optional.ofNullable(registrationIpAddress); + } + + @Override + public Optional getLastLoginDate() { + return Optional.ofNullable( lastLoginDate); + } + + @Override + public Optional getLastLoginIpAddress() { + return Optional.ofNullable(lastLoginIpAddress); + } + + private static Instant toInstant(Long epochMillis) { + return epochMillis == null ? null : Instant.ofEpochMilli(epochMillis); + } + + private static T nullIfDefault(T value, T defaultValue) { + return defaultValue.equals(value) ? null : value; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandArgumentDescription.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandArgumentDescription.java new file mode 100644 index 0000000000..9ae3da4bdc --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandArgumentDescription.java @@ -0,0 +1,61 @@ +package fr.xephi.authme.command; + +/** + * Wrapper for the description of a command argument. + */ +public class CommandArgumentDescription { + + /** + * Argument name (one-word description of the argument). + */ + private final String name; + /** + * Argument description. + */ + private final String description; + /** + * Defines whether the argument is optional. + */ + private final boolean isOptional; + + /** + * Constructor. + * + * @param name The argument name. + * @param description The argument description. + * @param isOptional True if the argument is optional, false otherwise. + */ + public CommandArgumentDescription(String name, String description, boolean isOptional) { + this.name = name; + this.description = description; + this.isOptional = isOptional; + } + + /** + * Get the argument name. + * + * @return Argument name. + */ + public String getName() { + return this.name; + } + + /** + * Get the argument description. + * + * @return Argument description. + */ + public String getDescription() { + return description; + } + + /** + * Return whether the argument is optional. + * + * @return True if the argument is optional, false otherwise. + */ + public boolean isOptional() { + return isOptional; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandDescription.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandDescription.java new file mode 100644 index 0000000000..040894f955 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandDescription.java @@ -0,0 +1,294 @@ +package fr.xephi.authme.command; + +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.util.StringUtils; +import fr.xephi.authme.util.Utils; + +import java.util.ArrayList; +import java.util.List; + +import static com.google.common.base.Preconditions.checkArgument; +import static java.util.Arrays.asList; + +/** + * Command description – defines which labels ("names") will lead to a command and points to the + * {@link ExecutableCommand} implementation that executes the logic of the command. + *

+ * CommandDescription instances are built hierarchically: they have one parent, or {@code null} for base commands + * (main commands such as {@code /authme}), and may have multiple children extending the mapping of the parent: e.g. if + * {@code /authme} has a child whose label is {@code "register"}, then {@code /authme register} is the command that + * the child defines. + */ +@SuppressWarnings("checkstyle:FinalClass") // Justification: class is mocked in multiple tests +public class CommandDescription { + + /** + * Defines the labels to execute the command. For example, if labels are "register" and "r" and the parent is + * the command for "/authme", then both "/authme register" and "/authme r" will be handled by this command. + */ + private List labels; + /** + * Short description of the command. + */ + private String description; + /** + * Detailed description of what the command does. + */ + private String detailedDescription; + /** + * The class implementing the command described by this object. + */ + private Class executableCommand; + /** + * The parent command. + */ + private CommandDescription parent; + /** + * The child commands that extend this command. + */ + private List children = new ArrayList<>(); + /** + * The arguments the command takes. + */ + private List arguments; + /** + * Permission node required to execute this command. + */ + private PermissionNode permission; + + /** + * Private constructor. + *

+ * Note for developers: Instances should be created with {@link CommandBuilder#register()} to be properly + * registered in the command tree. + * + * @param labels command labels + * @param description description of the command + * @param detailedDescription detailed command description + * @param executableCommand class of the command implementation + * @param parent parent command + * @param arguments command arguments + * @param permission permission node required to execute this command + */ + private CommandDescription(List labels, String description, String detailedDescription, + Class executableCommand, CommandDescription parent, + List arguments, PermissionNode permission) { + this.labels = labels; + this.description = description; + this.detailedDescription = detailedDescription; + this.executableCommand = executableCommand; + this.parent = parent; + this.arguments = arguments; + this.permission = permission; + } + + /** + * Return all relative labels of this command. For example, if this object describes {@code /authme register} and + * {@code /authme r}, then it will return a list with {@code register} and {@code r}. The parent label + * {@code authme} is not returned. + * + * @return All labels of the command description. + */ + public List getLabels() { + return labels; + } + + /** + * Check whether this command description has the given label. + * + * @param commandLabel The label to check for. + * + * @return {@code true} if this command contains the given label, {@code false} otherwise. + */ + public boolean hasLabel(String commandLabel) { + for (String label : labels) { + if (label.equalsIgnoreCase(commandLabel)) { + return true; + } + } + return false; + } + + /** + * Return the {@link ExecutableCommand} class implementing this command. + * + * @return The executable command class + */ + public Class getExecutableCommand() { + return executableCommand; + } + + /** + * Return the parent. + * + * @return The parent command, or null for base commands + */ + public CommandDescription getParent() { + return parent; + } + + /** + * Return the number of labels necessary to get to this command. This corresponds to the number of parents + 1. + * + * @return The number of labels, e.g. for "/authme abc def" the label count is 3 + */ + public int getLabelCount() { + if (parent == null) { + return 1; + } + return parent.getLabelCount() + 1; + } + + /** + * Return all command children. + * + * @return Command children. + */ + public List getChildren() { + return children; + } + + /** + * Return all arguments the command takes. + * + * @return Command arguments. + */ + public List getArguments() { + return arguments; + } + + /** + * Return a short description of the command. + * + * @return Command description. + */ + public String getDescription() { + return description; + } + + /** + * Return a detailed description of the command. + * + * @return Detailed description. + */ + public String getDetailedDescription() { + return detailedDescription; + } + + /** + * Return the permission node required to execute the command. + * + * @return The permission node, or null if none are required to execute the command. + */ + public PermissionNode getPermission() { + return permission; + } + + /** + * Return a builder instance to create a new command description. + * + * @return The builder + */ + public static CommandBuilder builder() { + return new CommandBuilder(); + } + + /** + * Builder for initializing CommandDescription objects. + */ + public static final class CommandBuilder { + private List labels; + private String description; + private String detailedDescription; + private Class executableCommand; + private CommandDescription parent; + private List arguments = new ArrayList<>(); + private PermissionNode permission; + + /** + * Build a CommandDescription and register it onto the parent if available. + * + * @return The generated CommandDescription object + */ + public CommandDescription register() { + CommandDescription command = build(); + + if (command.parent != null) { + command.parent.children.add(command); + } + return command; + } + + /** + * Build a CommandDescription (without registering it on the parent). + * + * @return The generated CommandDescription object + */ + public CommandDescription build() { + checkArgument(!Utils.isCollectionEmpty(labels), "Labels may not be empty"); + checkArgument(!StringUtils.isBlank(description), "Description may not be empty"); + checkArgument(!StringUtils.isBlank(detailedDescription), "Detailed description may not be empty"); + checkArgument(executableCommand != null, "Executable command must be set"); + // parents and permissions may be null; arguments may be empty + + return new CommandDescription(labels, description, detailedDescription, executableCommand, + parent, arguments, permission); + } + + public CommandBuilder labels(List labels) { + this.labels = labels; + return this; + } + + public CommandBuilder labels(String... labels) { + return labels(asList(labels)); + } + + public CommandBuilder description(String description) { + this.description = description; + return this; + } + + public CommandBuilder detailedDescription(String detailedDescription) { + this.detailedDescription = detailedDescription; + return this; + } + + public CommandBuilder executableCommand(Class executableCommand) { + this.executableCommand = executableCommand; + return this; + } + + public CommandBuilder parent(CommandDescription parent) { + this.parent = parent; + return this; + } + + /** + * Add an argument that the command description requires. This method can be called multiples times to add + * multiple arguments. + * + * @param label The label of the argument (single word name of the argument) + * @param description The description of the argument + * @param isOptional True if the argument is optional, false if it is mandatory + * + * @return The builder + */ + public CommandBuilder withArgument(String label, String description, boolean isOptional) { + arguments.add(new CommandArgumentDescription(label, description, isOptional)); + return this; + } + + /** + * Add a permission node that a user must have to execute the command. + * + * @param permission The PermissionNode to add + * @return The builder + */ + public CommandBuilder permission(PermissionNode permission) { + this.permission = permission; + return this; + } + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandHandler.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandHandler.java new file mode 100644 index 0000000000..08629c6f5c --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandHandler.java @@ -0,0 +1,186 @@ +package fr.xephi.authme.command; + +import ch.jalu.injector.factory.Factory; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.command.help.HelpProvider; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.util.StringUtils; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * The AuthMe command handler, responsible for invoking the correct {@link ExecutableCommand} based on incoming + * command labels or for displaying a help message for unknown command labels. + */ +public class CommandHandler { + + /** + * The threshold for suggesting a similar command. If the difference is below this value, we will + * ask the player whether he meant the similar command. + */ + private static final double SUGGEST_COMMAND_THRESHOLD = 0.75; + + private final CommandMapper commandMapper; + private final PermissionsManager permissionsManager; + private final Messages messages; + private final HelpProvider helpProvider; + + /** + * Map with ExecutableCommand children. The key is the type of the value. + */ + private Map, ExecutableCommand> commands = new HashMap<>(); + + @Inject + CommandHandler(Factory commandFactory, CommandMapper commandMapper, + PermissionsManager permissionsManager, Messages messages, HelpProvider helpProvider) { + this.commandMapper = commandMapper; + this.permissionsManager = permissionsManager; + this.messages = messages; + this.helpProvider = helpProvider; + initializeCommands(commandFactory, commandMapper.getCommandClasses()); + } + + /** + * Map a command that was invoked to the proper {@link CommandDescription} or return a useful error + * message upon failure. + * + * @param sender The command sender. + * @param bukkitCommandLabel The command label (Bukkit). + * @param bukkitArgs The command arguments (Bukkit). + * + * @return True if the command was executed, false otherwise. + */ + public boolean processCommand(CommandSender sender, String bukkitCommandLabel, String[] bukkitArgs) { + // Add the Bukkit command label to the front so we get a list like [authme, register, bobby, mysecret] + List parts = skipEmptyArguments(bukkitArgs); + parts.add(0, bukkitCommandLabel); + + FoundCommandResult result = commandMapper.mapPartsToCommand(sender, parts); + handleCommandResult(sender, result); + return !FoundResultStatus.MISSING_BASE_COMMAND.equals(result.getResultStatus()); + } + + /** + * Processes the given {@link FoundCommandResult} for the provided command sender. + * + * @param sender the command sender who executed the command + * @param result the command mapping result + */ + private void handleCommandResult(CommandSender sender, FoundCommandResult result) { + switch (result.getResultStatus()) { + case SUCCESS: + executeCommand(sender, result); + break; + case MISSING_BASE_COMMAND: + sender.sendMessage(ChatColor.DARK_RED + "Failed to parse " + AuthMe.getPluginName() + " command!"); + break; + case INCORRECT_ARGUMENTS: + sendImproperArgumentsMessage(sender, result); + break; + case UNKNOWN_LABEL: + sendUnknownCommandMessage(sender, result); + break; + case NO_PERMISSION: + messages.send(sender, MessageKey.NO_PERMISSION); + break; + default: + throw new IllegalStateException("Unknown result status '" + result.getResultStatus() + "'"); + } + } + + /** + * Initialize all required ExecutableCommand objects. + * + * @param commandFactory factory to create command objects + * @param commandClasses the classes to instantiate + */ + private void initializeCommands(Factory commandFactory, + Set> commandClasses) { + for (Class clazz : commandClasses) { + commands.put(clazz, commandFactory.newInstance(clazz)); + } + } + + /** + * Execute the command for the given command sender. + * + * @param sender The sender which initiated the command + * @param result The mapped result + */ + private void executeCommand(CommandSender sender, FoundCommandResult result) { + ExecutableCommand executableCommand = commands.get(result.getCommandDescription().getExecutableCommand()); + List arguments = result.getArguments(); + executableCommand.executeCommand(sender, arguments); + } + + /** + * Skip all entries of the given array that are simply whitespace. + * + * @param args The array to process + * @return List of the items that are not empty + */ + private static List skipEmptyArguments(String[] args) { + List cleanArguments = new ArrayList<>(); + for (String argument : args) { + if (!StringUtils.isBlank(argument)) { + cleanArguments.add(argument); + } + } + return cleanArguments; + } + + /** + * Show an "unknown command" message to the user and suggest an existing command if its similarity is within + * the defined threshold. + * + * @param sender The command sender + * @param result The command that was found during the mapping process + */ + private static void sendUnknownCommandMessage(CommandSender sender, FoundCommandResult result) { + sender.sendMessage(ChatColor.DARK_RED + "Unknown command!"); + + // Show a command suggestion if available and the difference isn't too big + if (result.getDifference() <= SUGGEST_COMMAND_THRESHOLD && result.getCommandDescription() != null) { + sender.sendMessage(ChatColor.YELLOW + "Did you mean " + ChatColor.GOLD + + CommandUtils.constructCommandPath(result.getCommandDescription()) + ChatColor.YELLOW + "?"); + } + + sender.sendMessage(ChatColor.YELLOW + "Use the command " + ChatColor.GOLD + "/" + result.getLabels().get(0) + + " help" + ChatColor.YELLOW + " to view help."); + } + + private void sendImproperArgumentsMessage(CommandSender sender, FoundCommandResult result) { + CommandDescription command = result.getCommandDescription(); + if (!permissionsManager.hasPermission(sender, command.getPermission())) { + messages.send(sender, MessageKey.NO_PERMISSION); + return; + } + + ExecutableCommand executableCommand = commands.get(command.getExecutableCommand()); + MessageKey usageMessage = executableCommand.getArgumentsMismatchMessage(); + if (usageMessage == null) { + showHelpForCommand(sender, result); + } else { + messages.send(sender, usageMessage); + } + } + + private void showHelpForCommand(CommandSender sender, FoundCommandResult result) { + sender.sendMessage(ChatColor.DARK_RED + "Incorrect command arguments!"); + helpProvider.outputHelp(sender, result, HelpProvider.SHOW_ARGUMENTS); + + List labels = result.getLabels(); + String childLabel = labels.size() >= 2 ? labels.get(1) : ""; + sender.sendMessage(ChatColor.GOLD + "Detailed help: " + ChatColor.WHITE + + "/" + labels.get(0) + " help " + childLabel); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandInitializer.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandInitializer.java new file mode 100644 index 0000000000..fcc3ce6118 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandInitializer.java @@ -0,0 +1,652 @@ +package fr.xephi.authme.command; + +import com.google.common.collect.ImmutableList; +import fr.xephi.authme.command.executable.HelpCommand; +import fr.xephi.authme.command.executable.authme.AccountsCommand; +import fr.xephi.authme.command.executable.authme.AuthMeCommand; +import fr.xephi.authme.command.executable.authme.BackupCommand; +import fr.xephi.authme.command.executable.authme.ChangePasswordAdminCommand; +import fr.xephi.authme.command.executable.authme.ConverterCommand; +import fr.xephi.authme.command.executable.authme.FirstSpawnCommand; +import fr.xephi.authme.command.executable.authme.ForceLoginCommand; +import fr.xephi.authme.command.executable.authme.GetEmailCommand; +import fr.xephi.authme.command.executable.authme.GetIpCommand; +import fr.xephi.authme.command.executable.authme.LastLoginCommand; +import fr.xephi.authme.command.executable.authme.PurgeBannedPlayersCommand; +import fr.xephi.authme.command.executable.authme.PurgeCommand; +import fr.xephi.authme.command.executable.authme.PurgeLastPositionCommand; +import fr.xephi.authme.command.executable.authme.PurgePlayerCommand; +import fr.xephi.authme.command.executable.authme.RecentPlayersCommand; +import fr.xephi.authme.command.executable.authme.RegisterAdminCommand; +import fr.xephi.authme.command.executable.authme.ReloadCommand; +import fr.xephi.authme.command.executable.authme.SetEmailCommand; +import fr.xephi.authme.command.executable.authme.SetFirstSpawnCommand; +import fr.xephi.authme.command.executable.authme.SetSpawnCommand; +import fr.xephi.authme.command.executable.authme.SpawnCommand; +import fr.xephi.authme.command.executable.authme.SwitchAntiBotCommand; +import fr.xephi.authme.command.executable.authme.TotpDisableAdminCommand; +import fr.xephi.authme.command.executable.authme.TotpViewStatusCommand; +import fr.xephi.authme.command.executable.authme.UnregisterAdminCommand; +import fr.xephi.authme.command.executable.authme.UpdateHelpMessagesCommand; +import fr.xephi.authme.command.executable.authme.VersionCommand; +import fr.xephi.authme.command.executable.authme.debug.DebugCommand; +import fr.xephi.authme.command.executable.captcha.CaptchaCommand; +import fr.xephi.authme.command.executable.changepassword.ChangePasswordCommand; +import fr.xephi.authme.command.executable.email.AddEmailCommand; +import fr.xephi.authme.command.executable.email.ChangeEmailCommand; +import fr.xephi.authme.command.executable.email.EmailBaseCommand; +import fr.xephi.authme.command.executable.email.EmailSetPasswordCommand; +import fr.xephi.authme.command.executable.email.ProcessCodeCommand; +import fr.xephi.authme.command.executable.email.RecoverEmailCommand; +import fr.xephi.authme.command.executable.email.ShowEmailCommand; +import fr.xephi.authme.command.executable.login.LoginCommand; +import fr.xephi.authme.command.executable.logout.LogoutCommand; +import fr.xephi.authme.command.executable.register.RegisterCommand; +import fr.xephi.authme.command.executable.totp.AddTotpCommand; +import fr.xephi.authme.command.executable.totp.ConfirmTotpCommand; +import fr.xephi.authme.command.executable.totp.RemoveTotpCommand; +import fr.xephi.authme.command.executable.totp.TotpBaseCommand; +import fr.xephi.authme.command.executable.totp.TotpCodeCommand; +import fr.xephi.authme.command.executable.unregister.UnregisterCommand; +import fr.xephi.authme.command.executable.verification.VerificationCommand; +import fr.xephi.authme.permission.AdminPermission; +import fr.xephi.authme.permission.DebugSectionPermissions; +import fr.xephi.authme.permission.PlayerPermission; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +/** + * Initializes all available AuthMe commands. + */ +public class CommandInitializer { + + private static final boolean OPTIONAL = true; + private static final boolean MANDATORY = false; + + private List commands; + + public CommandInitializer() { + buildCommands(); + } + + /** + * Returns the description of all AuthMe commands. + * + * @return the command descriptions + */ + public List getCommands() { + return commands; + } + + /** + * Builds the command description objects for all available AuthMe commands. + */ + private void buildCommands() { + // Register /authme and /email commands + CommandDescription authMeBase = buildAuthMeBaseCommand(); + CommandDescription emailBase = buildEmailBaseCommand(); + + // Register the base login command + CommandDescription loginBase = CommandDescription.builder() + .parent(null) + .labels("login", "l", "log") + .description("Login command") + .detailedDescription("Command to log in using AuthMeReloaded.") + .withArgument("password", "Login password", MANDATORY) + .permission(PlayerPermission.LOGIN) + .executableCommand(LoginCommand.class) + .register(); + + // Register the base logout command + CommandDescription logoutBase = CommandDescription.builder() + .parent(null) + .labels("logout") + .description("Logout command") + .detailedDescription("Command to logout using AuthMeReloaded.") + .permission(PlayerPermission.LOGOUT) + .executableCommand(LogoutCommand.class) + .register(); + + // Register the base register command + CommandDescription registerBase = CommandDescription.builder() + .parent(null) + .labels("register", "reg") + .description("Register an account") + .detailedDescription("Command to register using AuthMeReloaded.") + .withArgument("password", "Password", OPTIONAL) + .withArgument("verifyPassword", "Verify password", OPTIONAL) + .permission(PlayerPermission.REGISTER) + .executableCommand(RegisterCommand.class) + .register(); + + // Register the base unregister command + CommandDescription unregisterBase = CommandDescription.builder() + .parent(null) + .labels("unregister", "unreg") + .description("Unregister an account") + .detailedDescription("Command to unregister using AuthMeReloaded.") + .withArgument("password", "Password", MANDATORY) + .permission(PlayerPermission.UNREGISTER) + .executableCommand(UnregisterCommand.class) + .register(); + + // Register the base changepassword command + CommandDescription changePasswordBase = CommandDescription.builder() + .parent(null) + .labels("changepassword", "changepass", "cp") + .description("Change password of an account") + .detailedDescription("Command to change your password using AuthMeReloaded.") + .withArgument("oldPassword", "Old password", MANDATORY) + .withArgument("newPassword", "New password", MANDATORY) + .permission(PlayerPermission.CHANGE_PASSWORD) + .executableCommand(ChangePasswordCommand.class) + .register(); + + // Create totp base command + CommandDescription totpBase = buildTotpBaseCommand(); + + // Register the base captcha command + CommandDescription captchaBase = CommandDescription.builder() + .parent(null) + .labels("captcha") + .description("Captcha command") + .detailedDescription("Captcha command for AuthMeReloaded.") + .withArgument("captcha", "The Captcha", MANDATORY) + .permission(PlayerPermission.CAPTCHA) + .executableCommand(CaptchaCommand.class) + .register(); + + // Register the base verification code command + CommandDescription verificationBase = CommandDescription.builder() + .parent(null) + .labels("verification") + .description("Verification command") + .detailedDescription("Command to complete the verification process for AuthMeReloaded.") + .withArgument("code", "The code", MANDATORY) + .permission(PlayerPermission.VERIFICATION_CODE) + .executableCommand(VerificationCommand.class) + .register(); + + List baseCommands = ImmutableList.of(authMeBase, emailBase, loginBase, logoutBase, + registerBase, unregisterBase, changePasswordBase, totpBase, captchaBase, verificationBase); + + setHelpOnAllBases(baseCommands); + commands = baseCommands; + } + + /** + * Creates a command description object for {@code /authme} including its children. + * + * @return the authme base command description + */ + private CommandDescription buildAuthMeBaseCommand() { + // Register the base AuthMe Reloaded command + CommandDescription authmeBase = CommandDescription.builder() + .labels("authme") + .description("AuthMe op commands") + .detailedDescription("The main AuthMeReloaded command. The root for all admin commands.") + .executableCommand(AuthMeCommand.class) + .register(); + + // Register the register command + CommandDescription.builder() + .parent(authmeBase) + .labels("register", "reg", "r") + .description("Register a player") + .detailedDescription("Register the specified player with the specified password.") + .withArgument("player", "Player name", MANDATORY) + .withArgument("password", "Password", MANDATORY) + .permission(AdminPermission.REGISTER) + .executableCommand(RegisterAdminCommand.class) + .register(); + + // Register the unregister command + CommandDescription.builder() + .parent(authmeBase) + .labels("unregister", "unreg", "unr") + .description("Unregister a player") + .detailedDescription("Unregister the specified player.") + .withArgument("player", "Player name", MANDATORY) + .permission(AdminPermission.UNREGISTER) + .executableCommand(UnregisterAdminCommand.class) + .register(); + + // Register the forcelogin command + CommandDescription.builder() + .parent(authmeBase) + .labels("forcelogin", "login") + .description("Enforce login player") + .detailedDescription("Enforce the specified player to login.") + .withArgument("player", "Online player name", OPTIONAL) + .permission(AdminPermission.FORCE_LOGIN) + .executableCommand(ForceLoginCommand.class) + .register(); + + // Register the changepassword command + CommandDescription.builder() + .parent(authmeBase) + .labels("password", "changepassword", "changepass", "cp") + .description("Change a player's password") + .detailedDescription("Change the password of a player.") + .withArgument("player", "Player name", MANDATORY) + .withArgument("pwd", "New password", MANDATORY) + .permission(AdminPermission.CHANGE_PASSWORD) + .executableCommand(ChangePasswordAdminCommand.class) + .register(); + + // Register the last login command + CommandDescription.builder() + .parent(authmeBase) + .labels("lastlogin", "ll") + .description("Player's last login") + .detailedDescription("View the date of the specified players last login.") + .withArgument("player", "Player name", OPTIONAL) + .permission(AdminPermission.LAST_LOGIN) + .executableCommand(LastLoginCommand.class) + .register(); + + // Register the accounts command + CommandDescription.builder() + .parent(authmeBase) + .labels("accounts", "account") + .description("Display player accounts") + .detailedDescription("Display all accounts of a player by his player name or IP.") + .withArgument("player", "Player name or IP", OPTIONAL) + .permission(AdminPermission.ACCOUNTS) + .executableCommand(AccountsCommand.class) + .register(); + + // Register the getemail command + CommandDescription.builder() + .parent(authmeBase) + .labels("email", "mail", "getemail", "getmail") + .description("Display player's email") + .detailedDescription("Display the email address of the specified player if set.") + .withArgument("player", "Player name", OPTIONAL) + .permission(AdminPermission.GET_EMAIL) + .executableCommand(GetEmailCommand.class) + .register(); + + // Register the setemail command + CommandDescription.builder() + .parent(authmeBase) + .labels("setemail", "setmail", "chgemail", "chgmail") + .description("Change player's email") + .detailedDescription("Change the email address of the specified player.") + .withArgument("player", "Player name", MANDATORY) + .withArgument("email", "Player email", MANDATORY) + .permission(AdminPermission.CHANGE_EMAIL) + .executableCommand(SetEmailCommand.class) + .register(); + + // Register the getip command + CommandDescription.builder() + .parent(authmeBase) + .labels("getip", "ip") + .description("Get player's IP") + .detailedDescription("Get the IP address of the specified online player.") + .withArgument("player", "Player name", MANDATORY) + .permission(AdminPermission.GET_IP) + .executableCommand(GetIpCommand.class) + .register(); + + // Register totp command + CommandDescription.builder() + .parent(authmeBase) + .labels("totp", "2fa") + .description("See if a player has enabled TOTP") + .detailedDescription("Returns whether the specified player has enabled two-factor authentication.") + .withArgument("player", "Player name", MANDATORY) + .permission(AdminPermission.VIEW_TOTP_STATUS) + .executableCommand(TotpViewStatusCommand.class) + .register(); + + // Register disable totp command + CommandDescription.builder() + .parent(authmeBase) + .labels("disabletotp", "disable2fa", "deletetotp", "delete2fa") + .description("Delete TOTP token of a player") + .detailedDescription("Disable two-factor authentication for a player.") + .withArgument("player", "Player name", MANDATORY) + .permission(AdminPermission.DISABLE_TOTP) + .executableCommand(TotpDisableAdminCommand.class) + .register(); + + // Register the spawn command + CommandDescription.builder() + .parent(authmeBase) + .labels("spawn", "home") + .description("Teleport to spawn") + .detailedDescription("Teleport to the spawn.") + .permission(AdminPermission.SPAWN) + .executableCommand(SpawnCommand.class) + .register(); + + // Register the setspawn command + CommandDescription.builder() + .parent(authmeBase) + .labels("setspawn", "chgspawn") + .description("Change the spawn") + .detailedDescription("Change the player's spawn to your current position.") + .permission(AdminPermission.SET_SPAWN) + .executableCommand(SetSpawnCommand.class) + .register(); + + // Register the firstspawn command + CommandDescription.builder() + .parent(authmeBase) + .labels("firstspawn", "firsthome") + .description("Teleport to first spawn") + .detailedDescription("Teleport to the first spawn.") + .permission(AdminPermission.FIRST_SPAWN) + .executableCommand(FirstSpawnCommand.class) + .register(); + + // Register the setfirstspawn command + CommandDescription.builder() + .parent(authmeBase) + .labels("setfirstspawn", "chgfirstspawn") + .description("Change the first spawn") + .detailedDescription("Change the first player's spawn to your current position.") + .permission(AdminPermission.SET_FIRST_SPAWN) + .executableCommand(SetFirstSpawnCommand.class) + .register(); + + // Register the purge command + CommandDescription.builder() + .parent(authmeBase) + .labels("purge", "delete") + .description("Purge old data") + .detailedDescription("Purge old AuthMeReloaded data longer than the specified number of days ago.") + .withArgument("days", "Number of days", MANDATORY) + .permission(AdminPermission.PURGE) + .executableCommand(PurgeCommand.class) + .register(); + + // Purge player command + CommandDescription.builder() + .parent(authmeBase) + .labels("purgeplayer") + .description("Purges the data of one player") + .detailedDescription("Purges data of the given player.") + .withArgument("player", "The player to purge", MANDATORY) + .withArgument("options", "'force' to run without checking if player is registered", OPTIONAL) + .permission(AdminPermission.PURGE_PLAYER) + .executableCommand(PurgePlayerCommand.class) + .register(); + + // Backup command + CommandDescription.builder() + .parent(authmeBase) + .labels("backup") + .description("Perform a backup") + .detailedDescription("Creates a backup of the registered users.") + .permission(AdminPermission.BACKUP) + .executableCommand(BackupCommand.class) + .register(); + + // Register the purgelastposition command + CommandDescription.builder() + .parent(authmeBase) + .labels("resetpos", "purgelastposition", "purgelastpos", "resetposition", + "resetlastposition", "resetlastpos") + .description("Purge player's last position") + .detailedDescription("Purge the last know position of the specified player or all of them.") + .withArgument("player/*", "Player name or * for all players", MANDATORY) + .permission(AdminPermission.PURGE_LAST_POSITION) + .executableCommand(PurgeLastPositionCommand.class) + .register(); + + // Register the purgebannedplayers command + CommandDescription.builder() + .parent(authmeBase) + .labels("purgebannedplayers", "purgebannedplayer", "deletebannedplayers", "deletebannedplayer") + .description("Purge banned players data") + .detailedDescription("Purge all AuthMeReloaded data for banned players.") + .permission(AdminPermission.PURGE_BANNED_PLAYERS) + .executableCommand(PurgeBannedPlayersCommand.class) + .register(); + + // Register the switchantibot command + CommandDescription.builder() + .parent(authmeBase) + .labels("switchantibot", "toggleantibot", "antibot") + .description("Switch AntiBot mode") + .detailedDescription("Switch or toggle the AntiBot mode to the specified state.") + .withArgument("mode", "ON / OFF", OPTIONAL) + .permission(AdminPermission.SWITCH_ANTIBOT) + .executableCommand(SwitchAntiBotCommand.class) + .register(); + + // Register the reload command + CommandDescription.builder() + .parent(authmeBase) + .labels("reload", "rld") + .description("Reload plugin") + .detailedDescription("Reload the AuthMeReloaded plugin.") + .permission(AdminPermission.RELOAD) + .executableCommand(ReloadCommand.class) + .register(); + + // Register the version command + CommandDescription.builder() + .parent(authmeBase) + .labels("version", "ver", "v", "about", "info") + .description("Version info") + .detailedDescription("Show detailed information about the installed AuthMeReloaded version, the " + + "developers, contributors, and license.") + .executableCommand(VersionCommand.class) + .register(); + + CommandDescription.builder() + .parent(authmeBase) + .labels("converter", "convert", "conv") + .description("Converter command") + .detailedDescription("Converter command for AuthMeReloaded.") + .withArgument("job", "Conversion job: xauth / crazylogin / rakamak / " + + "royalauth / vauth / sqliteToSql / mysqlToSqlite / loginsecurity", OPTIONAL) + .permission(AdminPermission.CONVERTER) + .executableCommand(ConverterCommand.class) + .register(); + + CommandDescription.builder() + .parent(authmeBase) + .labels("messages", "msg") + .description("Add missing help messages") + .detailedDescription("Adds missing texts to the current help messages file.") + .permission(AdminPermission.UPDATE_MESSAGES) + .executableCommand(UpdateHelpMessagesCommand.class) + .register(); + + CommandDescription.builder() + .parent(authmeBase) + .labels("recent") + .description("See players who have recently logged in") + .detailedDescription("Shows the last players that have logged in.") + .permission(AdminPermission.SEE_RECENT_PLAYERS) + .executableCommand(RecentPlayersCommand.class) + .register(); + + CommandDescription.builder() + .parent(authmeBase) + .labels("debug", "dbg") + .description("Debug features") + .detailedDescription("Allows various operations for debugging.") + .withArgument("child", "The child to execute", OPTIONAL) + .withArgument("arg", "argument (depends on debug section)", OPTIONAL) + .withArgument("arg", "argument (depends on debug section)", OPTIONAL) + .permission(DebugSectionPermissions.DEBUG_COMMAND) + .executableCommand(DebugCommand.class) + .register(); + + return authmeBase; + } + + /** + * Creates a command description for {@code /email} including its children. + * + * @return the email base command description + */ + private CommandDescription buildEmailBaseCommand() { + // Register the base Email command + CommandDescription emailBase = CommandDescription.builder() + .parent(null) + .labels("email") + .description("Add email or recover password") + .detailedDescription("The AuthMeReloaded email command base.") + .executableCommand(EmailBaseCommand.class) + .register(); + + // Register the show command + CommandDescription.builder() + .parent(emailBase) + .labels("show", "myemail") + .description("Show Email") + .detailedDescription("Show your current email address.") + .permission(PlayerPermission.SEE_EMAIL) + .executableCommand(ShowEmailCommand.class) + .register(); + + // Register the add command + CommandDescription.builder() + .parent(emailBase) + .labels("add", "addemail", "addmail") + .description("Add Email") + .detailedDescription("Add a new email address to your account.") + .withArgument("email", "Email address", MANDATORY) + .withArgument("verifyEmail", "Email address verification", MANDATORY) + .permission(PlayerPermission.ADD_EMAIL) + .executableCommand(AddEmailCommand.class) + .register(); + + // Register the change command + CommandDescription.builder() + .parent(emailBase) + .labels("change", "changeemail", "changemail") + .description("Change Email") + .detailedDescription("Change an email address of your account.") + .withArgument("oldEmail", "Old email address", MANDATORY) + .withArgument("newEmail", "New email address", MANDATORY) + .permission(PlayerPermission.CHANGE_EMAIL) + .executableCommand(ChangeEmailCommand.class) + .register(); + + // Register the recover command + CommandDescription.builder() + .parent(emailBase) + .labels("recover", "recovery", "recoveremail", "recovermail") + .description("Recover password using email") + .detailedDescription("Recover your account using an Email address by sending a mail containing " + + "a new password.") + .withArgument("email", "Email address", MANDATORY) + .permission(PlayerPermission.RECOVER_EMAIL) + .executableCommand(RecoverEmailCommand.class) + .register(); + + // Register the process recovery code command + CommandDescription.builder() + .parent(emailBase) + .labels("code") + .description("Submit code to recover password") + .detailedDescription("Recover your account by submitting a code delivered to your email.") + .withArgument("code", "Recovery code", MANDATORY) + .permission(PlayerPermission.RECOVER_EMAIL) + .executableCommand(ProcessCodeCommand.class) + .register(); + + // Register the change password after recovery command + CommandDescription.builder() + .parent(emailBase) + .labels("setpassword") + .description("Set new password after recovery") + .detailedDescription("Set a new password after successfully recovering your account.") + .withArgument("password", "New password", MANDATORY) + .permission(PlayerPermission.RECOVER_EMAIL) + .executableCommand(EmailSetPasswordCommand.class) + .register(); + + return emailBase; + } + + /** + * Creates a command description object for {@code /totp} including its children. + * + * @return the totp base command description + */ + private CommandDescription buildTotpBaseCommand() { + // Register the base totp command + CommandDescription totpBase = CommandDescription.builder() + .parent(null) + .labels("totp", "2fa") + .description("TOTP commands") + .detailedDescription("Performs actions related to two-factor authentication.") + .executableCommand(TotpBaseCommand.class) + .register(); + + // Register the base totp code + CommandDescription.builder() + .parent(totpBase) + .labels("code", "c") + .description("Command for logging in") + .detailedDescription("Processes the two-factor authentication code during login.") + .withArgument("code", "The TOTP code to use to log in", MANDATORY) + .executableCommand(TotpCodeCommand.class) + .register(); + + // Register totp add + CommandDescription.builder() + .parent(totpBase) + .labels("add") + .description("Enables TOTP") + .detailedDescription("Enables two-factor authentication for your account.") + .permission(PlayerPermission.ENABLE_TWO_FACTOR_AUTH) + .executableCommand(AddTotpCommand.class) + .register(); + + // Register totp confirm + CommandDescription.builder() + .parent(totpBase) + .labels("confirm") + .description("Enables TOTP after successful code") + .detailedDescription("Saves the generated TOTP secret after confirmation.") + .withArgument("code", "Code from the given secret from /totp add", MANDATORY) + .permission(PlayerPermission.ENABLE_TWO_FACTOR_AUTH) + .executableCommand(ConfirmTotpCommand.class) + .register(); + + // Register totp remove + CommandDescription.builder() + .parent(totpBase) + .labels("remove") + .description("Removes TOTP") + .detailedDescription("Disables two-factor authentication for your account.") + .withArgument("code", "Current 2FA code", MANDATORY) + .permission(PlayerPermission.DISABLE_TWO_FACTOR_AUTH) + .executableCommand(RemoveTotpCommand.class) + .register(); + + return totpBase; + } + + /** + * Sets the help command on all base commands, e.g. to register /authme help or /register help. + * + * @param commands the list of base commands to register a help child command on + */ + private void setHelpOnAllBases(Collection commands) { + final List helpCommandLabels = Arrays.asList("help", "hlp", "h", "sos", "?"); + + for (CommandDescription base : commands) { + CommandDescription.builder() + .parent(base) + .labels(helpCommandLabels) + .description("View help") + .detailedDescription("View detailed help for /" + base.getLabels().get(0) + " commands.") + .withArgument("query", "The command or query to view help for.", OPTIONAL) + .executableCommand(HelpCommand.class) + .register(); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandMapper.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandMapper.java new file mode 100644 index 0000000000..5beb5e33e2 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandMapper.java @@ -0,0 +1,207 @@ +package fr.xephi.authme.command; + +import fr.xephi.authme.command.executable.HelpCommand; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.util.StringUtils; +import fr.xephi.authme.util.Utils; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +import static fr.xephi.authme.command.FoundResultStatus.INCORRECT_ARGUMENTS; +import static fr.xephi.authme.command.FoundResultStatus.MISSING_BASE_COMMAND; +import static fr.xephi.authme.command.FoundResultStatus.UNKNOWN_LABEL; + +/** + * Maps incoming command parts to the correct {@link CommandDescription}. + */ +public class CommandMapper { + + /** + * The class of the help command, to which the base label should also be passed in the arguments. + */ + private static final Class HELP_COMMAND_CLASS = HelpCommand.class; + + private final Collection baseCommands; + private final PermissionsManager permissionsManager; + + @Inject + public CommandMapper(CommandInitializer commandInitializer, PermissionsManager permissionsManager) { + this.baseCommands = commandInitializer.getCommands(); + this.permissionsManager = permissionsManager; + } + + + /** + * Map incoming command parts to a command. This processes all parts and distinguishes the labels from arguments. + * + * @param sender The command sender (null if none applicable) + * @param parts The parts to map to commands and arguments + * @return The generated {@link FoundCommandResult} + */ + public FoundCommandResult mapPartsToCommand(CommandSender sender, List parts) { + if (Utils.isCollectionEmpty(parts)) { + return new FoundCommandResult(null, parts, null, 0.0, MISSING_BASE_COMMAND); + } + + CommandDescription base = getBaseCommand(parts.get(0)); + if (base == null) { + return new FoundCommandResult(null, parts, null, 0.0, MISSING_BASE_COMMAND); + } + + // Prefer labels: /register help goes to "Help command", not "Register command" with argument 'help' + List remainingParts = parts.subList(1, parts.size()); + CommandDescription childCommand = getSuitableChild(base, remainingParts); + if (childCommand != null) { + FoundResultStatus status = getPermissionAwareStatus(sender, childCommand); + FoundCommandResult result = new FoundCommandResult( + childCommand, parts.subList(0, 2), parts.subList(2, parts.size()), 0.0, status); + return transformResultForHelp(result); + } else if (hasSuitableArgumentCount(base, remainingParts.size())) { + FoundResultStatus status = getPermissionAwareStatus(sender, base); + return new FoundCommandResult(base, parts.subList(0, 1), parts.subList(1, parts.size()), 0.0, status); + } + + return getCommandWithSmallestDifference(base, parts); + } + + /** + * Return all {@link ExecutableCommand} classes referenced in {@link CommandDescription} objects. + * + * @return all classes + * @see CommandInitializer#getCommands + */ + public Set> getCommandClasses() { + Set> classes = new HashSet<>(50); + for (CommandDescription command : baseCommands) { + classes.add(command.getExecutableCommand()); + for (CommandDescription child : command.getChildren()) { + classes.add(child.getExecutableCommand()); + } + } + return classes; + } + + /** + * Return the command whose label matches the given parts the best. This method is called when + * a successful mapping could not be performed. + * + * @param base the base command + * @param parts the command parts + * @return the closest result + */ + private static FoundCommandResult getCommandWithSmallestDifference(CommandDescription base, List parts) { + // Return the base command with incorrect arg count error if we only have one part + if (parts.size() <= 1) { + return new FoundCommandResult(base, parts, new ArrayList<>(), 0.0, INCORRECT_ARGUMENTS); + } + + final String childLabel = parts.get(1); + double minDifference = Double.POSITIVE_INFINITY; + CommandDescription closestCommand = null; + + for (CommandDescription child : base.getChildren()) { + double difference = getLabelDifference(child, childLabel); + if (difference < minDifference) { + minDifference = difference; + closestCommand = child; + } + } + + // base command may have no children, in which case we return the base command with incorrect arguments error + if (closestCommand == null) { + return new FoundCommandResult( + base, parts.subList(0, 1), parts.subList(1, parts.size()), 0.0, INCORRECT_ARGUMENTS); + } + + FoundResultStatus status = (minDifference == 0.0) ? INCORRECT_ARGUMENTS : UNKNOWN_LABEL; + final int partsSize = parts.size(); + List labels = parts.subList(0, Math.min(closestCommand.getLabelCount(), partsSize)); + List arguments = (labels.size() == partsSize) + ? new ArrayList<>() + : parts.subList(labels.size(), partsSize); + + return new FoundCommandResult(closestCommand, labels, arguments, minDifference, status); + } + + private CommandDescription getBaseCommand(String label) { + String baseLabel = label.toLowerCase(Locale.ROOT); + if (baseLabel.startsWith("authme:")) { + baseLabel = baseLabel.substring("authme:".length()); + } + for (CommandDescription command : baseCommands) { + if (command.hasLabel(baseLabel)) { + return command; + } + } + return null; + } + + /** + * Return a child from a base command if the label and the argument count match. + * + * @param baseCommand The base command whose children should be checked + * @param parts The command parts received from the invocation; the first item is the potential label and any + * other items are command arguments. The first initial part that led to the base command should not + * be present. + * + * @return A command if there was a complete match (including proper argument count), null otherwise + */ + private static CommandDescription getSuitableChild(CommandDescription baseCommand, List parts) { + if (Utils.isCollectionEmpty(parts)) { + return null; + } + + final String label = parts.get(0).toLowerCase(Locale.ROOT); + final int argumentCount = parts.size() - 1; + + for (CommandDescription child : baseCommand.getChildren()) { + if (child.hasLabel(label) && hasSuitableArgumentCount(child, argumentCount)) { + return child; + } + } + return null; + } + + private static FoundCommandResult transformResultForHelp(FoundCommandResult result) { + if (result.getCommandDescription() != null + && HELP_COMMAND_CLASS == result.getCommandDescription().getExecutableCommand()) { + // For "/authme help register" we have labels = [authme, help] and arguments = [register] + // But for the help command we want labels = [authme, help] and arguments = [authme, register], + // so we can use the arguments as the labels to the command to show help for + List arguments = new ArrayList<>(result.getArguments()); + arguments.add(0, result.getLabels().get(0)); + return new FoundCommandResult(result.getCommandDescription(), result.getLabels(), + arguments, result.getDifference(), result.getResultStatus()); + } + return result; + } + + private FoundResultStatus getPermissionAwareStatus(CommandSender sender, CommandDescription command) { + if (sender != null && !permissionsManager.hasPermission(sender, command.getPermission())) { + return FoundResultStatus.NO_PERMISSION; + } + return FoundResultStatus.SUCCESS; + } + + private static boolean hasSuitableArgumentCount(CommandDescription command, int argumentCount) { + int minArgs = CommandUtils.getMinNumberOfArguments(command); + int maxArgs = CommandUtils.getMaxNumberOfArguments(command); + + return argumentCount >= minArgs && argumentCount <= maxArgs; + } + + private static double getLabelDifference(CommandDescription command, String givenLabel) { + return command.getLabels().stream() + .map(label -> StringUtils.getDifference(label, givenLabel)) + .min(Double::compareTo) + .orElseThrow(() -> new IllegalStateException("Command does not have any labels set")); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandUtils.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandUtils.java new file mode 100644 index 0000000000..595f23aba5 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/CommandUtils.java @@ -0,0 +1,109 @@ +package fr.xephi.authme.command; + +import com.google.common.collect.Lists; +import org.bukkit.ChatColor; + +import java.util.ArrayList; +import java.util.List; + +/** + * Utility functions for {@link CommandDescription} objects. + */ +public final class CommandUtils { + + private CommandUtils() { + } + + /** + * Returns the minimum number of arguments required for running the command (= number of mandatory arguments). + * + * @param command the command to process + * @return min number of arguments required by the command + */ + public static int getMinNumberOfArguments(CommandDescription command) { + int mandatoryArguments = 0; + for (CommandArgumentDescription argument : command.getArguments()) { + if (!argument.isOptional()) { + ++mandatoryArguments; + } + } + return mandatoryArguments; + } + + /** + * Returns the maximum number of arguments the command accepts. + * + * @param command the command to process + * @return max number of arguments that may be passed to the command + */ + public static int getMaxNumberOfArguments(CommandDescription command) { + return command.getArguments().size(); + } + + /** + * Constructs a hierarchical list of commands for the given command. The commands are in order: + * the parents of the given command precede the provided command. For example, given the command + * for {@code /authme register}, a list with {@code [{authme}, {authme register}]} is returned. + * + * @param command the command to build a parent list for + * @return the parent list + */ + public static List constructParentList(CommandDescription command) { + List commands = new ArrayList<>(); + CommandDescription currentCommand = command; + while (currentCommand != null) { + commands.add(currentCommand); + currentCommand = currentCommand.getParent(); + } + return Lists.reverse(commands); + } + + /** + * Returns a textual representation of the command, e.g. {@code /authme register}. + * + * @param command the command to create the path for + * @return the command string + */ + public static String constructCommandPath(CommandDescription command) { + StringBuilder sb = new StringBuilder(); + String prefix = "/"; + for (CommandDescription ancestor : constructParentList(command)) { + sb.append(prefix).append(ancestor.getLabels().get(0)); + prefix = " "; + } + return sb.toString(); + } + + /** + * Constructs a command path with color formatting, based on the supplied labels. This includes + * the command's arguments, as defined in the provided command description. The list of labels + * must contain all labels to be used. + * + * @param command the command to read arguments from + * @param correctLabels the labels to use (must be complete) + * @return formatted command syntax incl. arguments + */ + public static String buildSyntax(CommandDescription command, List correctLabels) { + StringBuilder commandSyntax = new StringBuilder(ChatColor.WHITE + "/" + correctLabels.get(0) + ChatColor.YELLOW); + for (int i = 1; i < correctLabels.size(); ++i) { + commandSyntax.append(" ").append(correctLabels.get(i)); + } + for (CommandArgumentDescription argument : command.getArguments()) { + commandSyntax.append(" ").append(formatArgument(argument)); + } + return commandSyntax.toString(); + } + + /** + * Formats a command argument with the proper type of brackets. + * + * @param argument the argument to format + * @return the formatted argument + */ + public static String formatArgument(CommandArgumentDescription argument) { + if (argument.isOptional()) { + return "[" + argument.getName() + "]"; + } + return "<" + argument.getName() + ">"; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/ExecutableCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/ExecutableCommand.java new file mode 100644 index 0000000000..54ee9e8464 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/ExecutableCommand.java @@ -0,0 +1,31 @@ +package fr.xephi.authme.command; + +import fr.xephi.authme.message.MessageKey; +import org.bukkit.command.CommandSender; + +import java.util.List; + +/** + * Base class for AuthMe commands that can be executed. + */ +public interface ExecutableCommand { + + /** + * Executes the command with the given arguments. + * + * @param sender the command sender (initiator of the command) + * @param arguments the arguments + */ + void executeCommand(CommandSender sender, List arguments); + + /** + * Returns the message to show to the user if the command is used with the wrong arguments. + * If null is returned, the standard help (/command help) output is shown. + * + * @return the message explaining the command's usage, or {@code null} for default behavior + */ + default MessageKey getArgumentsMismatchMessage() { + return null; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/FoundCommandResult.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/FoundCommandResult.java new file mode 100644 index 0000000000..520eec2433 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/FoundCommandResult.java @@ -0,0 +1,79 @@ +package fr.xephi.authme.command; + +import java.util.List; + +/** + * Result of a command mapping by {@link CommandHandler}. An object of this class represents a successful mapping + * as well as erroneous ones, as communicated with {@link FoundResultStatus}. + *

+ * Fields other than {@link FoundResultStatus} are available depending, among other factors, on the status: + *

+ */ +public class FoundCommandResult { + + /** + * The command description instance. + */ + private final CommandDescription commandDescription; + /** + * The labels used to invoke the command. This may be different for the same {@link ExecutableCommand} instance + * if multiple labels have been defined, e.g. "/authme register" and "/authme reg". + */ + private final List labels; + /** The command arguments. */ + private final List arguments; + /** The difference between the matched command and the supplied labels. */ + private final double difference; + /** The status of the result (see class description). */ + private final FoundResultStatus resultStatus; + + /** + * Constructor. + * + * @param commandDescription The command description. + * @param labels The labels used to access the command. + * @param arguments The command arguments. + * @param difference The difference between the supplied labels and the matched command. + * @param resultStatus The status of the result. + */ + public FoundCommandResult(CommandDescription commandDescription, List labels, List arguments, + double difference, FoundResultStatus resultStatus) { + this.commandDescription = commandDescription; + this.labels = labels; + this.arguments = arguments; + this.difference = difference; + this.resultStatus = resultStatus; + } + + public CommandDescription getCommandDescription() { + return this.commandDescription; + } + + public List getArguments() { + return this.arguments; + } + + public List getLabels() { + return this.labels; + } + + public double getDifference() { + return difference; + } + + public FoundResultStatus getResultStatus() { + return resultStatus; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/FoundResultStatus.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/FoundResultStatus.java new file mode 100644 index 0000000000..32ca6b7b2d --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/FoundResultStatus.java @@ -0,0 +1,18 @@ +package fr.xephi.authme.command; + +/** + * Result status for mapping command parts. See {@link FoundCommandResult} for a detailed description of the states. + */ +public enum FoundResultStatus { + + SUCCESS, + + INCORRECT_ARGUMENTS, + + UNKNOWN_LABEL, + + NO_PERMISSION, + + MISSING_BASE_COMMAND + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/PlayerCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/PlayerCommand.java new file mode 100644 index 0000000000..8ce6e05fcb --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/PlayerCommand.java @@ -0,0 +1,45 @@ +package fr.xephi.authme.command; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.List; + +/** + * Common base type for player-only commands, handling the verification that the command sender is indeed a player. + */ +public abstract class PlayerCommand implements ExecutableCommand { + + @Override + public void executeCommand(CommandSender sender, List arguments) { + if (sender instanceof Player) { + runCommand((Player) sender, arguments); + } else { + String alternative = getAlternativeCommand(); + if (alternative != null) { + sender.sendMessage("Player only! Please use " + alternative + " instead."); + } else { + sender.sendMessage("This command is only for players."); + } + } + } + + /** + * Runs the command with the given player and arguments. + * + * @param player the player who initiated the command + * @param arguments the arguments supplied with the command + */ + protected abstract void runCommand(Player player, List arguments); + + /** + * Returns an alternative command (textual representation) that is not restricted to players only. + * Example: {@code "/authme register "} + * + * @return Alternative command not restricted to players, or null if not applicable + */ + protected String getAlternativeCommand() { + return null; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/TabCompleteHandler.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/TabCompleteHandler.java new file mode 100644 index 0000000000..363900843d --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/TabCompleteHandler.java @@ -0,0 +1,17 @@ +package fr.xephi.authme.command; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class TabCompleteHandler implements TabCompleter { + + @Override + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { + return new ArrayList<>(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/HelpCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/HelpCommand.java new file mode 100644 index 0000000000..118994f072 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/HelpCommand.java @@ -0,0 +1,64 @@ +package fr.xephi.authme.command.executable; + +import fr.xephi.authme.command.CommandMapper; +import fr.xephi.authme.command.CommandUtils; +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.command.FoundCommandResult; +import fr.xephi.authme.command.FoundResultStatus; +import fr.xephi.authme.command.help.HelpProvider; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.List; + +import static fr.xephi.authme.command.FoundResultStatus.MISSING_BASE_COMMAND; +import static fr.xephi.authme.command.FoundResultStatus.UNKNOWN_LABEL; +import static fr.xephi.authme.command.help.HelpProvider.ALL_OPTIONS; +import static fr.xephi.authme.command.help.HelpProvider.SHOW_ALTERNATIVES; +import static fr.xephi.authme.command.help.HelpProvider.SHOW_CHILDREN; +import static fr.xephi.authme.command.help.HelpProvider.SHOW_COMMAND; +import static fr.xephi.authme.command.help.HelpProvider.SHOW_DESCRIPTION; + +/** + * Displays help information to a user. + */ +public class HelpCommand implements ExecutableCommand { + + @Inject + private CommandMapper commandMapper; + + @Inject + private HelpProvider helpProvider; + + + // Convention: arguments is not the actual invoked arguments but the command that was invoked, + // e.g. "/authme help register" would typically be arguments = [register], but here we pass [authme, register] + @Override + public void executeCommand(CommandSender sender, List arguments) { + FoundCommandResult result = commandMapper.mapPartsToCommand(sender, arguments); + + FoundResultStatus resultStatus = result.getResultStatus(); + if (MISSING_BASE_COMMAND.equals(resultStatus)) { + sender.sendMessage(ChatColor.DARK_RED + "Could not get base command"); + return; + } else if (UNKNOWN_LABEL.equals(resultStatus)) { + if (result.getCommandDescription() == null) { + sender.sendMessage(ChatColor.DARK_RED + "Unknown command"); + return; + } else { + sender.sendMessage(ChatColor.GOLD + "Assuming " + ChatColor.WHITE + + CommandUtils.constructCommandPath(result.getCommandDescription())); + } + } + + int mappedCommandLevel = result.getCommandDescription().getLabelCount(); + if (mappedCommandLevel == 1) { + helpProvider.outputHelp(sender, result, + SHOW_COMMAND | SHOW_DESCRIPTION | SHOW_CHILDREN | SHOW_ALTERNATIVES); + } else { + helpProvider.outputHelp(sender, result, ALL_OPTIONS); + } + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/AccountsCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/AccountsCommand.java new file mode 100644 index 0000000000..20f6bff8ab --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/AccountsCommand.java @@ -0,0 +1,74 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.List; +import java.util.Locale; + +/** + * Shows all accounts registered by the same IP address for the given player name or IP address. + */ +public class AccountsCommand implements ExecutableCommand { + + @Inject + private DataSource dataSource; + + @Inject + private BukkitService bukkitService; + + @Inject + private CommonService commonService; + + @Override + public void executeCommand(final CommandSender sender, List arguments) { + // TODO #1366: last IP vs. registration IP? + final String playerName = arguments.isEmpty() ? sender.getName() : arguments.get(0); + + // Assumption: a player name cannot contain '.' + if (playerName.contains(".")) { + bukkitService.runTaskAsynchronously(() -> { + List accountList = dataSource.getAllAuthsByIp(playerName); + if (accountList.isEmpty()) { + sender.sendMessage("[AuthMe] This IP does not exist in the database."); + } else if (accountList.size() == 1) { + sender.sendMessage("[AuthMe] " + playerName + " is a single account player"); + } else { + outputAccountsList(sender, playerName, accountList); + } + }); + } else { + bukkitService.runTaskAsynchronously(() -> { + PlayerAuth auth = dataSource.getAuth(playerName.toLowerCase(Locale.ROOT)); + if (auth == null) { + commonService.send(sender, MessageKey.UNKNOWN_USER); + return; + } else if (auth.getLastIp() == null) { + sender.sendMessage("No known last IP address for player"); + return; + } + + List accountList = dataSource.getAllAuthsByIp(auth.getLastIp()); + if (accountList.isEmpty()) { + commonService.send(sender, MessageKey.UNKNOWN_USER); + } else if (accountList.size() == 1) { + sender.sendMessage("[AuthMe] " + playerName + " is a single account player"); + } else { + outputAccountsList(sender, playerName, accountList); + } + }); + } + } + + private static void outputAccountsList(CommandSender sender, String playerName, List accountList) { + sender.sendMessage("[AuthMe] " + playerName + " has " + accountList.size() + " accounts."); + String message = "[AuthMe] " + String.join(", ", accountList) + "."; + sender.sendMessage(message); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/AuthMeCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/AuthMeCommand.java new file mode 100644 index 0000000000..2648177eb5 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/AuthMeCommand.java @@ -0,0 +1,24 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.command.ExecutableCommand; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import java.util.List; + +/** + * AuthMe base command; shows the version and some command pointers. + */ +public class AuthMeCommand implements ExecutableCommand { + + @Override + public void executeCommand(CommandSender sender, List arguments) { + sender.sendMessage(ChatColor.GREEN + "This server is running " + AuthMe.getPluginName() + " v" + + AuthMe.getPluginVersion() + " b" + AuthMe.getPluginBuildNumber()+ "! " + ChatColor.RED + "<3"); + sender.sendMessage(ChatColor.YELLOW + "Use the command " + ChatColor.GOLD + "/authme help" + ChatColor.YELLOW + + " to view help."); + sender.sendMessage(ChatColor.YELLOW + "Use the command " + ChatColor.GOLD + "/authme about" + ChatColor.YELLOW + + " to view about."); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/BackupCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/BackupCommand.java new file mode 100644 index 0000000000..0e72fb6009 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/BackupCommand.java @@ -0,0 +1,23 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.service.BackupService; +import fr.xephi.authme.service.BackupService.BackupCause; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.List; + +/** + * Command to perform a backup. + */ +public class BackupCommand implements ExecutableCommand { + + @Inject + private BackupService backupService; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + backupService.doBackup(BackupCause.COMMAND, sender); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/ChangePasswordAdminCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/ChangePasswordAdminCommand.java new file mode 100644 index 0000000000..3c6264cc10 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/ChangePasswordAdminCommand.java @@ -0,0 +1,41 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.process.Management; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.service.ValidationService.ValidationResult; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.List; + +/** + * Admin command for changing a player's password. + */ +public class ChangePasswordAdminCommand implements ExecutableCommand { + + @Inject + private ValidationService validationService; + + @Inject + private CommonService commonService; + + @Inject + private Management management; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + // Get the player and password + final String playerName = arguments.get(0); + final String playerPass = arguments.get(1); + + // Validate the password + ValidationResult validationResult = validationService.validatePassword(playerPass, playerName); + if (validationResult.hasError()) { + commonService.send(sender, validationResult.getMessageKey(), validationResult.getArgs()); + } else { + management.performPasswordChangeAsAdmin(sender, playerName, playerPass); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/ConverterCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/ConverterCommand.java new file mode 100644 index 0000000000..15875ac9b3 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/ConverterCommand.java @@ -0,0 +1,95 @@ +package fr.xephi.authme.command.executable.authme; + +import ch.jalu.injector.factory.Factory; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableSortedMap; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.datasource.converter.Converter; +import fr.xephi.authme.datasource.converter.CrazyLoginConverter; +import fr.xephi.authme.datasource.converter.H2ToSqlite; +import fr.xephi.authme.datasource.converter.LoginSecurityConverter; +import fr.xephi.authme.datasource.converter.MySqlToSqlite; +import fr.xephi.authme.datasource.converter.RoyalAuthConverter; +import fr.xephi.authme.datasource.converter.SqliteToH2; +import fr.xephi.authme.datasource.converter.SqliteToSql; +import fr.xephi.authme.datasource.converter.XAuthConverter; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +/** + * Converter command: launches conversion based on its parameters. + */ +public class ConverterCommand implements ExecutableCommand { + + @VisibleForTesting + static final Map> CONVERTERS = getConverters(); + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(ConverterCommand.class); + + @Inject + private CommonService commonService; + + @Inject + private BukkitService bukkitService; + + @Inject + private Factory converterFactory; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + Class converterClass = getConverterClassFromArgs(arguments); + if (converterClass == null) { + sender.sendMessage("Converters: " + String.join(", ", CONVERTERS.keySet())); + return; + } + + // Get the proper converter instance + final Converter converter = converterFactory.newInstance(converterClass); + + // Run the convert job + bukkitService.runTaskAsynchronously(() -> { + try { + converter.execute(sender); + } catch (Exception e) { + commonService.send(sender, MessageKey.ERROR); + logger.logException("Error during conversion:", e); + } + }); + + // Show a status message + sender.sendMessage("[AuthMe] Successfully started " + arguments.get(0)); + } + + private static Class getConverterClassFromArgs(List arguments) { + return arguments.isEmpty() + ? null + : CONVERTERS.get(arguments.get(0).toLowerCase(Locale.ROOT)); + } + + /** + * Initializes a map with all available converters. + * + * @return map with all available converters + */ + private static Map> getConverters() { + return ImmutableSortedMap.>naturalOrder() + .put("xauth", XAuthConverter.class) + .put("crazylogin", CrazyLoginConverter.class) + .put("royalauth", RoyalAuthConverter.class) + .put("sqlitetosql", SqliteToSql.class) + .put("mysqltosqlite", MySqlToSqlite.class) + .put("sqlitetoh2", SqliteToH2.class) + .put("h2tosqlite", H2ToSqlite.class) + .put("loginsecurity", LoginSecurityConverter.class) + .build(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/FirstSpawnCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/FirstSpawnCommand.java new file mode 100644 index 0000000000..9eba3d1510 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/FirstSpawnCommand.java @@ -0,0 +1,35 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.SpawnLoader; +import fr.xephi.authme.util.TeleportUtils; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Teleports the player to the first spawn. + */ +public class FirstSpawnCommand extends PlayerCommand { + @Inject + private Settings settings; + @Inject + private SpawnLoader spawnLoader; + @Inject + private BukkitService bukkitService; + @Override + public void runCommand(Player player, List arguments) { + if (spawnLoader.getFirstSpawn() == null) { + player.sendMessage("[AuthMe] First spawn has failed, please try to define the first spawn"); + } else { + //String name= player.getName(); + bukkitService.runTaskIfFolia(player, () -> { + TeleportUtils.teleport(player, spawnLoader.getFirstSpawn()); + }); + //player.teleport(spawnLoader.getFirstSpawn()); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/ForceLoginCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/ForceLoginCommand.java new file mode 100644 index 0000000000..3adcad45e1 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/ForceLoginCommand.java @@ -0,0 +1,44 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.process.Management; +import fr.xephi.authme.service.BukkitService; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +import static fr.xephi.authme.permission.PlayerPermission.CAN_LOGIN_BE_FORCED; + +/** + * Forces the login of a player, i.e. logs the player in without the need of a (correct) password. + */ +public class ForceLoginCommand implements ExecutableCommand { + + @Inject + private PermissionsManager permissionsManager; + + @Inject + private Management management; + + @Inject + private BukkitService bukkitService; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + // Get the player query + String playerName = arguments.isEmpty() ? sender.getName() : arguments.get(0); + + Player player = bukkitService.getPlayerExact(playerName); + if (player == null || !player.isOnline()) { + sender.sendMessage("Player needs to be online!"); + } else if (!permissionsManager.hasPermission(player, CAN_LOGIN_BE_FORCED)) { + sender.sendMessage("You cannot force login the player " + playerName + "!"); + } else { + management.forceLogin(player); + sender.sendMessage("Force login for " + playerName + " performed!"); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/GetEmailCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/GetEmailCommand.java new file mode 100644 index 0000000000..b669143877 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/GetEmailCommand.java @@ -0,0 +1,35 @@ +package fr.xephi.authme.command.executable.authme; + +import ch.jalu.datasourcecolumns.data.DataSourceValue; +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.service.CommonService; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.List; + +/** + * Returns a player's email. + */ +public class GetEmailCommand implements ExecutableCommand { + + @Inject + private DataSource dataSource; + + @Inject + private CommonService commonService; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + String playerName = arguments.isEmpty() ? sender.getName() : arguments.get(0); + + DataSourceValue email = dataSource.getEmail(playerName); + if (email.rowExists()) { + sender.sendMessage("[AuthMe] " + playerName + "'s email: " + email.getValue()); + } else { + commonService.send(sender, MessageKey.UNKNOWN_USER); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/GetIpCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/GetIpCommand.java new file mode 100644 index 0000000000..2e00c65e99 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/GetIpCommand.java @@ -0,0 +1,41 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.util.PlayerUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +public class GetIpCommand implements ExecutableCommand { + + @Inject + private BukkitService bukkitService; + + @Inject + private DataSource dataSource; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + String playerName = arguments.get(0); + Player player = bukkitService.getPlayerExact(playerName); + PlayerAuth auth = dataSource.getAuth(playerName); + + if (player != null) { + sender.sendMessage("Current IP of " + player.getName() + " is " + PlayerUtils.getPlayerIp(player) + + ":" + player.getAddress().getPort()); + } + + if (auth == null) { + String displayName = player == null ? playerName : player.getName(); + sender.sendMessage(displayName + " is not registered in the database"); + } else { + sender.sendMessage("Database: last IP: " + auth.getLastIp() + ", registration IP: " + + auth.getRegistrationIp()); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/LastLoginCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/LastLoginCommand.java new file mode 100644 index 0000000000..f522e80fb5 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/LastLoginCommand.java @@ -0,0 +1,56 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.service.CommonService; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.Date; +import java.util.List; + +/** + * Returns the last login date of the given user. + */ +public class LastLoginCommand implements ExecutableCommand { + + @Inject + private DataSource dataSource; + + @Inject + private CommonService commonService; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + // Get the player + String playerName = arguments.isEmpty() ? sender.getName() : arguments.get(0); + + PlayerAuth auth = dataSource.getAuth(playerName); + if (auth == null) { + commonService.send(sender, MessageKey.UNKNOWN_USER); + return; + } + + // Get the last login date + final Long lastLogin = auth.getLastLogin(); + final String lastLoginDate = lastLogin == null ? "never" : new Date(lastLogin).toString(); + + // Show the player status + sender.sendMessage("[AuthMe] " + playerName + " last login: " + lastLoginDate); + if (lastLogin != null) { + sender.sendMessage("[AuthMe] The player " + playerName + " last logged in " + + createLastLoginIntervalMessage(lastLogin) + " ago"); + } + sender.sendMessage("[AuthMe] Last player's IP: " + auth.getLastIp()); + } + + private static String createLastLoginIntervalMessage(long lastLogin) { + final long diff = System.currentTimeMillis() - lastLogin; + return (int) (diff / 86400000) + " days " + + (int) (diff / 3600000 % 24) + " hours " + + (int) (diff / 60000 % 60) + " mins " + + (int) (diff / 1000 % 60) + " secs"; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/PurgeBannedPlayersCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/PurgeBannedPlayersCommand.java new file mode 100644 index 0000000000..860ae73d21 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/PurgeBannedPlayersCommand.java @@ -0,0 +1,38 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.task.purge.PurgeService; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +/** + * Command for purging data of banned players. Depending on the settings + * it purges (deletes) data from third-party plugins as well. + */ +public class PurgeBannedPlayersCommand implements ExecutableCommand { + + @Inject + private PurgeService purgeService; + + @Inject + private BukkitService bukkitService; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + // Get the list of banned players + Set bannedPlayers = bukkitService.getBannedPlayers(); + Set namedBanned = new HashSet<>(bannedPlayers.size()); + for (OfflinePlayer offlinePlayer : bannedPlayers) { + namedBanned.add(offlinePlayer.getName().toLowerCase(Locale.ROOT)); + } + + purgeService.purgePlayers(sender, namedBanned, bannedPlayers.toArray(new OfflinePlayer[bannedPlayers.size()])); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/PurgeCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/PurgeCommand.java new file mode 100644 index 0000000000..1538061e90 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/PurgeCommand.java @@ -0,0 +1,51 @@ +package fr.xephi.authme.command.executable.authme; + +import com.google.common.primitives.Ints; +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.task.purge.PurgeService; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.Calendar; +import java.util.List; + +/** + * Command for purging the data of players which have not been online for a given number + * of days. Depending on the settings, this removes player data in third-party plugins as well. + */ +public class PurgeCommand implements ExecutableCommand { + + private static final int MINIMUM_LAST_SEEN_DAYS = 30; + + @Inject + private PurgeService purgeService; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + // Get the days parameter + String daysStr = arguments.get(0); + + // Convert the days string to an integer value, and make sure it's valid + Integer days = Ints.tryParse(daysStr); + if (days == null) { + sender.sendMessage(ChatColor.RED + "The value you've entered is invalid!"); + return; + } + + // Validate the value + if (days < MINIMUM_LAST_SEEN_DAYS) { + sender.sendMessage(ChatColor.RED + "You can only purge data older than " + + MINIMUM_LAST_SEEN_DAYS + " days"); + return; + } + + // Create a calender instance to determine the date + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DATE, -days); + long until = calendar.getTimeInMillis(); + + // Run the purge + purgeService.runPurge(sender, until); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/PurgeLastPositionCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/PurgeLastPositionCommand.java new file mode 100644 index 0000000000..4e20b0313e --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/PurgeLastPositionCommand.java @@ -0,0 +1,56 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.service.CommonService; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.List; + +/** + * Removes the stored last position of a user or of all. + */ +public class PurgeLastPositionCommand implements ExecutableCommand { + + @Inject + private DataSource dataSource; + + @Inject + private CommonService commonService; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + String playerName = arguments.isEmpty() ? sender.getName() : arguments.get(0); + + if ("*".equals(playerName)) { + for (PlayerAuth auth : dataSource.getAllAuths()) { + resetLastPosition(auth); + dataSource.updateQuitLoc(auth); + // TODO: send an update when a messaging service will be implemented (QUITLOC) + } + sender.sendMessage("All players last position locations are now reset"); + } else { + // Get the user auth and make sure the user exists + PlayerAuth auth = dataSource.getAuth(playerName); + if (auth == null) { + commonService.send(sender, MessageKey.UNKNOWN_USER); + return; + } + + resetLastPosition(auth); + dataSource.updateQuitLoc(auth); + // TODO: send an update when a messaging service will be implemented (QUITLOC) + sender.sendMessage(playerName + "'s last position location is now reset"); + } + } + + private static void resetLastPosition(PlayerAuth auth) { + auth.setQuitLocX(0d); + auth.setQuitLocY(0d); + auth.setQuitLocZ(0d); + auth.setWorld("world"); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/PurgePlayerCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/PurgePlayerCommand.java new file mode 100644 index 0000000000..e0bf9040fe --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/PurgePlayerCommand.java @@ -0,0 +1,47 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.task.purge.PurgeExecutor; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.List; +import java.util.Locale; + +import static java.util.Collections.singletonList; + +/** + * Command to purge a player. + */ +public class PurgePlayerCommand implements ExecutableCommand { + + @Inject + private PurgeExecutor purgeExecutor; + + @Inject + private BukkitService bukkitService; + + @Inject + private DataSource dataSource; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + String option = arguments.size() > 1 ? arguments.get(1) : null; + bukkitService.runTaskAsynchronously( + () -> executeCommand(sender, arguments.get(0), option)); + } + + private void executeCommand(CommandSender sender, String name, String option) { + if ("force".equals(option) || !dataSource.isAuthAvailable(name)) { + OfflinePlayer offlinePlayer = bukkitService.getOfflinePlayer(name); + purgeExecutor.executePurge(singletonList(offlinePlayer), singletonList(name.toLowerCase(Locale.ROOT))); + sender.sendMessage("Purged data for player " + name); + } else { + sender.sendMessage("This player is still registered! Are you sure you want to proceed? " + + "Use '/authme purgeplayer " + name + " force' to run the command anyway"); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/RecentPlayersCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/RecentPlayersCommand.java new file mode 100644 index 0000000000..3ae185e3e1 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/RecentPlayersCommand.java @@ -0,0 +1,55 @@ +package fr.xephi.authme.command.executable.authme; + +import com.google.common.annotations.VisibleForTesting; +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.List; + +import static java.time.Instant.ofEpochMilli; + +/** + * Command showing the most recent logged in players. + */ +public class RecentPlayersCommand implements ExecutableCommand { + + /** DateTime formatter, producing Strings such as "10:42 AM, 11 Jul". */ + private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("hh:mm a, dd MMM"); + + @Inject + private DataSource dataSource; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + List recentPlayers = dataSource.getRecentlyLoggedInPlayers(); + + sender.sendMessage(ChatColor.BLUE + "[AuthMe] Recently logged in players"); + for (PlayerAuth auth : recentPlayers) { + sender.sendMessage(formatPlayerMessage(auth)); + } + } + + @VisibleForTesting + ZoneId getZoneId() { + return ZoneId.systemDefault(); + } + + private String formatPlayerMessage(PlayerAuth auth) { + String lastLoginText; + if (auth.getLastLogin() == null) { + lastLoginText = "never"; + } else { + LocalDateTime lastLogin = LocalDateTime.ofInstant(ofEpochMilli(auth.getLastLogin()), getZoneId()); + lastLoginText = DATE_FORMAT.format(lastLogin); + } + + return "- " + auth.getRealName() + " (" + lastLoginText + " with IP " + auth.getLastIp() + ")"; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/RegisterAdminCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/RegisterAdminCommand.java new file mode 100644 index 0000000000..7b2847f79b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/RegisterAdminCommand.java @@ -0,0 +1,86 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.security.PasswordSecurity; +import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.service.ValidationService.ValidationResult; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; +import java.util.Locale; + +/** + * Admin command to register a user. + */ +public class RegisterAdminCommand implements ExecutableCommand { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(RegisterAdminCommand.class); + + @Inject + private PasswordSecurity passwordSecurity; + + @Inject + private CommonService commonService; + + @Inject + private DataSource dataSource; + + @Inject + private BukkitService bukkitService; + + @Inject + private ValidationService validationService; + + @Override + public void executeCommand(final CommandSender sender, List arguments) { + // Get the player name and password + final String playerName = arguments.get(0); + final String playerPass = arguments.get(1); + final String playerNameLowerCase = playerName.toLowerCase(Locale.ROOT); + + // Command logic + ValidationResult passwordValidation = validationService.validatePassword(playerPass, playerName); + if (passwordValidation.hasError()) { + commonService.send(sender, passwordValidation.getMessageKey(), passwordValidation.getArgs()); + return; + } + + bukkitService.runTaskOptionallyAsync(() -> { + if (dataSource.isAuthAvailable(playerNameLowerCase)) { + commonService.send(sender, MessageKey.NAME_ALREADY_REGISTERED); + return; + } + HashedPassword hashedPassword = passwordSecurity.computeHash(playerPass, playerNameLowerCase); + PlayerAuth auth = PlayerAuth.builder() + .name(playerNameLowerCase) + .realName(playerName) + .password(hashedPassword) + .registrationDate(System.currentTimeMillis()) + .build(); + + if (!dataSource.saveAuth(auth)) { + commonService.send(sender, MessageKey.ERROR); + return; + } + + commonService.send(sender, MessageKey.REGISTER_SUCCESS); + logger.info(sender.getName() + " registered " + playerName); + final Player player = bukkitService.getPlayerExact(playerName); + if (player != null) { + bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(() -> + // AuthMeReReloaded - Folia compatibility + bukkitService.runTaskIfFolia(player, () -> player.kickPlayer(commonService.retrieveSingleMessage(player, MessageKey.KICK_FOR_ADMIN_REGISTER)))); + } + }); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/ReloadCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/ReloadCommand.java new file mode 100644 index 0000000000..2956a39f64 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/ReloadCommand.java @@ -0,0 +1,77 @@ +package fr.xephi.authme.command.executable.authme; + +import ch.jalu.injector.factory.SingletonStore; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.initialization.Reloadable; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.SettingsWarner; +import fr.xephi.authme.settings.properties.DatabaseSettings; +import fr.xephi.authme.util.Utils; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.List; + +/** + * The reload command. + */ +public class ReloadCommand implements ExecutableCommand { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(ReloadCommand.class); + + @Inject + private AuthMe plugin; + + @Inject + private Settings settings; + + @Inject + private DataSource dataSource; + + @Inject + private CommonService commonService; + + @Inject + private SettingsWarner settingsWarner; + + @Inject + private SingletonStore reloadableStore; + + @Inject + private SingletonStore settingsDependentStore; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + try { + settings.reload(); + ConsoleLoggerFactory.reloadSettings(settings); + settingsWarner.logWarningsForMisconfigurations(); + + // We do not change database type for consistency issues, but we'll output a note in the logs + if (!settings.getProperty(DatabaseSettings.BACKEND).equals(dataSource.getType())) { + Utils.logAndSendMessage(sender, "Note: cannot change database type during /authme reload"); + } + performReloadOnServices(); + commonService.send(sender, MessageKey.CONFIG_RELOAD_SUCCESS); + } catch (Exception e) { + sender.sendMessage("Error occurred during reload of AuthMe: aborting"); + logger.logException("Aborting! Encountered exception during reload of AuthMe:", e); + plugin.stopOrUnload(); + } + } + + private void performReloadOnServices() { + reloadableStore.retrieveAllOfType() + .forEach(r -> r.reload()); + + settingsDependentStore.retrieveAllOfType() + .forEach(s -> s.reload(settings)); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SetEmailCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SetEmailCommand.java new file mode 100644 index 0000000000..51890edce4 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SetEmailCommand.java @@ -0,0 +1,75 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.ValidationService; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.List; + +/** + * Admin command for setting an email to an account. + */ +public class SetEmailCommand implements ExecutableCommand { + + @Inject + private DataSource dataSource; + + @Inject + private CommonService commonService; + + @Inject + private PlayerCache playerCache; + + @Inject + private BukkitService bukkitService; + + @Inject + private ValidationService validationService; + + @Override + public void executeCommand(final CommandSender sender, List arguments) { + // Get the player name and email address + final String playerName = arguments.get(0); + final String playerEmail = arguments.get(1); + + // Validate the email address + if (!validationService.validateEmail(playerEmail)) { + commonService.send(sender, MessageKey.INVALID_EMAIL); + return; + } + + bukkitService.runTaskOptionallyAsync(() -> { // AuthMeReReloaded - Folia compatibility + // Validate the user + PlayerAuth auth = dataSource.getAuth(playerName); + if (auth == null) { + commonService.send(sender, MessageKey.UNKNOWN_USER); + return; + } else if (!validationService.isEmailFreeForRegistration(playerEmail, sender)) { + commonService.send(sender, MessageKey.EMAIL_ALREADY_USED_ERROR); + return; + } + + // Set the email address + auth.setEmail(playerEmail); + if (!dataSource.updateEmail(auth)) { + commonService.send(sender, MessageKey.ERROR); + return; + } + + // Update the player cache + if (playerCache.getAuth(playerName) != null) { + playerCache.updatePlayer(auth); + } + + // Show a status message + commonService.send(sender, MessageKey.EMAIL_CHANGED_SUCCESS); + }); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SetFirstSpawnCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SetFirstSpawnCommand.java new file mode 100644 index 0000000000..899a1103fe --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SetFirstSpawnCommand.java @@ -0,0 +1,23 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.settings.SpawnLoader; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +public class SetFirstSpawnCommand extends PlayerCommand { + + @Inject + private SpawnLoader spawnLoader; + + @Override + public void runCommand(Player player, List arguments) { + if (spawnLoader.setFirstSpawn(player.getLocation())) { + player.sendMessage("[AuthMe] Correctly defined new first spawn point"); + } else { + player.sendMessage("[AuthMe] SetFirstSpawn has failed, please retry"); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SetSpawnCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SetSpawnCommand.java new file mode 100644 index 0000000000..fc9a67b9eb --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SetSpawnCommand.java @@ -0,0 +1,23 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.settings.SpawnLoader; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +public class SetSpawnCommand extends PlayerCommand { + + @Inject + private SpawnLoader spawnLoader; + + @Override + public void runCommand(Player player, List arguments) { + if (spawnLoader.setSpawn(player.getLocation())) { + player.sendMessage("[AuthMe] Correctly defined new spawn point"); + } else { + player.sendMessage("[AuthMe] SetSpawn has failed, please retry"); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SpawnCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SpawnCommand.java new file mode 100644 index 0000000000..92ad0a3041 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SpawnCommand.java @@ -0,0 +1,27 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.SpawnLoader; +import fr.xephi.authme.util.TeleportUtils; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +public class SpawnCommand extends PlayerCommand { + + @Inject + private SpawnLoader spawnLoader; + @Inject + private BukkitService bukkitService; + + @Override + public void runCommand(Player player, List arguments) { + if (spawnLoader.getSpawn() == null) { + player.sendMessage("[AuthMe] Spawn has failed, please try to define the spawn"); + } else { + bukkitService.runTaskIfFolia(player, () -> TeleportUtils.teleport(player, spawnLoader.getSpawn())); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SwitchAntiBotCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SwitchAntiBotCommand.java new file mode 100644 index 0000000000..1e72c0587f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/SwitchAntiBotCommand.java @@ -0,0 +1,52 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.CommandMapper; +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.command.FoundCommandResult; +import fr.xephi.authme.command.help.HelpProvider; +import fr.xephi.authme.service.AntiBotService; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.Arrays; +import java.util.List; + +/** + * Display or change the status of the antibot mod. + */ +public class SwitchAntiBotCommand implements ExecutableCommand { + + @Inject + private AntiBotService antiBotService; + + @Inject + private CommandMapper commandMapper; + + @Inject + private HelpProvider helpProvider; + + @Override + public void executeCommand(final CommandSender sender, List arguments) { + if (arguments.isEmpty()) { + sender.sendMessage("[AuthMe] AntiBot status: " + antiBotService.getAntiBotStatus().name()); + return; + } + + String newState = arguments.get(0); + + // Enable or disable the mod + if ("ON".equalsIgnoreCase(newState)) { + antiBotService.overrideAntiBotStatus(true); + sender.sendMessage("[AuthMe] AntiBot Manual Override: enabled!"); + } else if ("OFF".equalsIgnoreCase(newState)) { + antiBotService.overrideAntiBotStatus(false); + sender.sendMessage("[AuthMe] AntiBot Manual Override: disabled!"); + } else { + sender.sendMessage(ChatColor.DARK_RED + "Invalid AntiBot mode!"); + FoundCommandResult result = commandMapper.mapPartsToCommand(sender, Arrays.asList("authme", "antibot")); + helpProvider.outputHelp(sender, result, HelpProvider.SHOW_ARGUMENTS); + sender.sendMessage(ChatColor.GOLD + "Detailed help: " + ChatColor.WHITE + "/authme help antibot"); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/TotpDisableAdminCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/TotpDisableAdminCommand.java new file mode 100644 index 0000000000..4789e0439f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/TotpDisableAdminCommand.java @@ -0,0 +1,61 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.service.BukkitService; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Command to disable two-factor authentication for a user. + */ +public class TotpDisableAdminCommand implements ExecutableCommand { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(TotpDisableAdminCommand.class); + + @Inject + private DataSource dataSource; + + @Inject + private Messages messages; + + @Inject + private BukkitService bukkitService; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + String player = arguments.get(0); + + PlayerAuth auth = dataSource.getAuth(player); + if (auth == null) { + messages.send(sender, MessageKey.UNKNOWN_USER); + } else if (auth.getTotpKey() == null) { + sender.sendMessage(ChatColor.RED + "Player '" + player + "' does not have two-factor auth enabled"); + } else { + removeTotpKey(sender, player); + } + } + + private void removeTotpKey(CommandSender sender, String player) { + if (dataSource.removeTotpKey(player)) { + sender.sendMessage("Disabled two-factor authentication successfully for '" + player + "'"); + logger.info(sender.getName() + " disable two-factor authentication for '" + player + "'"); + + Player onlinePlayer = bukkitService.getPlayerExact(player); + if (onlinePlayer != null) { + messages.send(onlinePlayer, MessageKey.TWO_FACTOR_REMOVED_SUCCESS); + } + } else { + messages.send(sender, MessageKey.ERROR); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/TotpViewStatusCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/TotpViewStatusCommand.java new file mode 100644 index 0000000000..d9b2c92c90 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/TotpViewStatusCommand.java @@ -0,0 +1,38 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.List; + +/** + * Command to see whether a user has enabled two-factor authentication. + */ +public class TotpViewStatusCommand implements ExecutableCommand { + + @Inject + private DataSource dataSource; + + @Inject + private Messages messages; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + String player = arguments.get(0); + + PlayerAuth auth = dataSource.getAuth(player); + if (auth == null) { + messages.send(sender, MessageKey.UNKNOWN_USER); + } else if (auth.getTotpKey() == null) { + sender.sendMessage(ChatColor.RED + "Player '" + player + "' does NOT have two-factor auth enabled"); + } else { + sender.sendMessage(ChatColor.DARK_GREEN + "Player '" + player + "' has enabled two-factor authentication"); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/UnregisterAdminCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/UnregisterAdminCommand.java new file mode 100644 index 0000000000..d8901994e1 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/UnregisterAdminCommand.java @@ -0,0 +1,49 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.process.Management; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Admin command to unregister a player. + */ +public class UnregisterAdminCommand implements ExecutableCommand { + + @Inject + private DataSource dataSource; + + @Inject + private CommonService commonService; + + @Inject + private BukkitService bukkitService; + + @Inject + private Management management; + + UnregisterAdminCommand() { + } + + @Override + public void executeCommand(final CommandSender sender, List arguments) { + String playerName = arguments.get(0); + + // Make sure the user exists + if (!dataSource.isAuthAvailable(playerName)) { + commonService.send(sender, MessageKey.UNKNOWN_USER); + return; + } + + // Get the player from the server and perform unregister + Player target = bukkitService.getPlayerExact(playerName); + management.performUnregisterByAdmin(sender, playerName, target); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/UpdateHelpMessagesCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/UpdateHelpMessagesCommand.java new file mode 100644 index 0000000000..7f61afd0f7 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/UpdateHelpMessagesCommand.java @@ -0,0 +1,39 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.command.help.HelpMessagesService; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.service.HelpTranslationGenerator; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.io.File; +import java.io.IOException; +import java.util.List; + +/** + * Messages command, updates the user's help messages file with any missing files + * from the provided file in the JAR. + */ +public class UpdateHelpMessagesCommand implements ExecutableCommand { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(UpdateHelpMessagesCommand.class); + + @Inject + private HelpTranslationGenerator helpTranslationGenerator; + @Inject + private HelpMessagesService helpMessagesService; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + try { + File updatedFile = helpTranslationGenerator.updateHelpFile(); + sender.sendMessage("Successfully updated the help file '" + updatedFile.getName() + "'"); + helpMessagesService.reloadMessagesFile(); + } catch (IOException e) { + sender.sendMessage("Could not update help file: " + e.getMessage()); + logger.logException("Could not update help file:", e); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/VersionCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/VersionCommand.java new file mode 100644 index 0000000000..2f7e8a7c68 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/VersionCommand.java @@ -0,0 +1,99 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.DatabaseSettings; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.text.SimpleDateFormat; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +public class VersionCommand implements ExecutableCommand { + + @Inject + private BukkitService bukkitService; + @Inject + private Settings settings; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + // Show some version info + sender.sendMessage(ChatColor.GOLD + "==========[ " + AuthMe.getPluginName() + " ABOUT ]=========="); + sender.sendMessage(ChatColor.GOLD + "Version: " + ChatColor.WHITE + AuthMe.getPluginName() + + " v" + AuthMe.getPluginVersion() + ChatColor.GRAY + " (build: " + AuthMe.getPluginBuildNumber() + ")"); + sender.sendMessage(ChatColor.GOLD + "Database Implementation: " + ChatColor.WHITE + settings.getProperty(DatabaseSettings.BACKEND).toString()); + sender.sendMessage(ChatColor.GOLD + "Authors:"); + Collection onlinePlayers = bukkitService.getOnlinePlayers(); + printDeveloper(sender, "Gabriele C.", "sgdc3", "Project manager, Contributor", onlinePlayers); + printDeveloper(sender, "Lucas J.", "ljacqu", "Main Developer", onlinePlayers); + printDeveloper(sender, "games647", "games647", "Developer", onlinePlayers); + printDeveloper(sender, "Hex3l", "Hex3l", "Developer", onlinePlayers); + printDeveloper(sender, "krusic22", "krusic22", "Support", onlinePlayers); + sender.sendMessage(ChatColor.GOLD + "Retired authors:"); + printDeveloper(sender, "Alexandre Vanhecke", "xephi59", "Original Author", onlinePlayers); + printDeveloper(sender, "Gnat008", "gnat008", "Developer, Retired", onlinePlayers); + printDeveloper(sender, "DNx5", "DNx5", "Developer, Retired", onlinePlayers); + printDeveloper(sender, "Tim Visee", "timvisee", "Developer, Retired", onlinePlayers); + sender.sendMessage(ChatColor.GOLD + "Website: " + ChatColor.WHITE + + "https://github.com/AuthMe/AuthMeReloaded"); + sender.sendMessage(ChatColor.GOLD + "License: " + ChatColor.WHITE + "GNU GPL v3.0" + + ChatColor.GRAY + ChatColor.ITALIC + " (See LICENSE file)"); + sender.sendMessage(ChatColor.GOLD + "Copyright: " + ChatColor.WHITE + + "Copyright (c) AuthMe-Team " + new SimpleDateFormat("yyyy").format(new Date()) + + ". Released under GPL v3 License."); + } + + /** + * Print a developer with proper styling. + * + * @param sender The command sender + * @param name The display name of the developer + * @param minecraftName The Minecraft username of the developer, if available + * @param function The function of the developer + * @param onlinePlayers The list of online players + */ + private static void printDeveloper(CommandSender sender, String name, String minecraftName, String function, + Collection onlinePlayers) { + // Print the name + StringBuilder msg = new StringBuilder(); + msg.append(" ") + .append(ChatColor.WHITE) + .append(name); + + // Append the Minecraft name + msg.append(ChatColor.GRAY).append(" // ").append(ChatColor.WHITE).append(minecraftName); + msg.append(ChatColor.GRAY).append(ChatColor.ITALIC).append(" (").append(function).append(")"); + + // Show the online status + if (isPlayerOnline(minecraftName, onlinePlayers)) { + msg.append(ChatColor.GREEN).append(ChatColor.ITALIC).append(" (In-Game)"); + } + + // Print the message + sender.sendMessage(msg.toString()); + } + + /** + * Check whether a player is online. + * + * @param minecraftName The Minecraft player name + * @param onlinePlayers List of online players + * + * @return True if the player is online, false otherwise + */ + private static boolean isPlayerOnline(String minecraftName, Collection onlinePlayers) { + for (Player player : onlinePlayers) { + if (player.getName().equalsIgnoreCase(minecraftName)) { + return true; + } + } + return false; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/CountryLookup.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/CountryLookup.java new file mode 100644 index 0000000000..78cee4622e --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/CountryLookup.java @@ -0,0 +1,88 @@ +package fr.xephi.authme.command.executable.authme.debug; + +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.permission.DebugSectionPermissions; +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.service.GeoIpService; +import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.settings.properties.ProtectionSettings; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.List; +import java.util.regex.Pattern; + +/** + * Shows the GeoIP information as returned by the geoIpService. + */ +class CountryLookup implements DebugSection { + + private static final Pattern IS_IP_ADDR = Pattern.compile("(\\d{1,3}\\.){3}\\d{1,3}"); + + @Inject + private GeoIpService geoIpService; + + @Inject + private DataSource dataSource; + + @Inject + private ValidationService validationService; + + @Override + public String getName() { + return "cty"; + } + + @Override + public String getDescription() { + return "Check country protection / country data"; + } + + @Override + public void execute(CommandSender sender, List arguments) { + sender.sendMessage(ChatColor.BLUE + "AuthMe country lookup"); + if (arguments.isEmpty()) { + sender.sendMessage("Check player: /authme debug cty Bobby"); + sender.sendMessage("Check IP address: /authme debug cty 127.123.45.67"); + return; + } + + String argument = arguments.get(0); + if (IS_IP_ADDR.matcher(argument).matches()) { + outputInfoForIpAddr(sender, argument); + } else { + outputInfoForPlayer(sender, argument); + } + } + + @Override + public PermissionNode getRequiredPermission() { + return DebugSectionPermissions.COUNTRY_LOOKUP; + } + + private void outputInfoForIpAddr(CommandSender sender, String ipAddr) { + sender.sendMessage("IP '" + ipAddr + "' maps to country '" + geoIpService.getCountryCode(ipAddr) + + "' (" + geoIpService.getCountryName(ipAddr) + ")"); + if (validationService.isCountryAdmitted(ipAddr)) { + sender.sendMessage(ChatColor.DARK_GREEN + "This IP address' country is not blocked"); + } else { + sender.sendMessage(ChatColor.DARK_RED + "This IP address' country is blocked from the server"); + } + sender.sendMessage("Note: if " + ProtectionSettings.ENABLE_PROTECTION + " is false no country is blocked"); + } + + // TODO #1366: Extend with registration IP? + private void outputInfoForPlayer(CommandSender sender, String name) { + PlayerAuth auth = dataSource.getAuth(name); + if (auth == null) { + sender.sendMessage("No player with name '" + name + "'"); + } else if (auth.getLastIp() == null) { + sender.sendMessage("No last IP address known for '" + name + "'"); + } else { + sender.sendMessage("Player '" + name + "' has IP address " + auth.getLastIp()); + outputInfoForIpAddr(sender, auth.getLastIp()); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/DataStatistics.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/DataStatistics.java new file mode 100644 index 0000000000..406ee17deb --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/DataStatistics.java @@ -0,0 +1,81 @@ +package fr.xephi.authme.command.executable.authme.debug; + +import ch.jalu.injector.factory.SingletonStore; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.data.limbo.LimboService; +import fr.xephi.authme.datasource.CacheDataSource; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.initialization.HasCleanup; +import fr.xephi.authme.initialization.Reloadable; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.permission.DebugSectionPermissions; +import fr.xephi.authme.permission.PermissionNode; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.List; +import java.util.Map; + +import static fr.xephi.authme.command.executable.authme.debug.DebugSectionUtils.applyToLimboPlayersMap; + +/** + * Fetches various statistics, particularly regarding in-memory data that is stored. + */ +class DataStatistics implements DebugSection { + + @Inject + private PlayerCache playerCache; + + @Inject + private LimboService limboService; + + @Inject + private DataSource dataSource; + + @Inject + private SingletonStore singletonStore; + + @Override + public String getName() { + return "stats"; + } + + @Override + public String getDescription() { + return "Outputs general data statistics"; + } + + @Override + public void execute(CommandSender sender, List arguments) { + sender.sendMessage(ChatColor.BLUE + "AuthMe statistics"); + sender.sendMessage("LimboPlayers in memory: " + applyToLimboPlayersMap(limboService, Map::size)); + sender.sendMessage("PlayerCache size: " + playerCache.getLogged() + " (= logged in players)"); + + outputDatabaseStats(sender); + outputInjectorStats(sender); + sender.sendMessage("Total logger instances: " + ConsoleLoggerFactory.getTotalLoggers()); + } + + @Override + public PermissionNode getRequiredPermission() { + return DebugSectionPermissions.DATA_STATISTICS; + } + + private void outputDatabaseStats(CommandSender sender) { + sender.sendMessage("Total players in DB: " + dataSource.getAccountsRegistered()); + if (dataSource instanceof CacheDataSource) { + CacheDataSource cacheDataSource = (CacheDataSource) this.dataSource; + sender.sendMessage("Cached PlayerAuth objects: " + cacheDataSource.getCachedAuths().size()); + } + } + + private void outputInjectorStats(CommandSender sender) { + sender.sendMessage("Singleton Java classes: " + singletonStore.retrieveAllOfType().size()); + sender.sendMessage(String.format("(Reloadable: %d / SettingsDependent: %d / HasCleanup: %d)", + singletonStore.retrieveAllOfType(Reloadable.class).size(), + singletonStore.retrieveAllOfType(SettingsDependent.class).size(), + singletonStore.retrieveAllOfType(HasCleanup.class).size())); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/DebugCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/DebugCommand.java new file mode 100644 index 0000000000..4198a19ebb --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/DebugCommand.java @@ -0,0 +1,85 @@ +package fr.xephi.authme.command.executable.authme.debug; + +import ch.jalu.injector.factory.Factory; +import com.google.common.collect.ImmutableSet; +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.permission.PermissionsManager; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + +/** + * Debug command main. + */ +public class DebugCommand implements ExecutableCommand { + + private static final Set> SECTION_CLASSES = ImmutableSet.of( + PermissionGroups.class, DataStatistics.class, CountryLookup.class, PlayerAuthViewer.class, InputValidator.class, + LimboPlayerViewer.class, CountryLookup.class, HasPermissionChecker.class, TestEmailSender.class, + SpawnLocationViewer.class, MySqlDefaultChanger.class); + + @Inject + private Factory debugSectionFactory; + + @Inject + private PermissionsManager permissionsManager; + + private Map sections; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + DebugSection debugSection = findDebugSection(arguments); + if (debugSection == null) { + sendAvailableSections(sender); + } else { + executeSection(debugSection, sender, arguments); + } + } + + private DebugSection findDebugSection(List arguments) { + if (arguments.isEmpty()) { + return null; + } + return getSections().get(arguments.get(0).toLowerCase(Locale.ROOT)); + } + + private void sendAvailableSections(CommandSender sender) { + sender.sendMessage(ChatColor.BLUE + "AuthMe debug utils"); + sender.sendMessage("Sections available to you:"); + long availableSections = getSections().values().stream() + .filter(section -> permissionsManager.hasPermission(sender, section.getRequiredPermission())) + .peek(e -> sender.sendMessage("- " + e.getName() + ": " + e.getDescription())) + .count(); + + if (availableSections == 0) { + sender.sendMessage(ChatColor.RED + "You don't have permission to view any debug section"); + } + } + + private void executeSection(DebugSection section, CommandSender sender, List arguments) { + if (permissionsManager.hasPermission(sender, section.getRequiredPermission())) { + section.execute(sender, arguments.subList(1, arguments.size())); + } else { + sender.sendMessage(ChatColor.RED + "You don't have permission for this section. See /authme debug"); + } + } + + // Lazy getter + private Map getSections() { + if (sections == null) { + Map sections = new TreeMap<>(); + for (Class sectionClass : SECTION_CLASSES) { + DebugSection section = debugSectionFactory.newInstance(sectionClass); + sections.put(section.getName(), section); + } + this.sections = sections; + } + return sections; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/DebugSection.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/DebugSection.java new file mode 100644 index 0000000000..155520c480 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/DebugSection.java @@ -0,0 +1,36 @@ +package fr.xephi.authme.command.executable.authme.debug; + +import fr.xephi.authme.permission.PermissionNode; +import org.bukkit.command.CommandSender; + +import java.util.List; + +/** + * A debug section: "child" command of the debug command. + */ +interface DebugSection { + + /** + * @return the name to get to this child command + */ + String getName(); + + /** + * @return short description of the child command + */ + String getDescription(); + + /** + * Executes the debug child command. + * + * @param sender the sender executing the command + * @param arguments the arguments, without the label of the child command + */ + void execute(CommandSender sender, List arguments); + + /** + * @return permission required to run this section + */ + PermissionNode getRequiredPermission(); + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/DebugSectionUtils.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/DebugSectionUtils.java new file mode 100644 index 0000000000..fa4200a0ac --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/DebugSectionUtils.java @@ -0,0 +1,130 @@ +package fr.xephi.authme.command.executable.authme.debug; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.limbo.LimboService; +import fr.xephi.authme.datasource.CacheDataSource; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import org.bukkit.Location; + +import java.lang.reflect.Field; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; +import java.util.Map; +import java.util.function.Function; + +/** + * Utilities used within the DebugSection implementations. + */ +final class DebugSectionUtils { + + private static ConsoleLogger logger = ConsoleLoggerFactory.get(DebugSectionUtils.class); + private static Field limboEntriesField; + + private DebugSectionUtils() { + } + + /** + * Formats the given location in a human readable way. Null-safe. + * + * @param location the location to format + * @return the formatted location + */ + static String formatLocation(Location location) { + if (location == null) { + return "null"; + } + + String worldName = location.getWorld() == null ? "null" : location.getWorld().getName(); + return formatLocation(location.getX(), location.getY(), location.getZ(), worldName); + } + + /** + * Formats the given location in a human readable way. + * + * @param x the x coordinate + * @param y the y coordinate + * @param z the z coordinate + * @param world the world name + * @return the formatted location + */ + static String formatLocation(double x, double y, double z, String world) { + return "(" + round(x) + ", " + round(y) + ", " + round(z) + ") in '" + world + "'"; + } + + /** + * Rounds the given number to two decimals. + * + * @param number the number to round + * @return the rounded number + */ + private static String round(double number) { + DecimalFormat df = new DecimalFormat("#.##"); + df.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.US)); + df.setRoundingMode(RoundingMode.HALF_UP); + return df.format(number); + } + + private static Field getLimboPlayerEntriesField() { + if (limboEntriesField == null) { + try { + Field field = LimboService.class.getDeclaredField("entries"); + field.setAccessible(true); + limboEntriesField = field; + } catch (Exception e) { + logger.logException("Could not retrieve LimboService entries field:", e); + } + } + return limboEntriesField; + } + + /** + * Applies the given function to the map in LimboService containing the LimboPlayers. + * As we don't want to expose this information in non-debug settings, this is done with reflection. + * Exceptions are generously caught and {@code null} is returned on failure. + * + * @param limboService the limbo service instance to get the map from + * @param function the function to apply to the map + * @param the result type of the function + * + * @return the value of the function applied to the map, or null upon error + */ + static U applyToLimboPlayersMap(LimboService limboService, Function function) { + Field limboPlayerEntriesField = getLimboPlayerEntriesField(); + if (limboPlayerEntriesField != null) { + try { + return function.apply((Map) limboEntriesField.get(limboService)); + } catch (Exception e) { + logger.logException("Could not retrieve LimboService values:", e); + } + } + return null; + } + + static T castToTypeOrNull(Object object, Class clazz) { + return clazz.isInstance(object) ? clazz.cast(object) : null; + } + + /** + * Unwraps the "cache data source" and returns the underlying source. Returns the + * same as the input argument otherwise. + * + * @param dataSource the data source to unwrap if applicable + * @return the non-cache data source + */ + static DataSource unwrapSourceFromCacheDataSource(DataSource dataSource) { + if (dataSource instanceof CacheDataSource) { + try { + Field source = CacheDataSource.class.getDeclaredField("source"); + source.setAccessible(true); + return (DataSource) source.get(dataSource); + } catch (NoSuchFieldException | IllegalAccessException e) { + logger.logException("Could not get source of CacheDataSource:", e); + return null; + } + } + return dataSource; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/HasPermissionChecker.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/HasPermissionChecker.java new file mode 100644 index 0000000000..e8a15b7953 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/HasPermissionChecker.java @@ -0,0 +1,138 @@ +package fr.xephi.authme.command.executable.authme.debug; + +import com.google.common.collect.ImmutableList; +import fr.xephi.authme.permission.AdminPermission; +import fr.xephi.authme.permission.DebugSectionPermissions; +import fr.xephi.authme.permission.DefaultPermission; +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.permission.PlayerPermission; +import fr.xephi.authme.permission.PlayerStatePermission; +import fr.xephi.authme.service.BukkitService; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.function.BiFunction; + +/** + * Checks if a player has a given permission, as checked by AuthMe. + */ +class HasPermissionChecker implements DebugSection { + + static final List> PERMISSION_NODE_CLASSES = ImmutableList.of( + AdminPermission.class, PlayerPermission.class, PlayerStatePermission.class, DebugSectionPermissions.class); + + @Inject + private PermissionsManager permissionsManager; + + @Inject + private BukkitService bukkitService; + + @Override + public String getName() { + return "perm"; + } + + @Override + public String getDescription() { + return "Checks if a player has a given permission"; + } + + @Override + public void execute(CommandSender sender, List arguments) { + sender.sendMessage(ChatColor.BLUE + "AuthMe permission check"); + if (arguments.size() < 2) { + sender.sendMessage("Check if a player has permission:"); + sender.sendMessage("Example: /authme debug perm bobby my.perm.node"); + sender.sendMessage("Permission system type used: " + permissionsManager.getPermissionSystem()); + return; + } + + final String playerName = arguments.get(0); + final String permissionNode = arguments.get(1); + + Player player = bukkitService.getPlayerExact(playerName); + if (player == null) { + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerName); + if (offlinePlayer == null) { + sender.sendMessage(ChatColor.DARK_RED + "Player '" + playerName + "' does not exist"); + } else { + sender.sendMessage("Player '" + playerName + "' not online; checking with offline player"); + performPermissionCheck(offlinePlayer, permissionNode, permissionsManager::hasPermissionOffline, sender); + } + } else { + performPermissionCheck(player, permissionNode, permissionsManager::hasPermission, sender); + } + } + + @Override + public PermissionNode getRequiredPermission() { + return DebugSectionPermissions.HAS_PERMISSION_CHECK; + } + + /** + * Performs a permission check and informs the given sender of the result. {@code permissionChecker} is the + * permission check to perform with the given {@code node} and the {@code player}. + * + * @param player the player to check a permission for + * @param node the node of the permission to check + * @param permissionChecker permission checking function + * @param sender the sender to inform of the result + * @param

the player type + */ + private static

void performPermissionCheck( + P player, String node, BiFunction permissionChecker, CommandSender sender) { + + PermissionNode permNode = getPermissionNode(sender, node); + if (permissionChecker.apply(player, permNode)) { + sender.sendMessage(ChatColor.DARK_GREEN + "Success: player '" + player.getName() + + "' has permission '" + node + "'"); + } else { + sender.sendMessage(ChatColor.DARK_RED + "Check failed: player '" + player.getName() + + "' does NOT have permission '" + node + "'"); + } + } + + /** + * Based on the given permission node (String), tries to find the according AuthMe {@link PermissionNode} + * instance, or creates a new one if not available. + * + * @param sender the sender (used to inform him if no AuthMe PermissionNode can be matched) + * @param node the node to search for + * @return the node as {@link PermissionNode} object + */ + private static PermissionNode getPermissionNode(CommandSender sender, String node) { + Optional permNode = PERMISSION_NODE_CLASSES.stream() + .map(Class::getEnumConstants) + .flatMap(Arrays::stream) + .filter(perm -> perm.getNode().equals(node)) + .findFirst(); + if (permNode.isPresent()) { + return permNode.get(); + } else { + sender.sendMessage("Did not detect AuthMe permission; using default permission = DENIED"); + return createPermNode(node); + } + } + + private static PermissionNode createPermNode(String node) { + return new PermissionNode() { + @Override + public String getNode() { + return node; + } + + @Override + public DefaultPermission getDefaultPermission() { + return DefaultPermission.NOT_ALLOWED; + } + }; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/InputValidator.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/InputValidator.java new file mode 100644 index 0000000000..2e82c3c823 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/InputValidator.java @@ -0,0 +1,124 @@ +package fr.xephi.authme.command.executable.authme.debug; + +import fr.xephi.authme.listener.FailedVerificationException; +import fr.xephi.authme.listener.OnJoinVerifier; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.permission.DebugSectionPermissions; +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.service.ValidationService.ValidationResult; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.Arrays; +import java.util.List; + +import static fr.xephi.authme.command.executable.authme.debug.InputValidator.ValidationObject.MAIL; +import static fr.xephi.authme.command.executable.authme.debug.InputValidator.ValidationObject.NAME; +import static fr.xephi.authme.command.executable.authme.debug.InputValidator.ValidationObject.PASS; + +/** + * Checks if a sample username, email or password is valid according to the AuthMe settings. + */ +class InputValidator implements DebugSection { + + @Inject + private ValidationService validationService; + + @Inject + private Messages messages; + + @Inject + private OnJoinVerifier onJoinVerifier; + + + @Override + public String getName() { + return "valid"; + } + + @Override + public String getDescription() { + return "Checks if your config.yml allows a password / email"; + } + + @Override + public void execute(CommandSender sender, List arguments) { + if (arguments.size() < 2 || !ValidationObject.matchesAny(arguments.get(0))) { + displayUsageHint(sender); + + } else if (PASS.matches(arguments.get(0))) { + validatePassword(sender, arguments.get(1)); + + } else if (MAIL.matches(arguments.get(0))) { + validateEmail(sender, arguments.get(1)); + + } else if (NAME.matches(arguments.get(0))) { + validateUsername(sender, arguments.get(1)); + + } else { + throw new IllegalStateException("Unexpected validation object with arg[0] = '" + arguments.get(0) + "'"); + } + } + + @Override + public PermissionNode getRequiredPermission() { + return DebugSectionPermissions.INPUT_VALIDATOR; + } + + private void displayUsageHint(CommandSender sender) { + sender.sendMessage(ChatColor.BLUE + "Validation tests"); + sender.sendMessage("You can define forbidden emails and passwords in your config.yml." + + " You can test your settings with this command."); + final String command = ChatColor.GOLD + "/authme debug valid"; + sender.sendMessage(" Use " + command + " pass " + ChatColor.RESET + " to check a password"); + sender.sendMessage(" Use " + command + " mail " + ChatColor.RESET + " to check an email"); + sender.sendMessage(" Use " + command + " name " + ChatColor.RESET + " to check a username"); + } + + private void validatePassword(CommandSender sender, String password) { + ValidationResult validationResult = validationService.validatePassword(password, ""); + sender.sendMessage(ChatColor.BLUE + "Validation of password '" + password + "'"); + if (validationResult.hasError()) { + messages.send(sender, validationResult.getMessageKey(), validationResult.getArgs()); + } else { + sender.sendMessage(ChatColor.DARK_GREEN + "Valid password!"); + } + } + + private void validateEmail(CommandSender sender, String email) { + boolean isValidEmail = validationService.validateEmail(email); + sender.sendMessage(ChatColor.BLUE + "Validation of email '" + email + "'"); + if (isValidEmail) { + sender.sendMessage(ChatColor.DARK_GREEN + "Valid email!"); + } else { + sender.sendMessage(ChatColor.DARK_RED + "Email is not valid!"); + } + } + + private void validateUsername(CommandSender sender, String username) { + sender.sendMessage(ChatColor.BLUE + "Validation of username '" + username + "'"); + try { + onJoinVerifier.checkIsValidName(username); + sender.sendMessage("Valid username!"); + } catch (FailedVerificationException failedVerificationEx) { + messages.send(sender, failedVerificationEx.getReason(), failedVerificationEx.getArgs()); + } + } + + + enum ValidationObject { + + PASS, MAIL, NAME; + + static boolean matchesAny(String arg) { + return Arrays.stream(values()).anyMatch(vo -> vo.matches(arg)); + } + + boolean matches(String arg) { + return name().equalsIgnoreCase(arg); + } + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/LimboPlayerViewer.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/LimboPlayerViewer.java new file mode 100644 index 0000000000..7338c86862 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/LimboPlayerViewer.java @@ -0,0 +1,143 @@ +package fr.xephi.authme.command.executable.authme.debug; + +import fr.xephi.authme.data.limbo.LimboPlayer; +import fr.xephi.authme.data.limbo.LimboService; +import fr.xephi.authme.data.limbo.persistence.LimboPersistence; +import fr.xephi.authme.permission.DebugSectionPermissions; +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.service.BukkitService; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; + +import static fr.xephi.authme.command.executable.authme.debug.DebugSectionUtils.applyToLimboPlayersMap; +import static fr.xephi.authme.command.executable.authme.debug.DebugSectionUtils.formatLocation; + +/** + * Shows the data stored in LimboPlayers and the equivalent properties on online players. + */ +class LimboPlayerViewer implements DebugSection { + + @Inject + private LimboService limboService; + + @Inject + private LimboPersistence limboPersistence; + + @Inject + private BukkitService bukkitService; + + @Inject + private PermissionsManager permissionsManager; + + @Override + public String getName() { + return "limbo"; + } + + @Override + public String getDescription() { + return "View LimboPlayers and player's \"limbo stats\""; + } + + @Override + public void execute(CommandSender sender, List arguments) { + if (arguments.isEmpty()) { + sender.sendMessage(ChatColor.BLUE + "AuthMe limbo viewer"); + sender.sendMessage("/authme debug limbo : show a player's limbo info"); + sender.sendMessage("Available limbo records: " + applyToLimboPlayersMap(limboService, Map::keySet)); + return; + } + + LimboPlayer memoryLimbo = limboService.getLimboPlayer(arguments.get(0)); + Player player = bukkitService.getPlayerExact(arguments.get(0)); + LimboPlayer diskLimbo = player != null ? limboPersistence.getLimboPlayer(player) : null; + if (memoryLimbo == null && player == null) { + sender.sendMessage(ChatColor.BLUE + "No AuthMe limbo data"); + sender.sendMessage("No limbo data and no player online with name '" + arguments.get(0) + "'"); + return; + } + + sender.sendMessage(ChatColor.BLUE + "Player / limbo / disk limbo info for '" + arguments.get(0) + "'"); + new InfoDisplayer(sender, player, memoryLimbo, diskLimbo) + .sendEntry("Is op", Player::isOp, LimboPlayer::isOperator) + .sendEntry("Walk speed", Player::getWalkSpeed, LimboPlayer::getWalkSpeed) + .sendEntry("Can fly", Player::getAllowFlight, LimboPlayer::isCanFly) + .sendEntry("Fly speed", Player::getFlySpeed, LimboPlayer::getFlySpeed) + .sendEntry("Location", p -> formatLocation(p.getLocation()), l -> formatLocation(l.getLocation())) + .sendEntry("Prim. group", + p -> permissionsManager.hasGroupSupport() ? permissionsManager.getPrimaryGroup(p) : "N/A", + LimboPlayer::getGroups); + } + + @Override + public PermissionNode getRequiredPermission() { + return DebugSectionPermissions.LIMBO_PLAYER_VIEWER; + } + + /** + * Displays the info for the given LimboPlayer and Player to the provided CommandSender. + */ + private static final class InfoDisplayer { + private final CommandSender sender; + private final Optional player; + private final Optional memoryLimbo; + private final Optional diskLimbo; + + /** + * Constructor. + * + * @param sender command sender to send the information to + * @param player the player to get data from + * @param memoryLimbo the limbo player to get data from + */ + InfoDisplayer(CommandSender sender, Player player, LimboPlayer memoryLimbo, LimboPlayer diskLimbo) { + this.sender = sender; + this.player = Optional.ofNullable(player); + this.memoryLimbo = Optional.ofNullable(memoryLimbo); + this.diskLimbo = Optional.ofNullable(diskLimbo); + + if (memoryLimbo == null) { + sender.sendMessage("Note: no Limbo information available"); + } + if (player == null) { + sender.sendMessage("Note: player is not online"); + } else if (diskLimbo == null) { + sender.sendMessage("Note: no Limbo on disk available"); + } + } + + /** + * Displays a piece of information to the command sender. + * + * @param title the designation of the piece of information + * @param playerGetter getter for data retrieval on Player + * @param limboGetter getter for data retrieval on the LimboPlayer + * @param the data type + * @return this instance (for chaining) + */ + InfoDisplayer sendEntry(String title, + Function playerGetter, + Function limboGetter) { + sender.sendMessage( + title + ": " + + getData(player, playerGetter) + + " / " + + getData(memoryLimbo, limboGetter) + + " / " + + getData(diskLimbo, limboGetter)); + return this; + } + + static String getData(Optional entity, Function getter) { + return entity.map(getter).map(String::valueOf).orElse(" -- "); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/MySqlDefaultChanger.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/MySqlDefaultChanger.java new file mode 100644 index 0000000000..d4eb1d3c1e --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/MySqlDefaultChanger.java @@ -0,0 +1,327 @@ +package fr.xephi.authme.command.executable.authme.debug; + +import ch.jalu.configme.properties.Property; +import com.google.common.annotations.VisibleForTesting; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.datasource.MySQL; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.permission.DebugSectionPermissions; +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.DatabaseSettings; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static fr.xephi.authme.command.executable.authme.debug.DebugSectionUtils.castToTypeOrNull; +import static fr.xephi.authme.command.executable.authme.debug.DebugSectionUtils.unwrapSourceFromCacheDataSource; +import static fr.xephi.authme.data.auth.PlayerAuth.DB_EMAIL_DEFAULT; +import static fr.xephi.authme.data.auth.PlayerAuth.DB_LAST_IP_DEFAULT; +import static fr.xephi.authme.data.auth.PlayerAuth.DB_LAST_LOGIN_DEFAULT; +import static fr.xephi.authme.datasource.SqlDataSourceUtils.getColumnDefaultValue; +import static fr.xephi.authme.datasource.SqlDataSourceUtils.isNotNullColumn; +import static java.lang.String.format; + +/** + * Convenience command to add or remove the default value of a column and its nullable status + * in the MySQL data source. + */ +class MySqlDefaultChanger implements DebugSection { + + private static final String NOT_NULL_SUFFIX = ChatColor.DARK_AQUA + "@" + ChatColor.RESET; + private static final String DEFAULT_VALUE_SUFFIX = ChatColor.GOLD + "#" + ChatColor.RESET; + + private ConsoleLogger logger = ConsoleLoggerFactory.get(MySqlDefaultChanger.class); + + @Inject + private Settings settings; + + @Inject + private DataSource dataSource; + + private MySQL mySql; + + @PostConstruct + void setMySqlField() { + this.mySql = castToTypeOrNull(unwrapSourceFromCacheDataSource(this.dataSource), MySQL.class); + } + + @Override + public String getName() { + return "mysqldef"; + } + + @Override + public String getDescription() { + return "Add or remove the default value of MySQL columns"; + } + + @Override + public PermissionNode getRequiredPermission() { + return DebugSectionPermissions.MYSQL_DEFAULT_CHANGER; + } + + @Override + public void execute(CommandSender sender, List arguments) { + if (mySql == null) { + sender.sendMessage("Defaults can be changed for the MySQL data source only."); + return; + } + + Operation operation = matchToEnum(arguments, 0, Operation.class); + Columns column = matchToEnum(arguments, 1, Columns.class); + if (operation == Operation.DETAILS) { + showColumnDetails(sender); + } else if (operation == null || column == null) { + displayUsageHints(sender); + } else { + sender.sendMessage(ChatColor.BLUE + "[AuthMe] MySQL change '" + column + "'"); + try (Connection con = getConnection(mySql)) { + switch (operation) { + case ADD: + changeColumnToNotNullWithDefault(sender, column, con); + break; + case REMOVE: + removeNotNullAndDefault(sender, column, con); + break; + default: + throw new IllegalStateException("Unknown operation '" + operation + "'"); + } + } catch (SQLException | IllegalStateException e) { + logger.logException("Failed to perform MySQL default altering operation:", e); + } + } + } + + /** + * Adds a default value to the column definition and adds a {@code NOT NULL} constraint for + * the specified column. + * + * @param sender the command sender initiation the action + * @param column the column to modify + * @param con connection to the database + * @throws SQLException . + */ + private void changeColumnToNotNullWithDefault(CommandSender sender, Columns column, + Connection con) throws SQLException { + final String tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE); + final String columnName = settings.getProperty(column.getColumnNameProperty()); + + // Replace NULLs with future default value + String sql = format("UPDATE %s SET %s = ? WHERE %s IS NULL;", tableName, columnName, columnName); + int updatedRows; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setObject(1, column.getDefaultValue()); + updatedRows = pst.executeUpdate(); + } + sender.sendMessage("Replaced NULLs with default value ('" + column.getDefaultValue() + + "'), modifying " + updatedRows + " entries"); + + // Change column definition to NOT NULL version + try (Statement st = con.createStatement()) { + st.execute(format("ALTER TABLE %s MODIFY %s %s", tableName, columnName, column.getNotNullDefinition())); + sender.sendMessage("Changed column '" + columnName + "' to have NOT NULL constraint"); + } + + // Log success message + logger.info("Changed MySQL column '" + columnName + "' to be NOT NULL, as initiated by '" + + sender.getName() + "'"); + } + + /** + * Removes the {@code NOT NULL} constraint of a column definition and replaces rows with the + * default value to {@code NULL}. + * + * @param sender the command sender initiation the action + * @param column the column to modify + * @param con connection to the database + * @throws SQLException . + */ + private void removeNotNullAndDefault(CommandSender sender, Columns column, Connection con) throws SQLException { + final String tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE); + final String columnName = settings.getProperty(column.getColumnNameProperty()); + + // Change column definition to nullable version + try (Statement st = con.createStatement()) { + st.execute(format("ALTER TABLE %s MODIFY %s %s", tableName, columnName, column.getNullableDefinition())); + sender.sendMessage("Changed column '" + columnName + "' to allow nulls"); + } + + // Replace old default value with NULL + String sql = format("UPDATE %s SET %s = NULL WHERE %s = ?;", tableName, columnName, columnName); + int updatedRows; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setObject(1, column.getDefaultValue()); + updatedRows = pst.executeUpdate(); + } + sender.sendMessage("Replaced default value ('" + column.getDefaultValue() + + "') to be NULL, modifying " + updatedRows + " entries"); + + // Log success message + logger.info("Changed MySQL column '" + columnName + "' to allow NULL, as initiated by '" + + sender.getName() + "'"); + } + + /** + * Outputs the current definitions of all {@link Columns} which can be migrated. + * + * @param sender command sender to output the data to + */ + private void showColumnDetails(CommandSender sender) { + sender.sendMessage(ChatColor.BLUE + "MySQL column details"); + final String tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE); + try (Connection con = getConnection(mySql)) { + final DatabaseMetaData metaData = con.getMetaData(); + for (Columns col : Columns.values()) { + String columnName = settings.getProperty(col.getColumnNameProperty()); + String isNullText = isNotNullColumn(metaData, tableName, columnName) ? "NOT NULL" : "nullable"; + Object defaultValue = getColumnDefaultValue(metaData, tableName, columnName); + String defaultText = defaultValue == null ? "no default" : "default: '" + defaultValue + "'"; + sender.sendMessage(formatColumnWithMetadata(col, metaData, tableName) + + " (" + columnName + "): " + isNullText + ", " + defaultText); + } + } catch (SQLException e) { + logger.logException("Failed while showing column details:", e); + sender.sendMessage("Failed while showing column details. See log for info"); + } + + } + + /** + * Displays sample commands and the list of columns that can be changed. + * + * @param sender the sender issuing the command + */ + private void displayUsageHints(CommandSender sender) { + sender.sendMessage(ChatColor.BLUE + "MySQL column changer"); + sender.sendMessage("Adds or removes a NOT NULL constraint for a column."); + sender.sendMessage("Examples: add a NOT NULL constraint with"); + sender.sendMessage(" /authme debug mysqldef add "); + sender.sendMessage("Remove one with /authme debug mysqldef remove "); + + sender.sendMessage("Available columns: " + constructColumnListWithMetadata()); + sender.sendMessage(" " + NOT_NULL_SUFFIX + ": not-null, " + DEFAULT_VALUE_SUFFIX + + ": has default. See /authme debug mysqldef details"); + } + + /** + * @return list of {@link Columns} we can toggle with suffixes indicating their NOT NULL and default value status + */ + private String constructColumnListWithMetadata() { + try (Connection con = getConnection(mySql)) { + final DatabaseMetaData metaData = con.getMetaData(); + final String tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE); + + List formattedColumns = new ArrayList<>(Columns.values().length); + for (Columns col : Columns.values()) { + formattedColumns.add(formatColumnWithMetadata(col, metaData, tableName)); + } + return String.join(ChatColor.RESET + ", ", formattedColumns); + } catch (SQLException e) { + logger.logException("Failed to construct column list:", e); + return ChatColor.RED + "An error occurred! Please see the console for details."; + } + } + + private String formatColumnWithMetadata(Columns column, DatabaseMetaData metaData, + String tableName) throws SQLException { + String columnName = settings.getProperty(column.getColumnNameProperty()); + boolean isNotNull = isNotNullColumn(metaData, tableName, columnName); + boolean hasDefaultValue = getColumnDefaultValue(metaData, tableName, columnName) != null; + return column.name() + + (isNotNull ? NOT_NULL_SUFFIX : "") + + (hasDefaultValue ? DEFAULT_VALUE_SUFFIX : ""); + } + + /** + * Gets the Connection object from the MySQL data source. + * + * @param mySql the MySQL data source to get the connection from + * @return the connection + */ + @VisibleForTesting + Connection getConnection(MySQL mySql) { + try { + Method method = MySQL.class.getDeclaredMethod("getConnection"); + method.setAccessible(true); + return (Connection) method.invoke(mySql); + } catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { + throw new IllegalStateException("Could not get MySQL connection", e); + } + } + + private static > E matchToEnum(List arguments, int index, Class clazz) { + if (arguments.size() <= index) { + return null; + } + String str = arguments.get(index); + return Arrays.stream(clazz.getEnumConstants()) + .filter(e -> e.name().equalsIgnoreCase(str)) + .findFirst().orElse(null); + } + + private enum Operation { + ADD, REMOVE, DETAILS + } + + /** MySQL columns which can be toggled between being NOT NULL and allowing NULL values. */ + enum Columns { + + LASTLOGIN(DatabaseSettings.MYSQL_COL_LASTLOGIN, + "BIGINT", "BIGINT NOT NULL DEFAULT 0", DB_LAST_LOGIN_DEFAULT), + + LASTIP(DatabaseSettings.MYSQL_COL_LAST_IP, + "VARCHAR(40) CHARACTER SET ascii COLLATE ascii_bin", + "VARCHAR(40) CHARACTER SET ascii COLLATE ascii_bin NOT NULL DEFAULT '127.0.0.1'", + DB_LAST_IP_DEFAULT), + + EMAIL(DatabaseSettings.MYSQL_COL_EMAIL, + "VARCHAR(255)", "VARCHAR(255) NOT NULL DEFAULT 'your@email.com'", DB_EMAIL_DEFAULT); + + private final Property columnNameProperty; + private final String nullableDefinition; + private final String notNullDefinition; + private final Object defaultValue; + + Columns(Property columnNameProperty, String nullableDefinition, + String notNullDefinition, Object defaultValue) { + this.columnNameProperty = columnNameProperty; + this.nullableDefinition = nullableDefinition; + this.notNullDefinition = notNullDefinition; + this.defaultValue = defaultValue; + } + + /** @return property defining the column name in the database */ + Property getColumnNameProperty() { + return columnNameProperty; + } + + /** @return SQL definition of the column allowing NULL values */ + String getNullableDefinition() { + return nullableDefinition; + } + + /** @return SQL definition of the column with a NOT NULL constraint */ + String getNotNullDefinition() { + return notNullDefinition; + } + + /** @return the default value used in {@link #notNullDefinition} */ + Object getDefaultValue() { + return defaultValue; + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/PermissionGroups.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/PermissionGroups.java new file mode 100644 index 0000000000..4515ca0bd0 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/PermissionGroups.java @@ -0,0 +1,56 @@ +package fr.xephi.authme.command.executable.authme.debug; + +import fr.xephi.authme.data.limbo.UserGroup; +import fr.xephi.authme.permission.DebugSectionPermissions; +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.permission.PermissionsManager; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +import static java.util.stream.Collectors.toList; + +/** + * Outputs the permission groups of a player. + */ +class PermissionGroups implements DebugSection { + + @Inject + private PermissionsManager permissionsManager; + + @Override + public String getName() { + return "groups"; + } + + @Override + public String getDescription() { + return "Show permission groups a player belongs to"; + } + + @Override + public void execute(CommandSender sender, List arguments) { + sender.sendMessage(ChatColor.BLUE + "AuthMe permission groups"); + String name = arguments.isEmpty() ? sender.getName() : arguments.get(0); + Player player = Bukkit.getPlayer(name); + if (player == null) { + sender.sendMessage("Player " + name + " could not be found"); + } else { + List groupNames = permissionsManager.getGroups(player).stream() + .map(UserGroup::getGroupName) + .collect(toList()); + + sender.sendMessage("Player " + name + " has permission groups: " + String.join(", ", groupNames)); + sender.sendMessage("Primary group is: " + permissionsManager.getGroups(player)); + } + } + + @Override + public PermissionNode getRequiredPermission() { + return DebugSectionPermissions.PERM_GROUPS; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/PlayerAuthViewer.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/PlayerAuthViewer.java new file mode 100644 index 0000000000..99115cfe21 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/PlayerAuthViewer.java @@ -0,0 +1,117 @@ +package fr.xephi.authme.command.executable.authme.debug; + +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.permission.DebugSectionPermissions; +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.util.StringUtils; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.List; + +import static fr.xephi.authme.command.executable.authme.debug.DebugSectionUtils.formatLocation; + +/** + * Allows to view the data of a PlayerAuth in the database. + */ +class PlayerAuthViewer implements DebugSection { + + @Inject + private DataSource dataSource; + + @Override + public String getName() { + return "db"; + } + + @Override + public String getDescription() { + return "View player's data in the database"; + } + + @Override + public void execute(CommandSender sender, List arguments) { + if (arguments.isEmpty()) { + sender.sendMessage(ChatColor.BLUE + "AuthMe database viewer"); + sender.sendMessage("Enter player name to view his data in the database."); + sender.sendMessage("Example: /authme debug db Bobby"); + return; + } + + PlayerAuth auth = dataSource.getAuth(arguments.get(0)); + if (auth == null) { + sender.sendMessage(ChatColor.BLUE + "AuthMe database viewer"); + sender.sendMessage("No record exists for '" + arguments.get(0) + "'"); + } else { + displayAuthToSender(auth, sender); + } + } + + @Override + public PermissionNode getRequiredPermission() { + return DebugSectionPermissions.PLAYER_AUTH_VIEWER; + } + + /** + * Outputs the PlayerAuth information to the given sender. + * + * @param auth the PlayerAuth to display + * @param sender the sender to send the messages to + */ + private void displayAuthToSender(PlayerAuth auth, CommandSender sender) { + sender.sendMessage(ChatColor.BLUE + "[AuthMe] Player " + auth.getNickname() + " / " + auth.getRealName()); + sender.sendMessage("Email: " + auth.getEmail() + ". IP: " + auth.getLastIp() + ". Group: " + auth.getGroupId()); + sender.sendMessage("Quit location: " + + formatLocation(auth.getQuitLocX(), auth.getQuitLocY(), auth.getQuitLocZ(), auth.getWorld())); + sender.sendMessage("Last login: " + formatDate(auth.getLastLogin())); + sender.sendMessage("Registration: " + formatDate(auth.getRegistrationDate()) + + " with IP " + auth.getRegistrationIp()); + + HashedPassword hashedPass = auth.getPassword(); + sender.sendMessage("Hash / salt (partial): '" + safeSubstring(hashedPass.getHash(), 6) + + "' / '" + safeSubstring(hashedPass.getSalt(), 4) + "'"); + sender.sendMessage("TOTP code (partial): '" + safeSubstring(auth.getTotpKey(), 3) + "'"); + } + + /** + * Fail-safe substring method. Guarantees not to show the entire String. + * + * @param str the string to transform + * @param length number of characters to show from the start of the String + * @return the first length characters of the string, or half of the string if it is shorter, + * or empty string if the string is null or empty + */ + private static String safeSubstring(String str, int length) { + if (StringUtils.isBlank(str)) { + return ""; + } else if (str.length() < length) { + return str.substring(0, str.length() / 2) + "..."; + } else { + return str.substring(0, length) + "..."; + } + } + + /** + * Formats the given timestamp to a human readable date. + * + * @param timestamp the timestamp to format (nullable) + * @return the formatted timestamp + */ + private static String formatDate(Long timestamp) { + if (timestamp == null) { + return "Not available (null)"; + } else if (timestamp == 0) { + return "Not available (0)"; + } else { + LocalDateTime date = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault()); + return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(date); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/SpawnLocationViewer.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/SpawnLocationViewer.java new file mode 100644 index 0000000000..30f756c321 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/SpawnLocationViewer.java @@ -0,0 +1,87 @@ +package fr.xephi.authme.command.executable.authme.debug; + +import fr.xephi.authme.permission.DebugSectionPermissions; +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.SpawnLoader; +import fr.xephi.authme.settings.properties.RestrictionSettings; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +import static fr.xephi.authme.command.executable.authme.debug.DebugSectionUtils.formatLocation; + +/** + * Shows the spawn location that AuthMe is configured to use. + */ +class SpawnLocationViewer implements DebugSection { + + @Inject + private SpawnLoader spawnLoader; + + @Inject + private Settings settings; + + @Inject + private BukkitService bukkitService; + + + @Override + public String getName() { + return "spawn"; + } + + @Override + public String getDescription() { + return "Shows the spawn location that AuthMe will use"; + } + + @Override + public void execute(CommandSender sender, List arguments) { + sender.sendMessage(ChatColor.BLUE + "AuthMe spawn location viewer"); + if (arguments.isEmpty()) { + showGeneralInfo(sender); + } else if ("?".equals(arguments.get(0))) { + showHelp(sender); + } else { + showPlayerSpawn(sender, arguments.get(0)); + } + } + + @Override + public PermissionNode getRequiredPermission() { + return DebugSectionPermissions.SPAWN_LOCATION; + } + + private void showGeneralInfo(CommandSender sender) { + sender.sendMessage("Spawn priority: " + + String.join(", ", settings.getProperty(RestrictionSettings.SPAWN_PRIORITY))); + sender.sendMessage("AuthMe spawn location: " + formatLocation(spawnLoader.getSpawn())); + sender.sendMessage("AuthMe first spawn location: " + formatLocation(spawnLoader.getFirstSpawn())); + sender.sendMessage("AuthMe (first)spawn are only used depending on the configured priority!"); + sender.sendMessage("Use '/authme debug spawn ?' for further help"); + } + + private void showHelp(CommandSender sender) { + sender.sendMessage("Use /authme spawn and /authme firstspawn to teleport to the spawns."); + sender.sendMessage("/authme set(first)spawn sets the (first) spawn to your current location."); + sender.sendMessage("Use /authme debug spawn to view where a player would be teleported to."); + sender.sendMessage("Read more at https://github.com/AuthMe/AuthMeReloaded/wiki/Spawn-Handling"); + } + + private void showPlayerSpawn(CommandSender sender, String playerName) { + Player player = bukkitService.getPlayerExact(playerName); + if (player == null) { + sender.sendMessage("Player '" + playerName + "' is not online!"); + } else { + Location spawn = spawnLoader.getSpawnLocation(player); + sender.sendMessage("Player '" + playerName + "' has spawn location: " + formatLocation(spawn)); + sender.sendMessage("Note: this check excludes the AuthMe firstspawn."); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/TestEmailSender.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/TestEmailSender.java new file mode 100644 index 0000000000..388a18af15 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/authme/debug/TestEmailSender.java @@ -0,0 +1,125 @@ +package fr.xephi.authme.command.executable.authme.debug; + +import ch.jalu.datasourcecolumns.data.DataSourceValue; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.mail.SendMailSsl; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.permission.DebugSectionPermissions; +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.util.StringUtils; +import fr.xephi.authme.util.Utils; +import org.apache.commons.mail.EmailException; +import org.apache.commons.mail.HtmlEmail; +import org.bukkit.ChatColor; +import org.bukkit.Server; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.List; + +/** + * Sends out a test email. + */ +class TestEmailSender implements DebugSection { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(TestEmailSender.class); + + @Inject + private DataSource dataSource; + + @Inject + private SendMailSsl sendMailSsl; + + @Inject + private Server server; + + + @Override + public String getName() { + return "mail"; + } + + @Override + public String getDescription() { + return "Sends out a test email"; + } + + @Override + public void execute(CommandSender sender, List arguments) { + sender.sendMessage(ChatColor.BLUE + "AuthMe test email sender"); + if (!sendMailSsl.hasAllInformation()) { + sender.sendMessage(ChatColor.RED + "You haven't set all required configurations in config.yml " + + "for sending emails. Please check your config.yml"); + return; + } + + String email = getEmail(sender, arguments); + + // getEmail() takes care of informing the sender of the error if email == null + if (email != null) { + boolean sendMail = sendTestEmail(email); + if (sendMail) { + sender.sendMessage("Test email sent to " + email + " with success"); + } else { + sender.sendMessage(ChatColor.RED + "Failed to send test mail to " + email + "; please check your logs"); + } + } + } + + @Override + public PermissionNode getRequiredPermission() { + return DebugSectionPermissions.TEST_EMAIL; + } + + /** + * Gets the email address to use based on the sender and the arguments. If the arguments are empty, + * we attempt to retrieve the email from the sender. If there is an argument, we verify that it is + * an email address. + * {@code null} is returned if no email address could be found. This method informs the sender of + * the specific error in such cases. + * + * @param sender the command sender + * @param arguments the provided arguments + * @return the email to use, or null if none found + */ + private String getEmail(CommandSender sender, List arguments) { + if (arguments.isEmpty()) { + DataSourceValue emailResult = dataSource.getEmail(sender.getName()); + if (!emailResult.rowExists()) { + sender.sendMessage(ChatColor.RED + "Please provide an email address, " + + "e.g. /authme debug mail test@example.com"); + return null; + } + final String email = emailResult.getValue(); + if (Utils.isEmailEmpty(email)) { + sender.sendMessage(ChatColor.RED + "No email set for your account!" + + " Please use /authme debug mail "); + return null; + } + return email; + } else { + String email = arguments.get(0); + if (StringUtils.isInsideString('@', email)) { + return email; + } + sender.sendMessage(ChatColor.RED + "Invalid email! Usage: /authme debug mail test@example.com"); + return null; + } + } + + private boolean sendTestEmail(String email) { + HtmlEmail htmlEmail; + try { + htmlEmail = sendMailSsl.initializeMail(email); + } catch (EmailException e) { + logger.logException("Failed to create email for sample email:", e); + return false; + } + + htmlEmail.setSubject("AuthMe test email"); + String message = "Hello there!
This is a sample email sent to you from a Minecraft server (" + + server.getName() + ") via /authme debug mail. If you're seeing this, sending emails should be fine."; + return sendMailSsl.sendEmail(message, htmlEmail); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/captcha/CaptchaCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/captcha/CaptchaCommand.java new file mode 100644 index 0000000000..c486dd042f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/captcha/CaptchaCommand.java @@ -0,0 +1,86 @@ +package fr.xephi.authme.command.executable.captcha; + +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.data.captcha.LoginCaptchaManager; +import fr.xephi.authme.data.captcha.RegistrationCaptchaManager; +import fr.xephi.authme.data.limbo.LimboMessageType; +import fr.xephi.authme.data.limbo.LimboService; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.service.CommonService; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Captcha command, allowing a player to solve a captcha. + */ +public class CaptchaCommand extends PlayerCommand { + + @Inject + private PlayerCache playerCache; + + @Inject + private LoginCaptchaManager loginCaptchaManager; + + @Inject + private RegistrationCaptchaManager registrationCaptchaManager; + + @Inject + private CommonService commonService; + + @Inject + private LimboService limboService; + + @Inject + private DataSource dataSource; + + @Override + public void runCommand(Player player, List arguments) { + final String name = player.getName(); + + if (playerCache.isAuthenticated(name)) { + // No captcha is relevant if the player is logged in + commonService.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR); + return; + } + + if (loginCaptchaManager.isCaptchaRequired(name)) { + checkLoginCaptcha(player, arguments.get(0)); + } else { + final boolean isPlayerRegistered = dataSource.isAuthAvailable(name); + if (!isPlayerRegistered && registrationCaptchaManager.isCaptchaRequired(name)) { + checkRegisterCaptcha(player, arguments.get(0)); + } else { + MessageKey errorMessage = isPlayerRegistered ? MessageKey.USAGE_LOGIN : MessageKey.USAGE_REGISTER; + commonService.send(player, errorMessage); + } + } + } + + private void checkLoginCaptcha(Player player, String captchaCode) { + final boolean isCorrectCode = loginCaptchaManager.checkCode(player, captchaCode); + if (isCorrectCode) { + commonService.send(player, MessageKey.CAPTCHA_SUCCESS); + commonService.send(player, MessageKey.LOGIN_MESSAGE); + limboService.unmuteMessageTask(player); + } else { + String newCode = loginCaptchaManager.getCaptchaCodeOrGenerateNew(player.getName()); + commonService.send(player, MessageKey.CAPTCHA_WRONG_ERROR, newCode); + } + } + + private void checkRegisterCaptcha(Player player, String captchaCode) { + final boolean isCorrectCode = registrationCaptchaManager.checkCode(player, captchaCode); + if (isCorrectCode) { + commonService.send(player, MessageKey.REGISTER_CAPTCHA_SUCCESS); + commonService.send(player, MessageKey.REGISTER_MESSAGE); + } else { + String newCode = registrationCaptchaManager.getCaptchaCodeOrGenerateNew(player.getName()); + commonService.send(player, MessageKey.CAPTCHA_WRONG_ERROR, newCode); + } + limboService.resetMessageTask(player, LimboMessageType.REGISTER); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/changepassword/ChangePasswordCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/changepassword/ChangePasswordCommand.java new file mode 100644 index 0000000000..83a0e5b2ce --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/changepassword/ChangePasswordCommand.java @@ -0,0 +1,74 @@ +package fr.xephi.authme.command.executable.changepassword; + +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.data.VerificationCodeManager; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.process.Management; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.service.ValidationService.ValidationResult; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; +import java.util.Locale; + +/** + * The command for a player to change his password with. + */ +public class ChangePasswordCommand extends PlayerCommand { + + @Inject + private CommonService commonService; + + @Inject + private PlayerCache playerCache; + + @Inject + private ValidationService validationService; + + @Inject + private Management management; + + @Inject + private VerificationCodeManager codeManager; + + @Override + public void runCommand(Player player, List arguments) { + String name = player.getName().toLowerCase(Locale.ROOT); + + if (!playerCache.isAuthenticated(name)) { + commonService.send(player, MessageKey.NOT_LOGGED_IN); + return; + } + // Check if the user has been verified or not + if (codeManager.isVerificationRequired(player)) { + codeManager.codeExistOrGenerateNew(name); + commonService.send(player, MessageKey.VERIFICATION_CODE_REQUIRED); + return; + } + + String oldPassword = arguments.get(0); + String newPassword = arguments.get(1); + + // Make sure the password is allowed + ValidationResult passwordValidation = validationService.validatePassword(newPassword, name); + if (passwordValidation.hasError()) { + commonService.send(player, passwordValidation.getMessageKey(), passwordValidation.getArgs()); + return; + } + + management.performPasswordChange(player, oldPassword, newPassword); + } + + @Override + protected String getAlternativeCommand() { + return "/authme password "; + } + + @Override + public MessageKey getArgumentsMismatchMessage() { + return MessageKey.USAGE_CHANGE_PASSWORD; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/AddEmailCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/AddEmailCommand.java new file mode 100644 index 0000000000..87e381047f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/AddEmailCommand.java @@ -0,0 +1,40 @@ +package fr.xephi.authme.command.executable.email; + +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.process.Management; +import fr.xephi.authme.service.CommonService; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Command for setting an email to an account. + */ +public class AddEmailCommand extends PlayerCommand { + + @Inject + private Management management; + + @Inject + private CommonService commonService; + + @Override + public void runCommand(Player player, List arguments) { + String email = arguments.get(0); + String emailConfirmation = arguments.get(1); + + if (email.equals(emailConfirmation)) { + // Closer inspection of the mail address handled by the async task + management.performAddEmail(player, email); + } else { + commonService.send(player, MessageKey.CONFIRM_EMAIL_MESSAGE); + } + } + + @Override + public MessageKey getArgumentsMismatchMessage() { + return MessageKey.USAGE_ADD_EMAIL; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/ChangeEmailCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/ChangeEmailCommand.java new file mode 100644 index 0000000000..a6d52e0a44 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/ChangeEmailCommand.java @@ -0,0 +1,46 @@ +package fr.xephi.authme.command.executable.email; + +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.data.VerificationCodeManager; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.process.Management; +import fr.xephi.authme.service.CommonService; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Change email command. + */ +public class ChangeEmailCommand extends PlayerCommand { + + @Inject + private Management management; + + @Inject + private CommonService commonService; + + @Inject + private VerificationCodeManager codeManager; + + @Override + public void runCommand(Player player, List arguments) { + final String playerName = player.getName(); + // Check if the user has been verified or not + if (codeManager.isVerificationRequired(player)) { + codeManager.codeExistOrGenerateNew(playerName); + commonService.send(player, MessageKey.VERIFICATION_CODE_REQUIRED); + return; + } + + String playerMailOld = arguments.get(0); + String playerMailNew = arguments.get(1); + management.performChangeEmail(player, playerMailOld, playerMailNew); + } + + @Override + public MessageKey getArgumentsMismatchMessage() { + return MessageKey.USAGE_CHANGE_EMAIL; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/EmailBaseCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/EmailBaseCommand.java new file mode 100644 index 0000000000..0484e21898 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/EmailBaseCommand.java @@ -0,0 +1,29 @@ +package fr.xephi.authme.command.executable.email; + +import fr.xephi.authme.command.CommandMapper; +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.command.FoundCommandResult; +import fr.xephi.authme.command.help.HelpProvider; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.Collections; +import java.util.List; + +/** + * Base command for /email, showing information about the child commands. + */ +public class EmailBaseCommand implements ExecutableCommand { + + @Inject + private CommandMapper commandMapper; + + @Inject + private HelpProvider helpProvider; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + FoundCommandResult result = commandMapper.mapPartsToCommand(sender, Collections.singletonList("email")); + helpProvider.outputHelp(sender, result, HelpProvider.SHOW_CHILDREN); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/EmailSetPasswordCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/EmailSetPasswordCommand.java new file mode 100644 index 0000000000..f3979adca0 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/EmailSetPasswordCommand.java @@ -0,0 +1,61 @@ +package fr.xephi.authme.command.executable.email; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.security.PasswordSecurity; +import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.PasswordRecoveryService; +import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.service.ValidationService.ValidationResult; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Command for changing password following successful recovery. + */ +public class EmailSetPasswordCommand extends PlayerCommand { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(EmailSetPasswordCommand.class); + + @Inject + private DataSource dataSource; + + @Inject + private CommonService commonService; + + @Inject + private PasswordRecoveryService recoveryService; + + @Inject + private PasswordSecurity passwordSecurity; + + @Inject + private ValidationService validationService; + + @Override + protected void runCommand(Player player, List arguments) { + if (recoveryService.canChangePassword(player)) { + String name = player.getName(); + String password = arguments.get(0); + + ValidationResult result = validationService.validatePassword(password, name); + if (!result.hasError()) { + HashedPassword hashedPassword = passwordSecurity.computeHash(password, name); + dataSource.updatePassword(name, hashedPassword); + recoveryService.removeFromSuccessfulRecovery(player); + logger.info("Player '" + name + "' has changed their password from recovery"); + commonService.send(player, MessageKey.PASSWORD_CHANGED_SUCCESS); + } else { + commonService.send(player, result.getMessageKey(), result.getArgs()); + } + } else { + commonService.send(player, MessageKey.CHANGE_PASSWORD_EXPIRED); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/ProcessCodeCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/ProcessCodeCommand.java new file mode 100644 index 0000000000..0883c18f94 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/ProcessCodeCommand.java @@ -0,0 +1,46 @@ +package fr.xephi.authme.command.executable.email; + +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.PasswordRecoveryService; +import fr.xephi.authme.service.RecoveryCodeService; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Command for submitting email recovery code. + */ +public class ProcessCodeCommand extends PlayerCommand { + + @Inject + private CommonService commonService; + + @Inject + private RecoveryCodeService codeService; + + @Inject + private PasswordRecoveryService recoveryService; + + @Override + protected void runCommand(Player player, List arguments) { + String name = player.getName(); + String code = arguments.get(0); + + if (codeService.hasTriesLeft(name)) { + if (codeService.isCodeValid(name, code)) { + commonService.send(player, MessageKey.RECOVERY_CODE_CORRECT); + recoveryService.addSuccessfulRecovery(player); + codeService.removeCode(name); + } else { + commonService.send(player, MessageKey.INCORRECT_RECOVERY_CODE, + Integer.toString(codeService.getTriesLeft(name))); + } + } else { + codeService.removeCode(name); + commonService.send(player, MessageKey.RECOVERY_TRIES_EXCEEDED); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/RecoverEmailCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/RecoverEmailCommand.java new file mode 100644 index 0000000000..ebb7113394 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/RecoverEmailCommand.java @@ -0,0 +1,91 @@ +package fr.xephi.authme.command.executable.email; + +import ch.jalu.datasourcecolumns.data.DataSourceValue; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.mail.EmailService; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.PasswordRecoveryService; +import fr.xephi.authme.service.RecoveryCodeService; +import fr.xephi.authme.util.Utils; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Command for password recovery by email. + */ +public class RecoverEmailCommand extends PlayerCommand { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(RecoverEmailCommand.class); + + @Inject + private CommonService commonService; + + @Inject + private DataSource dataSource; + + @Inject + private PlayerCache playerCache; + + @Inject + private EmailService emailService; + + @Inject + private PasswordRecoveryService recoveryService; + + @Inject + private RecoveryCodeService recoveryCodeService; + + @Inject + private BukkitService bukkitService; + + @Override + protected void runCommand(Player player, List arguments) { + final String playerMail = arguments.get(0); + final String playerName = player.getName(); + + if (!emailService.hasAllInformation()) { + logger.warning("Mail API is not set"); + commonService.send(player, MessageKey.INCOMPLETE_EMAIL_SETTINGS); + return; + } + if (playerCache.isAuthenticated(playerName)) { + commonService.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR); + return; + } + + DataSourceValue emailResult = dataSource.getEmail(playerName); + if (!emailResult.rowExists()) { + commonService.send(player, MessageKey.USAGE_REGISTER); + return; + } + + final String email = emailResult.getValue(); + if (Utils.isEmailEmpty(email) || !email.equalsIgnoreCase(playerMail)) { + commonService.send(player, MessageKey.INVALID_EMAIL); + return; + } + + bukkitService.runTaskAsynchronously(() -> { + if (recoveryCodeService.isRecoveryCodeNeeded()) { + // Recovery code is needed; generate and send one + recoveryService.createAndSendRecoveryCode(player, email); + } else { + // Code not needed, just send them a new password + recoveryService.generateAndSendNewPassword(player, email); + } + }); + } + + @Override + public MessageKey getArgumentsMismatchMessage() { + return MessageKey.USAGE_RECOVER_EMAIL; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/ShowEmailCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/ShowEmailCommand.java new file mode 100644 index 0000000000..9e20498754 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/email/ShowEmailCommand.java @@ -0,0 +1,48 @@ +package fr.xephi.authme.command.executable.email; + +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.settings.properties.SecuritySettings; +import fr.xephi.authme.util.Utils; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Show email command. + */ +public class ShowEmailCommand extends PlayerCommand { + + @Inject + private CommonService commonService; + + @Inject + private PlayerCache playerCache; + + @Override + public void runCommand(Player player, List arguments) { + PlayerAuth auth = playerCache.getAuth(player.getName()); + if (auth != null && !Utils.isEmailEmpty(auth.getEmail())) { + if (commonService.getProperty(SecuritySettings.USE_EMAIL_MASKING)){ + commonService.send(player, MessageKey.EMAIL_SHOW, emailMask(auth.getEmail())); + } else { + commonService.send(player, MessageKey.EMAIL_SHOW, auth.getEmail()); + } + } else { + commonService.send(player, MessageKey.SHOW_NO_EMAIL); + } + } + + private String emailMask(String email){ + String[] frag = email.split("@"); //Split id and domain + int sid = frag[0].length() / 3 + 1; //Define the id view (required length >= 1) + int sdomain = frag[1].length() / 3; //Define the domain view (required length >= 0) + String id = frag[0].substring(0, sid) + "***"; //Build the id + String domain = "***" + frag[1].substring(sdomain); //Build the domain + return id + "@" + domain; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/login/LoginCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/login/LoginCommand.java new file mode 100644 index 0000000000..57ae863937 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/login/LoginCommand.java @@ -0,0 +1,34 @@ +package fr.xephi.authme.command.executable.login; + +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.process.Management; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Login command. + */ +public class LoginCommand extends PlayerCommand { + + @Inject + private Management management; + + @Override + public void runCommand(Player player, List arguments) { + String password = arguments.get(0); + management.performLogin(player, password); + } + + @Override + public MessageKey getArgumentsMismatchMessage() { + return MessageKey.USAGE_LOGIN; + } + + @Override + protected String getAlternativeCommand() { + return "/authme forcelogin "; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/logout/LogoutCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/logout/LogoutCommand.java new file mode 100644 index 0000000000..83b17882aa --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/logout/LogoutCommand.java @@ -0,0 +1,22 @@ +package fr.xephi.authme.command.executable.logout; + +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.process.Management; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Logout command. + */ +public class LogoutCommand extends PlayerCommand { + + @Inject + private Management management; + + @Override + public void runCommand(Player player, List arguments) { + management.performLogout(player); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/register/RegisterCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/register/RegisterCommand.java new file mode 100644 index 0000000000..29e9833319 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/register/RegisterCommand.java @@ -0,0 +1,222 @@ +package fr.xephi.authme.command.executable.register; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.data.captcha.RegistrationCaptchaManager; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.mail.EmailService; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.process.Management; +import fr.xephi.authme.process.register.RegisterSecondaryArgument; +import fr.xephi.authme.process.register.RegistrationType; +import fr.xephi.authme.process.register.executors.EmailRegisterParams; +import fr.xephi.authme.process.register.executors.PasswordRegisterParams; +import fr.xephi.authme.process.register.executors.RegistrationMethod; +import fr.xephi.authme.process.register.executors.TwoFactorRegisterParams; +import fr.xephi.authme.security.HashAlgorithm; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.settings.properties.EmailSettings; +import fr.xephi.authme.settings.properties.RegistrationSettings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +import static fr.xephi.authme.process.register.RegisterSecondaryArgument.CONFIRMATION; +import static fr.xephi.authme.process.register.RegisterSecondaryArgument.EMAIL_MANDATORY; +import static fr.xephi.authme.process.register.RegisterSecondaryArgument.EMAIL_OPTIONAL; +import static fr.xephi.authme.process.register.RegisterSecondaryArgument.NONE; +import static fr.xephi.authme.settings.properties.RegistrationSettings.REGISTER_SECOND_ARGUMENT; + +/** + * Command for /register. + */ +public class RegisterCommand extends PlayerCommand { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(RegisterCommand.class); + + @Inject + private Management management; + + @Inject + private CommonService commonService; + + @Inject + private BukkitService bukkitService; + + @Inject + private DataSource dataSource; + + @Inject + private EmailService emailService; + + @Inject + private ValidationService validationService; + + @Inject + private RegistrationCaptchaManager registrationCaptchaManager; + + @Override + public void runCommand(Player player, List arguments) { + if (!isCaptchaFulfilled(player)) { + return; // isCaptchaFulfilled handles informing the player on failure + } + + if (commonService.getProperty(SecuritySettings.PASSWORD_HASH) == HashAlgorithm.TWO_FACTOR) { + //for two factor auth we don't need to check the usage + management.performRegister(RegistrationMethod.TWO_FACTOR_REGISTRATION, + TwoFactorRegisterParams.of(player)); + return; + } else if (arguments.size() < 1) { + commonService.send(player, MessageKey.USAGE_REGISTER); + return; + } + + RegistrationType registrationType = commonService.getProperty(RegistrationSettings.REGISTRATION_TYPE); + if (registrationType == RegistrationType.PASSWORD) { + handlePasswordRegistration(player, arguments); + } else if (registrationType == RegistrationType.EMAIL) { + handleEmailRegistration(player, arguments); + } else { + throw new IllegalStateException("Unknown registration type '" + registrationType + "'"); + } + } + + @Override + protected String getAlternativeCommand() { + return "/authme register "; + } + + @Override + public MessageKey getArgumentsMismatchMessage() { + return MessageKey.USAGE_REGISTER; + } + + private boolean isCaptchaFulfilled(Player player) { + if (registrationCaptchaManager.isCaptchaRequired(player.getName())) { + String code = registrationCaptchaManager.getCaptchaCodeOrGenerateNew(player.getName()); + commonService.send(player, MessageKey.CAPTCHA_FOR_REGISTRATION_REQUIRED, code); + return false; + } + return true; + } + + private void handlePasswordRegistration(Player player, List arguments) { + if (isSecondArgValidForPasswordRegistration(player, arguments)) { + final String password = arguments.get(0); + final String email = getEmailIfAvailable(arguments); + + management.performRegister(RegistrationMethod.PASSWORD_REGISTRATION, + PasswordRegisterParams.of(player, password, email)); + } + } + + private String getEmailIfAvailable(List arguments) { + if (arguments.size() >= 2) { + RegisterSecondaryArgument secondArgType = commonService.getProperty(REGISTER_SECOND_ARGUMENT); + if (secondArgType == EMAIL_MANDATORY || secondArgType == EMAIL_OPTIONAL) { + return arguments.get(1); + } + } + return null; + } + + /** + * Verifies that the second argument is valid (based on the configuration) + * to perform a password registration. The player is informed if the check + * is unsuccessful. + * + * @param player the player to register + * @param arguments the provided arguments + * @return true if valid, false otherwise + */ + private boolean isSecondArgValidForPasswordRegistration(Player player, List arguments) { + RegisterSecondaryArgument secondArgType = commonService.getProperty(REGISTER_SECOND_ARGUMENT); + // cases where args.size < 2 + if (secondArgType == NONE || secondArgType == EMAIL_OPTIONAL && arguments.size() < 2) { + return true; + } else if (arguments.size() < 2) { + commonService.send(player, MessageKey.USAGE_REGISTER); + return false; + } + + if (secondArgType == CONFIRMATION) { + if (arguments.get(0).equals(arguments.get(1))) { + return true; + } else { + commonService.send(player, MessageKey.PASSWORD_MATCH_ERROR); + return false; + } + } else if (secondArgType == EMAIL_MANDATORY || secondArgType == EMAIL_OPTIONAL) { + if (validationService.validateEmail(arguments.get(1))) { + return true; + } else { + commonService.send(player, MessageKey.INVALID_EMAIL); + return false; + } + } else { + throw new IllegalStateException("Unknown secondary argument type '" + secondArgType + "'"); + } + } + + private void handleEmailRegistration(Player player, List arguments) { + if (!emailService.hasAllInformation()) { + commonService.send(player, MessageKey.INCOMPLETE_EMAIL_SETTINGS); + logger.warning("Cannot register player '" + player.getName() + "': no email or password is set " + + "to send emails from. Please adjust your config at " + EmailSettings.MAIL_ACCOUNT.getPath()); + return; + } + + final String email = arguments.get(0); + if (!validationService.validateEmail(email)) { + commonService.send(player, MessageKey.INVALID_EMAIL); + } else if (isSecondArgValidForEmailRegistration(player, arguments)) { + management.performRegister(RegistrationMethod.EMAIL_REGISTRATION, + EmailRegisterParams.of(player, email)); + if (commonService.getProperty(RegistrationSettings.UNREGISTER_ON_EMAIL_VERIFICATION_FAILURE) && commonService.getProperty(RegistrationSettings.UNREGISTER_AFTER_MINUTES) > 0) { + bukkitService.runTaskLater(player, () -> { + if (dataSource.getAuth(player.getName()) != null) { + if (dataSource.getAuth(player.getName()).getLastLogin() == null) { + management.performUnregisterByAdmin(null, player.getName(), player); + } + } + }, 60 * 20 * commonService.getProperty(RegistrationSettings.UNREGISTER_AFTER_MINUTES)); + } + } + } + + /** + * Verifies that the second argument is valid (based on the configuration) + * to perform an email registration. The player is informed if the check + * is unsuccessful. + * + * @param player the player to register + * @param arguments the provided arguments + * @return true if valid, false otherwise + */ + private boolean isSecondArgValidForEmailRegistration(Player player, List arguments) { + RegisterSecondaryArgument secondArgType = commonService.getProperty(REGISTER_SECOND_ARGUMENT); + // cases where args.size < 2 + if (secondArgType == NONE || secondArgType == EMAIL_OPTIONAL && arguments.size() < 2) { + return true; + } else if (arguments.size() < 2) { + commonService.send(player, MessageKey.USAGE_REGISTER); + return false; + } + + if (secondArgType == EMAIL_OPTIONAL || secondArgType == EMAIL_MANDATORY || secondArgType == CONFIRMATION) { + if (arguments.get(0).equals(arguments.get(1))) { + return true; + } else { + commonService.send(player, MessageKey.USAGE_REGISTER); + return false; + } + } else { + throw new IllegalStateException("Unknown secondary argument type '" + secondArgType + "'"); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/AddTotpCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/AddTotpCommand.java new file mode 100644 index 0000000000..e8a78bd1de --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/AddTotpCommand.java @@ -0,0 +1,43 @@ +package fr.xephi.authme.command.executable.totp; + +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.security.totp.GenerateTotpService; +import fr.xephi.authme.security.totp.TotpAuthenticator.TotpGenerationResult; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Command for a player to enable TOTP. + */ +public class AddTotpCommand extends PlayerCommand { + + @Inject + private GenerateTotpService generateTotpService; + + @Inject + private PlayerCache playerCache; + + @Inject + private Messages messages; + + @Override + protected void runCommand(Player player, List arguments) { + PlayerAuth auth = playerCache.getAuth(player.getName()); + if (auth == null) { + messages.send(player, MessageKey.NOT_LOGGED_IN); + } else if (auth.getTotpKey() == null) { + TotpGenerationResult createdTotpInfo = generateTotpService.generateTotpKey(player); + messages.send(player, MessageKey.TWO_FACTOR_CREATE, + createdTotpInfo.getTotpKey(), createdTotpInfo.getAuthenticatorQrCodeUrl()); + messages.send(player, MessageKey.TWO_FACTOR_CREATE_CONFIRMATION_REQUIRED); + } else { + messages.send(player, MessageKey.TWO_FACTOR_ALREADY_ENABLED); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/ConfirmTotpCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/ConfirmTotpCommand.java new file mode 100644 index 0000000000..85d7bc8a12 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/ConfirmTotpCommand.java @@ -0,0 +1,74 @@ +package fr.xephi.authme.command.executable.totp; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.security.totp.GenerateTotpService; +import fr.xephi.authme.security.totp.TotpAuthenticator.TotpGenerationResult; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Command to enable TOTP by supplying the proper code as confirmation. + */ +public class ConfirmTotpCommand extends PlayerCommand { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(ConfirmTotpCommand.class); + + @Inject + private GenerateTotpService generateTotpService; + + @Inject + private PlayerCache playerCache; + + @Inject + private DataSource dataSource; + + @Inject + private Messages messages; + + @Override + protected void runCommand(Player player, List arguments) { + PlayerAuth auth = playerCache.getAuth(player.getName()); + if (auth == null) { + messages.send(player, MessageKey.NOT_LOGGED_IN); + } else if (auth.getTotpKey() != null) { + messages.send(player, MessageKey.TWO_FACTOR_ALREADY_ENABLED); + } else { + verifyTotpCodeConfirmation(player, auth, arguments.get(0)); + } + } + + private void verifyTotpCodeConfirmation(Player player, PlayerAuth auth, String inputTotpCode) { + final TotpGenerationResult totpDetails = generateTotpService.getGeneratedTotpKey(player); + if (totpDetails == null) { + messages.send(player, MessageKey.TWO_FACTOR_ENABLE_ERROR_NO_CODE); + } else { + boolean isCodeValid = generateTotpService.isTotpCodeCorrectForGeneratedTotpKey(player, inputTotpCode); + if (isCodeValid) { + generateTotpService.removeGenerateTotpKey(player); + insertTotpKeyIntoDatabase(player, auth, totpDetails); + } else { + messages.send(player, MessageKey.TWO_FACTOR_ENABLE_ERROR_WRONG_CODE); + } + } + } + + private void insertTotpKeyIntoDatabase(Player player, PlayerAuth auth, TotpGenerationResult totpDetails) { + if (dataSource.setTotpKey(player.getName(), totpDetails.getTotpKey())) { + messages.send(player, MessageKey.TWO_FACTOR_ENABLE_SUCCESS); + auth.setTotpKey(totpDetails.getTotpKey()); + playerCache.updatePlayer(auth); + logger.info("Player '" + player.getName() + "' has successfully added a TOTP key to their account"); + } else { + messages.send(player, MessageKey.ERROR); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/RemoveTotpCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/RemoveTotpCommand.java new file mode 100644 index 0000000000..649f13e40f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/RemoveTotpCommand.java @@ -0,0 +1,62 @@ +package fr.xephi.authme.command.executable.totp; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.security.totp.TotpAuthenticator; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Command for a player to remove 2FA authentication. + */ +public class RemoveTotpCommand extends PlayerCommand { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(RemoveTotpCommand.class); + + @Inject + private DataSource dataSource; + + @Inject + private PlayerCache playerCache; + + @Inject + private TotpAuthenticator totpAuthenticator; + + @Inject + private Messages messages; + + @Override + protected void runCommand(Player player, List arguments) { + PlayerAuth auth = playerCache.getAuth(player.getName()); + if (auth == null) { + messages.send(player, MessageKey.NOT_LOGGED_IN); + } else if (auth.getTotpKey() == null) { + messages.send(player, MessageKey.TWO_FACTOR_NOT_ENABLED_ERROR); + } else { + if (totpAuthenticator.checkCode(auth, arguments.get(0))) { + removeTotpKeyFromDatabase(player, auth); + } else { + messages.send(player, MessageKey.TWO_FACTOR_INVALID_CODE); + } + } + } + + private void removeTotpKeyFromDatabase(Player player, PlayerAuth auth) { + if (dataSource.removeTotpKey(auth.getNickname())) { + auth.setTotpKey(null); + playerCache.updatePlayer(auth); + messages.send(player, MessageKey.TWO_FACTOR_REMOVED_SUCCESS); + logger.info("Player '" + player.getName() + "' removed their TOTP key"); + } else { + messages.send(player, MessageKey.ERROR); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/TotpBaseCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/TotpBaseCommand.java new file mode 100644 index 0000000000..2b170a030f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/TotpBaseCommand.java @@ -0,0 +1,29 @@ +package fr.xephi.authme.command.executable.totp; + +import fr.xephi.authme.command.CommandMapper; +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.command.FoundCommandResult; +import fr.xephi.authme.command.help.HelpProvider; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.Collections; +import java.util.List; + +/** + * Base command for /totp. + */ +public class TotpBaseCommand implements ExecutableCommand { + + @Inject + private CommandMapper commandMapper; + + @Inject + private HelpProvider helpProvider; + + @Override + public void executeCommand(CommandSender sender, List arguments) { + FoundCommandResult result = commandMapper.mapPartsToCommand(sender, Collections.singletonList("totp")); + helpProvider.outputHelp(sender, result, HelpProvider.SHOW_CHILDREN); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/TotpCodeCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/TotpCodeCommand.java new file mode 100644 index 0000000000..760b83ec74 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/totp/TotpCodeCommand.java @@ -0,0 +1,79 @@ +package fr.xephi.authme.command.executable.totp; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.data.limbo.LimboPlayer; +import fr.xephi.authme.data.limbo.LimboPlayerState; +import fr.xephi.authme.data.limbo.LimboService; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.process.login.AsynchronousLogin; +import fr.xephi.authme.security.totp.TotpAuthenticator; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * TOTP code command for processing the 2FA code during the login process. + */ +public class TotpCodeCommand extends PlayerCommand { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(TotpCodeCommand.class); + + @Inject + private LimboService limboService; + + @Inject + private PlayerCache playerCache; + + @Inject + private Messages messages; + + @Inject + private TotpAuthenticator totpAuthenticator; + + @Inject + private DataSource dataSource; + + @Inject + private AsynchronousLogin asynchronousLogin; + + @Override + protected void runCommand(Player player, List arguments) { + if (playerCache.isAuthenticated(player.getName())) { + messages.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR); + return; + } + + PlayerAuth auth = dataSource.getAuth(player.getName()); + if (auth == null) { + messages.send(player, MessageKey.REGISTER_MESSAGE); + return; + } + + LimboPlayer limbo = limboService.getLimboPlayer(player.getName()); + if (limbo != null && limbo.getState() == LimboPlayerState.TOTP_REQUIRED) { + processCode(player, auth, arguments.get(0)); + } else { + logger.debug(() -> "Aborting TOTP check for player '" + player.getName() + + "'. Invalid limbo state: " + (limbo == null ? "no limbo" : limbo.getState())); + messages.send(player, MessageKey.LOGIN_MESSAGE); + } + } + + private void processCode(Player player, PlayerAuth auth, String inputCode) { + boolean isCodeValid = totpAuthenticator.checkCode(auth, inputCode); + if (isCodeValid) { + logger.debug("Successfully checked TOTP code for `{0}`", player.getName()); + asynchronousLogin.performLogin(player, auth); + } else { + logger.debug("Input TOTP code was invalid for player `{0}`", player.getName()); + messages.send(player, MessageKey.TWO_FACTOR_INVALID_CODE); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/unregister/UnregisterCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/unregister/UnregisterCommand.java new file mode 100644 index 0000000000..21993f38e9 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/unregister/UnregisterCommand.java @@ -0,0 +1,62 @@ +package fr.xephi.authme.command.executable.unregister; + +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.data.VerificationCodeManager; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.process.Management; +import fr.xephi.authme.service.CommonService; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Command for a player to unregister himself. + */ +public class UnregisterCommand extends PlayerCommand { + + @Inject + private Management management; + + @Inject + private CommonService commonService; + + @Inject + private PlayerCache playerCache; + + @Inject + private VerificationCodeManager codeManager; + + @Override + public void runCommand(Player player, List arguments) { + String playerPass = arguments.get(0); + String playerName = player.getName(); + + // Make sure the player is authenticated + if (!playerCache.isAuthenticated(playerName)) { + commonService.send(player, MessageKey.NOT_LOGGED_IN); + return; + } + + // Check if the user has been verified or not + if (codeManager.isVerificationRequired(player)) { + codeManager.codeExistOrGenerateNew(playerName); + commonService.send(player, MessageKey.VERIFICATION_CODE_REQUIRED); + return; + } + + // Unregister the player + management.performUnregister(player, playerPass); + } + + @Override + public MessageKey getArgumentsMismatchMessage() { + return MessageKey.USAGE_UNREGISTER; + } + + @Override + protected String getAlternativeCommand() { + return "/authme unregister "; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/verification/VerificationCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/verification/VerificationCommand.java new file mode 100644 index 0000000000..dc28c95fab --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/executable/verification/VerificationCommand.java @@ -0,0 +1,61 @@ +package fr.xephi.authme.command.executable.verification; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.command.PlayerCommand; +import fr.xephi.authme.data.VerificationCodeManager; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.service.CommonService; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Used to complete the email verification process. + */ +public class VerificationCommand extends PlayerCommand { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(VerificationCommand.class); + + @Inject + private CommonService commonService; + + @Inject + private VerificationCodeManager codeManager; + + @Override + public void runCommand(Player player, List arguments) { + final String playerName = player.getName(); + + if (!codeManager.canSendMail()) { + logger.warning("Mail API is not set"); + commonService.send(player, MessageKey.INCOMPLETE_EMAIL_SETTINGS); + return; + } + + if (codeManager.isVerificationRequired(player)) { + if (codeManager.isCodeRequired(playerName)) { + if (codeManager.checkCode(playerName, arguments.get(0))) { + commonService.send(player, MessageKey.VERIFICATION_CODE_VERIFIED); + } else { + commonService.send(player, MessageKey.INCORRECT_VERIFICATION_CODE); + } + } else { + commonService.send(player, MessageKey.VERIFICATION_CODE_EXPIRED); + } + } else { + if (codeManager.hasEmail(playerName)) { + commonService.send(player, MessageKey.VERIFICATION_CODE_ALREADY_VERIFIED); + } else { + commonService.send(player, MessageKey.VERIFICATION_CODE_EMAIL_NEEDED); + commonService.send(player, MessageKey.ADD_EMAIL_MESSAGE); + } + } + } + + @Override + public MessageKey getArgumentsMismatchMessage() { + return MessageKey.USAGE_VERIFICATION_CODE; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/help/HelpMessage.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/help/HelpMessage.java new file mode 100644 index 0000000000..ae306a4033 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/help/HelpMessage.java @@ -0,0 +1,43 @@ +package fr.xephi.authme.command.help; + +/** + * Common, non-generic keys for messages used when showing command help. + * All keys are prefixed with {@code common}. + */ +public enum HelpMessage { + + HEADER("header"), + + OPTIONAL("optional"), + + HAS_PERMISSION("hasPermission"), + + NO_PERMISSION("noPermission"), + + DEFAULT("default"), + + RESULT("result"); + + private static final String PREFIX = "common."; + private final String key; + + /** + * Constructor. + * + * @param key the message key + */ + HelpMessage(String key) { + this.key = PREFIX + key; + } + + /** @return the message key */ + public String getKey() { + return key; + } + + /** @return the key without the common prefix */ + public String getEntryKey() { + // Note ljacqu 20171008: #getKey is called more often than this method, so we optimize for the former method + return key.substring(PREFIX.length()); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/help/HelpMessagesService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/help/HelpMessagesService.java new file mode 100644 index 0000000000..994d967b29 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/help/HelpMessagesService.java @@ -0,0 +1,117 @@ +package fr.xephi.authme.command.help; + +import com.google.common.base.CaseFormat; +import fr.xephi.authme.command.CommandArgumentDescription; +import fr.xephi.authme.command.CommandDescription; +import fr.xephi.authme.command.CommandUtils; +import fr.xephi.authme.message.HelpMessagesFileHandler; +import fr.xephi.authme.permission.DefaultPermission; + +import javax.inject.Inject; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +/** + * Manages translatable help messages. + */ +public class HelpMessagesService { + + private static final String COMMAND_PREFIX = "commands."; + private static final String DESCRIPTION_SUFFIX = ".description"; + private static final String DETAILED_DESCRIPTION_SUFFIX = ".detailedDescription"; + private static final String DEFAULT_PERMISSIONS_PATH = "common.defaultPermissions."; + + private final HelpMessagesFileHandler helpMessagesFileHandler; + + @Inject + HelpMessagesService(HelpMessagesFileHandler helpMessagesFileHandler) { + this.helpMessagesFileHandler = helpMessagesFileHandler; + } + + /** + * Creates a copy of the supplied command description with localized messages where present. + * + * @param command the command to build a localized version of + * @return the localized description + */ + public CommandDescription buildLocalizedDescription(CommandDescription command) { + final String path = COMMAND_PREFIX + getCommandSubPath(command); + if (!helpMessagesFileHandler.hasSection(path)) { + // Messages file does not have a section for this command - return the provided command + return command; + } + + CommandDescription.CommandBuilder builder = CommandDescription.builder() + .description(getText(path + DESCRIPTION_SUFFIX, command::getDescription)) + .detailedDescription(getText(path + DETAILED_DESCRIPTION_SUFFIX, command::getDetailedDescription)) + .executableCommand(command.getExecutableCommand()) + .parent(command.getParent()) + .labels(command.getLabels()) + .permission(command.getPermission()); + + int i = 1; + for (CommandArgumentDescription argument : command.getArguments()) { + String argPath = path + ".arg" + i; + String label = getText(argPath + ".label", argument::getName); + String description = getText(argPath + ".description", argument::getDescription); + builder.withArgument(label, description, argument.isOptional()); + ++i; + } + + CommandDescription localCommand = builder.build(); + localCommand.getChildren().addAll(command.getChildren()); + return localCommand; + } + + public String getDescription(CommandDescription command) { + return getText(COMMAND_PREFIX + getCommandSubPath(command) + DESCRIPTION_SUFFIX, command::getDescription); + } + + public String getMessage(HelpMessage message) { + return helpMessagesFileHandler.getMessage(message.getKey()); + } + + public String getMessage(HelpSection section) { + return helpMessagesFileHandler.getMessage(section.getKey()); + } + + public String getMessage(DefaultPermission defaultPermission) { + // e.g. {default_permissions_path}.opOnly for DefaultPermission.OP_ONLY + String path = DEFAULT_PERMISSIONS_PATH + getDefaultPermissionsSubPath(defaultPermission); + return helpMessagesFileHandler.getMessage(path); + } + + public static String getDefaultPermissionsSubPath(DefaultPermission defaultPermission) { + return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, defaultPermission.name()); + } + + private String getText(String path, Supplier defaultTextGetter) { + String message = helpMessagesFileHandler.getMessageIfExists(path); + return message == null + ? defaultTextGetter.get() + : message; + } + + + /** + * Triggers a reload of the help messages file. Note that this method is not needed + * to be called for /authme reload. + */ + public void reloadMessagesFile() { + helpMessagesFileHandler.reload(); + } + + /** + * Returns the command subpath for the given command (i.e. the path to the translations for the given + * command under "commands"). + * + * @param command the command to process + * @return the subpath for the command's texts + */ + public static String getCommandSubPath(CommandDescription command) { + return CommandUtils.constructParentList(command) + .stream() + .map(cmd -> cmd.getLabels().get(0)) + .collect(Collectors.joining(".")); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/help/HelpProvider.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/help/HelpProvider.java new file mode 100644 index 0000000000..4327b827f1 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/help/HelpProvider.java @@ -0,0 +1,328 @@ +package fr.xephi.authme.command.help; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableList; +import fr.xephi.authme.command.CommandArgumentDescription; +import fr.xephi.authme.command.CommandDescription; +import fr.xephi.authme.command.CommandUtils; +import fr.xephi.authme.command.FoundCommandResult; +import fr.xephi.authme.initialization.Reloadable; +import fr.xephi.authme.permission.DefaultPermission; +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.permission.PermissionsManager; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.Function; + +import static fr.xephi.authme.command.help.HelpSection.DETAILED_DESCRIPTION; +import static fr.xephi.authme.command.help.HelpSection.SHORT_DESCRIPTION; +import static java.util.Collections.singletonList; + +/** + * Help syntax generator for AuthMe commands. + */ +public class HelpProvider implements Reloadable { + + // --- Bit flags --- + /** Set to show a command overview. */ + public static final int SHOW_COMMAND = 0x001; + /** Set to show the description of the command. */ + public static final int SHOW_DESCRIPTION = 0x002; + /** Set to show the detailed description of the command. */ + public static final int SHOW_LONG_DESCRIPTION = 0x004; + /** Set to include the arguments the command takes. */ + public static final int SHOW_ARGUMENTS = 0x008; + /** Set to show the permissions required to execute the command. */ + public static final int SHOW_PERMISSIONS = 0x010; + /** Set to show alternative labels for the command. */ + public static final int SHOW_ALTERNATIVES = 0x020; + /** Set to show the child commands of the command. */ + public static final int SHOW_CHILDREN = 0x040; + + /** Shortcut for setting all options. */ + public static final int ALL_OPTIONS = ~0; + + private final PermissionsManager permissionsManager; + private final HelpMessagesService helpMessagesService; + /** int with bit flags set corresponding to the above constants for enabled sections. */ + private Integer enabledSections; + + @Inject + HelpProvider(PermissionsManager permissionsManager, HelpMessagesService helpMessagesService) { + this.permissionsManager = permissionsManager; + this.helpMessagesService = helpMessagesService; + } + + /** + * Builds the help messages based on the provided arguments. + * + * @param sender the sender to evaluate permissions with + * @param result the command result to create help for + * @param options output options + * @return the generated help messages + */ + private List buildHelpOutput(CommandSender sender, FoundCommandResult result, int options) { + if (result.getCommandDescription() == null) { + return singletonList(ChatColor.DARK_RED + "Failed to retrieve any help information!"); + } + + List lines = new ArrayList<>(); + options = filterDisabledSections(options); + if (options == 0) { + // Return directly if no options are enabled so we don't include the help header + return lines; + } + String header = helpMessagesService.getMessage(HelpMessage.HEADER); + if (!header.isEmpty()) { + lines.add(ChatColor.GOLD + header); + } + + CommandDescription command = helpMessagesService.buildLocalizedDescription(result.getCommandDescription()); + List correctLabels = ImmutableList.copyOf(filterCorrectLabels(command, result.getLabels())); + + if (hasFlag(SHOW_COMMAND, options)) { + lines.add(ChatColor.GOLD + helpMessagesService.getMessage(HelpSection.COMMAND) + ": " + + CommandUtils.buildSyntax(command, correctLabels)); + } + if (hasFlag(SHOW_DESCRIPTION, options)) { + lines.add(ChatColor.GOLD + helpMessagesService.getMessage(SHORT_DESCRIPTION) + ": " + + ChatColor.WHITE + command.getDescription()); + } + if (hasFlag(SHOW_LONG_DESCRIPTION, options)) { + lines.add(ChatColor.GOLD + helpMessagesService.getMessage(DETAILED_DESCRIPTION) + ":"); + lines.add(ChatColor.WHITE + " " + command.getDetailedDescription()); + } + if (hasFlag(SHOW_ARGUMENTS, options)) { + addArgumentsInfo(command, lines); + } + if (hasFlag(SHOW_PERMISSIONS, options) && sender != null) { + addPermissionsInfo(command, sender, lines); + } + if (hasFlag(SHOW_ALTERNATIVES, options)) { + addAlternativesInfo(command, correctLabels, lines); + } + if (hasFlag(SHOW_CHILDREN, options)) { + addChildrenInfo(command, correctLabels, lines); + } + + return lines; + } + + /** + * Outputs the help for a given command. + * + * @param sender the sender to output the help to + * @param result the result to output information about + * @param options output options + */ + public void outputHelp(CommandSender sender, FoundCommandResult result, int options) { + List lines = buildHelpOutput(sender, result, options); + for (String line : lines) { + sender.sendMessage(line); + } + } + + @Override + public void reload() { + // We don't know about the reloading order of the classes, i.e. we cannot assume that HelpMessagesService + // has already been reloaded. So set the enabledSections flag to null and redefine it first time needed. + enabledSections = null; + } + + /** + * Removes any disabled sections from the options. Sections are considered disabled + * if the translated text for the section is empty. + * + * @param options the options to process + * @return the options without any disabled sections + */ + @SuppressWarnings("checkstyle:BooleanExpressionComplexity") + private int filterDisabledSections(int options) { + if (enabledSections == null) { + enabledSections = flagFor(HelpSection.COMMAND, SHOW_COMMAND) + | flagFor(HelpSection.SHORT_DESCRIPTION, SHOW_DESCRIPTION) + | flagFor(HelpSection.DETAILED_DESCRIPTION, SHOW_LONG_DESCRIPTION) + | flagFor(HelpSection.ARGUMENTS, SHOW_ARGUMENTS) + | flagFor(HelpSection.PERMISSIONS, SHOW_PERMISSIONS) + | flagFor(HelpSection.ALTERNATIVES, SHOW_ALTERNATIVES) + | flagFor(HelpSection.CHILDREN, SHOW_CHILDREN); + } + return options & enabledSections; + } + + private int flagFor(HelpSection section, int flag) { + return helpMessagesService.getMessage(section).isEmpty() ? 0 : flag; + } + + /** + * Adds help info about the given command's arguments into the provided list. + * + * @param command the command to generate arguments info for + * @param lines the output collection to add the info to + */ + private void addArgumentsInfo(CommandDescription command, List lines) { + if (command.getArguments().isEmpty()) { + return; + } + + lines.add(ChatColor.GOLD + helpMessagesService.getMessage(HelpSection.ARGUMENTS) + ":"); + StringBuilder argString = new StringBuilder(); + String optionalText = " (" + helpMessagesService.getMessage(HelpMessage.OPTIONAL) + ")"; + for (CommandArgumentDescription argument : command.getArguments()) { + argString.setLength(0); + argString.append(" ").append(ChatColor.YELLOW).append(ChatColor.ITALIC).append(argument.getName()) + .append(": ").append(ChatColor.WHITE).append(argument.getDescription()); + + if (argument.isOptional()) { + argString.append(ChatColor.GRAY).append(ChatColor.ITALIC).append(optionalText); + } + lines.add(argString.toString()); + } + } + + /** + * Adds help info about the given command's alternative labels into the provided list. + * + * @param command the command for which to generate info about its labels + * @param correctLabels labels used to access the command (sanitized) + * @param lines the output collection to add the info to + */ + private void addAlternativesInfo(CommandDescription command, List correctLabels, List lines) { + if (command.getLabels().size() <= 1) { + return; + } + + lines.add(ChatColor.GOLD + helpMessagesService.getMessage(HelpSection.ALTERNATIVES) + ":"); + + // Label with which the command was called -> don't show it as an alternative + final String usedLabel; + // Takes alternative label and constructs list of labels, e.g. "reg" -> [authme, reg] + final Function> commandLabelsFn; + + if (correctLabels.size() == 1) { + usedLabel = correctLabels.get(0); + commandLabelsFn = label -> singletonList(label); + } else { + usedLabel = correctLabels.get(1); + commandLabelsFn = label -> Arrays.asList(correctLabels.get(0), label); + } + + // Create a list of alternatives + for (String label : command.getLabels()) { + if (!label.equalsIgnoreCase(usedLabel)) { + lines.add(" " + CommandUtils.buildSyntax(command, commandLabelsFn.apply(label))); + } + } + } + + /** + * Adds help info about the given command's permissions into the provided list. + * + * @param command the command to generate permissions info for + * @param sender the command sender, used to evaluate permissions + * @param lines the output collection to add the info to + */ + private void addPermissionsInfo(CommandDescription command, CommandSender sender, List lines) { + PermissionNode permission = command.getPermission(); + if (permission == null) { + return; + } + lines.add(ChatColor.GOLD + helpMessagesService.getMessage(HelpSection.PERMISSIONS) + ":"); + + boolean hasPermission = permissionsManager.hasPermission(sender, permission); + lines.add(String.format(" " + ChatColor.YELLOW + ChatColor.ITALIC + "%s" + ChatColor.GRAY + " (%s)", + permission.getNode(), getLocalPermissionText(hasPermission))); + + // Addendum to the line to specify whether the sender has permission or not when default is OP_ONLY + final DefaultPermission defaultPermission = permission.getDefaultPermission(); + String addendum = ""; + if (DefaultPermission.OP_ONLY.equals(defaultPermission)) { + addendum = " (" + getLocalPermissionText(defaultPermission.evaluate(sender)) + ")"; + } + lines.add(ChatColor.GOLD + helpMessagesService.getMessage(HelpMessage.DEFAULT) + ": " + + ChatColor.GRAY + ChatColor.ITALIC + helpMessagesService.getMessage(defaultPermission) + addendum); + + // Evaluate if the sender has permission to the command + ChatColor permissionColor; + String permissionText; + if (permissionsManager.hasPermission(sender, command.getPermission())) { + permissionColor = ChatColor.GREEN; + permissionText = getLocalPermissionText(true); + } else { + permissionColor = ChatColor.DARK_RED; + permissionText = getLocalPermissionText(false); + } + lines.add(String.format(ChatColor.GOLD + " %s: %s" + ChatColor.ITALIC + "%s", + helpMessagesService.getMessage(HelpMessage.RESULT), permissionColor, permissionText)); + } + + private String getLocalPermissionText(boolean hasPermission) { + if (hasPermission) { + return helpMessagesService.getMessage(HelpMessage.HAS_PERMISSION); + } + return helpMessagesService.getMessage(HelpMessage.NO_PERMISSION); + } + + /** + * Adds help info about the given command's child command into the provided list. + * + * @param command the command for which to generate info about its child commands + * @param correctLabels the labels used to access the given command (sanitized) + * @param lines the output collection to add the info to + */ + private void addChildrenInfo(CommandDescription command, List correctLabels, List lines) { + if (command.getChildren().isEmpty()) { + return; + } + + lines.add(ChatColor.GOLD + helpMessagesService.getMessage(HelpSection.CHILDREN) + ":"); + String parentCommandPath = String.join(" ", correctLabels); + for (CommandDescription child : command.getChildren()) { + lines.add(" /" + parentCommandPath + " " + child.getLabels().get(0) + + ChatColor.GRAY + ChatColor.ITALIC + ": " + helpMessagesService.getDescription(child)); + } + } + + private static boolean hasFlag(int flag, int options) { + return (flag & options) != 0; + } + + /** + * Returns a list of labels for the given command, using the labels from the provided labels list + * as long as they are correct. + *

+ * Background: commands may have multiple labels (e.g. /authme register vs. /authme reg). It is interesting + * for us to keep with which label the user requested the command. At the same time, when a user inputs a + * non-existent label, we try to find the most similar one. This method keeps all labels that exists and will + * default to the command's first label when an invalid label is encountered. + *

+ * Examples: + * command = "authme register", labels = {authme, egister}. Output: {authme, register} + * command = "authme register", labels = {authme, reg}. Output: {authme, reg} + * + * @param command the command to compare the labels against + * @param labels the labels as input by the user + * @return list of correct labels, keeping the user's input where possible + */ + @VisibleForTesting + static List filterCorrectLabels(CommandDescription command, List labels) { + List commands = CommandUtils.constructParentList(command); + List correctLabels = new ArrayList<>(); + boolean foundIncorrectLabel = false; + for (int i = 0; i < commands.size(); ++i) { + if (!foundIncorrectLabel && i < labels.size() && commands.get(i).hasLabel(labels.get(i))) { + correctLabels.add(labels.get(i)); + } else { + foundIncorrectLabel = true; + correctLabels.add(commands.get(i).getLabels().get(0)); + } + } + return correctLabels; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/help/HelpSection.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/help/HelpSection.java new file mode 100644 index 0000000000..506262bfa4 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/command/help/HelpSection.java @@ -0,0 +1,44 @@ +package fr.xephi.authme.command.help; + +/** + * Translatable sections. Message keys are prefixed by {@code section}. + */ +public enum HelpSection { + + COMMAND("command"), + + SHORT_DESCRIPTION("description"), + + DETAILED_DESCRIPTION("detailedDescription"), + + ARGUMENTS("arguments"), + + ALTERNATIVES("alternatives"), + + PERMISSIONS("permissions"), + + CHILDREN("children"); + + private static final String PREFIX = "section."; + private final String key; + + /** + * Constructor. + * + * @param key the message key + */ + HelpSection(String key) { + this.key = PREFIX + key; + } + + /** @return the message key */ + public String getKey() { + return key; + } + + /** @return the key without the common prefix */ + public String getEntryKey() { + // Note ljacqu 20171008: #getKey is called more often than this method, so we optimize for the former method + return key.substring(PREFIX.length()); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/ProxySessionManager.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/ProxySessionManager.java new file mode 100644 index 0000000000..d0c60fb2a3 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/ProxySessionManager.java @@ -0,0 +1,49 @@ +package fr.xephi.authme.data; + +import fr.xephi.authme.initialization.HasCleanup; +import fr.xephi.authme.util.expiring.ExpiringSet; + +import javax.inject.Inject; +import java.util.Locale; +import java.util.concurrent.TimeUnit; + +public class ProxySessionManager implements HasCleanup { + + private final ExpiringSet activeProxySessions; + + @Inject + public ProxySessionManager() { + long countTimeout = 5; + activeProxySessions = new ExpiringSet<>(countTimeout, TimeUnit.SECONDS); + } + + /** + * Saves the player in the set + * @param name the player's name + */ + private void setActiveSession(String name) { + activeProxySessions.add(name.toLowerCase(Locale.ROOT)); + } + + /** + * Process a proxy session message from AuthMeBungee + * @param name the player to process + */ + public void processProxySessionMessage(String name) { + setActiveSession(name); + } + + /** + * Returns if the player should be logged in or not + * @param name the name of the player to check + * @return true if player has to be logged in, false otherwise + */ + public boolean shouldResumeSession(String name) { + return activeProxySessions.contains(name); + } + + @Override + public void performCleanup() { + activeProxySessions.removeExpiredEntries(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/QuickCommandsProtectionManager.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/QuickCommandsProtectionManager.java new file mode 100644 index 0000000000..7414e21c8c --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/QuickCommandsProtectionManager.java @@ -0,0 +1,75 @@ +package fr.xephi.authme.data; + +import fr.xephi.authme.initialization.HasCleanup; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.permission.PlayerPermission; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.ProtectionSettings; +import fr.xephi.authme.util.expiring.ExpiringSet; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.concurrent.TimeUnit; + +public class QuickCommandsProtectionManager implements SettingsDependent, HasCleanup { + + private final PermissionsManager permissionsManager; + + private final ExpiringSet latestJoin; + + @Inject + public QuickCommandsProtectionManager(Settings settings, PermissionsManager permissionsManager) { + this.permissionsManager = permissionsManager; + long countTimeout = settings.getProperty(ProtectionSettings.QUICK_COMMANDS_DENIED_BEFORE_MILLISECONDS); + latestJoin = new ExpiringSet<>(countTimeout, TimeUnit.MILLISECONDS); + reload(settings); + } + + /** + * Save the player in the set + * @param name the player's name + */ + private void setJoin(String name) { + latestJoin.add(name); + } + + /** + * Returns whether the given player has the permission and should be saved in the set + * @param player the player to check + * @return true if the player has the permission, false otherwise + */ + private boolean shouldSavePlayer(Player player) { + return permissionsManager.hasPermission(player, PlayerPermission.QUICK_COMMANDS_PROTECTION); + } + + /** + * Process the player join + * @param player the player to process + */ + public void processJoin(Player player) { + if (shouldSavePlayer(player)) { + setJoin(player.getName()); + } + } + + /** + * Returns whether the given player is able to perform the command + * @param name the name of the player to check + * @return true if the player is not in the set (so it's allowed to perform the command), false otherwise + */ + public boolean isAllowed(String name) { + return !latestJoin.contains(name); + } + + @Override + public void reload(Settings settings) { + long countTimeout = settings.getProperty(ProtectionSettings.QUICK_COMMANDS_DENIED_BEFORE_MILLISECONDS); + latestJoin.setExpiration(countTimeout, TimeUnit.MILLISECONDS); + } + + @Override + public void performCleanup() { + latestJoin.removeExpiredEntries(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/TempbanManager.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/TempbanManager.java new file mode 100644 index 0000000000..2a767874db --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/TempbanManager.java @@ -0,0 +1,138 @@ +package fr.xephi.authme.data; + +import fr.xephi.authme.initialization.HasCleanup; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import fr.xephi.authme.util.PlayerUtils; +import fr.xephi.authme.util.expiring.TimedCounter; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +import static fr.xephi.authme.util.Utils.MILLIS_PER_MINUTE; + +/** + * Manager for handling temporary bans. + */ +public class TempbanManager implements SettingsDependent, HasCleanup { + + private final Map> ipLoginFailureCounts; + private final BukkitService bukkitService; + private final Messages messages; + + private boolean isEnabled; + private int threshold; + private int length; + private long resetThreshold; + private String customCommand; + + @Inject + TempbanManager(BukkitService bukkitService, Messages messages, Settings settings) { + this.ipLoginFailureCounts = new ConcurrentHashMap<>(); + this.bukkitService = bukkitService; + this.messages = messages; + reload(settings); + } + + /** + * Increases the failure count for the given IP address/username combination. + * + * @param address The player's IP address + * @param name The username + */ + public void increaseCount(String address, String name) { + if (isEnabled) { + TimedCounter countsByName = ipLoginFailureCounts.computeIfAbsent( + address, k -> new TimedCounter<>(resetThreshold, TimeUnit.MINUTES)); + countsByName.increment(name); + } + } + + /** + * Set the failure count for a given IP address / username combination to 0. + * + * @param address The IP address + * @param name The username + */ + public void resetCount(String address, String name) { + if (isEnabled) { + TimedCounter counter = ipLoginFailureCounts.get(address); + if (counter != null) { + counter.remove(name); + } + } + } + + /** + * Return whether the IP address should be tempbanned. + * + * @param address The player's IP address + * @return True if the IP should be tempbanned + */ + public boolean shouldTempban(String address) { + if (isEnabled) { + TimedCounter countsByName = ipLoginFailureCounts.get(address); + if (countsByName != null) { + return countsByName.total() >= threshold; + } + } + return false; + } + + /** + * Tempban a player's IP address for failing to log in too many times. + * This calculates the expire time based on the time the method was called. + * + * @param player The player to tempban + */ + public void tempbanPlayer(final Player player) { + if (isEnabled) { + final String name = player.getName(); + final String ip = PlayerUtils.getPlayerIp(player); + final String reason = messages.retrieveSingle(player, MessageKey.TEMPBAN_MAX_LOGINS); + + final Date expires = new Date(); + long newTime = expires.getTime() + (length * MILLIS_PER_MINUTE); + expires.setTime(newTime); + + bukkitService.runTask(player,() -> { // AuthMeReReloaded - Folia compatibility + if (customCommand.isEmpty()) { + bukkitService.banIp(ip, reason, expires, "AuthMe"); + player.kickPlayer(reason); + } else { + String command = customCommand + .replace("%player%", name) + .replace("%ip%", ip); + bukkitService.dispatchConsoleCommand(command); + } + }); + + ipLoginFailureCounts.remove(ip); + } + } + + @Override + public void reload(Settings settings) { + this.isEnabled = settings.getProperty(SecuritySettings.TEMPBAN_ON_MAX_LOGINS); + this.threshold = settings.getProperty(SecuritySettings.MAX_LOGIN_TEMPBAN); + this.length = settings.getProperty(SecuritySettings.TEMPBAN_LENGTH); + this.resetThreshold = settings.getProperty(SecuritySettings.TEMPBAN_MINUTES_BEFORE_RESET); + this.customCommand = settings.getProperty(SecuritySettings.TEMPBAN_CUSTOM_COMMAND); + } + + @Override + public void performCleanup() { + for (TimedCounter countsByIp : ipLoginFailureCounts.values()) { + countsByIp.removeExpiredEntries(); + } + ipLoginFailureCounts.entrySet().removeIf(e -> e.getValue().isEmpty()); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/VerificationCodeManager.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/VerificationCodeManager.java new file mode 100644 index 0000000000..ad1b778da0 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/VerificationCodeManager.java @@ -0,0 +1,194 @@ +package fr.xephi.authme.data; + +import ch.jalu.datasourcecolumns.data.DataSourceValue; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.initialization.HasCleanup; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.mail.EmailService; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.permission.PlayerPermission; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import fr.xephi.authme.util.RandomStringUtils; +import fr.xephi.authme.util.Utils; +import fr.xephi.authme.util.expiring.ExpiringMap; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashSet; +import java.util.Locale; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +public class VerificationCodeManager implements SettingsDependent, HasCleanup { + + private final EmailService emailService; + private final DataSource dataSource; + private final PermissionsManager permissionsManager; + + private final ExpiringMap verificationCodes; + private final Set verifiedPlayers; + + private boolean canSendMail; + + @Inject + VerificationCodeManager(Settings settings, DataSource dataSource, EmailService emailService, + PermissionsManager permissionsManager) { + this.emailService = emailService; + this.dataSource = dataSource; + this.permissionsManager = permissionsManager; + verifiedPlayers = new HashSet<>(); + long countTimeout = settings.getProperty(SecuritySettings.VERIFICATION_CODE_EXPIRATION_MINUTES); + verificationCodes = new ExpiringMap<>(countTimeout, TimeUnit.MINUTES); + reload(settings); + } + + /** + * Returns if it is possible to send emails + * + * @return true if the service is enabled, false otherwise + */ + public boolean canSendMail() { + return canSendMail; + } + + /** + * Returns whether the given player is able to verify his identity + * + * @param player the player to verify + * @return true if the player has not been verified yet, false otherwise + */ + public boolean isVerificationRequired(Player player) { + final String name = player.getName(); + return canSendMail + && !isPlayerVerified(name) + && permissionsManager.hasPermission(player, PlayerPermission.VERIFICATION_CODE) + && hasEmail(name); + } + + /** + * Returns whether the given player is required to verify his identity through a command + * + * @param name the name of the player to verify + * @return true if the player has an existing code and has not been verified yet, false otherwise + */ + public boolean isCodeRequired(String name) { + return canSendMail && hasCode(name) && !isPlayerVerified(name); + } + + /** + * Returns whether the given player has been verified or not + * + * @param name the name of the player to verify + * @return true if the player has been verified, false otherwise + */ + private boolean isPlayerVerified(String name) { + return verifiedPlayers.contains(name.toLowerCase(Locale.ROOT)); + } + + /** + * Returns if a code exists for the player + * + * @param name the name of the player to verify + * @return true if the code exists, false otherwise + */ + public boolean hasCode(String name) { + return (verificationCodes.get(name.toLowerCase(Locale.ROOT)) != null); + } + + /** + * Returns whether the given player is able to receive emails + * + * @param name the name of the player to verify + * @return true if the player is able to receive emails, false otherwise + */ + public boolean hasEmail(String name) { + boolean result = false; + DataSourceValue emailResult = dataSource.getEmail(name); + if (emailResult.rowExists()) { + final String email = emailResult.getValue(); + if (!Utils.isEmailEmpty(email)) { + result = true; + } + } + return result; + } + + /** + * Check if a code exists for the player or generates and saves a new one. + * + * @param name the player's name + */ + public void codeExistOrGenerateNew(String name) { + if (!hasCode(name)) { + generateCode(name); + } + } + + /** + * Generates a code for the player and returns it. + * + * @param name the name of the player to generate a code for + */ + private void generateCode(String name) { + DataSourceValue emailResult = dataSource.getEmail(name); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy'年'MM'月'dd'日' HH:mm:ss"); + Date date = new Date(System.currentTimeMillis()); + if (emailResult.rowExists()) { + final String email = emailResult.getValue(); + if (!Utils.isEmailEmpty(email)) { + String code = RandomStringUtils.generateNum(6); // 6 digits code + verificationCodes.put(name.toLowerCase(Locale.ROOT), code); + emailService.sendVerificationMail(name, email, code, dateFormat.format(date)); + } + } + } + + /** + * Checks the given code against the existing one. + * + * @param name the name of the player to check + * @param code the supplied code + * @return true if the code matches, false otherwise + */ + public boolean checkCode(String name, String code) { + boolean correct = false; + if (code.equals(verificationCodes.get(name.toLowerCase(Locale.ROOT)))) { + verify(name); + correct = true; + } + return correct; + } + + /** + * Add the user to the set of verified users + * + * @param name the name of the player to generate a code for + */ + public void verify(String name) { + verifiedPlayers.add(name.toLowerCase(Locale.ROOT)); + } + + /** + * Remove the user from the set of verified users + * + * @param name the name of the player to generate a code for + */ + public void unverify(String name){ + verifiedPlayers.remove(name.toLowerCase(Locale.ROOT)); + } + + @Override + public void reload(Settings settings) { + canSendMail = emailService.hasAllInformation(); + long countTimeout = settings.getProperty(SecuritySettings.VERIFICATION_CODE_EXPIRATION_MINUTES); + verificationCodes.setExpiration(countTimeout, TimeUnit.MINUTES); + } + + @Override + public void performCleanup() { + verificationCodes.removeExpiredEntries(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/auth/PlayerAuth.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/auth/PlayerAuth.java new file mode 100644 index 0000000000..8208262900 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/auth/PlayerAuth.java @@ -0,0 +1,373 @@ +package fr.xephi.authme.data.auth; + +import fr.xephi.authme.security.crypts.HashedPassword; +import org.bukkit.Location; + +import java.util.Locale; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; + +import static com.google.common.base.Preconditions.checkNotNull; + + +/** + * AuthMe player data. + */ +@SuppressWarnings("checkstyle:FinalClass") // Justification: class is mocked in multiple tests +public class PlayerAuth { + + /** Default email used in the database if the email column is defined to be NOT NULL. */ + public static final String DB_EMAIL_DEFAULT = "your@email.com"; + /** Default last login value used in the database if the last login column is NOT NULL. */ + public static final long DB_LAST_LOGIN_DEFAULT = 0; + /** Default last ip value used in the database if the last IP column is NOT NULL. */ + public static final String DB_LAST_IP_DEFAULT = "127.0.0.1"; + + /** The player's name in lowercase, e.g. "xephi". */ + private String nickname; + /** The player's name in the correct casing, e.g. "Xephi". */ + private String realName; + private HashedPassword password; + private String totpKey; + private String email; + private String lastIp; + private int groupId; + private Long lastLogin; + private String registrationIp; + private long registrationDate; + // Fields storing the player's quit location + private double x; + private double y; + private double z; + private String world; + private float yaw; + private float pitch; + private UUID uuid; + + /** + * Hidden constructor. + * + * @see #builder() + */ + private PlayerAuth() { + } + + + public void setNickname(String nickname) { + this.nickname = nickname.toLowerCase(Locale.ROOT); + } + + public String getNickname() { + return nickname; + } + + public String getRealName() { + return realName; + } + + public void setRealName(String realName) { + this.realName = realName; + } + + public int getGroupId() { + return groupId; + } + + public void setQuitLocation(Location location) { + x = location.getBlockX(); + y = location.getBlockY(); + z = location.getBlockZ(); + world = location.getWorld().getName(); + } + + public double getQuitLocX() { + return x; + } + + public void setQuitLocX(double d) { + this.x = d; + } + + public double getQuitLocY() { + return y; + } + + public void setQuitLocY(double d) { + this.y = d; + } + + public double getQuitLocZ() { + return z; + } + + public void setQuitLocZ(double d) { + this.z = d; + } + + public String getWorld() { + return world; + } + + public void setWorld(String world) { + this.world = world; + } + + public float getYaw() { + return yaw; + } + + public float getPitch() { + return pitch; + } + + public String getLastIp() { + return lastIp; + } + + public void setLastIp(String lastIp) { + this.lastIp = lastIp; + } + + public Long getLastLogin() { + return lastLogin; + } + + public void setLastLogin(long lastLogin) { + this.lastLogin = lastLogin; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public HashedPassword getPassword() { + return password; + } + + public void setPassword(HashedPassword password) { + this.password = password; + } + + public String getRegistrationIp() { + return registrationIp; + } + + public long getRegistrationDate() { + return registrationDate; + } + + public void setRegistrationDate(long registrationDate) { + this.registrationDate = registrationDate; + } + + public String getTotpKey() { + return totpKey; + } + + public void setTotpKey(String totpKey) { + this.totpKey = totpKey; + } + + public UUID getUuid() { + return uuid; + } + + public void setUuid(UUID uuid) { + this.uuid = uuid; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof PlayerAuth)) { + return false; + } + PlayerAuth other = (PlayerAuth) obj; + return Objects.equals(other.lastIp, this.lastIp) && Objects.equals(other.nickname, this.nickname); + } + + @Override + public int hashCode() { + int hashCode = 7; + hashCode = 71 * hashCode + (this.nickname != null ? this.nickname.hashCode() : 0); + hashCode = 71 * hashCode + (this.lastIp != null ? this.lastIp.hashCode() : 0); + return hashCode; + } + + @Override + public String toString() { + return "Player : " + nickname + " | " + realName + + " ! IP : " + lastIp + + " ! LastLogin : " + lastLogin + + " ! LastPosition : " + x + "," + y + "," + z + "," + world + + " ! Email : " + email + + " ! Password : {" + password.getHash() + ", " + password.getSalt() + "}" + + " ! UUID : " + uuid; + } + + public static Builder builder() { + return new Builder(); + } + + public static final class Builder { + private String name; + private String realName; + private HashedPassword password; + private String totpKey; + private String lastIp; + private String email; + private int groupId = -1; + private Long lastLogin; + private String registrationIp; + private Long registrationDate; + + private double x; + private double y; + private double z; + private String world; + private float yaw; + private float pitch; + private UUID uuid; + + /** + * Creates a PlayerAuth object. + * + * @return the generated PlayerAuth + */ + public PlayerAuth build() { + PlayerAuth auth = new PlayerAuth(); + auth.nickname = checkNotNull(name).toLowerCase(Locale.ROOT); + auth.realName = Optional.ofNullable(realName).orElse("Player"); + auth.password = Optional.ofNullable(password).orElse(new HashedPassword("")); + auth.totpKey = totpKey; + auth.email = DB_EMAIL_DEFAULT.equals(email) ? null : email; + auth.lastIp = lastIp; // Don't check against default value 127.0.0.1 as it may be a legit value + auth.groupId = groupId; + auth.lastLogin = isEqualTo(lastLogin, DB_LAST_LOGIN_DEFAULT) ? null : lastLogin; + auth.registrationIp = registrationIp; + auth.registrationDate = registrationDate == null ? System.currentTimeMillis() : registrationDate; + + auth.x = x; + auth.y = y; + auth.z = z; + auth.world = Optional.ofNullable(world).orElse("world"); + auth.yaw = yaw; + auth.pitch = pitch; + auth.uuid = uuid; + return auth; + } + + private static boolean isEqualTo(Long value, long defaultValue) { + return value != null && defaultValue == value; + } + + public Builder name(String name) { + this.name = name; + return this; + } + + public Builder realName(String realName) { + this.realName = realName; + return this; + } + + public Builder password(HashedPassword password) { + this.password = password; + return this; + } + + public Builder password(String hash, String salt) { + return password(new HashedPassword(hash, salt)); + } + + public Builder totpKey(String totpKey) { + this.totpKey = totpKey; + return this; + } + + public Builder lastIp(String lastIp) { + this.lastIp = lastIp; + return this; + } + + /** + * Sets the location info based on the argument. + * + * @param location the location info to set + * @return this builder instance + */ + public Builder location(Location location) { + this.x = location.getX(); + this.y = location.getY(); + this.z = location.getZ(); + this.world = location.getWorld().getName(); + this.yaw = location.getYaw(); + this.pitch = location.getPitch(); + return this; + } + + public Builder locX(double x) { + this.x = x; + return this; + } + + public Builder locY(double y) { + this.y = y; + return this; + } + + public Builder locZ(double z) { + this.z = z; + return this; + } + + public Builder locWorld(String world) { + this.world = world; + return this; + } + + public Builder locYaw(float yaw) { + this.yaw = yaw; + return this; + } + + public Builder locPitch(float pitch) { + this.pitch = pitch; + return this; + } + + public Builder lastLogin(Long lastLogin) { + this.lastLogin = lastLogin; + return this; + } + + public Builder groupId(int groupId) { + this.groupId = groupId; + return this; + } + + public Builder email(String email) { + this.email = email; + return this; + } + + public Builder registrationIp(String ip) { + this.registrationIp = ip; + return this; + } + + public Builder registrationDate(long date) { + this.registrationDate = date; + return this; + } + + public Builder uuid(UUID uuid) { + this.uuid = uuid; + return this; + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/auth/PlayerCache.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/auth/PlayerCache.java new file mode 100644 index 0000000000..e617f20ec5 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/auth/PlayerCache.java @@ -0,0 +1,74 @@ +package fr.xephi.authme.data.auth; + + +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Used to manage player's Authenticated status + */ +public class PlayerCache { + + private final Map cache = new ConcurrentHashMap<>(); + + PlayerCache() { + } + + /** + * Adds the given auth object to the player cache (for the name defined in the PlayerAuth). + * + * @param auth the player auth object to save + */ + public void updatePlayer(PlayerAuth auth) { + cache.put(auth.getNickname().toLowerCase(Locale.ROOT), auth); + } + + /** + * Removes a player from the player cache. + * + * @param user name of the player to remove + */ + public void removePlayer(String user) { + cache.remove(user.toLowerCase(Locale.ROOT)); + } + + /** + * Get whether a player is authenticated (i.e. whether he is present in the player cache). + * + * @param user player's name + * + * @return true if player is logged in, false otherwise. + */ + public boolean isAuthenticated(String user) { + return cache.containsKey(user.toLowerCase(Locale.ROOT)); + } + + /** + * Returns the PlayerAuth associated with the given user, if available. + * + * @param user name of the player + * + * @return the associated auth object, or null if not available + */ + public PlayerAuth getAuth(String user) { + return cache.get(user.toLowerCase(Locale.ROOT)); + } + + /** + * @return number of logged in players + */ + public int getLogged() { + return cache.size(); + } + + /** + * Returns the player cache data. + * + * @return all player auths inside the player cache + */ + public Map getCache() { + return this.cache; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/captcha/CaptchaCodeStorage.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/captcha/CaptchaCodeStorage.java new file mode 100644 index 0000000000..5667a6f150 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/captcha/CaptchaCodeStorage.java @@ -0,0 +1,94 @@ +package fr.xephi.authme.data.captcha; + +import fr.xephi.authme.util.RandomStringUtils; +import fr.xephi.authme.util.expiring.ExpiringMap; + +import java.util.Locale; +import java.util.concurrent.TimeUnit; + +/** + * Primitive service for storing captcha codes. + */ +public class CaptchaCodeStorage { + + /** Map of captcha codes (with player name as key, case-insensitive). */ + private ExpiringMap captchaCodes; + /** Number of characters newly generated captcha codes should have. */ + private int captchaLength; + + /** + * Constructor. + * + * @param expirationInMinutes minutes after which a saved captcha code expires + * @param captchaLength the number of characters a captcha code should have + */ + public CaptchaCodeStorage(long expirationInMinutes, int captchaLength) { + this.captchaCodes = new ExpiringMap<>(expirationInMinutes, TimeUnit.MINUTES); + this.captchaLength = captchaLength; + } + + /** + * Sets the expiration of captcha codes. + * + * @param expirationInMinutes minutes after which a saved captcha code expires + */ + public void setExpirationInMinutes(long expirationInMinutes) { + captchaCodes.setExpiration(expirationInMinutes, TimeUnit.MINUTES); + } + + /** + * Sets the captcha length. + * + * @param captchaLength number of characters a captcha code should have + */ + public void setCaptchaLength(int captchaLength) { + this.captchaLength = captchaLength; + } + + /** + * Returns the stored captcha for the player or generates and saves a new one. + * + * @param name the player's name + * @return the code the player is required to enter + */ + public String getCodeOrGenerateNew(String name) { + String code = captchaCodes.get(name.toLowerCase(Locale.ROOT)); + return code == null ? generateCode(name) : code; + } + + /** + * Generates a code for the player and returns it. + * + * @param name the name of the player to generate a code for + * @return the generated code + */ + private String generateCode(String name) { + String code = RandomStringUtils.generate(captchaLength); + captchaCodes.put(name.toLowerCase(Locale.ROOT), code); + return code; + } + + /** + * Checks the given code against the existing one. Upon success, the saved captcha code is removed from storage. + * Upon failure, a new code is generated. + * + * @param name the name of the player to check + * @param code the supplied code + * @return true if the code matches, false otherwise + */ + public boolean checkCode(String name, String code) { + String nameLowerCase = name.toLowerCase(Locale.ROOT); + String savedCode = captchaCodes.get(nameLowerCase); + if (savedCode != null && savedCode.equalsIgnoreCase(code)) { + captchaCodes.remove(nameLowerCase); + return true; + } else { + generateCode(name); + } + return false; + } + + public void removeExpiredEntries() { + captchaCodes.removeExpiredEntries(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/captcha/CaptchaManager.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/captcha/CaptchaManager.java new file mode 100644 index 0000000000..c3daeb6c0d --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/captcha/CaptchaManager.java @@ -0,0 +1,38 @@ +package fr.xephi.authme.data.captcha; + +import org.bukkit.entity.Player; + +/** + * Manages captcha codes. + */ +public interface CaptchaManager { + + /** + * Returns whether the given player is required to solve a captcha. + * + * @param name the name of the player to verify + * @return true if the player has to solve a captcha, false otherwise + */ + boolean isCaptchaRequired(String name); + + /** + * Returns the stored captcha for the player or generates and saves a new one. + * + * @param name the player's name + * @return the code the player is required to enter + */ + String getCaptchaCodeOrGenerateNew(String name); + + /** + * Checks the given code against the existing one. This method is not reentrant, i.e. it performs additional + * state changes on success or failure, such as modifying some counter or setting a player as verified. + *

+ * On success, the code associated with the player is cleared; on failure, a new code is generated. + * + * @param player the player to check + * @param code the supplied code + * @return true if the code matches, false otherwise + */ + boolean checkCode(Player player, String code); + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/captcha/LoginCaptchaManager.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/captcha/LoginCaptchaManager.java new file mode 100644 index 0000000000..1d97af69c8 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/captcha/LoginCaptchaManager.java @@ -0,0 +1,95 @@ +package fr.xephi.authme.data.captcha; + +import fr.xephi.authme.initialization.HasCleanup; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import fr.xephi.authme.util.expiring.TimedCounter; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.Locale; +import java.util.concurrent.TimeUnit; + +/** + * Manager for the handling of captchas after too many failed login attempts. + */ +public class LoginCaptchaManager implements CaptchaManager, SettingsDependent, HasCleanup { + + private final TimedCounter playerCounts; + private final CaptchaCodeStorage captchaCodeStorage; + + private boolean isEnabled; + private int threshold; + + @Inject + LoginCaptchaManager(Settings settings) { + // Note: Proper values are set in reload() + this.captchaCodeStorage = new CaptchaCodeStorage(30, 4); + this.playerCounts = new TimedCounter<>(9, TimeUnit.MINUTES); + reload(settings); + } + + /** + * Increases the failure count for the given player. + * + * @param name the player's name + */ + public void increaseLoginFailureCount(String name) { + if (isEnabled) { + String playerLower = name.toLowerCase(Locale.ROOT); + playerCounts.increment(playerLower); + } + } + + @Override + public boolean isCaptchaRequired(String playerName) { + return isEnabled && playerCounts.get(playerName.toLowerCase(Locale.ROOT)) >= threshold; + } + + @Override + public String getCaptchaCodeOrGenerateNew(String name) { + return captchaCodeStorage.getCodeOrGenerateNew(name); + } + + @Override + public boolean checkCode(Player player, String code) { + String nameLower = player.getName().toLowerCase(Locale.ROOT); + boolean isCodeCorrect = captchaCodeStorage.checkCode(nameLower, code); + if (isCodeCorrect) { + playerCounts.remove(nameLower); + } + return isCodeCorrect; + } + + /** + * Resets the login count of the given player to 0. + * + * @param name the player's name + */ + public void resetLoginFailureCount(String name) { + if (isEnabled) { + playerCounts.remove(name.toLowerCase(Locale.ROOT)); + } + } + + @Override + public void reload(Settings settings) { + int expirationInMinutes = settings.getProperty(SecuritySettings.CAPTCHA_COUNT_MINUTES_BEFORE_RESET); + captchaCodeStorage.setExpirationInMinutes(expirationInMinutes); + int captchaLength = settings.getProperty(SecuritySettings.CAPTCHA_LENGTH); + captchaCodeStorage.setCaptchaLength(captchaLength); + + int countTimeout = settings.getProperty(SecuritySettings.CAPTCHA_COUNT_MINUTES_BEFORE_RESET); + playerCounts.setExpiration(countTimeout, TimeUnit.MINUTES); + + isEnabled = settings.getProperty(SecuritySettings.ENABLE_LOGIN_FAILURE_CAPTCHA); + threshold = settings.getProperty(SecuritySettings.MAX_LOGIN_TRIES_BEFORE_CAPTCHA); + } + + @Override + public void performCleanup() { + playerCounts.removeExpiredEntries(); + captchaCodeStorage.removeExpiredEntries(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/captcha/RegistrationCaptchaManager.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/captcha/RegistrationCaptchaManager.java new file mode 100644 index 0000000000..655d994086 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/captcha/RegistrationCaptchaManager.java @@ -0,0 +1,66 @@ +package fr.xephi.authme.data.captcha; + +import fr.xephi.authme.initialization.HasCleanup; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import fr.xephi.authme.util.expiring.ExpiringSet; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.Locale; +import java.util.concurrent.TimeUnit; + +/** + * Captcha manager for registration. + */ +public class RegistrationCaptchaManager implements CaptchaManager, SettingsDependent, HasCleanup { + + private static final int MINUTES_VALID_FOR_REGISTRATION = 30; + + private final ExpiringSet verifiedNamesForRegistration; + private final CaptchaCodeStorage captchaCodeStorage; + private boolean isEnabled; + + @Inject + RegistrationCaptchaManager(Settings settings) { + // NOTE: proper captcha length is set in reload() + this.captchaCodeStorage = new CaptchaCodeStorage(MINUTES_VALID_FOR_REGISTRATION, 4); + this.verifiedNamesForRegistration = new ExpiringSet<>(MINUTES_VALID_FOR_REGISTRATION, TimeUnit.MINUTES); + reload(settings); + } + + @Override + public boolean isCaptchaRequired(String name) { + return isEnabled && !verifiedNamesForRegistration.contains(name.toLowerCase(Locale.ROOT)); + } + + @Override + public String getCaptchaCodeOrGenerateNew(String name) { + return captchaCodeStorage.getCodeOrGenerateNew(name); + } + + @Override + public boolean checkCode(Player player, String code) { + String nameLower = player.getName().toLowerCase(Locale.ROOT); + boolean isCodeCorrect = captchaCodeStorage.checkCode(nameLower, code); + if (isCodeCorrect) { + verifiedNamesForRegistration.add(nameLower); + } + return isCodeCorrect; + } + + @Override + public void reload(Settings settings) { + int captchaLength = settings.getProperty(SecuritySettings.CAPTCHA_LENGTH); + captchaCodeStorage.setCaptchaLength(captchaLength); + + isEnabled = settings.getProperty(SecuritySettings.ENABLE_CAPTCHA_FOR_REGISTRATION); + } + + @Override + public void performCleanup() { + verifiedNamesForRegistration.removeExpiredEntries(); + captchaCodeStorage.removeExpiredEntries(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/AllowFlightRestoreType.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/AllowFlightRestoreType.java new file mode 100644 index 0000000000..753650b679 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/AllowFlightRestoreType.java @@ -0,0 +1,66 @@ +package fr.xephi.authme.data.limbo; + +import org.bukkit.entity.Player; + +/** + * Possible types to restore the "allow flight" property + * from LimboPlayer to Bukkit Player. + */ +public enum AllowFlightRestoreType { + + /** Set value from LimboPlayer to Player. */ + RESTORE { + @Override + public void restoreAllowFlight(Player player, LimboPlayer limbo) { + player.setAllowFlight(limbo.isCanFly()); + } + }, + + /** Always set flight enabled to true. */ + ENABLE { + @Override + public void restoreAllowFlight(Player player, LimboPlayer limbo) { + player.setAllowFlight(true); + } + }, + + /** Always set flight enabled to false. */ + DISABLE { + @Override + public void restoreAllowFlight(Player player, LimboPlayer limbo) { + player.setAllowFlight(false); + } + }, + + /** The user's flight handling is not modified. */ + NOTHING { + @Override + public void restoreAllowFlight(Player player, LimboPlayer limbo) { + // noop + } + + @Override + public void processPlayer(Player player) { + // noop + } + }; + + /** + * Restores the "allow flight" property from the LimboPlayer to the Player. + * This method behaves differently for each restoration type. + * + * @param player the player to modify + * @param limbo the limbo player to read from + */ + public abstract void restoreAllowFlight(Player player, LimboPlayer limbo); + + /** + * Processes the player when a LimboPlayer instance is created based on him. Typically this + * method revokes the {@code allowFlight} property to be restored again later. + * + * @param player the player to process + */ + public void processPlayer(Player player) { + player.setAllowFlight(false); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/AuthGroupHandler.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/AuthGroupHandler.java new file mode 100644 index 0000000000..6e8c241af6 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/AuthGroupHandler.java @@ -0,0 +1,114 @@ +package fr.xephi.authme.data.limbo; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.initialization.Reloadable; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.PluginSettings; +import org.bukkit.entity.Player; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import java.util.Collection; +import java.util.Collections; + +/** + * Changes the permission group according to the auth status of the player and the configuration. + *

+ * If this feature is enabled, the primary permissions group of a player is replaced until he has + * logged in. Some permission plugins have a notion of a primary group; for other permission plugins the + * first group is simply taken. + *

+ * The groups that are used as replacement until the player logs in is configurable and depends on if + * the player is registered or not. Note that some (all?) permission systems require the group to actually + * exist for the replacement to take place. Furthermore, since some permission groups require that players + * be in at least one group, this will mean that the player is not removed from his primary group. + */ +class AuthGroupHandler implements Reloadable { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(AuthGroupHandler.class); + + @Inject + private PermissionsManager permissionsManager; + + @Inject + private Settings settings; + + private UserGroup unregisteredGroup; + private UserGroup registeredGroup; + + AuthGroupHandler() { + } + + /** + * Sets the group of a player by its authentication status. + * + * @param player the player + * @param limbo the associated limbo player (nullable) + * @param groupType the group type + */ + void setGroup(Player player, LimboPlayer limbo, AuthGroupType groupType) { + if (!useAuthGroups()) { + return; + } + + Collection previousGroups = limbo == null ? Collections.emptyList() : limbo.getGroups(); + + switch (groupType) { + // Implementation note: some permission systems don't support players not being in any group, + // so add the new group before removing the old ones + case UNREGISTERED: + permissionsManager.addGroup(player, unregisteredGroup); + permissionsManager.removeGroup(player, registeredGroup); + permissionsManager.removeGroups(player, previousGroups); + break; + + case REGISTERED_UNAUTHENTICATED: + permissionsManager.addGroup(player, registeredGroup); + permissionsManager.removeGroup(player, unregisteredGroup); + permissionsManager.removeGroups(player, previousGroups); + + break; + + case LOGGED_IN: + permissionsManager.addGroups(player, previousGroups); + permissionsManager.removeGroup(player, unregisteredGroup); + permissionsManager.removeGroup(player, registeredGroup); + break; + + default: + throw new IllegalStateException("Encountered unhandled auth group type '" + groupType + "'"); + } + + logger.debug(() -> player.getName() + " changed to " + + groupType + ": has groups " + permissionsManager.getGroups(player)); + } + + /** + * Returns whether the auth permissions group function should be used. + * + * @return true if should be used, false otherwise + */ + private boolean useAuthGroups() { + // Check whether the permissions check is enabled + if (!settings.getProperty(PluginSettings.ENABLE_PERMISSION_CHECK)) { + return false; + } + + // Make sure group support is available + if (!permissionsManager.hasGroupSupport()) { + logger.warning("The current permissions system doesn't have group support, unable to set group!"); + return false; + } + return true; + } + + @Override + @PostConstruct + public void reload() { + unregisteredGroup = new UserGroup(settings.getProperty(PluginSettings.UNREGISTERED_GROUP)); + registeredGroup = new UserGroup(settings.getProperty(PluginSettings.REGISTERED_GROUP)); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/AuthGroupType.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/AuthGroupType.java new file mode 100644 index 0000000000..501a20d8ad --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/AuthGroupType.java @@ -0,0 +1,17 @@ +package fr.xephi.authme.data.limbo; + +/** + * Represents the group type based on the user's auth status. + */ +enum AuthGroupType { + + /** Player does not have an account. */ + UNREGISTERED, + + /** Player is registered but not logged in. */ + REGISTERED_UNAUTHENTICATED, + + /** Player is logged in. */ + LOGGED_IN + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboMessageType.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboMessageType.java new file mode 100644 index 0000000000..4d0af3e5ae --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboMessageType.java @@ -0,0 +1,11 @@ +package fr.xephi.authme.data.limbo; + +public enum LimboMessageType { + + REGISTER, + + LOG_IN, + + TOTP_CODE + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboPlayer.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboPlayer.java new file mode 100644 index 0000000000..9446222f9f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboPlayer.java @@ -0,0 +1,138 @@ +package fr.xephi.authme.data.limbo; + +import com.github.Anon8281.universalScheduler.scheduling.tasks.MyScheduledTask; +import fr.xephi.authme.task.MessageTask; +import org.bukkit.Location; + +import java.util.ArrayList; +import java.util.Collection; + +/** + * Represents a player which is not logged in and keeps track of certain states (like OP status, flying) + * which may be revoked from the player until he has logged in or registered. + */ +public class LimboPlayer { + + public static final float DEFAULT_WALK_SPEED = 0.2f; + public static final float DEFAULT_FLY_SPEED = 0.1f; + + private final boolean canFly; + private final boolean operator; + private final Collection groups; + private final Location loc; + private final float walkSpeed; + private final float flySpeed; + private MyScheduledTask timeoutTask = null; + private MessageTask messageTask = null; + + private LimboPlayerState state = LimboPlayerState.PASSWORD_REQUIRED; + + public LimboPlayer(Location loc, boolean operator, Collection groups, boolean fly, float walkSpeed, + float flySpeed) { + this.loc = loc; + this.operator = operator; + this.groups = new ArrayList<>(groups); // prevent bug #2413 + this.canFly = fly; + this.walkSpeed = walkSpeed; + this.flySpeed = flySpeed; + } + + /** + * Return the player's original location. + * + * @return The player's location + */ + public Location getLocation() { + return loc; + } + + /** + * Return whether the player is an operator or not (i.e. whether he is an OP). + * + * @return True if the player has OP status, false otherwise + */ + public boolean isOperator() { + return operator; + } + + /** + * Return the player's permissions groups. + * + * @return The permissions groups the player belongs to + */ + public Collection getGroups() { + return groups; + } + + public boolean isCanFly() { + return canFly; + } + + public float getWalkSpeed() { + return walkSpeed; + } + + public float getFlySpeed() { + return flySpeed; + } + + /** + * Return the timeout task, which kicks the player if he hasn't registered or logged in + * after a configurable amount of time. + * + * @return The timeout task associated to the player + */ + public MyScheduledTask getTimeoutTask() { + return timeoutTask; + } + + /** + * Set the timeout task of the player. The timeout task kicks the player after a configurable + * amount of time if he hasn't logged in or registered. + * + * @param timeoutTask The task to set + */ + public void setTimeoutTask(MyScheduledTask timeoutTask) { + if (this.timeoutTask != null) { + this.timeoutTask.cancel(); + } + this.timeoutTask = timeoutTask; + } + + /** + * Return the message task reminding the player to log in or register. + * + * @return The task responsible for sending the message regularly + */ + public MessageTask getMessageTask() { + return messageTask; + } + + /** + * Set the messages task responsible for telling the player to log in or register. + * + * @param messageTask The message task to set + */ + public void setMessageTask(MessageTask messageTask) { + if (this.messageTask != null) { + this.messageTask.cancel(); + } + this.messageTask = messageTask; + } + + /** + * Clears all tasks associated to the player. + */ + public void clearTasks() { + setMessageTask(null); + setTimeoutTask(null); + } + + public LimboPlayerState getState() { + return state; + } + + public void setState(LimboPlayerState state) { + this.state = state; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboPlayerState.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboPlayerState.java new file mode 100644 index 0000000000..5940ab2068 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboPlayerState.java @@ -0,0 +1,9 @@ +package fr.xephi.authme.data.limbo; + +public enum LimboPlayerState { + + PASSWORD_REQUIRED, + + TOTP_REQUIRED + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboPlayerTaskManager.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboPlayerTaskManager.java new file mode 100644 index 0000000000..ca5eaa1f6d --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboPlayerTaskManager.java @@ -0,0 +1,117 @@ +package fr.xephi.authme.data.limbo; + +import com.github.Anon8281.universalScheduler.scheduling.tasks.MyScheduledTask; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.data.captcha.RegistrationCaptchaManager; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.RegistrationSettings; +import fr.xephi.authme.settings.properties.RestrictionSettings; +import fr.xephi.authme.task.MessageTask; +import fr.xephi.authme.task.TimeoutTask; +import org.bukkit.entity.Player; + +import javax.inject.Inject; + +import static fr.xephi.authme.service.BukkitService.TICKS_PER_SECOND; + +/** + * Registers tasks associated with a LimboPlayer. + */ +class LimboPlayerTaskManager { + + @Inject + private Messages messages; + + @Inject + private Settings settings; + + @Inject + private BukkitService bukkitService; + + @Inject + private PlayerCache playerCache; + + @Inject + private RegistrationCaptchaManager registrationCaptchaManager; + + LimboPlayerTaskManager() { + } + + /** + * Registers a {@link MessageTask} for the given player name. + * + * @param player the player + * @param limbo the associated limbo player of the player + * @param messageType message type + */ + void registerMessageTask(Player player, LimboPlayer limbo, LimboMessageType messageType) { + int interval = settings.getProperty(RegistrationSettings.MESSAGE_INTERVAL); + MessageResult result = getMessageKey(player.getName(), messageType); + if (interval > 0) { + String[] joinMessage = messages.retrieveSingle(player, result.messageKey, result.args).split("\n"); + MessageTask messageTask = new MessageTask(player, joinMessage); + bukkitService.runTaskTimer(messageTask, 2 * TICKS_PER_SECOND, (long) interval * TICKS_PER_SECOND); + limbo.setMessageTask(messageTask); + } + } + + /** + * Registers a {@link TimeoutTask} for the given player according to the configuration. + * + * @param player the player to register a timeout task for + * @param limbo the associated limbo player + */ + void registerTimeoutTask(Player player, LimboPlayer limbo) { + final int timeout = settings.getProperty(RestrictionSettings.TIMEOUT) * TICKS_PER_SECOND; + if (timeout > 0) { + String message = messages.retrieveSingle(player, MessageKey.LOGIN_TIMEOUT_ERROR); + MyScheduledTask task = bukkitService.runTaskLater(new TimeoutTask(player, message, playerCache), timeout); + limbo.setTimeoutTask(task); + } + } + + /** + * Null-safe method to set the muted flag on a message task. + * + * @param task the task to modify (or null) + * @param isMuted the value to set if task is not null + */ + static void setMuted(MessageTask task, boolean isMuted) { + if (task != null) { + task.setMuted(isMuted); + } + } + + /** + * Returns the appropriate message key according to the registration status and settings. + * + * @param name the player's name + * @param messageType the message to show + * @return the message key to display to the user + */ + private MessageResult getMessageKey(String name, LimboMessageType messageType) { + if (messageType == LimboMessageType.LOG_IN) { + return new MessageResult(MessageKey.LOGIN_MESSAGE); + } else if (messageType == LimboMessageType.TOTP_CODE) { + return new MessageResult(MessageKey.TWO_FACTOR_CODE_REQUIRED); + } else if (registrationCaptchaManager.isCaptchaRequired(name)) { + final String captchaCode = registrationCaptchaManager.getCaptchaCodeOrGenerateNew(name); + return new MessageResult(MessageKey.CAPTCHA_FOR_REGISTRATION_REQUIRED, captchaCode); + } else { + return new MessageResult(MessageKey.REGISTER_MESSAGE); + } + } + + private static final class MessageResult { + private final MessageKey messageKey; + private final String[] args; + + MessageResult(MessageKey messageKey, String... args) { + this.messageKey = messageKey; + this.args = args; + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboService.java new file mode 100644 index 0000000000..c8b469224e --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboService.java @@ -0,0 +1,188 @@ +package fr.xephi.authme.data.limbo; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.limbo.persistence.LimboPersistence; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.SpawnLoader; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; + +import static fr.xephi.authme.settings.properties.LimboSettings.RESTORE_ALLOW_FLIGHT; +import static fr.xephi.authme.settings.properties.LimboSettings.RESTORE_FLY_SPEED; +import static fr.xephi.authme.settings.properties.LimboSettings.RESTORE_WALK_SPEED; + +/** + * Service for managing players that are in "limbo," a temporary state players are + * put in which have joined but not yet logged in. + */ +public class LimboService { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(LimboService.class); + + private final Map entries = new ConcurrentHashMap<>(); + + @Inject + private Settings settings; + + @Inject + private LimboPlayerTaskManager taskManager; + + @Inject + private LimboServiceHelper helper; + + @Inject + private LimboPersistence persistence; + + @Inject + private AuthGroupHandler authGroupHandler; + + @Inject + private SpawnLoader spawnLoader; + + LimboService() { + } + + /** + * Creates a LimboPlayer for the given player and revokes all "limbo data" from the player. + * + * @param player the player to process + * @param isRegistered whether or not the player is registered + */ + public void createLimboPlayer(Player player, boolean isRegistered) { + final String name = player.getName().toLowerCase(Locale.ROOT); + + LimboPlayer limboFromDisk = persistence.getLimboPlayer(player); + if (limboFromDisk != null) { + logger.debug("LimboPlayer for `{0}` already exists on disk", name); + } + + LimboPlayer existingLimbo = entries.remove(name); + if (existingLimbo != null) { + existingLimbo.clearTasks(); + logger.debug("LimboPlayer for `{0}` already present in memory", name); + } + + Location location = spawnLoader.getPlayerLocationOrSpawn(player); + LimboPlayer limboPlayer = helper.merge(existingLimbo, limboFromDisk); + limboPlayer = helper.merge(helper.createLimboPlayer(player, isRegistered, location), limboPlayer); + + taskManager.registerMessageTask(player, limboPlayer, + isRegistered ? LimboMessageType.LOG_IN : LimboMessageType.REGISTER); + taskManager.registerTimeoutTask(player, limboPlayer); + helper.revokeLimboStates(player); + authGroupHandler.setGroup(player, limboPlayer, + isRegistered ? AuthGroupType.REGISTERED_UNAUTHENTICATED : AuthGroupType.UNREGISTERED); + entries.put(name, limboPlayer); + persistence.saveLimboPlayer(player, limboPlayer); + } + + /** + * Returns the limbo player for the given name, or null otherwise. + * + * @param name the name to retrieve the data for + * @return the associated limbo player, or null if none available + */ + public LimboPlayer getLimboPlayer(String name) { + return entries.get(name.toLowerCase(Locale.ROOT)); + } + + /** + * Returns whether there is a limbo player for the given name. + * + * @param name the name to check + * @return true if present, false otherwise + */ + public boolean hasLimboPlayer(String name) { + return entries.containsKey(name.toLowerCase(Locale.ROOT)); + } + + /** + * Restores the limbo data and subsequently deletes the entry. + *

+ * Note that teleportation on the player is performed by {@link fr.xephi.authme.service.TeleportationService} and + * changing the permission group is handled by {@link fr.xephi.authme.data.limbo.AuthGroupHandler}. + * + * @param player the player whose data should be restored + */ + public void restoreData(Player player) { + String lowerName = player.getName().toLowerCase(Locale.ROOT); + LimboPlayer limbo = entries.remove(lowerName); + + if (limbo == null) { + logger.debug("No LimboPlayer found for `{0}` - cannot restore", lowerName); + } else { + player.setOp(limbo.isOperator()); + settings.getProperty(RESTORE_ALLOW_FLIGHT).restoreAllowFlight(player, limbo); + settings.getProperty(RESTORE_FLY_SPEED).restoreFlySpeed(player, limbo); + settings.getProperty(RESTORE_WALK_SPEED).restoreWalkSpeed(player, limbo); + limbo.clearTasks(); + logger.debug("Restored LimboPlayer stats for `{0}`", lowerName); + persistence.removeLimboPlayer(player); + } + authGroupHandler.setGroup(player, limbo, AuthGroupType.LOGGED_IN); + } + + /** + * Creates new tasks for the given player and cancels the old ones for a newly registered player. + * This resets his time to log in (TimeoutTask) and updates the message he is shown (MessageTask). + * + * @param player the player to reset the tasks for + */ + public void replaceTasksAfterRegistration(Player player) { + Optional limboPlayer = getLimboOrLogError(player, "reset tasks"); + limboPlayer.ifPresent(limbo -> { + taskManager.registerTimeoutTask(player, limbo); + taskManager.registerMessageTask(player, limbo, LimboMessageType.LOG_IN); + }); + authGroupHandler.setGroup(player, limboPlayer.orElse(null), AuthGroupType.REGISTERED_UNAUTHENTICATED); + } + + /** + * Resets the message task associated with the player's LimboPlayer. + * + * @param player the player to set a new message task for + * @param messageType the message to show for the limbo player + */ + public void resetMessageTask(Player player, LimboMessageType messageType) { + getLimboOrLogError(player, "reset message task") + .ifPresent(limbo -> taskManager.registerMessageTask(player, limbo, messageType)); + } + + /** + * @param player the player whose message task should be muted + */ + public void muteMessageTask(Player player) { + getLimboOrLogError(player, "mute message task") + .ifPresent(limbo -> LimboPlayerTaskManager.setMuted(limbo.getMessageTask(), true)); + } + + /** + * @param player the player whose message task should be unmuted + */ + public void unmuteMessageTask(Player player) { + getLimboOrLogError(player, "unmute message task") + .ifPresent(limbo -> LimboPlayerTaskManager.setMuted(limbo.getMessageTask(), false)); + } + + /** + * Returns the limbo player for the given player or logs an error. + * + * @param player the player to retrieve the limbo player for + * @param context the action for which the limbo player is being retrieved (for logging) + * @return Optional with the limbo player + */ + private Optional getLimboOrLogError(Player player, String context) { + LimboPlayer limbo = entries.get(player.getName().toLowerCase(Locale.ROOT)); + if (limbo == null) { + logger.debug("No LimboPlayer found for `{0}`. Action: {1}", player.getName(), context); + } + return Optional.ofNullable(limbo); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboServiceHelper.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboServiceHelper.java new file mode 100644 index 0000000000..a3edb164f4 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/LimboServiceHelper.java @@ -0,0 +1,115 @@ +package fr.xephi.authme.data.limbo; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.LimboSettings; +import fr.xephi.authme.settings.properties.RestrictionSettings; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static fr.xephi.authme.util.Utils.isCollectionEmpty; +import static java.util.stream.Collectors.toList; + +/** + * Helper class for the LimboService. + */ +class LimboServiceHelper { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(LimboServiceHelper.class); + + @Inject + private PermissionsManager permissionsManager; + + @Inject + private Settings settings; + + /** + * Creates a LimboPlayer with the given player's details. + * + * @param player the player to process + * @param isRegistered whether the player is registered + * @param location the player location + * @return limbo player with the player's data + */ + LimboPlayer createLimboPlayer(Player player, boolean isRegistered, Location location) { + // For safety reasons an unregistered player should not have OP status after registration + boolean isOperator = isRegistered && player.isOp(); + boolean flyEnabled = player.getAllowFlight(); + float walkSpeed = player.getWalkSpeed(); + float flySpeed = player.getFlySpeed(); + Collection playerGroups = permissionsManager.hasGroupSupport() + ? permissionsManager.getGroups(player) : Collections.emptyList(); + + List groupNames = playerGroups.stream() + .map(UserGroup::getGroupName) + .collect(toList()); + + logger.debug("Player `{0}` has groups `{1}`", player.getName(), String.join(", ", groupNames)); + return new LimboPlayer(location, isOperator, playerGroups, flyEnabled, walkSpeed, flySpeed); + } + + /** + * Removes the data that is saved in a LimboPlayer from the player. + *

+ * Note that teleportation on the player is performed by {@link fr.xephi.authme.service.TeleportationService} and + * changing the permission group is handled by {@link fr.xephi.authme.data.limbo.AuthGroupHandler}. + * + * @param player the player to set defaults to + */ + void revokeLimboStates(Player player) { + player.setOp(false); + settings.getProperty(LimboSettings.RESTORE_ALLOW_FLIGHT) + .processPlayer(player); + + if (!settings.getProperty(RestrictionSettings.ALLOW_UNAUTHED_MOVEMENT)) { + player.setFlySpeed(0.0f); + player.setWalkSpeed(0.0f); + } + } + + /** + * Merges two existing LimboPlayer instances of a player. Merging is done the following way: + *

    + *
  • isOperator, allowFlight: true if either limbo has true
  • + *
  • flySpeed, walkSpeed: maximum value of either limbo player
  • + *
  • groups, location: from old limbo if not empty/null, otherwise from new limbo
  • + *
+ * + * @param newLimbo the new limbo player + * @param oldLimbo the old limbo player + * @return merged limbo player if both arguments are not null, otherwise the first non-null argument + */ + LimboPlayer merge(LimboPlayer newLimbo, LimboPlayer oldLimbo) { + if (newLimbo == null) { + return oldLimbo; + } else if (oldLimbo == null) { + return newLimbo; + } + + boolean isOperator = newLimbo.isOperator() || oldLimbo.isOperator(); + boolean canFly = newLimbo.isCanFly() || oldLimbo.isCanFly(); + float flySpeed = Math.max(newLimbo.getFlySpeed(), oldLimbo.getFlySpeed()); + float walkSpeed = Math.max(newLimbo.getWalkSpeed(), oldLimbo.getWalkSpeed()); + Collection groups = getLimboGroups(oldLimbo.getGroups(), newLimbo.getGroups()); + Location location = firstNotNull(oldLimbo.getLocation(), newLimbo.getLocation()); + + return new LimboPlayer(location, isOperator, groups, canFly, walkSpeed, flySpeed); + } + + private static Location firstNotNull(Location first, Location second) { + return first == null ? second : first; + } + + private Collection getLimboGroups(Collection oldLimboGroups, + Collection newLimboGroups) { + logger.debug("Limbo merge: new and old groups are `{0}` and `{1}`", newLimboGroups, oldLimboGroups); + return isCollectionEmpty(oldLimboGroups) ? newLimboGroups : oldLimboGroups; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/UserGroup.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/UserGroup.java new file mode 100644 index 0000000000..9ed028a56d --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/UserGroup.java @@ -0,0 +1,45 @@ +package fr.xephi.authme.data.limbo; + +import java.util.Map; +import java.util.Objects; + +public class UserGroup { + + private String groupName; + private Map contextMap; + + public UserGroup(String groupName) { + this.groupName = groupName; + } + + public UserGroup(String groupName, Map contextMap) { + this.groupName = groupName; + this.contextMap = contextMap; + } + + public String getGroupName() { + return groupName; + } + + public Map getContextMap() { + return contextMap; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + UserGroup userGroup = (UserGroup) o; + return Objects.equals(groupName, userGroup.groupName) + && Objects.equals(contextMap, userGroup.contextMap); + } + + @Override + public int hashCode() { + return Objects.hash(groupName, contextMap); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/WalkFlySpeedRestoreType.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/WalkFlySpeedRestoreType.java new file mode 100644 index 0000000000..f4a2490171 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/WalkFlySpeedRestoreType.java @@ -0,0 +1,123 @@ +package fr.xephi.authme.data.limbo; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import org.bukkit.entity.Player; + +/** + * Possible types to restore the walk and fly speed from LimboPlayer + * back to Bukkit Player. + */ +public enum WalkFlySpeedRestoreType { + + /** + * Restores from LimboPlayer to Player. + */ + RESTORE { + @Override + public void restoreFlySpeed(Player player, LimboPlayer limbo) { + logger.debug(() -> "Restoring fly speed for LimboPlayer " + player.getName() + " to " + + limbo.getFlySpeed() + " (RESTORE mode)"); + player.setFlySpeed(limbo.getFlySpeed()); + } + + @Override + public void restoreWalkSpeed(Player player, LimboPlayer limbo) { + logger.debug(() -> "Restoring walk speed for LimboPlayer " + player.getName() + " to " + + limbo.getWalkSpeed() + " (RESTORE mode)"); + player.setWalkSpeed(limbo.getWalkSpeed()); + } + }, + + /** + * Restores from LimboPlayer, using the default speed if the speed on LimboPlayer is 0. + */ + RESTORE_NO_ZERO { + @Override + public void restoreFlySpeed(Player player, LimboPlayer limbo) { + float limboFlySpeed = limbo.getFlySpeed(); + if (limboFlySpeed > 0.01f) { + logger.debug(() -> "Restoring fly speed for LimboPlayer " + player.getName() + " to " + + limboFlySpeed + " (RESTORE_NO_ZERO mode)"); + player.setFlySpeed(limboFlySpeed); + } else { + logger.debug(() -> "Restoring fly speed for LimboPlayer " + player.getName() + + " to DEFAULT, it was 0! (RESTORE_NO_ZERO mode)"); + player.setFlySpeed(LimboPlayer.DEFAULT_FLY_SPEED); + } + } + + @Override + public void restoreWalkSpeed(Player player, LimboPlayer limbo) { + float limboWalkSpeed = limbo.getWalkSpeed(); + if (limboWalkSpeed > 0.01f) { + logger.debug(() -> "Restoring walk speed for LimboPlayer " + player.getName() + " to " + + limboWalkSpeed + " (RESTORE_NO_ZERO mode)"); + player.setWalkSpeed(limboWalkSpeed); + } else { + logger.debug(() -> "Restoring walk speed for LimboPlayer " + player.getName() + "" + + " to DEFAULT, it was 0! (RESTORE_NO_ZERO mode)"); + player.setWalkSpeed(LimboPlayer.DEFAULT_WALK_SPEED); + } + } + }, + + /** + * Uses the max speed of Player (current speed) and the LimboPlayer. + */ + MAX_RESTORE { + @Override + public void restoreFlySpeed(Player player, LimboPlayer limbo) { + float newSpeed = Math.max(player.getFlySpeed(), limbo.getFlySpeed()); + logger.debug(() -> "Restoring fly speed for LimboPlayer " + player.getName() + " to " + newSpeed + + " (Current: " + player.getFlySpeed() + ", Limbo: " + limbo.getFlySpeed() + ") (MAX_RESTORE mode)"); + player.setFlySpeed(newSpeed); + } + + @Override + public void restoreWalkSpeed(Player player, LimboPlayer limbo) { + float newSpeed = Math.max(player.getWalkSpeed(), limbo.getWalkSpeed()); + logger.debug(() -> "Restoring walk speed for LimboPlayer " + player.getName() + " to " + newSpeed + + " (Current: " + player.getWalkSpeed() + ", Limbo: " + limbo.getWalkSpeed() + ") (MAX_RESTORE mode)"); + player.setWalkSpeed(newSpeed); + } + }, + + /** + * Always sets the default speed to the player. + */ + DEFAULT { + @Override + public void restoreFlySpeed(Player player, LimboPlayer limbo) { + logger.debug(() -> "Restoring fly speed for LimboPlayer " + player.getName() + + " to DEFAULT (DEFAULT mode)"); + player.setFlySpeed(LimboPlayer.DEFAULT_FLY_SPEED); + } + + @Override + public void restoreWalkSpeed(Player player, LimboPlayer limbo) { + logger.debug(() -> "Restoring walk speed for LimboPlayer " + player.getName() + + " to DEFAULT (DEFAULT mode)"); + player.setWalkSpeed(LimboPlayer.DEFAULT_WALK_SPEED); + } + }; + + private static final ConsoleLogger logger = ConsoleLoggerFactory.get(WalkFlySpeedRestoreType.class); + + /** + * Restores the fly speed from Limbo to Player according to the restoration type. + * + * @param player the player to modify + * @param limbo the limbo player to read from + */ + public abstract void restoreFlySpeed(Player player, LimboPlayer limbo); + + /** + * Restores the walk speed from Limbo to Player according to the restoration type. + * + * @param player the player to modify + * @param limbo the limbo player to read from + */ + public abstract void restoreWalkSpeed(Player player, LimboPlayer limbo); + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/DistributedFilesPersistenceHandler.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/DistributedFilesPersistenceHandler.java new file mode 100644 index 0000000000..9708ce884e --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/DistributedFilesPersistenceHandler.java @@ -0,0 +1,228 @@ +package fr.xephi.authme.data.limbo.persistence; + +import com.google.common.io.Files; +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.limbo.LimboPlayer; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.LimboSettings; +import fr.xephi.authme.util.FileUtils; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.io.File; +import java.io.FileWriter; +import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * Persistence handler for LimboPlayer objects by distributing the objects to store + * in various segments (buckets) based on the start of the player's UUID. + */ +class DistributedFilesPersistenceHandler implements LimboPersistenceHandler { + + private static final Type LIMBO_MAP_TYPE = new TypeToken>(){}.getType(); + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(DistributedFilesPersistenceHandler.class); + private final File cacheFolder; + private final Gson gson; + private final SegmentNameBuilder segmentNameBuilder; + + @Inject + DistributedFilesPersistenceHandler(@DataFolder File dataFolder, BukkitService bukkitService, Settings settings) { + cacheFolder = new File(dataFolder, "playerdata"); + FileUtils.createDirectory(cacheFolder); + + gson = new GsonBuilder() + .registerTypeAdapter(LimboPlayer.class, new LimboPlayerSerializer()) + .registerTypeAdapter(LimboPlayer.class, new LimboPlayerDeserializer(bukkitService)) + .setPrettyPrinting() + .create(); + + segmentNameBuilder = new SegmentNameBuilder(settings.getProperty(LimboSettings.DISTRIBUTION_SIZE)); + + convertOldDataToCurrentSegmentScheme(); + deleteEmptyFiles(); + } + + @Override + public LimboPlayer getLimboPlayer(Player player) { + String uuid = player.getUniqueId().toString(); + File file = getPlayerSegmentFile(uuid); + Map entries = readLimboPlayers(file); + return entries == null ? null : entries.get(uuid); + } + + @Override + public void saveLimboPlayer(Player player, LimboPlayer limbo) { + String uuid = player.getUniqueId().toString(); + File file = getPlayerSegmentFile(uuid); + + Map entries = null; + if (file.exists()) { + entries = readLimboPlayers(file); + } else { + FileUtils.create(file); + } + /* intentionally separate if */ + if (entries == null) { + entries = new HashMap<>(); + } + + entries.put(uuid, limbo); + saveEntries(entries, file); + } + + @Override + public void removeLimboPlayer(Player player) { + String uuid = player.getUniqueId().toString(); + File file = getPlayerSegmentFile(uuid); + if (file.exists()) { + Map entries = readLimboPlayers(file); + if (entries != null && entries.remove(uuid) != null) { + saveEntries(entries, file); + } + } + } + + @Override + public LimboPersistenceType getType() { + return LimboPersistenceType.DISTRIBUTED_FILES; + } + + private void saveEntries(Map entries, File file) { + try (FileWriter fw = new FileWriter(file)) { + gson.toJson(entries, fw); + } catch (Exception e) { + logger.logException("Could not write to '" + file + "':", e); + } + } + + private Map readLimboPlayers(File file) { + if (!file.exists()) { + return null; + } + + try { + return gson.fromJson(Files.asCharSource(file, StandardCharsets.UTF_8).read(), LIMBO_MAP_TYPE); + } catch (Exception e) { + logger.logException("Failed reading '" + file + "':", e); + } + return null; + } + + private File getPlayerSegmentFile(String uuid) { + String segment = segmentNameBuilder.createSegmentName(uuid); + return getSegmentFile(segment); + } + + private File getSegmentFile(String segmentId) { + return new File(cacheFolder, segmentId + "-limbo.json"); + } + + /** + * Loads segment files in the cache folder that don't correspond to the current segmenting scheme + * and migrates the data into files of the current segments. This allows a player to change the + * segment size without any loss of data. + */ + private void convertOldDataToCurrentSegmentScheme() { + String currentPrefix = segmentNameBuilder.getPrefix(); + File[] files = listFiles(cacheFolder); + Map allLimboPlayers = new HashMap<>(); + List migratedFiles = new ArrayList<>(); + + for (File file : files) { + if (isLimboJsonFile(file) && !file.getName().startsWith(currentPrefix)) { + Map data = readLimboPlayers(file); + if (data != null) { + allLimboPlayers.putAll(data); + migratedFiles.add(file); + } + } + } + + if (!allLimboPlayers.isEmpty()) { + saveToNewSegments(allLimboPlayers); + migratedFiles.forEach(FileUtils::delete); + } + } + + /** + * Saves the LimboPlayer data read from old segmenting schemes into the current segmenting scheme. + * + * @param limbosFromOldSegments the limbo players to store into the current segment files + */ + private void saveToNewSegments(Map limbosFromOldSegments) { + Map> limboBySegment = groupBySegment(limbosFromOldSegments); + + logger.info("Saving " + limbosFromOldSegments.size() + " LimboPlayers from old segments into " + + limboBySegment.size() + " current segments"); + for (Map.Entry> entry : limboBySegment.entrySet()) { + File file = getSegmentFile(entry.getKey()); + Map limbosToSave = Optional.ofNullable(readLimboPlayers(file)) + .orElseGet(HashMap::new); + limbosToSave.putAll(entry.getValue()); + saveEntries(limbosToSave, file); + } + } + + /** + * Converts a Map of UUID to LimboPlayers to a 2-dimensional Map of LimboPlayers by segment ID and UUID. + * {@code Map(uuid -> LimboPlayer) to Map(segment -> Map(uuid -> LimboPlayer))} + * + * @param readLimboPlayers the limbo players to order by segment + * @return limbo players ordered by segment ID and associated player UUID + */ + private Map> groupBySegment(Map readLimboPlayers) { + Map> limboBySegment = new HashMap<>(); + for (Map.Entry entry : readLimboPlayers.entrySet()) { + String segmentId = segmentNameBuilder.createSegmentName(entry.getKey()); + limboBySegment.computeIfAbsent(segmentId, s -> new HashMap<>()) + .put(entry.getKey(), entry.getValue()); + } + return limboBySegment; + } + + /** + * Deletes segment files that are empty. + */ + private void deleteEmptyFiles() { + File[] files = listFiles(cacheFolder); + + long deletedFiles = Arrays.stream(files) + // typically the size is 2 because there's an empty JSON map: {} + .filter(f -> isLimboJsonFile(f) && f.length() < 3) + .peek(FileUtils::delete) + .count(); + logger.debug("Limbo: Deleted {0} empty segment files", deletedFiles); + } + + /** + * @param file the file to check + * @return true if it is a segment file storing Limbo data, false otherwise + */ + private static boolean isLimboJsonFile(File file) { + String name = file.getName(); + return name.startsWith("seg") && name.endsWith("-limbo.json"); + } + + private File[] listFiles(File folder) { + File[] files = folder.listFiles(); + if (files == null) { + logger.warning("Could not get files of '" + folder + "'"); + return new File[0]; + } + return files; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/IndividualFilesPersistenceHandler.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/IndividualFilesPersistenceHandler.java new file mode 100644 index 0000000000..9772ec0649 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/IndividualFilesPersistenceHandler.java @@ -0,0 +1,92 @@ +package fr.xephi.authme.data.limbo.persistence; + +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.limbo.LimboPlayer; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.util.FileUtils; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +/** + * Saves LimboPlayer objects as JSON into individual files. + */ +class IndividualFilesPersistenceHandler implements LimboPersistenceHandler { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(IndividualFilesPersistenceHandler.class); + + private final Gson gson; + private final File cacheDir; + + @Inject + IndividualFilesPersistenceHandler(@DataFolder File dataFolder, BukkitService bukkitService) { + cacheDir = new File(dataFolder, "playerdata"); + if (!cacheDir.exists() && !cacheDir.isDirectory() && !cacheDir.mkdir()) { + logger.warning("Failed to create playerdata directory '" + cacheDir + "'"); + } + gson = new GsonBuilder() + .registerTypeAdapter(LimboPlayer.class, new LimboPlayerSerializer()) + .registerTypeAdapter(LimboPlayer.class, new LimboPlayerDeserializer(bukkitService)) + .setPrettyPrinting() + .create(); + } + + @Override + public LimboPlayer getLimboPlayer(Player player) { + String id = player.getUniqueId().toString(); + File file = new File(cacheDir, id + File.separator + "data.json"); + if (!file.exists()) { + return null; + } + + try { + String str = Files.asCharSource(file, StandardCharsets.UTF_8).read(); + return gson.fromJson(str, LimboPlayer.class); + } catch (IOException e) { + logger.logException("Could not read player data on disk for '" + player.getName() + "'", e); + return null; + } + } + + @Override + public void saveLimboPlayer(Player player, LimboPlayer limboPlayer) { + String id = player.getUniqueId().toString(); + try { + File file = new File(cacheDir, id + File.separator + "data.json"); + Files.createParentDirs(file); + Files.touch(file); + Files.write(gson.toJson(limboPlayer), file, StandardCharsets.UTF_8); + } catch (IOException e) { + logger.logException("Failed to write " + player.getName() + " data:", e); + } + } + + /** + * Removes the LimboPlayer. This will delete the + * "playerdata/<uuid or name>/" folder from disk. + * + * @param player player to remove + */ + @Override + public void removeLimboPlayer(Player player) { + String id = player.getUniqueId().toString(); + File file = new File(cacheDir, id); + if (file.exists()) { + FileUtils.purgeDirectory(file); + FileUtils.delete(file); + } + } + + @Override + public LimboPersistenceType getType() { + return LimboPersistenceType.INDIVIDUAL_FILES; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPersistence.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPersistence.java new file mode 100644 index 0000000000..844c9cdf5f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPersistence.java @@ -0,0 +1,82 @@ +package fr.xephi.authme.data.limbo.persistence; + +import ch.jalu.injector.factory.Factory; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.limbo.LimboPlayer; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.LimboSettings; +import org.bukkit.entity.Player; + +import javax.inject.Inject; + +/** + * Handles the persistence of LimboPlayers. + */ +public class LimboPersistence implements SettingsDependent { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(LimboPersistence.class); + + private final Factory handlerFactory; + + private LimboPersistenceHandler handler; + + @Inject + LimboPersistence(Settings settings, Factory handlerFactory) { + this.handlerFactory = handlerFactory; + reload(settings); + } + + /** + * Retrieves the LimboPlayer for the given player if available. + * + * @param player the player to retrieve the LimboPlayer for + * @return the player's limbo player, or null if not available + */ + public LimboPlayer getLimboPlayer(Player player) { + try { + return handler.getLimboPlayer(player); + } catch (Exception e) { + logger.logException("Could not get LimboPlayer for '" + player.getName() + "'", e); + } + return null; + } + + /** + * Saves the given LimboPlayer for the provided player. + * + * @param player the player to save the LimboPlayer for + * @param limbo the limbo player to save + */ + public void saveLimboPlayer(Player player, LimboPlayer limbo) { + try { + handler.saveLimboPlayer(player, limbo); + } catch (Exception e) { + logger.logException("Could not save LimboPlayer for '" + player.getName() + "'", e); + } + } + + /** + * Removes the LimboPlayer for the given player. + * + * @param player the player whose LimboPlayer should be removed + */ + public void removeLimboPlayer(Player player) { + try { + handler.removeLimboPlayer(player); + } catch (Exception e) { + logger.logException("Could not remove LimboPlayer for '" + player.getName() + "'", e); + } + } + + @Override + public void reload(Settings settings) { + LimboPersistenceType persistenceType = settings.getProperty(LimboSettings.LIMBO_PERSISTENCE_TYPE); + // If we're changing from an existing handler, output a quick hint that nothing is converted. + if (handler != null && handler.getType() != persistenceType) { + logger.info("Limbo persistence type has changed! Note that the data is not converted."); + } + handler = handlerFactory.newInstance(persistenceType.getImplementationClass()); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPersistenceHandler.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPersistenceHandler.java new file mode 100644 index 0000000000..95e88aada9 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPersistenceHandler.java @@ -0,0 +1,39 @@ +package fr.xephi.authme.data.limbo.persistence; + +import fr.xephi.authme.data.limbo.LimboPlayer; +import org.bukkit.entity.Player; + +/** + * Handles I/O for storing LimboPlayer objects. + */ +interface LimboPersistenceHandler { + + /** + * Returns the limbo player for the given player if it exists. + * + * @param player the player + * @return the stored limbo player, or null if not available + */ + LimboPlayer getLimboPlayer(Player player); + + /** + * Saves the given limbo player for the given player to the disk. + * + * @param player the player to save the limbo player for + * @param limbo the limbo player to save + */ + void saveLimboPlayer(Player player, LimboPlayer limbo); + + /** + * Removes the limbo player from the disk. + * + * @param player the player whose limbo player should be removed + */ + void removeLimboPlayer(Player player); + + /** + * @return the type of the limbo persistence implementation + */ + LimboPersistenceType getType(); + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPersistenceType.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPersistenceType.java new file mode 100644 index 0000000000..8119e66973 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPersistenceType.java @@ -0,0 +1,34 @@ +package fr.xephi.authme.data.limbo.persistence; + +/** + * Types of persistence for LimboPlayer objects. + */ +public enum LimboPersistenceType { + + /** Store each LimboPlayer in a separate file. */ + INDIVIDUAL_FILES(IndividualFilesPersistenceHandler.class), + + /** Store LimboPlayers distributed in a configured number of files. */ + DISTRIBUTED_FILES(DistributedFilesPersistenceHandler.class), + + /** No persistence to disk. */ + DISABLED(NoOpPersistenceHandler.class); + + private final Class implementationClass; + + /** + * Constructor. + * + * @param implementationClass the implementation class + */ + LimboPersistenceType(Class implementationClass) { + this.implementationClass= implementationClass; + } + + /** + * @return class implementing the persistence type + */ + public Class getImplementationClass() { + return implementationClass; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerDeserializer.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerDeserializer.java new file mode 100644 index 0000000000..6dea20efe6 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerDeserializer.java @@ -0,0 +1,163 @@ +package fr.xephi.authme.data.limbo.persistence; + +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import fr.xephi.authme.data.limbo.LimboPlayer; +import fr.xephi.authme.data.limbo.UserGroup; +import fr.xephi.authme.service.BukkitService; +import org.bukkit.Location; +import org.bukkit.World; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +import static fr.xephi.authme.data.limbo.persistence.LimboPlayerSerializer.CAN_FLY; +import static fr.xephi.authme.data.limbo.persistence.LimboPlayerSerializer.FLY_SPEED; +import static fr.xephi.authme.data.limbo.persistence.LimboPlayerSerializer.GROUPS; +import static fr.xephi.authme.data.limbo.persistence.LimboPlayerSerializer.IS_OP; +import static fr.xephi.authme.data.limbo.persistence.LimboPlayerSerializer.LOCATION; +import static fr.xephi.authme.data.limbo.persistence.LimboPlayerSerializer.LOC_PITCH; +import static fr.xephi.authme.data.limbo.persistence.LimboPlayerSerializer.LOC_WORLD; +import static fr.xephi.authme.data.limbo.persistence.LimboPlayerSerializer.LOC_X; +import static fr.xephi.authme.data.limbo.persistence.LimboPlayerSerializer.LOC_Y; +import static fr.xephi.authme.data.limbo.persistence.LimboPlayerSerializer.LOC_YAW; +import static fr.xephi.authme.data.limbo.persistence.LimboPlayerSerializer.LOC_Z; +import static fr.xephi.authme.data.limbo.persistence.LimboPlayerSerializer.WALK_SPEED; +import static java.util.Optional.ofNullable; + +/** + * Converts a JsonElement to a LimboPlayer. + */ +class LimboPlayerDeserializer implements JsonDeserializer { + + private static final String GROUP_LEGACY = "group"; + private static final String CONTEXT_MAP = "contextMap"; + private static final String GROUP_NAME = "groupName"; + + private BukkitService bukkitService; + + LimboPlayerDeserializer(BukkitService bukkitService) { + this.bukkitService = bukkitService; + } + + @Override + public LimboPlayer deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) { + JsonObject jsonObject = jsonElement.getAsJsonObject(); + if (jsonObject == null) { + return null; + } + + Location loc = deserializeLocation(jsonObject); + boolean operator = getBoolean(jsonObject, IS_OP); + + Collection groups = getLimboGroups(jsonObject); + boolean canFly = getBoolean(jsonObject, CAN_FLY); + float walkSpeed = getFloat(jsonObject, WALK_SPEED, LimboPlayer.DEFAULT_WALK_SPEED); + float flySpeed = getFloat(jsonObject, FLY_SPEED, LimboPlayer.DEFAULT_FLY_SPEED); + + return new LimboPlayer(loc, operator, groups, canFly, walkSpeed, flySpeed); + } + + private Location deserializeLocation(JsonObject jsonObject) { + JsonElement e; + if ((e = jsonObject.getAsJsonObject(LOCATION)) != null) { + JsonObject locationObject = e.getAsJsonObject(); + World world = bukkitService.getWorld(getString(locationObject, LOC_WORLD)); + if (world != null) { + double x = getDouble(locationObject, LOC_X); + double y = getDouble(locationObject, LOC_Y); + double z = getDouble(locationObject, LOC_Z); + float yaw = getFloat(locationObject, LOC_YAW); + float pitch = getFloat(locationObject, LOC_PITCH); + return new Location(world, x, y, z, yaw, pitch); + } + } + return null; + } + + private static String getString(JsonObject jsonObject, String memberName) { + JsonElement element = jsonObject.get(memberName); + return element != null ? element.getAsString() : ""; + } + + /** + * @param jsonObject LimboPlayer represented as JSON + * @return The list of UserGroups create from JSON + */ + private static List getLimboGroups(JsonObject jsonObject) { + JsonElement element = jsonObject.get(GROUPS); + if (element == null) { + String legacyGroup = ofNullable(jsonObject.get(GROUP_LEGACY)).map(JsonElement::getAsString).orElse(null); + return legacyGroup == null ? Collections.emptyList() : + Collections.singletonList(new UserGroup(legacyGroup, null)); + } + List result = new ArrayList<>(); + JsonArray jsonArray = element.getAsJsonArray(); + for (JsonElement arrayElement : jsonArray) { + if (!arrayElement.isJsonObject()) { + result.add(new UserGroup(arrayElement.getAsString(), null)); + } else { + JsonObject jsonGroup = arrayElement.getAsJsonObject(); + Map contextMap = null; + if (jsonGroup.has(CONTEXT_MAP)) { + JsonElement contextMapJson = jsonGroup.get("contextMap"); + Type type = new TypeToken>() { + }.getType(); + contextMap = new Gson().fromJson(contextMapJson.getAsString(), type); + } + + String groupName = jsonGroup.get(GROUP_NAME).getAsString(); + result.add(new UserGroup(groupName, contextMap)); + } + } + return result; + } + + private static boolean getBoolean(JsonObject jsonObject, String memberName) { + JsonElement element = jsonObject.get(memberName); + return element != null && element.getAsBoolean(); + } + + private static float getFloat(JsonObject jsonObject, String memberName) { + return getNumberFromElement(jsonObject.get(memberName), JsonElement::getAsFloat, 0.0f); + } + + private static float getFloat(JsonObject jsonObject, String memberName, float defaultValue) { + return getNumberFromElement(jsonObject.get(memberName), JsonElement::getAsFloat, defaultValue); + } + + private static double getDouble(JsonObject jsonObject, String memberName) { + return getNumberFromElement(jsonObject.get(memberName), JsonElement::getAsDouble, 0.0); + } + + /** + * Gets a number from the given JsonElement safely. + * + * @param jsonElement the element to retrieve the number from + * @param numberFunction the function to get the number from the element + * @param defaultValue the value to return if the element is null or the number cannot be retrieved + * @param the number type + * @return the number from the given JSON element, or the default value + */ + private static N getNumberFromElement(JsonElement jsonElement, + Function numberFunction, + N defaultValue) { + if (jsonElement != null) { + try { + return numberFunction.apply(jsonElement); + } catch (NumberFormatException ignore) { + } + } + return defaultValue; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java new file mode 100644 index 0000000000..eaad86b7e5 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/LimboPlayerSerializer.java @@ -0,0 +1,71 @@ +package fr.xephi.authme.data.limbo.persistence; + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import fr.xephi.authme.data.limbo.LimboPlayer; +import org.bukkit.Location; + +import java.lang.reflect.Type; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Converts a LimboPlayer to a JsonElement. + */ +class LimboPlayerSerializer implements JsonSerializer { + + static final String LOCATION = "location"; + static final String LOC_WORLD = "world"; + static final String LOC_X = "x"; + static final String LOC_Y = "y"; + static final String LOC_Z = "z"; + static final String LOC_YAW = "yaw"; + static final String LOC_PITCH = "pitch"; + + static final String GROUPS = "groups"; + static final String IS_OP = "operator"; + static final String CAN_FLY = "can-fly"; + static final String WALK_SPEED = "walk-speed"; + static final String FLY_SPEED = "fly-speed"; + + private static final Gson GSON = new Gson(); + + + @Override + public JsonElement serialize(LimboPlayer limboPlayer, Type type, JsonSerializationContext context) { + Location loc = limboPlayer.getLocation(); + JsonObject locationObject = new JsonObject(); + locationObject.addProperty(LOC_WORLD, loc.getWorld().getName()); + locationObject.addProperty(LOC_X, loc.getX()); + locationObject.addProperty(LOC_Y, loc.getY()); + locationObject.addProperty(LOC_Z, loc.getZ()); + locationObject.addProperty(LOC_YAW, loc.getYaw()); + locationObject.addProperty(LOC_PITCH, loc.getPitch()); + + JsonObject obj = new JsonObject(); + obj.add(LOCATION, locationObject); + + List groups = limboPlayer.getGroups().stream().map(g -> { + JsonObject jsonGroup = new JsonObject(); + jsonGroup.addProperty("groupName", g.getGroupName()); + if (g.getContextMap() != null) { + jsonGroup.addProperty("contextMap", GSON.toJson(g.getContextMap())); + } + return jsonGroup; + }).collect(Collectors.toList()); + + JsonArray jsonGroups = new JsonArray(); + groups.forEach(jsonGroups::add); + obj.add(GROUPS, jsonGroups); + + obj.addProperty(IS_OP, limboPlayer.isOperator()); + obj.addProperty(CAN_FLY, limboPlayer.isCanFly()); + obj.addProperty(WALK_SPEED, limboPlayer.getWalkSpeed()); + obj.addProperty(FLY_SPEED, limboPlayer.getFlySpeed()); + return obj; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/NoOpPersistenceHandler.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/NoOpPersistenceHandler.java new file mode 100644 index 0000000000..ac6ff9b360 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/NoOpPersistenceHandler.java @@ -0,0 +1,30 @@ +package fr.xephi.authme.data.limbo.persistence; + +import fr.xephi.authme.data.limbo.LimboPlayer; +import org.bukkit.entity.Player; + +/** + * Limbo player persistence implementation that does nothing. + */ +class NoOpPersistenceHandler implements LimboPersistenceHandler { + + @Override + public LimboPlayer getLimboPlayer(Player player) { + return null; + } + + @Override + public void saveLimboPlayer(Player player, LimboPlayer limbo) { + // noop + } + + @Override + public void removeLimboPlayer(Player player) { + // noop + } + + @Override + public LimboPersistenceType getType() { + return LimboPersistenceType.DISABLED; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/SegmentNameBuilder.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/SegmentNameBuilder.java new file mode 100644 index 0000000000..24e0737d3b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/SegmentNameBuilder.java @@ -0,0 +1,73 @@ +package fr.xephi.authme.data.limbo.persistence; + +import java.util.HashMap; +import java.util.Map; + +/** + * Creates segment names for {@link DistributedFilesPersistenceHandler}. + */ +class SegmentNameBuilder { + + private final int length; + private final int distribution; + private final String prefix; + private final Map charToSegmentChar; + + /** + * Constructor. + * + * @param partition the segment configuration + */ + SegmentNameBuilder(SegmentSize partition) { + this.length = partition.getLength(); + this.distribution = partition.getDistribution(); + this.prefix = "seg" + partition.getTotalSegments() + "-"; + this.charToSegmentChar = buildCharMap(distribution); + } + + /** + * Returns the segment ID for the given UUID. + * + * @param uuid the player's uuid to get the segment for + * @return id the uuid belongs to + */ + String createSegmentName(String uuid) { + if (distribution == 16) { + return prefix + uuid.substring(0, length); + } else { + return prefix + buildSegmentName(uuid.substring(0, length).toCharArray()); + } + } + + /** + * @return the prefix used for the current segment configuration + */ + String getPrefix() { + return prefix; + } + + private String buildSegmentName(char[] chars) { + if (chars.length == 1) { + return String.valueOf(charToSegmentChar.get(chars[0])); + } + + StringBuilder sb = new StringBuilder(chars.length); + for (char chr : chars) { + sb.append(charToSegmentChar.get(chr)); + } + return sb.toString(); + } + + private static Map buildCharMap(int distribution) { + final char[] hexChars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + final int divisor = 16 / distribution; + + Map charToSegmentChar = new HashMap<>(); + for (int i = 0; i < hexChars.length; ++i) { + int mappedChar = i / divisor; + charToSegmentChar.put(hexChars[i], hexChars[mappedChar]); + } + return charToSegmentChar; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/SegmentSize.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/SegmentSize.java new file mode 100644 index 0000000000..0e290ceaa8 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/data/limbo/persistence/SegmentSize.java @@ -0,0 +1,94 @@ +package fr.xephi.authme.data.limbo.persistence; + +/** + * Configuration for the total number of segments to use. + *

+ * The {@link DistributedFilesPersistenceHandler} reduces the number of files by assigning each UUID + * to a segment. This enum allows to define how many segments the UUIDs should be distributed in. + *

+ * Segments are defined by a distribution and a length. The distribution defines + * to how many outputs a single hexadecimal characters should be mapped. So e.g. a distribution + * of 3 means that all hexadecimal characters 0-f should be distributed over three different + * outputs evenly. The {@link SegmentNameBuilder} simply uses hexadecimal characters as outputs, + * so e.g. with a distribution of 3 all hex characters 0-f are mapped to 0, 1, or 2. + *

+ * To ensure an even distribution the segments must be powers of 2. Trivially, to implement a + * distribution of 16, the same character may be returned as was input (since 0-f make up 16 + * characters). A distribution of 1, on the other hand, means that the same output is returned + * regardless of the input character. + *

+ * The length parameter defines how many characters of a player's UUID should be used to + * create the segment ID. In other words, with a distribution of 2 and a length of 3, the first + * three characters of the UUID are taken into consideration, each mapped to one of two possible + * characters. For instance, a UUID starting with "0f5c9321" may yield the segment ID "010." + * Such a segment ID defines in which file the given UUID can be found and stored. + *

+ * The number of segments such a configuration yields is computed as {@code distribution ^ length}, + * since distribution defines how many outputs there are per digit, and length defines the number + * of digits. For instance, a distribution of 2 and a length of 3 will yield segment IDs 000, 001, + * 010, 011, 100, 101, 110 and 111 (i.e. all binary numbers from 0 to 7). + *

+ * There are multiple possibilities to achieve certain segment totals, e.g. 8 different segments + * may be created by setting distribution to 8 and length to 1, or distr. to 2 and length to 3. + * Where possible, prefer a length of 1 (no string concatenation required) or a distribution of + * 16 (no remapping of the characters required). + */ +public enum SegmentSize { + + /** 1. */ + ONE(1, 1), + + // /** 2. */ + // TWO(2, 1), + + /** 4. */ + FOUR(4, 1), + + /** 8. */ + EIGHT(8, 1), + + /** 16. */ + SIXTEEN(16, 1), + + /** 32. */ + THIRTY_TWO(2, 5), + + /** 64. */ + SIXTY_FOUR(4, 3), + + /** 128. */ + ONE_TWENTY(2, 7), + + /** 256. */ + TWO_FIFTY(16, 2); + + private final int distribution; + private final int length; + + SegmentSize(int distribution, int length) { + this.distribution = distribution; + this.length = length; + } + + /** + * @return the distribution size per character, i.e. how many possible outputs there are + * for any hexadecimal character + */ + public int getDistribution() { + return distribution; + } + + /** + * @return number of characters from a UUID that should be used to create a segment ID + */ + public int getLength() { + return length; + } + + /** + * @return number of segments to which this configuration will distribute all UUIDs + */ + public int getTotalSegments() { + return (int) Math.pow(distribution, length); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/AbstractSqlDataSource.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/AbstractSqlDataSource.java new file mode 100644 index 0000000000..6c12a17108 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/AbstractSqlDataSource.java @@ -0,0 +1,172 @@ +package fr.xephi.authme.datasource; + +import ch.jalu.datasourcecolumns.data.DataSourceValue; +import ch.jalu.datasourcecolumns.data.DataSourceValueImpl; +import ch.jalu.datasourcecolumns.data.DataSourceValues; +import ch.jalu.datasourcecolumns.predicate.AlwaysTruePredicate; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.columnshandler.AuthMeColumns; +import fr.xephi.authme.datasource.columnshandler.AuthMeColumnsHandler; +import fr.xephi.authme.security.crypts.HashedPassword; + +import java.sql.SQLException; +import java.util.Collections; +import java.util.List; + +import static ch.jalu.datasourcecolumns.data.UpdateValues.with; +import static ch.jalu.datasourcecolumns.predicate.StandardPredicates.eq; +import static ch.jalu.datasourcecolumns.predicate.StandardPredicates.eqIgnoreCase; +import static fr.xephi.authme.datasource.SqlDataSourceUtils.logSqlException; + +/** + * Common type for SQL-based data sources. Classes implementing this + * must ensure that {@link #columnsHandler} is initialized on creation. + */ +public abstract class AbstractSqlDataSource implements DataSource { + + protected AuthMeColumnsHandler columnsHandler; + + @Override + public boolean isAuthAvailable(String user) { + try { + return columnsHandler.retrieve(user, AuthMeColumns.NAME).rowExists(); + } catch (SQLException e) { + logSqlException(e); + return false; + } + } + + @Override + public HashedPassword getPassword(String user) { + try { + DataSourceValues values = columnsHandler.retrieve(user, AuthMeColumns.PASSWORD, AuthMeColumns.SALT); + if (values.rowExists()) { + return new HashedPassword(values.get(AuthMeColumns.PASSWORD), values.get(AuthMeColumns.SALT)); + } + } catch (SQLException e) { + logSqlException(e); + } + return null; + } + + @Override + public boolean saveAuth(PlayerAuth auth) { + return columnsHandler.insert(auth, + AuthMeColumns.NAME, AuthMeColumns.NICK_NAME, AuthMeColumns.PASSWORD, AuthMeColumns.SALT, + AuthMeColumns.EMAIL, AuthMeColumns.REGISTRATION_DATE, AuthMeColumns.REGISTRATION_IP, + AuthMeColumns.UUID); + } + + @Override + public boolean hasSession(String user) { + try { + DataSourceValue result = columnsHandler.retrieve(user, AuthMeColumns.HAS_SESSION); + return result.rowExists() && Integer.valueOf(1).equals(result.getValue()); + } catch (SQLException e) { + logSqlException(e); + return false; + } + } + + @Override + public boolean updateSession(PlayerAuth auth) { + return columnsHandler.update(auth, AuthMeColumns.LAST_IP, AuthMeColumns.LAST_LOGIN, AuthMeColumns.NICK_NAME); + } + + @Override + public boolean updatePassword(PlayerAuth auth) { + return updatePassword(auth.getNickname(), auth.getPassword()); + } + + @Override + public boolean updatePassword(String user, HashedPassword password) { + return columnsHandler.update(user, + with(AuthMeColumns.PASSWORD, password.getHash()) + .and(AuthMeColumns.SALT, password.getSalt()).build()); + } + + @Override + public boolean updateQuitLoc(PlayerAuth auth) { + return columnsHandler.update(auth, + AuthMeColumns.LOCATION_X, AuthMeColumns.LOCATION_Y, AuthMeColumns.LOCATION_Z, + AuthMeColumns.LOCATION_WORLD, AuthMeColumns.LOCATION_YAW, AuthMeColumns.LOCATION_PITCH); + } + + @Override + public List getAllAuthsByIp(String ip) { + try { + return columnsHandler.retrieve(eq(AuthMeColumns.LAST_IP, ip), AuthMeColumns.NAME); + } catch (SQLException e) { + logSqlException(e); + return Collections.emptyList(); + } + } + + @Override + public int countAuthsByEmail(String email) { + return columnsHandler.count(eqIgnoreCase(AuthMeColumns.EMAIL, email)); + } + + @Override + public boolean updateEmail(PlayerAuth auth) { + return columnsHandler.update(auth, AuthMeColumns.EMAIL); + } + + @Override + public boolean isLogged(String user) { + try { + DataSourceValue result = columnsHandler.retrieve(user, AuthMeColumns.IS_LOGGED); + return result.rowExists() && Integer.valueOf(1).equals(result.getValue()); + } catch (SQLException e) { + logSqlException(e); + return false; + } + } + + @Override + public void setLogged(String user) { + columnsHandler.update(user, AuthMeColumns.IS_LOGGED, 1); + } + + @Override + public void setUnlogged(String user) { + columnsHandler.update(user, AuthMeColumns.IS_LOGGED, 0); + } + + @Override + public void grantSession(String user) { + columnsHandler.update(user, AuthMeColumns.HAS_SESSION, 1); + } + + @Override + public void revokeSession(String user) { + columnsHandler.update(user, AuthMeColumns.HAS_SESSION, 0); + } + + @Override + public void purgeLogged() { + columnsHandler.update(eq(AuthMeColumns.IS_LOGGED, 1), AuthMeColumns.IS_LOGGED, 0); + } + + @Override + public int getAccountsRegistered() { + return columnsHandler.count(new AlwaysTruePredicate<>()); + } + + @Override + public boolean updateRealName(String user, String realName) { + return columnsHandler.update(user, AuthMeColumns.NICK_NAME, realName); + } + + @Override + public DataSourceValue getEmail(String user) { + try { + return columnsHandler.retrieve(user, AuthMeColumns.EMAIL); + } catch (SQLException e) { + logSqlException(e); + return DataSourceValueImpl.unknownRow(); + } + } + + abstract String getJdbcUrl(String host, String port, String database); +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java new file mode 100644 index 0000000000..450fd051b6 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java @@ -0,0 +1,323 @@ +package fr.xephi.authme.datasource; + +import ch.jalu.datasourcecolumns.data.DataSourceValue; +import ch.jalu.datasourcecolumns.data.DataSourceValueImpl; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.settings.properties.DatabaseSettings; +import fr.xephi.authme.util.Utils; + +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.List; +import java.util.Locale; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +public class CacheDataSource implements DataSource { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(CacheDataSource.class); + private final DataSource source; + private final PlayerCache playerCache; + private final LoadingCache> cachedAuths; + private ListeningExecutorService executorService; + + /** + * Constructor for CacheDataSource. + * + * @param source the source + * @param playerCache the player cache + */ + public CacheDataSource(DataSource source, PlayerCache playerCache) { + this.source = source; + this.playerCache = playerCache; + if (AuthMe.settings.getProperty(DatabaseSettings.USE_VIRTUAL_THREADS)) { + try { + Method method = Executors.class.getMethod("newVirtualThreadPerTaskExecutor"); + method.setAccessible(true); + ExecutorService ex = (ExecutorService) method.invoke(null); + executorService = MoreExecutors.listeningDecorator(ex); + logger.info("Using virtual threads for cache loader"); + } catch (Exception e) { + executorService = MoreExecutors.listeningDecorator( + Executors.newCachedThreadPool(new ThreadFactoryBuilder() + .setDaemon(true) + .setNameFormat("AuthMe-CacheLoader") + .build()) + ); + logger.info("Cannot enable virtual threads, fallback to CachedThreadPool"); + } + } else { + executorService = MoreExecutors.listeningDecorator( + Executors.newCachedThreadPool(new ThreadFactoryBuilder() + .setDaemon(true) + .setNameFormat("AuthMe-CacheLoader") + .build()) + ); + } + cachedAuths = CacheBuilder.newBuilder() + .refreshAfterWrite(5, TimeUnit.MINUTES) + .expireAfterAccess(15, TimeUnit.MINUTES) + .build(new CacheLoader>() { + @Override + public Optional load(String key) { + return Optional.ofNullable(source.getAuth(key)); + } + + @Override + public ListenableFuture> reload(final String key, Optional oldValue) { + return executorService.submit(() -> load(key)); + } + }); + } + + public LoadingCache> getCachedAuths() { + return cachedAuths; + } + + @Override + public void reload() { + source.reload(); + } + + @Override + public boolean isCached() { + return true; + } + + @Override + public boolean isAuthAvailable(String user) { + return getAuth(user) != null; + } + + @Override + public HashedPassword getPassword(String user) { + user = user.toLowerCase(Locale.ROOT); + Optional pAuthOpt = cachedAuths.getIfPresent(user); + if (pAuthOpt != null && pAuthOpt.isPresent()) { + return pAuthOpt.get().getPassword(); + } + return source.getPassword(user); + } + + @Override + public PlayerAuth getAuth(String user) { + user = user.toLowerCase(Locale.ROOT); + return cachedAuths.getUnchecked(user).orElse(null); + } + + @Override + public boolean saveAuth(PlayerAuth auth) { + boolean result = source.saveAuth(auth); + if (result) { + cachedAuths.refresh(auth.getNickname()); + } + return result; + } + + @Override + public boolean updatePassword(PlayerAuth auth) { + boolean result = source.updatePassword(auth); + if (result) { + cachedAuths.refresh(auth.getNickname()); + } + return result; + } + + @Override + public boolean updatePassword(String user, HashedPassword password) { + user = user.toLowerCase(Locale.ROOT); + boolean result = source.updatePassword(user, password); + if (result) { + cachedAuths.refresh(user); + } + return result; + } + + @Override + public boolean updateSession(PlayerAuth auth) { + boolean result = source.updateSession(auth); + if (result) { + cachedAuths.refresh(auth.getNickname()); + } + return result; + } + + @Override + public boolean updateQuitLoc(final PlayerAuth auth) { + boolean result = source.updateQuitLoc(auth); + if (result) { + cachedAuths.refresh(auth.getNickname()); + } + return result; + } + + @Override + public Set getRecordsToPurge(long until) { + return source.getRecordsToPurge(until); + } + + @Override + public boolean removeAuth(String name) { + name = name.toLowerCase(Locale.ROOT); + boolean result = source.removeAuth(name); + if (result) { + cachedAuths.invalidate(name); + } + return result; + } + + @Override + public void closeConnection() { + executorService.shutdown(); + try { + executorService.awaitTermination(5, TimeUnit.SECONDS); + } catch (InterruptedException e) { + logger.logException("Could not close executor service:", e); + } + cachedAuths.invalidateAll(); + source.closeConnection(); + } + + @Override + public boolean updateEmail(final PlayerAuth auth) { + boolean result = source.updateEmail(auth); + if (result) { + cachedAuths.refresh(auth.getNickname()); + } + return result; + } + + @Override + public List getAllAuthsByIp(String ip) { + return source.getAllAuthsByIp(ip); + } + + @Override + public int countAuthsByEmail(String email) { + return source.countAuthsByEmail(email); + } + + @Override + public void purgeRecords(Collection banned) { + source.purgeRecords(banned); + cachedAuths.invalidateAll(banned); + } + + @Override + public DataSourceType getType() { + return source.getType(); + } + + @Override + public boolean isLogged(String user) { + return source.isLogged(user); + } + + @Override + public void setLogged(final String user) { + source.setLogged(user.toLowerCase(Locale.ROOT)); + } + + @Override + public void setUnlogged(final String user) { + source.setUnlogged(user.toLowerCase(Locale.ROOT)); + } + + @Override + public boolean hasSession(final String user) { + return source.hasSession(user); + } + + @Override + public void grantSession(final String user) { + source.grantSession(user); + } + + @Override + public void revokeSession(final String user) { + source.revokeSession(user); + } + + @Override + public void purgeLogged() { + source.purgeLogged(); + cachedAuths.invalidateAll(); + } + + @Override + public int getAccountsRegistered() { + return source.getAccountsRegistered(); + } + + @Override + public boolean updateRealName(String user, String realName) { + boolean result = source.updateRealName(user, realName); + if (result) { + cachedAuths.refresh(user); + } + return result; + } + + @Override + public DataSourceValue getEmail(String user) { + return cachedAuths.getUnchecked(user) + .map(auth -> DataSourceValueImpl.of(auth.getEmail())) + .orElse(DataSourceValueImpl.unknownRow()); + } + + @Override + public List getAllAuths() { + return source.getAllAuths(); + } + + @Override + public List getLoggedPlayersWithEmptyMail() { + return playerCache.getCache().values().stream() + .filter(auth -> Utils.isEmailEmpty(auth.getEmail())) + .map(PlayerAuth::getRealName) + .collect(Collectors.toList()); + } + + @Override + public List getRecentlyLoggedInPlayers() { + return source.getRecentlyLoggedInPlayers(); + } + + @Override + public boolean setTotpKey(String user, String totpKey) { + boolean result = source.setTotpKey(user, totpKey); + if (result) { + cachedAuths.refresh(user); + } + return result; + } + + @Override + public void invalidateCache(String playerName) { + cachedAuths.invalidate(playerName); + } + + @Override + public void refreshCache(String playerName) { + if (cachedAuths.getIfPresent(playerName) != null) { + cachedAuths.refresh(playerName); + } + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/Columns.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/Columns.java new file mode 100644 index 0000000000..a604d0a4d1 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/Columns.java @@ -0,0 +1,59 @@ +package fr.xephi.authme.datasource; + +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.DatabaseSettings; + +/** + * Database column names. + */ +// Justification: String is immutable and this class is used to easily access the configurable column names +@SuppressWarnings({"checkstyle:VisibilityModifier", "checkstyle:MemberName", "checkstyle:AbbreviationAsWordInName"}) +public final class Columns { + + public final String NAME; + public final String REAL_NAME; + public final String PASSWORD; + public final String SALT; + public final String TOTP_KEY; + public final String LAST_IP; + public final String LAST_LOGIN; + public final String GROUP; + public final String LASTLOC_X; + public final String LASTLOC_Y; + public final String LASTLOC_Z; + public final String LASTLOC_WORLD; + public final String LASTLOC_YAW; + public final String LASTLOC_PITCH; + public final String EMAIL; + public final String ID; + public final String IS_LOGGED; + public final String HAS_SESSION; + public final String REGISTRATION_DATE; + public final String REGISTRATION_IP; + public final String PLAYER_UUID; + + public Columns(Settings settings) { + NAME = settings.getProperty(DatabaseSettings.MYSQL_COL_NAME); + REAL_NAME = settings.getProperty(DatabaseSettings.MYSQL_COL_REALNAME); + PASSWORD = settings.getProperty(DatabaseSettings.MYSQL_COL_PASSWORD); + SALT = settings.getProperty(DatabaseSettings.MYSQL_COL_SALT); + TOTP_KEY = settings.getProperty(DatabaseSettings.MYSQL_COL_TOTP_KEY); + LAST_IP = settings.getProperty(DatabaseSettings.MYSQL_COL_LAST_IP); + LAST_LOGIN = settings.getProperty(DatabaseSettings.MYSQL_COL_LASTLOGIN); + GROUP = settings.getProperty(DatabaseSettings.MYSQL_COL_GROUP); + LASTLOC_X = settings.getProperty(DatabaseSettings.MYSQL_COL_LASTLOC_X); + LASTLOC_Y = settings.getProperty(DatabaseSettings.MYSQL_COL_LASTLOC_Y); + LASTLOC_Z = settings.getProperty(DatabaseSettings.MYSQL_COL_LASTLOC_Z); + LASTLOC_WORLD = settings.getProperty(DatabaseSettings.MYSQL_COL_LASTLOC_WORLD); + LASTLOC_YAW = settings.getProperty(DatabaseSettings.MYSQL_COL_LASTLOC_YAW); + LASTLOC_PITCH = settings.getProperty(DatabaseSettings.MYSQL_COL_LASTLOC_PITCH); + EMAIL = settings.getProperty(DatabaseSettings.MYSQL_COL_EMAIL); + ID = settings.getProperty(DatabaseSettings.MYSQL_COL_ID); + IS_LOGGED = settings.getProperty(DatabaseSettings.MYSQL_COL_ISLOGGED); + HAS_SESSION = settings.getProperty(DatabaseSettings.MYSQL_COL_HASSESSION); + REGISTRATION_DATE = settings.getProperty(DatabaseSettings.MYSQL_COL_REGISTER_DATE); + REGISTRATION_IP = settings.getProperty(DatabaseSettings.MYSQL_COL_REGISTER_IP); + PLAYER_UUID = settings.getProperty(DatabaseSettings.MYSQL_COL_PLAYER_UUID); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/DataSource.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/DataSource.java new file mode 100644 index 0000000000..3152eb17ed --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/DataSource.java @@ -0,0 +1,286 @@ +package fr.xephi.authme.datasource; + +import ch.jalu.datasourcecolumns.data.DataSourceValue; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.initialization.Reloadable; +import fr.xephi.authme.security.crypts.HashedPassword; + +import java.util.Collection; +import java.util.List; +import java.util.Set; + +/** + * Interface for manipulating {@link PlayerAuth} objects from a data source. + */ +public interface DataSource extends Reloadable { + + /** + * Return whether the data source is cached and needs to send plugin messaging updates. + * + * @return true if the data source is cached. + */ + default boolean isCached() { + return false; + } + + /** + * Return whether there is a record for the given username. + * + * @param user The username to look up + * @return True if there is a record, false otherwise + */ + boolean isAuthAvailable(String user); + + /** + * Return the hashed password of the player. + * + * @param user The user whose password should be retrieve + * @return The password hash of the player + */ + HashedPassword getPassword(String user); + + /** + * Retrieve the entire PlayerAuth object associated with the username. + * + * @param user The user to retrieve + * @return The PlayerAuth object for the given username + */ + PlayerAuth getAuth(String user); + + /** + * Save a new PlayerAuth object. + * + * @param auth The new PlayerAuth to persist + * @return True upon success, false upon failure + */ + boolean saveAuth(PlayerAuth auth); + + /** + * Update the session of a record (IP, last login, real name). + * + * @param auth The PlayerAuth object to update in the database + * @return True upon success, false upon failure + */ + boolean updateSession(PlayerAuth auth); + + /** + * Update the password of the given PlayerAuth object. + * + * @param auth The PlayerAuth whose password should be updated + * @return True upon success, false upon failure + */ + boolean updatePassword(PlayerAuth auth); + + /** + * Update the password of the given player. + * + * @param user The user whose password should be updated + * @param password The new password + * @return True upon success, false upon failure + */ + boolean updatePassword(String user, HashedPassword password); + + /** + * Get all records in the database whose last login was before the given time. + * + * @param until The minimum last login + * @return The account names selected to purge + */ + Set getRecordsToPurge(long until); + + /** + * Purge the given players from the database. + * + * @param toPurge The players to purge + */ + void purgeRecords(Collection toPurge); + + /** + * Remove a user record from the database. + * + * @param user The user to remove + * @return True upon success, false upon failure + */ + boolean removeAuth(String user); + + /** + * Update the quit location of a PlayerAuth. + * + * @param auth The entry whose quit location should be updated + * @return True upon success, false upon failure + */ + boolean updateQuitLoc(PlayerAuth auth); + + /** + * Return all usernames associated with the given IP address. + * + * @param ip The IP address to look up + * @return Usernames associated with the given IP address + */ + List getAllAuthsByIp(String ip); + + /** + * Return the number of accounts associated with the given email address. + * + * @param email The email address to look up + * @return Number of accounts using the given email address + */ + int countAuthsByEmail(String email); + + /** + * Update the email of the PlayerAuth in the data source. + * + * @param auth The PlayerAuth whose email should be updated + * @return True upon success, false upon failure + */ + boolean updateEmail(PlayerAuth auth); + + /** + * Close the underlying connections to the data source. + */ + void closeConnection(); + + /** + * Return the data source type. + * + * @return the data source type + */ + DataSourceType getType(); + + /** + * Query the datasource whether the player is logged in or not. + * + * @param user The name of the player to verify + * @return True if logged in, false otherwise + */ + boolean isLogged(String user); + + /** + * Set a player as logged in. + * + * @param user The name of the player to change + */ + void setLogged(String user); + + /** + * Set a player as unlogged (not logged in). + * + * @param user The name of the player to change + */ + void setUnlogged(String user); + + /** + * Query the datasource whether the player has an active session or not. + * Warning: this value won't expire, you have also to check the user's last login timestamp. + * + * @param user The name of the player to verify + * @return True if the user has a valid session, false otherwise + */ + boolean hasSession(String user); + + /** + * Mark the user's hasSession value to true. + * + * @param user The name of the player to change + */ + void grantSession(String user); + + /** + * Mark the user's hasSession value to false. + * + * @param user The name of the player to change + */ + void revokeSession(String user); + + /** + * Set all players who are marked as logged in as NOT logged in. + */ + void purgeLogged(); + + /** + * Return all players which are logged in and whose email is not set. + * + * @return logged in players with no email + */ + List getLoggedPlayersWithEmptyMail(); + + /** + * Return the number of registered accounts. + * + * @return Total number of accounts + */ + int getAccountsRegistered(); + + /** + * Update a player's real name (capitalization). + * + * @param user The name of the user (lowercase) + * @param realName The real name of the user (proper casing) + * @return True upon success, false upon failure + */ + boolean updateRealName(String user, String realName); + + /** + * Returns the email of the user. + * + * @param user the user to retrieve an email for + * @return the email saved for the user, or null if user or email is not present + */ + DataSourceValue getEmail(String user); + + /** + * Return all players of the database. + * + * @return List of all players + */ + List getAllAuths(); + + /** + * Returns the last ten players who have recently logged in (first ten players with highest last login date). + * + * @return the 10 last players who last logged in + */ + List getRecentlyLoggedInPlayers(); + + /** + * Sets the given TOTP key to the player's account. + * + * @param user the name of the player to modify + * @param totpKey the totp key to set + * @return True upon success, false upon failure + */ + boolean setTotpKey(String user, String totpKey); + + /** + * Removes the TOTP key if present of the given player's account. + * + * @param user the name of the player to modify + * @return True upon success, false upon failure + */ + default boolean removeTotpKey(String user) { + return setTotpKey(user, null); + } + + /** + * Reload the data source. + */ + @Override + void reload(); + + /** + * Invalidate any cached data related to the specified player name. + * + * @param playerName the player name + */ + default void invalidateCache(String playerName) { + } + + /** + * Refresh any cached data (if present) related to the specified player name. + * + * @param playerName the player name + */ + default void refreshCache(String playerName) { + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/DataSourceType.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/DataSourceType.java new file mode 100644 index 0000000000..f36faba7b1 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/DataSourceType.java @@ -0,0 +1,17 @@ +package fr.xephi.authme.datasource; + +/** + * DataSource type. + */ +public enum DataSourceType { + H2, + + MYSQL, + + MARIADB, + + POSTGRESQL, + + SQLITE + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/H2.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/H2.java new file mode 100644 index 0000000000..94b28f58a3 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/H2.java @@ -0,0 +1,422 @@ +package fr.xephi.authme.datasource; + +import com.google.common.annotations.VisibleForTesting; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.columnshandler.AuthMeColumnsHandler; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.DatabaseSettings; + +import java.io.File; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +import static fr.xephi.authme.datasource.SqlDataSourceUtils.getNullableLong; +import static fr.xephi.authme.datasource.SqlDataSourceUtils.logSqlException; + +/** + * H2 data source. + */ +@SuppressWarnings({"checkstyle:AbbreviationAsWordInName"}) // Justification: Class name cannot be changed anymore +public class H2 extends AbstractSqlDataSource { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(H2.class); + private final Settings settings; + private final File dataFolder; + private final String database; + private final String tableName; + private final Columns col; + private Connection con; + + /** + * Constructor for H2. + * + * @param settings The settings instance + * @param dataFolder The data folder + * @throws SQLException when initialization of a SQL datasource failed + */ + public H2(Settings settings, File dataFolder) throws SQLException { + this.settings = settings; + this.dataFolder = dataFolder; + this.database = settings.getProperty(DatabaseSettings.MYSQL_DATABASE); + this.tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE); + this.col = new Columns(settings); + + try { + this.connect(); + this.setup(); + } catch (Exception ex) { + logger.logException("Error during H2 initialization:", ex); + throw ex; + } + } + + @VisibleForTesting + H2(Settings settings, File dataFolder, Connection connection) { + this.settings = settings; + this.dataFolder = dataFolder; + this.database = settings.getProperty(DatabaseSettings.MYSQL_DATABASE); + this.tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE); + this.col = new Columns(settings); + this.con = connection; + this.columnsHandler = AuthMeColumnsHandler.createForH2(con, settings); + } + + /** + * Initializes the connection to the H2 database. + * + * @throws SQLException when an SQL error occurs while connecting + */ + protected void connect() throws SQLException { + try { + Class.forName("org.h2.Driver"); + } catch (ClassNotFoundException e) { + throw new IllegalStateException("Failed to load H2 JDBC class", e); + } + + logger.debug("H2 driver loaded"); + this.con = DriverManager.getConnection(this.getJdbcUrl(this.dataFolder.getAbsolutePath(), "", this.database)); + this.columnsHandler = AuthMeColumnsHandler.createForSqlite(con, settings); + } + + /** + * Creates the table if necessary, or adds any missing columns to the table. + * + * @throws SQLException when an SQL error occurs while initializing the database + */ + @VisibleForTesting + @SuppressWarnings("checkstyle:CyclomaticComplexity") + protected void setup() throws SQLException { + try (Statement st = con.createStatement()) { + // Note: cannot add unique fields later on in SQLite, so we add it on initialization + st.executeUpdate("CREATE TABLE IF NOT EXISTS " + tableName + " (" + + col.ID + " INTEGER AUTO_INCREMENT, " + + col.NAME + " VARCHAR(255) NOT NULL UNIQUE, " + + "CONSTRAINT table_const_prim PRIMARY KEY (" + col.ID + "));"); + + DatabaseMetaData md = con.getMetaData(); + + if (isColumnMissing(md, col.REAL_NAME)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN IF NOT EXISTS " + + col.REAL_NAME + " VARCHAR(255) NOT NULL DEFAULT 'Player';"); + } + + if (isColumnMissing(md, col.PASSWORD)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN IF NOT EXISTS " + col.PASSWORD + " VARCHAR(255) NOT NULL DEFAULT '';"); + } + + if (!col.SALT.isEmpty() && isColumnMissing(md, col.SALT)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN IF NOT EXISTS " + col.SALT + " VARCHAR(255);"); + } + + if (isColumnMissing(md, col.LAST_IP)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN IF NOT EXISTS " + col.LAST_IP + " VARCHAR(40);"); + } + + if (isColumnMissing(md, col.LAST_LOGIN)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN IF NOT EXISTS " + col.LAST_LOGIN + " BIGINT;"); + } + + if (isColumnMissing(md, col.REGISTRATION_IP)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN IF NOT EXISTS " + col.REGISTRATION_IP + " VARCHAR(40);"); + } + + if (isColumnMissing(md, col.REGISTRATION_DATE)) { + addRegistrationDateColumn(st); + } + + if (isColumnMissing(md, col.LASTLOC_X)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN IF NOT EXISTS " + col.LASTLOC_X + + " DOUBLE NOT NULL DEFAULT '0.0';"); + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN IF NOT EXISTS " + col.LASTLOC_Y + + " DOUBLE NOT NULL DEFAULT '0.0';"); + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN IF NOT EXISTS " + col.LASTLOC_Z + + " DOUBLE NOT NULL DEFAULT '0.0';"); + } + + if (isColumnMissing(md, col.LASTLOC_WORLD)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN IF NOT EXISTS " + col.LASTLOC_WORLD + " VARCHAR(255) NOT NULL DEFAULT 'world';"); + } + + if (isColumnMissing(md, col.LASTLOC_YAW)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN IF NOT EXISTS " + + col.LASTLOC_YAW + " FLOAT;"); + } + + if (isColumnMissing(md, col.LASTLOC_PITCH)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN IF NOT EXISTS " + + col.LASTLOC_PITCH + " FLOAT;"); + } + + if (isColumnMissing(md, col.EMAIL)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN IF NOT EXISTS " + col.EMAIL + " VARCHAR_IGNORECASE(255);"); + } + + if (isColumnMissing(md, col.IS_LOGGED)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN IF NOT EXISTS " + col.IS_LOGGED + " INT NOT NULL DEFAULT '0';"); + } + + if (isColumnMissing(md, col.HAS_SESSION)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN IF NOT EXISTS " + col.HAS_SESSION + " INT NOT NULL DEFAULT '0';"); + } + + if (isColumnMissing(md, col.TOTP_KEY)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN IF NOT EXISTS " + col.TOTP_KEY + " VARCHAR(32);"); + } + + if (!col.PLAYER_UUID.isEmpty() && isColumnMissing(md, col.PLAYER_UUID)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN IF NOT EXISTS " + col.PLAYER_UUID + " VARCHAR(36)"); + } + } + logger.info("H2 Setup finished"); + } + + /** + * Checks if a column is missing in the specified table. + * @param columnName the name of the column to look for + * @return true if the column is missing, false if it exists + * @throws SQLException if an error occurs while executing SQL or accessing the result set + * @deprecated Not work in H2, it always returns true + */ + @Deprecated + private boolean isColumnMissing(DatabaseMetaData metaData, String columnName) throws SQLException { + String query = "SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ? AND COLUMN_NAME = ?"; +// try (PreparedStatement preparedStatement = con.prepareStatement(query)) { +// preparedStatement.setString(1, tableName); +// preparedStatement.setString(2, columnName.toUpperCase()); +// try (ResultSet rs = preparedStatement.executeQuery()) { +// return !rs.next(); +// } +// } + return true; + } + + + @Override + public void reload() { + close(con); + try { + this.connect(); + this.setup(); + } catch (SQLException ex) { + logger.logException("Error while reloading H2:", ex); + } + } + + @Override + public PlayerAuth getAuth(String user) { + String sql = "SELECT * FROM " + tableName + " WHERE LOWER(" + col.NAME + ")=LOWER(?);"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setString(1, user); + try (ResultSet rs = pst.executeQuery()) { + if (rs.next()) { + return buildAuthFromResultSet(rs); + } + } + } catch (SQLException ex) { + logSqlException(ex); + } + return null; + } + + @Override + public Set getRecordsToPurge(long until) { + Set list = new HashSet<>(); + String select = "SELECT " + col.NAME + " FROM " + tableName + " WHERE MAX(" + + " COALESCE(" + col.LAST_LOGIN + ", 0)," + + " COALESCE(" + col.REGISTRATION_DATE + ", 0)" + + ") < ?;"; + try (PreparedStatement selectPst = con.prepareStatement(select)) { + selectPst.setLong(1, until); + try (ResultSet rs = selectPst.executeQuery()) { + while (rs.next()) { + list.add(rs.getString(col.NAME)); + } + } + } catch (SQLException ex) { + logSqlException(ex); + } + + return list; + } + + @Override + public void purgeRecords(Collection toPurge) { + String delete = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; + try (PreparedStatement deletePst = con.prepareStatement(delete)) { + for (String name : toPurge) { + deletePst.setString(1, name.toLowerCase(Locale.ROOT)); + deletePst.executeUpdate(); + } + } catch (SQLException ex) { + logSqlException(ex); + } + } + + @Override + public boolean removeAuth(String user) { + String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setString(1, user.toLowerCase(Locale.ROOT)); + pst.executeUpdate(); + return true; + } catch (SQLException ex) { + logSqlException(ex); + } + return false; + } + + @Override + public void closeConnection() { + try { + if (con != null && !con.isClosed()) { + con.close(); + } + } catch (SQLException ex) { + logSqlException(ex); + } + } + + @Override + public DataSourceType getType() { + return DataSourceType.H2; + } + + @Override + public List getAllAuths() { + List auths = new ArrayList<>(); + String sql = "SELECT * FROM " + tableName + ";"; + try (PreparedStatement pst = con.prepareStatement(sql); ResultSet rs = pst.executeQuery()) { + while (rs.next()) { + PlayerAuth auth = buildAuthFromResultSet(rs); + auths.add(auth); + } + } catch (SQLException ex) { + logSqlException(ex); + } + return auths; + } + + @Override + public List getLoggedPlayersWithEmptyMail() { + List players = new ArrayList<>(); + String sql = "SELECT " + col.REAL_NAME + " FROM " + tableName + " WHERE " + col.IS_LOGGED + " = 1" + + " AND (" + col.EMAIL + " = 'your@email.com' OR " + col.EMAIL + " IS NULL);"; + try (Statement st = con.createStatement(); ResultSet rs = st.executeQuery(sql)) { + while (rs.next()) { + players.add(rs.getString(1)); + } + } catch (SQLException ex) { + logSqlException(ex); + } + return players; + } + + @Override + public List getRecentlyLoggedInPlayers() { + List players = new ArrayList<>(); + String sql = "SELECT * FROM " + tableName + " ORDER BY " + col.LAST_LOGIN + " DESC LIMIT 10;"; + try (Statement st = con.createStatement(); ResultSet rs = st.executeQuery(sql)) { + while (rs.next()) { + players.add(buildAuthFromResultSet(rs)); + } + } catch (SQLException e) { + logSqlException(e); + } + return players; + } + + + @Override + public boolean setTotpKey(String user, String totpKey) { + String sql = "UPDATE " + tableName + " SET " + col.TOTP_KEY + " = ? WHERE " + col.NAME + " = ?"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setString(1, totpKey); + pst.setString(2, user.toLowerCase(Locale.ROOT)); + pst.executeUpdate(); + return true; + } catch (SQLException e) { + logSqlException(e); + } + return false; + } + + private PlayerAuth buildAuthFromResultSet(ResultSet row) throws SQLException { + String salt = !col.SALT.isEmpty() ? row.getString(col.SALT) : null; + + return PlayerAuth.builder() + .name(row.getString(col.NAME)) + .email(row.getString(col.EMAIL)) + .realName(row.getString(col.REAL_NAME)) + .password(row.getString(col.PASSWORD), salt) + .totpKey(row.getString(col.TOTP_KEY)) + .lastLogin(getNullableLong(row, col.LAST_LOGIN)) + .lastIp(row.getString(col.LAST_IP)) + .registrationDate(row.getLong(col.REGISTRATION_DATE)) + .registrationIp(row.getString(col.REGISTRATION_IP)) + .locX(row.getDouble(col.LASTLOC_X)) + .locY(row.getDouble(col.LASTLOC_Y)) + .locZ(row.getDouble(col.LASTLOC_Z)) + .locWorld(row.getString(col.LASTLOC_WORLD)) + .locYaw(row.getFloat(col.LASTLOC_YAW)) + .locPitch(row.getFloat(col.LASTLOC_PITCH)) + .build(); + } + + /** + * Creates the column for registration date and sets all entries to the current timestamp. + * We do so in order to avoid issues with purging, where entries with 0 / NULL might get + * purged immediately on startup otherwise. + * + * @param st Statement object to the database + */ + private void addRegistrationDateColumn(Statement st) throws SQLException { + int affect = st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN IF NOT EXISTS " + col.REGISTRATION_DATE + " BIGINT NOT NULL DEFAULT '0';"); + if (affect > 0) { + long currentTimestamp = System.currentTimeMillis(); + int updatedRows = st.executeUpdate(String.format("UPDATE %s SET %s = %d;", + tableName, col.REGISTRATION_DATE, currentTimestamp)); + logger.info("Created column '" + col.REGISTRATION_DATE + "' and set the current timestamp, " + + currentTimestamp + ", to all " + updatedRows + " rows"); + } + } + + @Override + String getJdbcUrl(String dataPath, String ignored, String database) { + return "jdbc:h2:" + dataPath + File.separator + database; + } + + private static void close(Connection con) { + if (con != null) { + try { + con.close(); + } catch (SQLException ex) { + logSqlException(ex); + } + } + } +} + diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/MariaDB.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/MariaDB.java new file mode 100644 index 0000000000..8fa35595f9 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/MariaDB.java @@ -0,0 +1,27 @@ +package fr.xephi.authme.datasource; + +import fr.xephi.authme.datasource.mysqlextensions.MySqlExtensionsFactory; +import fr.xephi.authme.settings.Settings; + +import java.sql.SQLException; + +public class MariaDB extends MySQL { + public MariaDB(Settings settings, MySqlExtensionsFactory extensionsFactory) throws SQLException { + super(settings, extensionsFactory); + } + + @Override + String getJdbcUrl(String host, String port, String database) { + return "jdbc:mariadb://" + host + ":" + port + "/" + database; + } + + @Override + protected String getDriverClassName() { + return "org.mariadb.jdbc.Driver"; + } + + @Override + public DataSourceType getType() { + return DataSourceType.MARIADB; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/MySQL.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/MySQL.java new file mode 100644 index 0000000000..9a1cf216db --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/MySQL.java @@ -0,0 +1,524 @@ +package fr.xephi.authme.datasource; + +import com.google.common.annotations.VisibleForTesting; +import com.zaxxer.hikari.HikariDataSource; +import com.zaxxer.hikari.pool.HikariPool.PoolInitializationException; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.columnshandler.AuthMeColumnsHandler; +import fr.xephi.authme.datasource.mysqlextensions.MySqlExtension; +import fr.xephi.authme.datasource.mysqlextensions.MySqlExtensionsFactory; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.DatabaseSettings; +import fr.xephi.authme.settings.properties.HooksSettings; +import fr.xephi.authme.util.UuidUtils; + +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; +import java.util.UUID; + +import static fr.xephi.authme.datasource.SqlDataSourceUtils.getNullableLong; +import static fr.xephi.authme.datasource.SqlDataSourceUtils.logSqlException; + +/** + * MySQL data source. + */ +@SuppressWarnings({"checkstyle:AbbreviationAsWordInName"}) // Justification: Class name cannot be changed anymore +public class MySQL extends AbstractSqlDataSource { + private final ConsoleLogger logger = ConsoleLoggerFactory.get(MySQL.class); + + private boolean useSsl; + private boolean serverCertificateVerification; + private boolean allowPublicKeyRetrieval; + private String mariaDbSslMode; + private String host; + private String port; + private String username; + private String password; + private String database; + private String tableName; + private int poolSize; + private int maxLifetime; + private List columnOthers; + private Columns col; + private MySqlExtension sqlExtension; + private HikariDataSource ds; + + public MySQL(Settings settings, MySqlExtensionsFactory extensionsFactory) throws SQLException { + setParameters(settings, extensionsFactory); + + // Set the connection arguments (and check if connection is ok) + try { + this.setConnectionArguments(); + } catch (RuntimeException e) { + if (e instanceof IllegalArgumentException) { + logger.warning("Invalid database arguments! Please check your configuration!"); + logger.warning("If this error persists, please report it to the developer!"); + } + if (e instanceof PoolInitializationException) { + logger.warning("Can't initialize database connection! Please check your configuration!"); + logger.warning("If this error persists, please report it to the developer!"); + } + logger.warning("Can't use the Hikari Connection Pool! Please, report this error to the developer!"); + throw e; + } + + // Initialize the database + try { + checkTablesAndColumns(); + } catch (SQLException e) { + closeConnection(); + logger.logException("Can't initialize the MySQL database:", e); + logger.warning("Please check your database settings in the config.yml file!"); + throw e; + } + } + + @VisibleForTesting + MySQL(Settings settings, HikariDataSource hikariDataSource, MySqlExtensionsFactory extensionsFactory) { + ds = hikariDataSource; + setParameters(settings, extensionsFactory); + } + + /** + * Returns the path of the Driver class to use when connecting to the database. + * + * @return the dotted path of the SQL driver class to be used + */ + protected String getDriverClassName() { + return "com.mysql.cj.jdbc.Driver"; + } + + /** + * Retrieves various settings. + * + * @param settings the settings to read properties from + * @param extensionsFactory factory to create the MySQL extension + */ + private void setParameters(Settings settings, MySqlExtensionsFactory extensionsFactory) { + this.host = settings.getProperty(DatabaseSettings.MYSQL_HOST); + this.port = settings.getProperty(DatabaseSettings.MYSQL_PORT); + this.username = settings.getProperty(DatabaseSettings.MYSQL_USERNAME); + this.password = settings.getProperty(DatabaseSettings.MYSQL_PASSWORD); + this.database = settings.getProperty(DatabaseSettings.MYSQL_DATABASE); + this.tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE); + this.columnOthers = settings.getProperty(HooksSettings.MYSQL_OTHER_USERNAME_COLS); + this.col = new Columns(settings); + this.columnsHandler = AuthMeColumnsHandler.createForMySql(this::getConnection, settings); + this.sqlExtension = extensionsFactory.buildExtension(col); + this.poolSize = settings.getProperty(DatabaseSettings.MYSQL_POOL_SIZE); + this.maxLifetime = settings.getProperty(DatabaseSettings.MYSQL_CONNECTION_MAX_LIFETIME); + this.useSsl = settings.getProperty(DatabaseSettings.MYSQL_USE_SSL); + this.serverCertificateVerification = settings.getProperty(DatabaseSettings.MYSQL_CHECK_SERVER_CERTIFICATE); + this.allowPublicKeyRetrieval = settings.getProperty(DatabaseSettings.MYSQL_ALLOW_PUBLIC_KEY_RETRIEVAL); + this.mariaDbSslMode = settings.getProperty(DatabaseSettings.MARIADB_SSL_MODE); + } + + /** + * Sets up the connection arguments to the database. + */ + private void setConnectionArguments() { + ds = new HikariDataSource(); + ds.setPoolName("AuthMeMYSQLPool"); + + // Pool Settings + ds.setMaximumPoolSize(poolSize); + ds.setMaxLifetime(maxLifetime * 1000L); + + // Database URL + ds.setJdbcUrl(this.getJdbcUrl(this.host, this.port, this.database)); + + // Auth + ds.setUsername(this.username); + ds.setPassword(this.password); + + // Driver + ds.setDriverClassName(this.getDriverClassName()); + + // Request mysql over SSL + if (this instanceof MariaDB) { + ds.addDataSourceProperty("sslMode", mariaDbSslMode); + } else { + ds.addDataSourceProperty("useSSL", String.valueOf(useSsl)); + + // Disabling server certificate verification on need + if (!serverCertificateVerification) { + ds.addDataSourceProperty("verifyServerCertificate", String.valueOf(false)); + } + } + + + // Disabling server certificate verification on need + if (allowPublicKeyRetrieval) { + ds.addDataSourceProperty("allowPublicKeyRetrieval", String.valueOf(true)); + } + + // Encoding + ds.addDataSourceProperty("characterEncoding", "utf8"); + ds.addDataSourceProperty("encoding", "UTF-8"); + ds.addDataSourceProperty("useUnicode", "true"); + + // Random stuff + ds.addDataSourceProperty("rewriteBatchedStatements", "true"); + ds.addDataSourceProperty("jdbcCompliantTruncation", "false"); + + // Caching + ds.addDataSourceProperty("cachePrepStmts", "true"); + ds.addDataSourceProperty("prepStmtCacheSize", "275"); + ds.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); + + logger.info("Connection arguments loaded, Hikari ConnectionPool ready!"); + } + + @Override + public void reload() { + if (ds != null) { + ds.close(); + } + setConnectionArguments(); + logger.info("Hikari ConnectionPool arguments reloaded!"); + } + + private Connection getConnection() throws SQLException { + return ds.getConnection(); + } + + /** + * Creates the table or any of its required columns if they don't exist. + */ + @SuppressWarnings({"checkstyle:CyclomaticComplexity", "checkstyle:JavaNCSS"}) + private void checkTablesAndColumns() throws SQLException { + try (Connection con = getConnection(); Statement st = con.createStatement()) { + // Create table with ID column if it doesn't exist + String sql = "CREATE TABLE IF NOT EXISTS " + tableName + " (" + + col.ID + " MEDIUMINT(8) UNSIGNED AUTO_INCREMENT," + + "PRIMARY KEY (" + col.ID + ")" + + ") CHARACTER SET = utf8;"; + st.executeUpdate(sql); + + DatabaseMetaData md = con.getMetaData(); + if (isColumnMissing(md, col.NAME)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.NAME + " VARCHAR(255) NOT NULL UNIQUE AFTER " + col.ID + ";"); + } + + if (isColumnMissing(md, col.REAL_NAME)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.REAL_NAME + " VARCHAR(255) NOT NULL AFTER " + col.NAME + ";"); + } + + if (isColumnMissing(md, col.PASSWORD)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.PASSWORD + " VARCHAR(255) CHARACTER SET ascii COLLATE ascii_bin NOT NULL;"); + } + + if (!col.SALT.isEmpty() && isColumnMissing(md, col.SALT)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + col.SALT + " VARCHAR(255);"); + } + + if (isColumnMissing(md, col.LAST_IP)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.LAST_IP + " VARCHAR(40) CHARACTER SET ascii COLLATE ascii_bin;"); + } else { + MySqlMigrater.migrateLastIpColumn(st, md, tableName, col); + } + + if (isColumnMissing(md, col.LAST_LOGIN)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.LAST_LOGIN + " BIGINT;"); + } else { + MySqlMigrater.migrateLastLoginColumn(st, md, tableName, col); + } + + if (isColumnMissing(md, col.REGISTRATION_DATE)) { + MySqlMigrater.addRegistrationDateColumn(st, tableName, col); + } + + if (isColumnMissing(md, col.REGISTRATION_IP)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.REGISTRATION_IP + " VARCHAR(40) CHARACTER SET ascii COLLATE ascii_bin;"); + } + + if (isColumnMissing(md, col.LASTLOC_X)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.LASTLOC_X + " DOUBLE NOT NULL DEFAULT '0.0' AFTER " + col.LAST_LOGIN + " , ADD " + + col.LASTLOC_Y + " DOUBLE NOT NULL DEFAULT '0.0' AFTER " + col.LASTLOC_X + " , ADD " + + col.LASTLOC_Z + " DOUBLE NOT NULL DEFAULT '0.0' AFTER " + col.LASTLOC_Y); + } else { + st.executeUpdate("ALTER TABLE " + tableName + " MODIFY " + + col.LASTLOC_X + " DOUBLE NOT NULL DEFAULT '0.0', MODIFY " + + col.LASTLOC_Y + " DOUBLE NOT NULL DEFAULT '0.0', MODIFY " + + col.LASTLOC_Z + " DOUBLE NOT NULL DEFAULT '0.0';"); + } + + if (isColumnMissing(md, col.LASTLOC_WORLD)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.LASTLOC_WORLD + " VARCHAR(255) NOT NULL DEFAULT 'world' AFTER " + col.LASTLOC_Z); + } + + if (isColumnMissing(md, col.LASTLOC_YAW)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.LASTLOC_YAW + " FLOAT;"); + } + + if (isColumnMissing(md, col.LASTLOC_PITCH)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.LASTLOC_PITCH + " FLOAT;"); + } + + if (isColumnMissing(md, col.EMAIL)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.EMAIL + " VARCHAR(255);"); + } + + if (isColumnMissing(md, col.IS_LOGGED)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.IS_LOGGED + " SMALLINT NOT NULL DEFAULT '0' AFTER " + col.EMAIL); + } + + if (isColumnMissing(md, col.HAS_SESSION)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.HAS_SESSION + " SMALLINT NOT NULL DEFAULT '0' AFTER " + col.IS_LOGGED); + } + + if (isColumnMissing(md, col.TOTP_KEY)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.TOTP_KEY + " VARCHAR(32);"); + } else if (SqlDataSourceUtils.getColumnSize(md, tableName, col.TOTP_KEY) != 32) { + st.executeUpdate("ALTER TABLE " + tableName + + " MODIFY " + col.TOTP_KEY + " VARCHAR(32);"); + } + + if (!col.PLAYER_UUID.isEmpty() && isColumnMissing(md, col.PLAYER_UUID)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.PLAYER_UUID + " VARCHAR(36)"); + } + } + logger.info("MySQL setup finished"); + } + + private boolean isColumnMissing(DatabaseMetaData metaData, String columnName) throws SQLException { + try (ResultSet rs = metaData.getColumns(database, null, tableName, columnName)) { + return !rs.next(); + } + } + + @Override + public PlayerAuth getAuth(String user) { + String sql = "SELECT * FROM " + tableName + " WHERE " + col.NAME + "=?;"; + PlayerAuth auth; + try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { + pst.setString(1, user.toLowerCase(Locale.ROOT)); + try (ResultSet rs = pst.executeQuery()) { + if (rs.next()) { + int id = rs.getInt(col.ID); + auth = buildAuthFromResultSet(rs); + sqlExtension.extendAuth(auth, id, con); + return auth; + } + } + } catch (SQLException ex) { + logSqlException(ex); + } + return null; + } + + @Override + public boolean saveAuth(PlayerAuth auth) { + super.saveAuth(auth); + + try (Connection con = getConnection()) { + if (!columnOthers.isEmpty()) { + for (String column : columnOthers) { + try (PreparedStatement pst = con.prepareStatement( + "UPDATE " + tableName + " SET " + column + "=? WHERE " + col.NAME + "=?;")) { + pst.setString(1, auth.getRealName()); + pst.setString(2, auth.getNickname()); + pst.executeUpdate(); + } + } + } + + sqlExtension.saveAuth(auth, con); + return true; + } catch (SQLException ex) { + logSqlException(ex); + } + return false; + } + + @Override + String getJdbcUrl(String host, String port, String database) { + return "jdbc:mysql://" + host + ":" + port + "/" + database; + } + + @Override + public Set getRecordsToPurge(long until) { + Set list = new HashSet<>(); + String select = "SELECT " + col.NAME + " FROM " + tableName + " WHERE GREATEST(" + + " COALESCE(" + col.LAST_LOGIN + ", 0)," + + " COALESCE(" + col.REGISTRATION_DATE + ", 0)" + + ") < ?;"; + try (Connection con = getConnection(); + PreparedStatement selectPst = con.prepareStatement(select)) { + selectPst.setLong(1, until); + try (ResultSet rs = selectPst.executeQuery()) { + while (rs.next()) { + list.add(rs.getString(col.NAME)); + } + } + } catch (SQLException ex) { + logSqlException(ex); + } + + return list; + } + + @Override + public boolean removeAuth(String user) { + user = user.toLowerCase(Locale.ROOT); + String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; + try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { + sqlExtension.removeAuth(user, con); + pst.setString(1, user.toLowerCase(Locale.ROOT)); + pst.executeUpdate(); + return true; + } catch (SQLException ex) { + logSqlException(ex); + } + return false; + } + + @Override + public void closeConnection() { + if (ds != null && !ds.isClosed()) { + ds.close(); + } + } + + @Override + public void purgeRecords(Collection toPurge) { + String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; + try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { + for (String name : toPurge) { + pst.setString(1, name.toLowerCase(Locale.ROOT)); + pst.executeUpdate(); + } + } catch (SQLException ex) { + logSqlException(ex); + } + } + + @Override + public DataSourceType getType() { + return DataSourceType.MYSQL; + } + + @Override + public List getAllAuths() { + List auths = new ArrayList<>(); + try (Connection con = getConnection(); Statement st = con.createStatement()) { + try (ResultSet rs = st.executeQuery("SELECT * FROM " + tableName)) { + while (rs.next()) { + PlayerAuth auth = buildAuthFromResultSet(rs); + sqlExtension.extendAuth(auth, rs.getInt(col.ID), con); + auths.add(auth); + } + } + } catch (SQLException ex) { + logSqlException(ex); + } + return auths; + } + + @Override + public List getLoggedPlayersWithEmptyMail() { + List players = new ArrayList<>(); + String sql = "SELECT " + col.REAL_NAME + " FROM " + tableName + " WHERE " + col.IS_LOGGED + " = 1" + + " AND (" + col.EMAIL + " = 'your@email.com' OR " + col.EMAIL + " IS NULL);"; + try (Connection con = getConnection(); + Statement st = con.createStatement(); + ResultSet rs = st.executeQuery(sql)) { + while (rs.next()) { + players.add(rs.getString(1)); + } + } catch (SQLException ex) { + logSqlException(ex); + } + return players; + } + + @Override + public List getRecentlyLoggedInPlayers() { + List players = new ArrayList<>(); + String sql = "SELECT * FROM " + tableName + " ORDER BY " + col.LAST_LOGIN + " DESC LIMIT 10;"; + try (Connection con = getConnection(); + Statement st = con.createStatement(); + ResultSet rs = st.executeQuery(sql)) { + while (rs.next()) { + players.add(buildAuthFromResultSet(rs)); + } + } catch (SQLException e) { + logSqlException(e); + } + return players; + } + + @Override + public boolean setTotpKey(String user, String totpKey) { + String sql = "UPDATE " + tableName + " SET " + col.TOTP_KEY + " = ? WHERE " + col.NAME + " = ?"; + try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { + pst.setString(1, totpKey); + pst.setString(2, user.toLowerCase(Locale.ROOT)); + pst.executeUpdate(); + return true; + } catch (SQLException e) { + logSqlException(e); + } + return false; + } + + /** + * Creates a {@link PlayerAuth} object with the data from the provided result set. + * + * @param row the result set to read from + * @return generated player auth object with the data from the result set + * @throws SQLException . + */ + private PlayerAuth buildAuthFromResultSet(ResultSet row) throws SQLException { + String salt = col.SALT.isEmpty() ? null : row.getString(col.SALT); + int group = col.GROUP.isEmpty() ? -1 : row.getInt(col.GROUP); + UUID uuid = col.PLAYER_UUID.isEmpty() + ? null : UuidUtils.parseUuidSafely(row.getString(col.PLAYER_UUID)); + return PlayerAuth.builder() + .name(row.getString(col.NAME)) + .realName(row.getString(col.REAL_NAME)) + .password(row.getString(col.PASSWORD), salt) + .totpKey(row.getString(col.TOTP_KEY)) + .lastLogin(getNullableLong(row, col.LAST_LOGIN)) + .lastIp(row.getString(col.LAST_IP)) + .email(row.getString(col.EMAIL)) + .registrationDate(row.getLong(col.REGISTRATION_DATE)) + .registrationIp(row.getString(col.REGISTRATION_IP)) + .groupId(group) + .locWorld(row.getString(col.LASTLOC_WORLD)) + .locX(row.getDouble(col.LASTLOC_X)) + .locY(row.getDouble(col.LASTLOC_Y)) + .locZ(row.getDouble(col.LASTLOC_Z)) + .locYaw(row.getFloat(col.LASTLOC_YAW)) + .locPitch(row.getFloat(col.LASTLOC_PITCH)) + .uuid(uuid) + .build(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/MySqlMigrater.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/MySqlMigrater.java new file mode 100644 index 0000000000..fec564d5a3 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/MySqlMigrater.java @@ -0,0 +1,116 @@ +package fr.xephi.authme.datasource; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; + +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Types; + +/** + * Performs migrations on the MySQL data source if necessary. + */ +final class MySqlMigrater { + + private static ConsoleLogger logger = ConsoleLoggerFactory.get(MySqlMigrater.class); + + private MySqlMigrater() { + } + + /** + * Changes the last IP column to be nullable if it has a NOT NULL constraint without a default value. + * Background: Before 5.2, the last IP column was initialized to be {@code NOT NULL} without a default. + * With the introduction of a registration IP column we no longer want to set the last IP column on registration. + * + * @param st Statement object to the database + * @param metaData column metadata for the table + * @param tableName the MySQL table's name + * @param col the column names configuration + */ + static void migrateLastIpColumn(Statement st, DatabaseMetaData metaData, + String tableName, Columns col) throws SQLException { + final boolean isNotNullWithoutDefault = SqlDataSourceUtils.isNotNullColumn(metaData, tableName, col.LAST_IP) + && SqlDataSourceUtils.getColumnDefaultValue(metaData, tableName, col.LAST_IP) == null; + + if (isNotNullWithoutDefault) { + String sql = String.format("ALTER TABLE %s MODIFY %s VARCHAR(40) CHARACTER SET ascii COLLATE ascii_bin", + tableName, col.LAST_IP); + st.execute(sql); + logger.info("Changed last login column to allow NULL values. Please verify the registration feature " + + "if you are hooking into a forum."); + } + } + + /** + * Checks if the last login column has a type that needs to be migrated. + * + * @param st Statement object to the database + * @param metaData column metadata for the table + * @param tableName the MySQL table's name + * @param col the column names configuration + */ + static void migrateLastLoginColumn(Statement st, DatabaseMetaData metaData, + String tableName, Columns col) throws SQLException { + final int columnType; + try (ResultSet rs = metaData.getColumns(null, null, tableName, col.LAST_LOGIN)) { + if (!rs.next()) { + logger.warning("Could not get LAST_LOGIN meta data. This should never happen!"); + return; + } + columnType = rs.getInt("DATA_TYPE"); + } + + if (columnType == Types.INTEGER) { + migrateLastLoginColumnFromInt(st, tableName, col); + } + } + + /** + * Performs conversion of lastlogin column from int to bigint. + * + * @param st Statement object to the database + * @param tableName the table name + * @param col the column names configuration + * @see + * #887: Migrate lastlogin column from int32 to bigint + */ + private static void migrateLastLoginColumnFromInt(Statement st, String tableName, Columns col) throws SQLException { + // Change from int to bigint + logger.info("Migrating lastlogin column from int to bigint"); + String sql = String.format("ALTER TABLE %s MODIFY %s BIGINT;", tableName, col.LAST_LOGIN); + st.execute(sql); + + // Migrate timestamps in seconds format to milliseconds format if they are plausible + int rangeStart = 1262304000; // timestamp for 2010-01-01 + int rangeEnd = 1514678400; // timestamp for 2017-12-31 + sql = String.format("UPDATE %s SET %s = %s * 1000 WHERE %s > %d AND %s < %d;", + tableName, col.LAST_LOGIN, col.LAST_LOGIN, col.LAST_LOGIN, rangeStart, col.LAST_LOGIN, rangeEnd); + int changedRows = st.executeUpdate(sql); + + logger.warning("You may have entries with invalid timestamps. Please check your data " + + "before purging. " + changedRows + " rows were migrated from seconds to milliseconds."); + } + + /** + * Creates the column for registration date and sets all entries to the current timestamp. + * We do so in order to avoid issues with purging, where entries with 0 / NULL might get + * purged immediately on startup otherwise. + * + * @param st Statement object to the database + * @param tableName the table name + * @param col the column names configuration + */ + static void addRegistrationDateColumn(Statement st, String tableName, Columns col) throws SQLException { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.REGISTRATION_DATE + " BIGINT NOT NULL DEFAULT 0;"); + + // Use the timestamp from Java to avoid timezone issues in case JVM and database are out of sync + long currentTimestamp = System.currentTimeMillis(); + int updatedRows = st.executeUpdate(String.format("UPDATE %s SET %s = %d;", + tableName, col.REGISTRATION_DATE, currentTimestamp)); + logger.info("Created column '" + col.REGISTRATION_DATE + "' and set the current timestamp, " + + currentTimestamp + ", to all " + updatedRows + " rows"); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/PostgreSqlDataSource.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/PostgreSqlDataSource.java new file mode 100644 index 0000000000..cc308934b4 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/PostgreSqlDataSource.java @@ -0,0 +1,472 @@ +package fr.xephi.authme.datasource; + +import com.google.common.annotations.VisibleForTesting; +import com.zaxxer.hikari.HikariDataSource; +import com.zaxxer.hikari.pool.HikariPool.PoolInitializationException; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.columnshandler.AuthMeColumnsHandler; +import fr.xephi.authme.datasource.mysqlextensions.MySqlExtension; +import fr.xephi.authme.datasource.mysqlextensions.MySqlExtensionsFactory; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.DatabaseSettings; +import fr.xephi.authme.settings.properties.HooksSettings; + +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +import static fr.xephi.authme.datasource.SqlDataSourceUtils.getNullableLong; +import static fr.xephi.authme.datasource.SqlDataSourceUtils.logSqlException; + +/** + * PostgreSQL data source. + */ +public class PostgreSqlDataSource extends AbstractSqlDataSource { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(PostgreSqlDataSource.class); + + private String host; + private String port; + private String username; + private String password; + private String database; + private String tableName; + private int poolSize; + private int maxLifetime; + private List columnOthers; + private Columns col; + private MySqlExtension sqlExtension; + private HikariDataSource ds; + + public PostgreSqlDataSource(Settings settings, MySqlExtensionsFactory extensionsFactory) throws SQLException { + setParameters(settings, extensionsFactory); + + // Set the connection arguments (and check if connection is ok) + try { + this.setConnectionArguments(); + } catch (RuntimeException e) { + if (e instanceof IllegalArgumentException) { + logger.warning("Invalid database arguments! Please check your configuration!"); + logger.warning("If this error persists, please report it to the developer!"); + } + if (e instanceof PoolInitializationException) { + logger.warning("Can't initialize database connection! Please check your configuration!"); + logger.warning("If this error persists, please report it to the developer!"); + } + logger.warning("Can't use the Hikari Connection Pool! Please, report this error to the developer!"); + throw e; + } + + // Initialize the database + try { + checkTablesAndColumns(); + } catch (SQLException e) { + closeConnection(); + logger.logException("Can't initialize the PostgreSQL database:", e); + logger.warning("Please check your database settings in the config.yml file!"); + throw e; + } + } + + @VisibleForTesting + PostgreSqlDataSource(Settings settings, HikariDataSource hikariDataSource, + MySqlExtensionsFactory extensionsFactory) { + ds = hikariDataSource; + setParameters(settings, extensionsFactory); + } + + /** + * Retrieves various settings. + * + * @param settings the settings to read properties from + * @param extensionsFactory factory to create the MySQL extension + */ + private void setParameters(Settings settings, MySqlExtensionsFactory extensionsFactory) { + this.host = settings.getProperty(DatabaseSettings.MYSQL_HOST); + this.port = settings.getProperty(DatabaseSettings.MYSQL_PORT); + this.username = settings.getProperty(DatabaseSettings.MYSQL_USERNAME); + this.password = settings.getProperty(DatabaseSettings.MYSQL_PASSWORD); + this.database = settings.getProperty(DatabaseSettings.MYSQL_DATABASE); + this.tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE); + this.columnOthers = settings.getProperty(HooksSettings.MYSQL_OTHER_USERNAME_COLS); + this.col = new Columns(settings); + this.columnsHandler = AuthMeColumnsHandler.createForMySql(this::getConnection, settings); + this.sqlExtension = extensionsFactory.buildExtension(col); + this.poolSize = settings.getProperty(DatabaseSettings.MYSQL_POOL_SIZE); + this.maxLifetime = settings.getProperty(DatabaseSettings.MYSQL_CONNECTION_MAX_LIFETIME); + } + + /** + * Sets up the connection arguments to the database. + */ + private void setConnectionArguments() { + ds = new HikariDataSource(); + ds.setPoolName("AuthMePostgreSQLPool"); + + // Pool Settings + ds.setMaximumPoolSize(poolSize); + ds.setMaxLifetime(maxLifetime * 1000); + + // Database URL + ds.setDriverClassName("org.postgresql.Driver"); + ds.setJdbcUrl(this.getJdbcUrl(this.host, this.port, this.database)); + + // Auth + ds.setUsername(this.username); + ds.setPassword(this.password); + + // Random stuff + ds.addDataSourceProperty("reWriteBatchedInserts", "true"); + + // Caching + ds.addDataSourceProperty("cachePrepStmts", "true"); + ds.addDataSourceProperty("preparedStatementCacheQueries", "275"); + + logger.info("Connection arguments loaded, Hikari ConnectionPool ready!"); + } + + @Override + public void reload() { + if (ds != null) { + ds.close(); + } + setConnectionArguments(); + logger.info("Hikari ConnectionPool arguments reloaded!"); + } + + private Connection getConnection() throws SQLException { + return ds.getConnection(); + } + + /** + * Creates the table or any of its required columns if they don't exist. + */ + private void checkTablesAndColumns() throws SQLException { + try (Connection con = getConnection(); Statement st = con.createStatement()) { + // Create table with ID column if it doesn't exist + String sql = "CREATE TABLE IF NOT EXISTS " + tableName + " (" + + col.ID + " BIGSERIAL," + + "PRIMARY KEY (" + col.ID + ")" + + ");"; + st.executeUpdate(sql); + + DatabaseMetaData md = con.getMetaData(); + if (isColumnMissing(md, col.NAME)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.NAME + " VARCHAR(255) NOT NULL UNIQUE;"); + } + + if (isColumnMissing(md, col.REAL_NAME)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.REAL_NAME + " VARCHAR(255) NOT NULL;"); + } + + if (isColumnMissing(md, col.PASSWORD)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.PASSWORD + " VARCHAR(255) NOT NULL;"); + } + + if (!col.SALT.isEmpty() && isColumnMissing(md, col.SALT)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + col.SALT + " VARCHAR(255);"); + } + + if (isColumnMissing(md, col.LAST_IP)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.LAST_IP + " VARCHAR(40);"); + } else { + MySqlMigrater.migrateLastIpColumn(st, md, tableName, col); + } + + if (isColumnMissing(md, col.LAST_LOGIN)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.LAST_LOGIN + " BIGINT;"); + } else { + MySqlMigrater.migrateLastLoginColumn(st, md, tableName, col); + } + + if (isColumnMissing(md, col.REGISTRATION_DATE)) { + MySqlMigrater.addRegistrationDateColumn(st, tableName, col); + } + + if (isColumnMissing(md, col.REGISTRATION_IP)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.REGISTRATION_IP + " VARCHAR(40);"); + } + + if (isColumnMissing(md, col.LASTLOC_X)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.LASTLOC_X + " DOUBLE PRECISION NOT NULL DEFAULT '0.0' , ADD " + + col.LASTLOC_Y + " DOUBLE PRECISION NOT NULL DEFAULT '0.0' , ADD " + + col.LASTLOC_Z + " DOUBLE PRECISION NOT NULL DEFAULT '0.0';"); + } + + if (isColumnMissing(md, col.LASTLOC_WORLD)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.LASTLOC_WORLD + " VARCHAR(255) NOT NULL DEFAULT 'world';"); + } + + if (isColumnMissing(md, col.LASTLOC_YAW)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.LASTLOC_YAW + " FLOAT;"); + } + + if (isColumnMissing(md, col.LASTLOC_PITCH)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.LASTLOC_PITCH + " FLOAT;"); + } + + if (isColumnMissing(md, col.EMAIL)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.EMAIL + " VARCHAR(255);"); + } + + if (isColumnMissing(md, col.IS_LOGGED)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.IS_LOGGED + " SMALLINT NOT NULL DEFAULT '0';"); + } + + if (isColumnMissing(md, col.HAS_SESSION)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.HAS_SESSION + " SMALLINT NOT NULL DEFAULT '0';"); + } + + if (isColumnMissing(md, col.TOTP_KEY)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.TOTP_KEY + " VARCHAR(32);"); + } else if (SqlDataSourceUtils.getColumnSize(md, tableName, col.TOTP_KEY) != 32) { + st.executeUpdate("ALTER TABLE " + tableName + + " ALTER COLUMN " + col.TOTP_KEY + " TYPE VARCHAR(32);"); + } + + if (!col.PLAYER_UUID.isEmpty() && isColumnMissing(md, col.PLAYER_UUID)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.PLAYER_UUID + " VARCHAR(36)"); + } + } + logger.info("PostgreSQL setup finished"); + } + + private boolean isColumnMissing(DatabaseMetaData metaData, String columnName) throws SQLException { + try (ResultSet rs = metaData.getColumns(null, null, tableName, columnName.toLowerCase(Locale.ROOT))) { + return !rs.next(); + } + } + + @Override + public PlayerAuth getAuth(String user) { + String sql = "SELECT * FROM " + tableName + " WHERE " + col.NAME + "=?;"; + PlayerAuth auth; + try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { + pst.setString(1, user.toLowerCase(Locale.ROOT)); + try (ResultSet rs = pst.executeQuery()) { + if (rs.next()) { + int id = rs.getInt(col.ID); + auth = buildAuthFromResultSet(rs); + sqlExtension.extendAuth(auth, id, con); + return auth; + } + } + } catch (SQLException ex) { + logSqlException(ex); + } + return null; + } + + @Override + public boolean saveAuth(PlayerAuth auth) { + super.saveAuth(auth); + + try (Connection con = getConnection()) { + if (!columnOthers.isEmpty()) { + for (String column : columnOthers) { + try (PreparedStatement pst = con.prepareStatement( + "UPDATE " + tableName + " SET " + column + "=? WHERE " + col.NAME + "=?;")) { + pst.setString(1, auth.getRealName()); + pst.setString(2, auth.getNickname()); + pst.executeUpdate(); + } + } + } + + sqlExtension.saveAuth(auth, con); + return true; + } catch (SQLException ex) { + logSqlException(ex); + } + return false; + } + + @Override + String getJdbcUrl(String host, String port, String database) { + return "jdbc:postgresql://" + host + ":" + port + "/" + database; + } + + @Override + public Set getRecordsToPurge(long until) { + Set list = new HashSet<>(); + String select = "SELECT " + col.NAME + " FROM " + tableName + " WHERE GREATEST(" + + " COALESCE(" + col.LAST_LOGIN + ", 0)," + + " COALESCE(" + col.REGISTRATION_DATE + ", 0)" + + ") < ?;"; + try (Connection con = getConnection(); + PreparedStatement selectPst = con.prepareStatement(select)) { + selectPst.setLong(1, until); + try (ResultSet rs = selectPst.executeQuery()) { + while (rs.next()) { + list.add(rs.getString(col.NAME)); + } + } + } catch (SQLException ex) { + logSqlException(ex); + } + + return list; + } + + @Override + public boolean removeAuth(String user) { + user = user.toLowerCase(Locale.ROOT); + String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; + try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { + sqlExtension.removeAuth(user, con); + pst.setString(1, user.toLowerCase(Locale.ROOT)); + pst.executeUpdate(); + return true; + } catch (SQLException ex) { + logSqlException(ex); + } + return false; + } + + @Override + public void closeConnection() { + if (ds != null && !ds.isClosed()) { + ds.close(); + } + } + + @Override + public void purgeRecords(Collection toPurge) { + String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; + try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { + for (String name : toPurge) { + pst.setString(1, name.toLowerCase(Locale.ROOT)); + pst.executeUpdate(); + } + } catch (SQLException ex) { + logSqlException(ex); + } + } + + @Override + public DataSourceType getType() { + return DataSourceType.POSTGRESQL; + } + + @Override + public List getAllAuths() { + List auths = new ArrayList<>(); + try (Connection con = getConnection(); Statement st = con.createStatement()) { + try (ResultSet rs = st.executeQuery("SELECT * FROM " + tableName)) { + while (rs.next()) { + PlayerAuth auth = buildAuthFromResultSet(rs); + sqlExtension.extendAuth(auth, rs.getInt(col.ID), con); + auths.add(auth); + } + } + } catch (SQLException ex) { + logSqlException(ex); + } + return auths; + } + + @Override + public List getLoggedPlayersWithEmptyMail() { + List players = new ArrayList<>(); + String sql = "SELECT " + col.REAL_NAME + " FROM " + tableName + " WHERE " + col.IS_LOGGED + " = 1" + + " AND (" + col.EMAIL + " = 'your@email.com' OR " + col.EMAIL + " IS NULL);"; + try (Connection con = getConnection(); + Statement st = con.createStatement(); + ResultSet rs = st.executeQuery(sql)) { + while (rs.next()) { + players.add(rs.getString(1)); + } + } catch (SQLException ex) { + logSqlException(ex); + } + return players; + } + + @Override + public List getRecentlyLoggedInPlayers() { + List players = new ArrayList<>(); + String sql = "SELECT * FROM " + tableName + " ORDER BY " + col.LAST_LOGIN + " DESC LIMIT 10;"; + try (Connection con = getConnection(); + Statement st = con.createStatement(); + ResultSet rs = st.executeQuery(sql)) { + while (rs.next()) { + players.add(buildAuthFromResultSet(rs)); + } + } catch (SQLException e) { + logSqlException(e); + } + return players; + } + + @Override + public boolean setTotpKey(String user, String totpKey) { + String sql = "UPDATE " + tableName + " SET " + col.TOTP_KEY + " = ? WHERE " + col.NAME + " = ?"; + try (Connection con = getConnection(); PreparedStatement pst = con.prepareStatement(sql)) { + pst.setString(1, totpKey); + pst.setString(2, user.toLowerCase(Locale.ROOT)); + pst.executeUpdate(); + return true; + } catch (SQLException e) { + logSqlException(e); + } + return false; + } + + /** + * Creates a {@link PlayerAuth} object with the data from the provided result set. + * + * @param row the result set to read from + * + * @return generated player auth object with the data from the result set + * + * @throws SQLException . + */ + private PlayerAuth buildAuthFromResultSet(ResultSet row) throws SQLException { + String salt = col.SALT.isEmpty() ? null : row.getString(col.SALT); + int group = col.GROUP.isEmpty() ? -1 : row.getInt(col.GROUP); + return PlayerAuth.builder() + .name(row.getString(col.NAME)) + .realName(row.getString(col.REAL_NAME)) + .password(row.getString(col.PASSWORD), salt) + .totpKey(row.getString(col.TOTP_KEY)) + .lastLogin(getNullableLong(row, col.LAST_LOGIN)) + .lastIp(row.getString(col.LAST_IP)) + .email(row.getString(col.EMAIL)) + .registrationDate(row.getLong(col.REGISTRATION_DATE)) + .registrationIp(row.getString(col.REGISTRATION_IP)) + .groupId(group) + .locWorld(row.getString(col.LASTLOC_WORLD)) + .locX(row.getDouble(col.LASTLOC_X)) + .locY(row.getDouble(col.LASTLOC_Y)) + .locZ(row.getDouble(col.LASTLOC_Z)) + .locYaw(row.getFloat(col.LASTLOC_YAW)) + .locPitch(row.getFloat(col.LASTLOC_PITCH)) + .build(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/SQLite.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/SQLite.java new file mode 100644 index 0000000000..b261b5d548 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/SQLite.java @@ -0,0 +1,423 @@ +package fr.xephi.authme.datasource; + +import com.google.common.annotations.VisibleForTesting; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.columnshandler.AuthMeColumnsHandler; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.DatabaseSettings; + +import java.io.File; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +import static fr.xephi.authme.datasource.SqlDataSourceUtils.getNullableLong; +import static fr.xephi.authme.datasource.SqlDataSourceUtils.logSqlException; + +/** + * SQLite data source. + */ +@SuppressWarnings({"checkstyle:AbbreviationAsWordInName"}) // Justification: Class name cannot be changed anymore +public class SQLite extends AbstractSqlDataSource { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(SQLite.class); + private final Settings settings; + private final File dataFolder; + private final String database; + private final String tableName; + private final Columns col; + private Connection con; + + /** + * Constructor for SQLite. + * + * @param settings The settings instance + * @param dataFolder The data folder + * + * @throws SQLException when initialization of a SQL datasource failed + */ + public SQLite(Settings settings, File dataFolder) throws SQLException { + this.settings = settings; + this.dataFolder = dataFolder; + this.database = settings.getProperty(DatabaseSettings.MYSQL_DATABASE); + this.tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE); + this.col = new Columns(settings); + + try { + this.connect(); + this.setup(); + this.migrateIfNeeded(); + } catch (Exception ex) { + logger.logException("Error during SQLite initialization:", ex); + throw ex; + } + } + + @VisibleForTesting + SQLite(Settings settings, File dataFolder, Connection connection) { + this.settings = settings; + this.dataFolder = dataFolder; + this.database = settings.getProperty(DatabaseSettings.MYSQL_DATABASE); + this.tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE); + this.col = new Columns(settings); + this.con = connection; + this.columnsHandler = AuthMeColumnsHandler.createForSqlite(con, settings); + } + + /** + * Initializes the connection to the SQLite database. + * + * @throws SQLException when an SQL error occurs while connecting + */ + protected void connect() throws SQLException { + try { + Class.forName("org.sqlite.JDBC"); + } catch (ClassNotFoundException e) { + throw new IllegalStateException("Failed to load SQLite JDBC class", e); + } + + logger.debug("SQLite driver loaded"); + this.con = DriverManager.getConnection(this.getJdbcUrl(this.dataFolder.getAbsolutePath(), "", this.database)); + this.columnsHandler = AuthMeColumnsHandler.createForSqlite(con, settings); + } + + /** + * Creates the table if necessary, or adds any missing columns to the table. + * + * @throws SQLException when an SQL error occurs while initializing the database + */ + @VisibleForTesting + @SuppressWarnings("checkstyle:CyclomaticComplexity") + protected void setup() throws SQLException { + try (Statement st = con.createStatement()) { + // Note: cannot add unique fields later on in SQLite, so we add it on initialization + st.executeUpdate("CREATE TABLE IF NOT EXISTS " + tableName + " (" + + col.ID + " INTEGER AUTO_INCREMENT, " + + col.NAME + " VARCHAR(255) NOT NULL UNIQUE, " + + "CONSTRAINT table_const_prim PRIMARY KEY (" + col.ID + "));"); + + DatabaseMetaData md = con.getMetaData(); + + if (isColumnMissing(md, col.REAL_NAME)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.REAL_NAME + " VARCHAR(255) NOT NULL DEFAULT 'Player';"); + } + + if (isColumnMissing(md, col.PASSWORD)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.PASSWORD + " VARCHAR(255) NOT NULL DEFAULT '';"); + } + + if (!col.SALT.isEmpty() && isColumnMissing(md, col.SALT)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + col.SALT + " VARCHAR(255);"); + } + + if (isColumnMissing(md, col.LAST_IP)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.LAST_IP + " VARCHAR(40);"); + } + + if (isColumnMissing(md, col.LAST_LOGIN)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.LAST_LOGIN + " TIMESTAMP;"); + } + + if (isColumnMissing(md, col.REGISTRATION_IP)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.REGISTRATION_IP + " VARCHAR(40);"); + } + + if (isColumnMissing(md, col.REGISTRATION_DATE)) { + addRegistrationDateColumn(st); + } + + if (isColumnMissing(md, col.LASTLOC_X)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + col.LASTLOC_X + + " DOUBLE NOT NULL DEFAULT '0.0';"); + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + col.LASTLOC_Y + + " DOUBLE NOT NULL DEFAULT '0.0';"); + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + col.LASTLOC_Z + + " DOUBLE NOT NULL DEFAULT '0.0';"); + } + + if (isColumnMissing(md, col.LASTLOC_WORLD)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.LASTLOC_WORLD + " VARCHAR(255) NOT NULL DEFAULT 'world';"); + } + + if (isColumnMissing(md, col.LASTLOC_YAW)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.LASTLOC_YAW + " FLOAT;"); + } + + if (isColumnMissing(md, col.LASTLOC_PITCH)) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + col.LASTLOC_PITCH + " FLOAT;"); + } + + if (isColumnMissing(md, col.EMAIL)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.EMAIL + " VARCHAR(255);"); + } + + if (isColumnMissing(md, col.IS_LOGGED)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.IS_LOGGED + " INT NOT NULL DEFAULT '0';"); + } + + if (isColumnMissing(md, col.HAS_SESSION)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.HAS_SESSION + " INT NOT NULL DEFAULT '0';"); + } + + if (isColumnMissing(md, col.TOTP_KEY)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.TOTP_KEY + " VARCHAR(32);"); + } + + if (!col.PLAYER_UUID.isEmpty() && isColumnMissing(md, col.PLAYER_UUID)) { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.PLAYER_UUID + " VARCHAR(36)"); + } + } + logger.info("SQLite Setup finished"); + } + + /** + * Migrates the database if necessary. See {@link SqLiteMigrater} for details. + */ + @VisibleForTesting + void migrateIfNeeded() throws SQLException { + DatabaseMetaData metaData = con.getMetaData(); + if (SqLiteMigrater.isMigrationRequired(metaData, tableName, col)) { + new SqLiteMigrater(settings, dataFolder).performMigration(this); + // Migration deletes the table and recreates it, therefore call connect() again + // to get an up-to-date Connection to the database + connect(); + } + } + + private boolean isColumnMissing(DatabaseMetaData metaData, String columnName) throws SQLException { + try (ResultSet rs = metaData.getColumns(null, null, tableName, columnName)) { + return !rs.next(); + } + } + + @Override + public void reload() { + close(con); + try { + this.connect(); + this.setup(); + this.migrateIfNeeded(); + } catch (SQLException ex) { + logger.logException("Error while reloading SQLite:", ex); + } + } + + @Override + public PlayerAuth getAuth(String user) { + String sql = "SELECT * FROM " + tableName + " WHERE LOWER(" + col.NAME + ")=LOWER(?);"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setString(1, user); + try (ResultSet rs = pst.executeQuery()) { + if (rs.next()) { + return buildAuthFromResultSet(rs); + } + } + } catch (SQLException ex) { + logSqlException(ex); + } + return null; + } + + @Override + public Set getRecordsToPurge(long until) { + Set list = new HashSet<>(); + String select = "SELECT " + col.NAME + " FROM " + tableName + " WHERE MAX(" + + " COALESCE(" + col.LAST_LOGIN + ", 0)," + + " COALESCE(" + col.REGISTRATION_DATE + ", 0)" + + ") < ?;"; + try (PreparedStatement selectPst = con.prepareStatement(select)) { + selectPst.setLong(1, until); + try (ResultSet rs = selectPst.executeQuery()) { + while (rs.next()) { + list.add(rs.getString(col.NAME)); + } + } + } catch (SQLException ex) { + logSqlException(ex); + } + + return list; + } + + @Override + public void purgeRecords(Collection toPurge) { + String delete = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; + try (PreparedStatement deletePst = con.prepareStatement(delete)) { + for (String name : toPurge) { + deletePst.setString(1, name.toLowerCase(Locale.ROOT)); + deletePst.executeUpdate(); + } + } catch (SQLException ex) { + logSqlException(ex); + } + } + + @Override + public boolean removeAuth(String user) { + String sql = "DELETE FROM " + tableName + " WHERE " + col.NAME + "=?;"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setString(1, user.toLowerCase(Locale.ROOT)); + pst.executeUpdate(); + return true; + } catch (SQLException ex) { + logSqlException(ex); + } + return false; + } + + @Override + public void closeConnection() { + try { + if (con != null && !con.isClosed()) { + con.close(); + } + } catch (SQLException ex) { + logSqlException(ex); + } + } + + @Override + public DataSourceType getType() { + return DataSourceType.SQLITE; + } + + @Override + public List getAllAuths() { + List auths = new ArrayList<>(); + String sql = "SELECT * FROM " + tableName + ";"; + try (PreparedStatement pst = con.prepareStatement(sql); ResultSet rs = pst.executeQuery()) { + while (rs.next()) { + PlayerAuth auth = buildAuthFromResultSet(rs); + auths.add(auth); + } + } catch (SQLException ex) { + logSqlException(ex); + } + return auths; + } + + @Override + public List getLoggedPlayersWithEmptyMail() { + List players = new ArrayList<>(); + String sql = "SELECT " + col.REAL_NAME + " FROM " + tableName + " WHERE " + col.IS_LOGGED + " = 1" + + " AND (" + col.EMAIL + " = 'your@email.com' OR " + col.EMAIL + " IS NULL);"; + try (Statement st = con.createStatement(); ResultSet rs = st.executeQuery(sql)) { + while (rs.next()) { + players.add(rs.getString(1)); + } + } catch (SQLException ex) { + logSqlException(ex); + } + return players; + } + + @Override + public List getRecentlyLoggedInPlayers() { + List players = new ArrayList<>(); + String sql = "SELECT * FROM " + tableName + " ORDER BY " + col.LAST_LOGIN + " DESC LIMIT 10;"; + try (Statement st = con.createStatement(); ResultSet rs = st.executeQuery(sql)) { + while (rs.next()) { + players.add(buildAuthFromResultSet(rs)); + } + } catch (SQLException e) { + logSqlException(e); + } + return players; + } + + + @Override + public boolean setTotpKey(String user, String totpKey) { + String sql = "UPDATE " + tableName + " SET " + col.TOTP_KEY + " = ? WHERE " + col.NAME + " = ?"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setString(1, totpKey); + pst.setString(2, user.toLowerCase(Locale.ROOT)); + pst.executeUpdate(); + return true; + } catch (SQLException e) { + logSqlException(e); + } + return false; + } + + private PlayerAuth buildAuthFromResultSet(ResultSet row) throws SQLException { + String salt = !col.SALT.isEmpty() ? row.getString(col.SALT) : null; + + return PlayerAuth.builder() + .name(row.getString(col.NAME)) + .email(row.getString(col.EMAIL)) + .realName(row.getString(col.REAL_NAME)) + .password(row.getString(col.PASSWORD), salt) + .totpKey(row.getString(col.TOTP_KEY)) + .lastLogin(getNullableLong(row, col.LAST_LOGIN)) + .lastIp(row.getString(col.LAST_IP)) + .registrationDate(row.getLong(col.REGISTRATION_DATE)) + .registrationIp(row.getString(col.REGISTRATION_IP)) + .locX(row.getDouble(col.LASTLOC_X)) + .locY(row.getDouble(col.LASTLOC_Y)) + .locZ(row.getDouble(col.LASTLOC_Z)) + .locWorld(row.getString(col.LASTLOC_WORLD)) + .locYaw(row.getFloat(col.LASTLOC_YAW)) + .locPitch(row.getFloat(col.LASTLOC_PITCH)) + .build(); + } + + /** + * Creates the column for registration date and sets all entries to the current timestamp. + * We do so in order to avoid issues with purging, where entries with 0 / NULL might get + * purged immediately on startup otherwise. + * + * @param st Statement object to the database + */ + private void addRegistrationDateColumn(Statement st) throws SQLException { + st.executeUpdate("ALTER TABLE " + tableName + + " ADD COLUMN " + col.REGISTRATION_DATE + " TIMESTAMP NOT NULL DEFAULT '0';"); + + // Use the timestamp from Java to avoid timezone issues in case JVM and database are out of sync + long currentTimestamp = System.currentTimeMillis(); + int updatedRows = st.executeUpdate(String.format("UPDATE %s SET %s = %d;", + tableName, col.REGISTRATION_DATE, currentTimestamp)); + logger.info("Created column '" + col.REGISTRATION_DATE + "' and set the current timestamp, " + + currentTimestamp + ", to all " + updatedRows + " rows"); + } + + @Override + String getJdbcUrl(String dataPath, String ignored, String database) { + return "jdbc:sqlite:" + dataPath + File.separator + database + ".db"; + } + + private static void close(Connection con) { + if (con != null) { + try { + con.close(); + } catch (SQLException ex) { + logSqlException(ex); + } + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/SqLiteMigrater.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/SqLiteMigrater.java new file mode 100644 index 0000000000..b4a2a577bb --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/SqLiteMigrater.java @@ -0,0 +1,147 @@ +package fr.xephi.authme.datasource; + +import com.google.common.io.Files; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.DatabaseSettings; +import fr.xephi.authme.util.FileUtils; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Field; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.SQLException; +import java.sql.Statement; + +/** + * Migrates the SQLite database when necessary. + */ +class SqLiteMigrater { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(SqLiteMigrater.class); + private final File dataFolder; + private final String databaseName; + private final String tableName; + private final Columns col; + + SqLiteMigrater(Settings settings, File dataFolder) { + this.dataFolder = dataFolder; + this.databaseName = settings.getProperty(DatabaseSettings.MYSQL_DATABASE); + this.tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE); + this.col = new Columns(settings); + } + + /** + * Returns whether the database needs to be migrated. + *

+ * Background: Before commit 22911a0 (July 2016), new SQLite databases initialized the last IP column to be NOT NULL + * without a default value. Allowing the last IP to be null (#792) is therefore not compatible. + * + * @param metaData the database meta data + * @param tableName the table name (SQLite file name) + * @param col column names configuration + * @return true if a migration is necessary, false otherwise + */ + static boolean isMigrationRequired(DatabaseMetaData metaData, String tableName, Columns col) throws SQLException { + return SqlDataSourceUtils.isNotNullColumn(metaData, tableName, col.LAST_IP) + && SqlDataSourceUtils.getColumnDefaultValue(metaData, tableName, col.LAST_IP) == null; + } + + /** + * Migrates the given SQLite instance. + * + * @param sqLite the instance to migrate + */ + void performMigration(SQLite sqLite) throws SQLException { + logger.warning("YOUR SQLITE DATABASE NEEDS MIGRATING! DO NOT TURN OFF YOUR SERVER"); + + String backupName = createBackup(); + logger.info("Made a backup of your database at 'backups/" + backupName + "'"); + + recreateDatabaseWithNewDefinitions(sqLite); + logger.info("SQLite database migrated successfully"); + } + + private String createBackup() { + File sqLite = new File(dataFolder, databaseName + ".db"); + File backupDirectory = new File(dataFolder, "backups"); + FileUtils.createDirectory(backupDirectory); + + String backupName = "backup-" + databaseName + FileUtils.createCurrentTimeString() + ".db"; + File backup = new File(backupDirectory, backupName); + try { + Files.copy(sqLite, backup); + return backupName; + } catch (IOException e) { + throw new IllegalStateException("Failed to create SQLite backup before migration", e); + } + } + + /** + * Renames the current database, creates a new database under the name and copies the data + * from the renamed database to the newly created one. This is necessary because SQLite + * does not support dropping or modifying a column. + * + * @param sqLite the SQLite instance to migrate + */ + // cf. https://stackoverflow.com/questions/805363/how-do-i-rename-a-column-in-a-sqlite-database-table + private void recreateDatabaseWithNewDefinitions(SQLite sqLite) throws SQLException { + Connection connection = getConnection(sqLite); + String tempTable = "tmp_" + tableName; + try (Statement st = connection.createStatement()) { + st.execute("ALTER TABLE " + tableName + " RENAME TO " + tempTable + ";"); + } + + sqLite.reload(); + connection = getConnection(sqLite); + + try (Statement st = connection.createStatement()) { + String copySql = "INSERT INTO $table ($id, $name, $realName, $password, $lastIp, $lastLogin, $regIp, " + + "$regDate, $locX, $locY, $locZ, $locWorld, $locPitch, $locYaw, $email, $isLogged)" + + "SELECT $id, $name, $realName," + + " $password, CASE WHEN $lastIp = '127.0.0.1' OR $lastIp = '' THEN NULL else $lastIp END," + + " $lastLogin, $regIp, $regDate, $locX, $locY, $locZ, $locWorld, $locPitch, $locYaw," + + " CASE WHEN $email = 'your@email.com' THEN NULL ELSE $email END, $isLogged" + + " FROM " + tempTable + ";"; + int insertedEntries = st.executeUpdate(replaceColumnVariables(copySql)); + logger.info("Copied over " + insertedEntries + " from the old table to the new one"); + + st.execute("DROP TABLE " + tempTable + ";"); + } + } + + private String replaceColumnVariables(String sql) { + String replacedSql = sql.replace("$table", tableName).replace("$id", col.ID) + .replace("$name", col.NAME).replace("$realName", col.REAL_NAME) + .replace("$password", col.PASSWORD).replace("$lastIp", col.LAST_IP) + .replace("$lastLogin", col.LAST_LOGIN).replace("$regIp", col.REGISTRATION_IP) + .replace("$regDate", col.REGISTRATION_DATE).replace("$locX", col.LASTLOC_X) + .replace("$locY", col.LASTLOC_Y).replace("$locZ", col.LASTLOC_Z) + .replace("$locWorld", col.LASTLOC_WORLD).replace("$locPitch", col.LASTLOC_PITCH) + .replace("$locYaw", col.LASTLOC_YAW).replace("$email", col.EMAIL) + .replace("$isLogged", col.IS_LOGGED); + if (replacedSql.contains("$")) { + throw new IllegalStateException("SQL still statement still has '$' in it - was a tag not replaced?" + + " Replacement result: " + replacedSql); + } + return replacedSql; + } + + /** + * Returns the connection from the given SQLite instance. + * + * @param sqLite the SQLite instance to process + * @return the connection to the SQLite database + */ + private static Connection getConnection(SQLite sqLite) { + try { + Field connectionField = SQLite.class.getDeclaredField("con"); + connectionField.setAccessible(true); + return (Connection) connectionField.get(sqLite); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new IllegalStateException("Failed to get the connection from SQLite", e); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/SqlDataSourceUtils.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/SqlDataSourceUtils.java new file mode 100644 index 0000000000..1a936f024d --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/SqlDataSourceUtils.java @@ -0,0 +1,109 @@ +package fr.xephi.authme.datasource; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; + +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Utilities for SQL data sources. + */ +public final class SqlDataSourceUtils { + + private static final ConsoleLogger logger = ConsoleLoggerFactory.get(SqlDataSourceUtils.class); + + private SqlDataSourceUtils() { + } + + /** + * Logs a SQL exception. + * + * @param e the exception to log + */ + public static void logSqlException(SQLException e) { + logger.logException("Error during SQL operation:", e); + } + + /** + * Returns the long value of a column, or null when appropriate. This method is necessary because + * JDBC's {@link ResultSet#getLong} returns {@code 0} if the entry in the database is {@code null}. + * + * @param rs the result set to read from + * @param columnName the name of the column to retrieve + * @return the value (which may be null) + * @throws SQLException :) + */ + public static Long getNullableLong(ResultSet rs, String columnName) throws SQLException { + long longValue = rs.getLong(columnName); + return rs.wasNull() ? null : longValue; + } + + /** + * Returns whether the given column has a NOT NULL constraint. + * + * @param metaData the database meta data + * @param tableName the name of the table in which the column is + * @param columnName the name of the column to check + * @return true if the column is NOT NULL, false otherwise + * @throws SQLException :) + */ + public static boolean isNotNullColumn(DatabaseMetaData metaData, String tableName, + String columnName) throws SQLException { + try (ResultSet rs = metaData.getColumns(null, null, tableName, columnName)) { + if (!rs.next()) { + throw new IllegalStateException("Did not find meta data for column '" + + columnName + "' while checking for not-null constraint"); + } + + int nullableCode = rs.getInt("NULLABLE"); + if (nullableCode == DatabaseMetaData.columnNoNulls) { + return true; + } else if (nullableCode == DatabaseMetaData.columnNullableUnknown) { + logger.warning("Unknown nullable status for column '" + columnName + "'"); + } + } + return false; + } + + /** + * Returns the default value of a column (as per its SQL definition). + * + * @param metaData the database meta data + * @param tableName the name of the table in which the column is + * @param columnName the name of the column to check + * @return the default value of the column (may be null) + * @throws SQLException :) + */ + public static Object getColumnDefaultValue(DatabaseMetaData metaData, String tableName, + String columnName) throws SQLException { + try (ResultSet rs = metaData.getColumns(null, null, tableName, columnName)) { + if (!rs.next()) { + throw new IllegalStateException("Did not find meta data for column '" + + columnName + "' while checking its default value"); + } + return rs.getObject("COLUMN_DEF"); + } + } + + /** + * Returns the size of a column (as per its SQL definition). + * + * @param metaData the database meta data + * @param tableName the name of the table in which the column is + * @param columnName the name of the column to check + * @return the size of the column + * @throws SQLException :) + */ + public static int getColumnSize(DatabaseMetaData metaData, String tableName, + String columnName) throws SQLException { + try (ResultSet rs = metaData.getColumns(null, null, tableName, columnName)) { + if (!rs.next()) { + throw new IllegalStateException("Did not find meta data for column '" + + columnName + "' while checking its size"); + } + return rs.getInt("COLUMN_SIZE"); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/AuthMeColumns.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/AuthMeColumns.java new file mode 100644 index 0000000000..47851a5a9b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/AuthMeColumns.java @@ -0,0 +1,86 @@ +package fr.xephi.authme.datasource.columnshandler; + +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.settings.properties.DatabaseSettings; + +import static fr.xephi.authme.datasource.columnshandler.AuthMeColumnsFactory.ColumnOptions.DEFAULT_FOR_NULL; +import static fr.xephi.authme.datasource.columnshandler.AuthMeColumnsFactory.ColumnOptions.OPTIONAL; +import static fr.xephi.authme.datasource.columnshandler.AuthMeColumnsFactory.createDouble; +import static fr.xephi.authme.datasource.columnshandler.AuthMeColumnsFactory.createFloat; +import static fr.xephi.authme.datasource.columnshandler.AuthMeColumnsFactory.createInteger; +import static fr.xephi.authme.datasource.columnshandler.AuthMeColumnsFactory.createLong; +import static fr.xephi.authme.datasource.columnshandler.AuthMeColumnsFactory.createString; + +/** + * Contains column definitions for the AuthMe table. + */ +public final class AuthMeColumns { + + public static final PlayerAuthColumn NAME = createString( + DatabaseSettings.MYSQL_COL_NAME, PlayerAuth::getNickname); + + public static final PlayerAuthColumn NICK_NAME = createString( + DatabaseSettings.MYSQL_COL_REALNAME, PlayerAuth::getRealName); + + public static final PlayerAuthColumn PASSWORD = createString( + DatabaseSettings.MYSQL_COL_PASSWORD, auth -> auth.getPassword().getHash()); + + public static final PlayerAuthColumn SALT = createString( + DatabaseSettings.MYSQL_COL_SALT, auth -> auth.getPassword().getSalt(), OPTIONAL); + + public static final PlayerAuthColumn EMAIL = createString( + DatabaseSettings.MYSQL_COL_EMAIL, PlayerAuth::getEmail, DEFAULT_FOR_NULL); + + public static final PlayerAuthColumn LAST_IP = createString( + DatabaseSettings.MYSQL_COL_LAST_IP, PlayerAuth::getLastIp); + + public static final PlayerAuthColumn GROUP_ID = createInteger( + DatabaseSettings.MYSQL_COL_GROUP, PlayerAuth::getGroupId, OPTIONAL); + + public static final PlayerAuthColumn LAST_LOGIN = createLong( + DatabaseSettings.MYSQL_COL_LASTLOGIN, PlayerAuth::getLastLogin); + + public static final PlayerAuthColumn REGISTRATION_IP = createString( + DatabaseSettings.MYSQL_COL_REGISTER_IP, PlayerAuth::getRegistrationIp); + + public static final PlayerAuthColumn REGISTRATION_DATE = createLong( + DatabaseSettings.MYSQL_COL_REGISTER_DATE, PlayerAuth::getRegistrationDate); + + public static final PlayerAuthColumn UUID = createString( + DatabaseSettings.MYSQL_COL_PLAYER_UUID, + auth -> ( auth.getUuid() == null ? null : auth.getUuid().toString()), + OPTIONAL); + + // -------- + // Location columns + // -------- + public static final PlayerAuthColumn LOCATION_X = createDouble( + DatabaseSettings.MYSQL_COL_LASTLOC_X, PlayerAuth::getQuitLocX); + + public static final PlayerAuthColumn LOCATION_Y = createDouble( + DatabaseSettings.MYSQL_COL_LASTLOC_Y, PlayerAuth::getQuitLocY); + + public static final PlayerAuthColumn LOCATION_Z = createDouble( + DatabaseSettings.MYSQL_COL_LASTLOC_Z, PlayerAuth::getQuitLocZ); + + public static final PlayerAuthColumn LOCATION_WORLD = createString( + DatabaseSettings.MYSQL_COL_LASTLOC_WORLD, PlayerAuth::getWorld); + + public static final PlayerAuthColumn LOCATION_YAW = createFloat( + DatabaseSettings.MYSQL_COL_LASTLOC_YAW, PlayerAuth::getYaw); + + public static final PlayerAuthColumn LOCATION_PITCH = createFloat( + DatabaseSettings.MYSQL_COL_LASTLOC_PITCH, PlayerAuth::getPitch); + + // -------- + // Columns not on PlayerAuth + // -------- + public static final DataSourceColumn IS_LOGGED = createInteger( + DatabaseSettings.MYSQL_COL_ISLOGGED); + + public static final DataSourceColumn HAS_SESSION = createInteger( + DatabaseSettings.MYSQL_COL_HASSESSION); + + private AuthMeColumns() { + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/AuthMeColumnsFactory.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/AuthMeColumnsFactory.java new file mode 100644 index 0000000000..3400f76cd9 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/AuthMeColumnsFactory.java @@ -0,0 +1,83 @@ +package fr.xephi.authme.datasource.columnshandler; + +import ch.jalu.configme.properties.Property; +import ch.jalu.datasourcecolumns.ColumnType; +import ch.jalu.datasourcecolumns.StandardTypes; +import fr.xephi.authme.data.auth.PlayerAuth; + +import java.util.function.Function; + +/** + * Util class for initializing {@link DataSourceColumn} objects. + */ +final class AuthMeColumnsFactory { + + private AuthMeColumnsFactory() { + } + + static DataSourceColumn createInteger(Property nameProperty, + ColumnOptions... options) { + return new DataSourceColumn<>(StandardTypes.INTEGER, nameProperty, + isOptional(options), hasDefaultForNull(options)); + } + + static PlayerAuthColumn createInteger(Property nameProperty, + Function playerAuthGetter, + ColumnOptions... options) { + return createInternal(StandardTypes.INTEGER, nameProperty, playerAuthGetter, options); + } + + static PlayerAuthColumn createLong(Property nameProperty, + Function playerAuthGetter, + ColumnOptions... options) { + return createInternal(StandardTypes.LONG, nameProperty, playerAuthGetter, options); + } + + static PlayerAuthColumn createString(Property nameProperty, + Function playerAuthGetter, + ColumnOptions... options) { + return createInternal(StandardTypes.STRING, nameProperty, playerAuthGetter, options); + } + + static PlayerAuthColumn createDouble(Property nameProperty, + Function playerAuthGetter, + ColumnOptions... options) { + return createInternal(StandardTypes.DOUBLE, nameProperty, playerAuthGetter, options); + } + + static PlayerAuthColumn createFloat(Property nameProperty, + Function playerAuthGetter, + ColumnOptions... options) { + return createInternal(StandardTypes.FLOAT, nameProperty, playerAuthGetter, options); + } + + private static PlayerAuthColumn createInternal(ColumnType type, Property nameProperty, + Function authGetter, + ColumnOptions... options) { + return new PlayerAuthColumn<>(type, nameProperty, isOptional(options), hasDefaultForNull(options), authGetter); + } + + private static boolean isOptional(ColumnOptions[] options) { + return containsInArray(ColumnOptions.OPTIONAL, options); + } + + private static boolean hasDefaultForNull(ColumnOptions[] options) { + return containsInArray(ColumnOptions.DEFAULT_FOR_NULL, options); + } + + private static boolean containsInArray(ColumnOptions needle, ColumnOptions[] haystack) { + for (ColumnOptions option : haystack) { + if (option == needle) { + return true; + } + } + return false; + } + + enum ColumnOptions { + + OPTIONAL, + + DEFAULT_FOR_NULL + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/AuthMeColumnsHandler.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/AuthMeColumnsHandler.java new file mode 100644 index 0000000000..b910d36eb3 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/AuthMeColumnsHandler.java @@ -0,0 +1,227 @@ +package fr.xephi.authme.datasource.columnshandler; + +import ch.jalu.datasourcecolumns.data.DataSourceValue; +import ch.jalu.datasourcecolumns.data.DataSourceValues; +import ch.jalu.datasourcecolumns.data.UpdateValues; +import ch.jalu.datasourcecolumns.predicate.Predicate; +import ch.jalu.datasourcecolumns.sqlimplementation.PredicateSqlGenerator; +import ch.jalu.datasourcecolumns.sqlimplementation.SqlColumnsHandler; +import ch.jalu.datasourcecolumns.sqlimplementation.statementgenerator.ConnectionSupplier; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.DatabaseSettings; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; +import java.util.Locale; + +import static ch.jalu.datasourcecolumns.sqlimplementation.SqlColumnsHandlerConfig.forConnectionPool; +import static ch.jalu.datasourcecolumns.sqlimplementation.SqlColumnsHandlerConfig.forSingleConnection; +import static fr.xephi.authme.datasource.SqlDataSourceUtils.logSqlException; + +/** + * Wrapper of {@link SqlColumnsHandler} for the AuthMe data table. + * Wraps exceptions and provides better support for operations based on a {@link PlayerAuth} object. + */ +public final class AuthMeColumnsHandler { + + private final SqlColumnsHandler internalHandler; + + private AuthMeColumnsHandler(SqlColumnsHandler internalHandler) { + this.internalHandler = internalHandler; + } + + /** + * Creates a column handler for SQLite. + * + * @param connection the connection to the database + * @param settings plugin settings + * @return created column handler + */ + public static AuthMeColumnsHandler createForSqlite(Connection connection, Settings settings) { + ColumnContext columnContext = new ColumnContext(settings, false); + String tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE); + String nameColumn = settings.getProperty(DatabaseSettings.MYSQL_COL_NAME); + + SqlColumnsHandler sqlColHandler = new SqlColumnsHandler<>( + forSingleConnection(connection, tableName, nameColumn, columnContext) + .setPredicateSqlGenerator(new PredicateSqlGenerator<>(columnContext, true)) + ); + return new AuthMeColumnsHandler(sqlColHandler); + } + + /** + * Creates a column handler for H2. + * + * @param connection the connection to the database + * @param settings plugin settings + * @return created column handler + */ + public static AuthMeColumnsHandler createForH2(Connection connection, Settings settings) { + ColumnContext columnContext = new ColumnContext(settings, false); + String tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE); + String nameColumn = settings.getProperty(DatabaseSettings.MYSQL_COL_NAME); + + SqlColumnsHandler sqlColHandler = new SqlColumnsHandler<>( + forSingleConnection(connection, tableName, nameColumn, columnContext) + .setPredicateSqlGenerator(new PredicateSqlGenerator<>(columnContext, false)) + ); + return new AuthMeColumnsHandler(sqlColHandler); + } + + + /** + * Creates a column handler for MySQL. + * + * @param connectionSupplier supplier of connections from the connection pool + * @param settings plugin settings + * @return created column handler + */ + public static AuthMeColumnsHandler createForMySql(ConnectionSupplier connectionSupplier, Settings settings) { + ColumnContext columnContext = new ColumnContext(settings, true); + String tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE); + String nameColumn = settings.getProperty(DatabaseSettings.MYSQL_COL_NAME); + + SqlColumnsHandler sqlColHandler = new SqlColumnsHandler<>( + forConnectionPool(connectionSupplier, tableName, nameColumn, columnContext)); + return new AuthMeColumnsHandler(sqlColHandler); + } + + /** + * Changes a column from a specific row to the given value. + * + * @param name name of the account to modify + * @param column the column to modify + * @param value the value to set the column to + * @param the column type + * @return true upon success, false otherwise + */ + public boolean update(String name, DataSourceColumn column, T value) { + try { + return internalHandler.update(name.toLowerCase(Locale.ROOT), column, value); + } catch (SQLException e) { + logSqlException(e); + return false; + } + } + + /** + * Updates a row to have the values as retrieved from the PlayerAuth object. + * + * @param auth the player auth object to modify and to get values from + * @param columns the columns to update in the row + * @return true upon success, false otherwise + */ + public boolean update(PlayerAuth auth, PlayerAuthColumn... columns) { + try { + return internalHandler.update(auth.getNickname(), auth, columns); + } catch (SQLException e) { + logSqlException(e); + return false; + } + } + + /** + * Updates a row to have the given values. + * + * @param name the name of the account to modify + * @param updateValues the values to set on the row + * @return true upon success, false otherwise + */ + public boolean update(String name, UpdateValues updateValues) { + try { + return internalHandler.update(name.toLowerCase(Locale.ROOT), updateValues); + } catch (SQLException e) { + logSqlException(e); + return false; + } + } + + /** + * Sets the given value to the provided column for all rows which match the predicate. + * + * @param predicate the predicate to filter rows by + * @param column the column to modify on the matched rows + * @param value the new value to set + * @param the column type + * @return number of modified rows + */ + public int update(Predicate predicate, DataSourceColumn column, T value) { + try { + return internalHandler.update(predicate, column, value); + } catch (SQLException e) { + logSqlException(e); + return 0; + } + } + + /** + * Retrieves the given column from a given row. + * + * @param name the account name to look up + * @param column the column whose value should be retrieved + * @param the column type + * @return the result of the lookup + * @throws SQLException . + */ + public DataSourceValue retrieve(String name, DataSourceColumn column) throws SQLException { + return internalHandler.retrieve(name.toLowerCase(Locale.ROOT), column); + } + + /** + * Retrieves multiple values from a given row. + * + * @param name the account name to look up + * @param columns the columns to retrieve + * @return map-like object with the requested values + * @throws SQLException . + */ + public DataSourceValues retrieve(String name, DataSourceColumn... columns) throws SQLException { + return internalHandler.retrieve(name.toLowerCase(Locale.ROOT), columns); + } + + /** + * Retrieves a column's value for all rows that satisfy the given predicate. + * + * @param predicate the predicate to fulfill + * @param column the column to retrieve from the matching rows + * @param the column's value type + * @return the values of the matching rows + * @throws SQLException . + */ + public List retrieve(Predicate predicate, DataSourceColumn column) throws SQLException { + return internalHandler.retrieve(predicate, column); + } + + /** + * Inserts the given values into a new row, as taken from the player auth. + * + * @param auth the player auth to get values from + * @param columns the columns to insert + * @return true upon success, false otherwise + */ + public boolean insert(PlayerAuth auth, PlayerAuthColumn... columns) { + try { + return internalHandler.insert(auth, columns); + } catch (SQLException e) { + logSqlException(e); + return false; + } + } + + /** + * Returns the number of rows that match the provided predicate. + * + * @param predicate the predicate to test the rows for + * @return number of rows fulfilling the predicate + */ + public int count(Predicate predicate) { + try { + return internalHandler.count(predicate); + } catch (SQLException e) { + logSqlException(e); + return 0; + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/ColumnContext.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/ColumnContext.java new file mode 100644 index 0000000000..483e31e9c0 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/ColumnContext.java @@ -0,0 +1,35 @@ +package fr.xephi.authme.datasource.columnshandler; + +import fr.xephi.authme.settings.Settings; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Context for resolving the properties of {@link AuthMeColumns} entries. + */ +public class ColumnContext { + + private final Settings settings; + private final Map, String> columnNames = new ConcurrentHashMap<>(); + private final boolean hasDefaultSupport; + + /** + * Constructor. + * + * @param settings plugin settings + * @param hasDefaultSupport whether or not the underlying database has support for the {@code DEFAULT} keyword + */ + public ColumnContext(Settings settings, boolean hasDefaultSupport) { + this.settings = settings; + this.hasDefaultSupport = hasDefaultSupport; + } + + public String getName(DataSourceColumn column) { + return columnNames.computeIfAbsent(column, k -> settings.getProperty(k.getNameProperty())); + } + + public boolean hasDefaultSupport() { + return hasDefaultSupport; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/DataSourceColumn.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/DataSourceColumn.java new file mode 100644 index 0000000000..4b7fa4ca7d --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/DataSourceColumn.java @@ -0,0 +1,57 @@ +package fr.xephi.authme.datasource.columnshandler; + +import ch.jalu.configme.properties.Property; +import ch.jalu.datasourcecolumns.Column; +import ch.jalu.datasourcecolumns.ColumnType; + +/** + * Basic {@link Column} implementation for AuthMe. + * + * @param column type + */ +public class DataSourceColumn implements Column { + + private final ColumnType columnType; + private final Property nameProperty; + private final boolean isOptional; + private final boolean useDefaultForNull; + + /** + * Constructor. + * + * @param type type of the column + * @param nameProperty property defining the column name + * @param isOptional whether or not the column can be skipped (if name is configured to empty string) + * @param useDefaultForNull whether SQL DEFAULT should be used for null values (if supported by the database) + */ + DataSourceColumn(ColumnType type, Property nameProperty, boolean isOptional, boolean useDefaultForNull) { + this.columnType = type; + this.nameProperty = nameProperty; + this.isOptional = isOptional; + this.useDefaultForNull = useDefaultForNull; + } + + public Property getNameProperty() { + return nameProperty; + } + + @Override + public String resolveName(ColumnContext columnContext) { + return columnContext.getName(this); + } + + @Override + public ColumnType getType() { + return columnType; + } + + @Override + public boolean isColumnUsed(ColumnContext columnContext) { + return !isOptional || !resolveName(columnContext).isEmpty(); + } + + @Override + public boolean useDefaultForNullValue(ColumnContext columnContext) { + return useDefaultForNull && columnContext.hasDefaultSupport(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/PlayerAuthColumn.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/PlayerAuthColumn.java new file mode 100644 index 0000000000..43d022b13a --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/columnshandler/PlayerAuthColumn.java @@ -0,0 +1,32 @@ +package fr.xephi.authme.datasource.columnshandler; + +import ch.jalu.configme.properties.Property; +import ch.jalu.datasourcecolumns.ColumnType; +import ch.jalu.datasourcecolumns.DependentColumn; +import fr.xephi.authme.data.auth.PlayerAuth; + +import java.util.function.Function; + +/** + * Implementation for columns which can also be retrieved from a {@link PlayerAuth} object. + * + * @param column type + */ +public class PlayerAuthColumn extends DataSourceColumn implements DependentColumn { + + private final Function playerAuthGetter; + + /* + * Constructor. See parent class for details. + */ + PlayerAuthColumn(ColumnType type, Property nameProperty, boolean isOptional, boolean useDefaultForNull, + Function playerAuthGetter) { + super(type, nameProperty, isOptional, useDefaultForNull); + this.playerAuthGetter = playerAuthGetter; + } + + @Override + public T getValueFromDependent(PlayerAuth auth) { + return playerAuthGetter.apply(auth); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/AbstractDataSourceConverter.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/AbstractDataSourceConverter.java new file mode 100644 index 0000000000..fdced2fa4d --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/AbstractDataSourceConverter.java @@ -0,0 +1,85 @@ +package fr.xephi.authme.datasource.converter; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.datasource.DataSourceType; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import org.bukkit.command.CommandSender; + +import java.util.ArrayList; +import java.util.List; + +import static fr.xephi.authme.util.Utils.logAndSendMessage; + +/** + * Converts from one AuthMe data source type to another. + * + * @param the source type to convert from + */ +public abstract class AbstractDataSourceConverter implements Converter { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(MySqlToSqlite.class); + + private final DataSource destination; + private final DataSourceType destinationType; + + /** + * Constructor. + * + * @param destination the data source to convert to + * @param destinationType the data source type of the destination. The given data source is checked that its + * type corresponds to this type before the conversion is started, enabling us to just pass + * the current data source and letting this class check that the types correspond. + */ + public AbstractDataSourceConverter(DataSource destination, DataSourceType destinationType) { + this.destination = destination; + this.destinationType = destinationType; + } + + // Implementation note: Because of ForceFlatToSqlite it is possible that the CommandSender is null, + // which is never the case when a converter is launched from the /authme converter command. + @Override + public void execute(CommandSender sender) { + if (destinationType != destination.getType()) { + if (sender != null) { + sender.sendMessage("Please configure your connection to " + + destinationType + " and re-run this command"); + } + return; + } + + S source; + try { + source = getSource(); + } catch (Exception e) { + logAndSendMessage(sender, "The data source to convert from could not be initialized"); + logger.logException("Could not initialize source:", e); + return; + } + + List skippedPlayers = new ArrayList<>(); + for (PlayerAuth auth : source.getAllAuths()) { + if (destination.isAuthAvailable(auth.getNickname())) { + skippedPlayers.add(auth.getNickname()); + } else { + destination.saveAuth(auth); + destination.updateSession(auth); + destination.updateQuitLoc(auth); + } + } + + if (!skippedPlayers.isEmpty()) { + logAndSendMessage(sender, "Skipped conversion for players which were already in " + + destinationType + ": " + String.join(", ", skippedPlayers)); + } + logAndSendMessage(sender, "Database successfully converted from " + source.getType() + + " to " + destinationType); + } + + /** + * @return the data source to convert from + * @throws Exception during initialization of source + */ + protected abstract S getSource() throws Exception; +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/Converter.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/Converter.java new file mode 100644 index 0000000000..7549bb481c --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/Converter.java @@ -0,0 +1,16 @@ +package fr.xephi.authme.datasource.converter; + +import org.bukkit.command.CommandSender; + +/** + * Interface for AuthMe converters. + */ +public interface Converter { + + /** + * Execute the conversion. + * + * @param sender the sender who initialized the conversion + */ + void execute(CommandSender sender); +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/CrazyLoginConverter.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/CrazyLoginConverter.java new file mode 100644 index 0000000000..a91972239d --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/CrazyLoginConverter.java @@ -0,0 +1,82 @@ +package fr.xephi.authme.datasource.converter; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.ConverterSettings; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Locale; + +/** + * Converter for CrazyLogin to AuthMe. + */ +public class CrazyLoginConverter implements Converter { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(CrazyLoginConverter.class); + + private final DataSource database; + private final Settings settings; + private final File dataFolder; + + @Inject + CrazyLoginConverter(@DataFolder File dataFolder, DataSource dataSource, Settings settings) { + this.dataFolder = dataFolder; + this.database = dataSource; + this.settings = settings; + } + + @Override + public void execute(CommandSender sender) { + String fileName = settings.getProperty(ConverterSettings.CRAZYLOGIN_FILE_NAME); + File source = new File(dataFolder, fileName); + if (!source.exists()) { + sender.sendMessage("CrazyLogin file not found, please put " + fileName + " in AuthMe folder!"); + return; + } + + String line; + try (BufferedReader users = new BufferedReader(new FileReader(source))) { + while ((line = users.readLine()) != null) { + if (line.contains("|")) { + migrateAccount(line); + } + } + logger.info("CrazyLogin database has been imported correctly"); + } catch (IOException ex) { + logger.warning("Can't open the crazylogin database file! Does it exist?"); + logger.logException("Encountered", ex); + } + } + + /** + * Moves an account from CrazyLogin to the AuthMe database. + * + * @param line line read from the CrazyLogin file (one account) + */ + private void migrateAccount(String line) { + String[] args = line.split("\\|"); + if (args.length < 2 || "name".equalsIgnoreCase(args[0])) { + return; + } + String playerName = args[0]; + String password = args[1]; + if (password != null) { + PlayerAuth auth = PlayerAuth.builder() + .name(playerName.toLowerCase(Locale.ROOT)) + .realName(playerName) + .password(password, null) + .build(); + database.saveAuth(auth); + } + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/H2ToSqlite.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/H2ToSqlite.java new file mode 100644 index 0000000000..03520b80f9 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/H2ToSqlite.java @@ -0,0 +1,33 @@ +package fr.xephi.authme.datasource.converter; + +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.datasource.DataSourceType; +import fr.xephi.authme.datasource.H2; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.settings.Settings; + +import javax.inject.Inject; +import java.io.File; +import java.sql.SQLException; + +/** + * Converts H2 to SQLite. + * + */ +public class H2ToSqlite extends AbstractDataSourceConverter

{ + + private final Settings settings; + private final File dataFolder; + + @Inject + H2ToSqlite(Settings settings, DataSource dataSource, @DataFolder File dataFolder) { + super(dataSource, DataSourceType.SQLITE); + this.settings = settings; + this.dataFolder = dataFolder; + } + + @Override + protected H2 getSource() throws SQLException { + return new H2(settings, dataFolder); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/LoginSecurityConverter.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/LoginSecurityConverter.java new file mode 100644 index 0000000000..dbdce5dfd6 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/LoginSecurityConverter.java @@ -0,0 +1,210 @@ +package fr.xephi.authme.datasource.converter; + +import com.google.common.annotations.VisibleForTesting; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.ConverterSettings; +import fr.xephi.authme.util.UuidUtils; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.io.File; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static fr.xephi.authme.util.Utils.logAndSendMessage; + +/** + * Converts data from LoginSecurity to AuthMe. + */ +public class LoginSecurityConverter implements Converter { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(LoginSecurityConverter.class); + private final File dataFolder; + private final DataSource dataSource; + + private final boolean useSqlite; + private final String mySqlHost; + private final String mySqlDatabase; + private final String mySqlUser; + private final String mySqlPassword; + + @Inject + LoginSecurityConverter(@DataFolder File dataFolder, DataSource dataSource, Settings settings) { + this.dataFolder = dataFolder; + this.dataSource = dataSource; + + useSqlite = settings.getProperty(ConverterSettings.LOGINSECURITY_USE_SQLITE); + mySqlHost = settings.getProperty(ConverterSettings.LOGINSECURITY_MYSQL_HOST); + mySqlDatabase = settings.getProperty(ConverterSettings.LOGINSECURITY_MYSQL_DATABASE); + mySqlUser = settings.getProperty(ConverterSettings.LOGINSECURITY_MYSQL_USER); + mySqlPassword = settings.getProperty(ConverterSettings.LOGINSECURITY_MYSQL_PASSWORD); + } + + @Override + public void execute(CommandSender sender) { + try (Connection connection = createConnectionOrInformSender(sender)) { + if (connection != null) { + performConversion(sender, connection); + logger.info("LoginSecurity conversion completed! Please remember to set \"legacyHashes: ['BCRYPT']\" " + + "in your configuration file!"); + } + } catch (SQLException e) { + sender.sendMessage("Failed to convert from SQLite. Please see the log for more info"); + logger.logException("Could not fetch or migrate data:", e); + } + } + + /** + * Performs the conversion from LoginSecurity to AuthMe. + * + * @param sender the command sender who launched the conversion + * @param connection connection to the LoginSecurity data source + */ + @VisibleForTesting + void performConversion(CommandSender sender, Connection connection) throws SQLException { + try (Statement statement = connection.createStatement()) { + statement.execute( + "SELECT * from ls_players LEFT JOIN ls_locations ON ls_locations.id = ls_players.id"); + try (ResultSet resultSet = statement.getResultSet()) { + migrateData(sender, resultSet); + } + } + } + + /** + * Migrates the accounts. + * + * @param sender the command sender + * @param resultSet result set with the account data to migrate + */ + private void migrateData(CommandSender sender, ResultSet resultSet) throws SQLException { + List skippedPlayers = new ArrayList<>(); + long successfulSaves = 0; + while (resultSet.next()) { + String name = resultSet.getString("last_name"); + if (dataSource.isAuthAvailable(name)) { + skippedPlayers.add(name); + } else { + PlayerAuth auth = buildAuthFromLoginSecurity(name, resultSet); + dataSource.saveAuth(auth); + dataSource.updateSession(auth); + ++successfulSaves; + } + } + + logAndSendMessage(sender, "Migrated " + successfulSaves + " accounts successfully from LoginSecurity"); + if (!skippedPlayers.isEmpty()) { + logAndSendMessage(sender, "Skipped conversion for players which were already in AuthMe: " + + String.join(", ", skippedPlayers)); + } + } + + /** + * Creates a PlayerAuth based on data extracted from the given result set. + * + * @param name the name of the player to build + * @param resultSet the result set to extract data from + * @return the created player auth object + */ + private static PlayerAuth buildAuthFromLoginSecurity(String name, ResultSet resultSet) throws SQLException { + Long lastLoginMillis = Optional.ofNullable(resultSet.getTimestamp("last_login")) + .map(Timestamp::getTime).orElse(null); + long regDate = Optional.ofNullable(resultSet.getDate("registration_date")) + .map(Date::getTime).orElse(System.currentTimeMillis()); + UUID uuid = UuidUtils.parseUuidSafely(resultSet.getString("unique_user_id")); + return PlayerAuth.builder() + .name(name) + .realName(name) + .password(resultSet.getString("password"), null) + .lastIp(resultSet.getString("ip_address")) + .lastLogin(lastLoginMillis) + .registrationDate(regDate) + .locX(resultSet.getDouble("x")) + .locY(resultSet.getDouble("y")) + .locZ(resultSet.getDouble("z")) + .locWorld(resultSet.getString("world")) + .locYaw(resultSet.getFloat("yaw")) + .locPitch(resultSet.getFloat("pitch")) + .uuid(uuid) + .build(); + } + + /** + * Creates a {@link Connection} to the LoginSecurity data source based on the settings, + * or informs the sender of the error that occurred. + * + * @param sender the command sender who launched the conversion + * @return the created connection object, or null if it failed + */ + private Connection createConnectionOrInformSender(CommandSender sender) { + Connection connection; + if (useSqlite) { + File sqliteDatabase = new File(dataFolder.getParentFile(), "LoginSecurity/LoginSecurity.db"); + if (!sqliteDatabase.exists()) { + sender.sendMessage("The file '" + sqliteDatabase.getPath() + "' does not exist"); + return null; + } + connection = createSqliteConnection("plugins/LoginSecurity/LoginSecurity.db"); + } else { + if (mySqlDatabase.isEmpty() || mySqlUser.isEmpty()) { + sender.sendMessage("The LoginSecurity database or username is not configured in AuthMe's config.yml"); + return null; + } + connection = createMySqlConnection(); + } + + if (connection == null) { + sender.sendMessage("Could not connect to LoginSecurity using Sqlite = " + + useSqlite + ", see log for more info"); + return null; + } + return connection; + } + + /** + * Creates a connection to SQLite. + * + * @param path the path to the SQLite database + * @return the created connection + */ + @VisibleForTesting + Connection createSqliteConnection(String path) { + try { + Class.forName("org.sqlite.JDBC"); + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + + try { + return DriverManager.getConnection( + "jdbc:sqlite:" + path, "trump", "donald"); + } catch (SQLException e) { + logger.logException("Could not connect to SQLite database", e); + return null; + } + } + + private Connection createMySqlConnection() { + try { + return DriverManager.getConnection( + "jdbc:mysql://" + mySqlHost + "/" + mySqlDatabase, mySqlUser, mySqlPassword); + } catch (SQLException e) { + logger.logException("Could not connect to SQLite database", e); + return null; + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/MySqlToSqlite.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/MySqlToSqlite.java new file mode 100644 index 0000000000..b1a485b979 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/MySqlToSqlite.java @@ -0,0 +1,31 @@ +package fr.xephi.authme.datasource.converter; + +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.datasource.DataSourceType; +import fr.xephi.authme.datasource.MySQL; +import fr.xephi.authme.datasource.mysqlextensions.MySqlExtensionsFactory; +import fr.xephi.authme.settings.Settings; + +import javax.inject.Inject; +import java.sql.SQLException; + +/** + * Converts from MySQL to SQLite. + */ +public class MySqlToSqlite extends AbstractDataSourceConverter { + + private final Settings settings; + private final MySqlExtensionsFactory mySqlExtensionsFactory; + + @Inject + MySqlToSqlite(DataSource dataSource, Settings settings, MySqlExtensionsFactory mySqlExtensionsFactory) { + super(dataSource, DataSourceType.SQLITE); + this.settings = settings; + this.mySqlExtensionsFactory = mySqlExtensionsFactory; + } + + @Override + protected MySQL getSource() throws SQLException { + return new MySQL(settings, mySqlExtensionsFactory); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/RoyalAuthConverter.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/RoyalAuthConverter.java new file mode 100644 index 0000000000..ebb9080e09 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/RoyalAuthConverter.java @@ -0,0 +1,61 @@ +package fr.xephi.authme.datasource.converter; + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import javax.inject.Inject; +import java.io.File; +import java.util.Locale; + +import static fr.xephi.authme.util.FileUtils.makePath; + +public class RoyalAuthConverter implements Converter { + + private static final String LAST_LOGIN_PATH = "timestamps.quit"; + private static final String PASSWORD_PATH = "login.password"; + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(RoyalAuthConverter.class); + + private final AuthMe plugin; + private final DataSource dataSource; + + @Inject + RoyalAuthConverter(AuthMe plugin, DataSource dataSource) { + this.plugin = plugin; + this.dataSource = dataSource; + } + + @Override + public void execute(CommandSender sender) { + for (OfflinePlayer player : plugin.getServer().getOfflinePlayers()) { + try { + String name = player.getName().toLowerCase(Locale.ROOT); + File file = new File(makePath(".", "plugins", "RoyalAuth", "userdata", name + ".yml")); + + if (dataSource.isAuthAvailable(name) || !file.exists()) { + continue; + } + FileConfiguration configuration = YamlConfiguration.loadConfiguration(file); + PlayerAuth auth = PlayerAuth.builder() + .name(name) + .password(configuration.getString(PASSWORD_PATH), null) + .lastLogin(configuration.getLong(LAST_LOGIN_PATH)) + .realName(player.getName()) + .build(); + + dataSource.saveAuth(auth); + dataSource.updateSession(auth); + } catch (Exception e) { + logger.logException("Error while trying to import " + player.getName() + " RoyalAuth data", e); + } + } + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/SqliteToH2.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/SqliteToH2.java new file mode 100644 index 0000000000..eea2bfcab6 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/SqliteToH2.java @@ -0,0 +1,33 @@ +package fr.xephi.authme.datasource.converter; + +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.datasource.DataSourceType; +import fr.xephi.authme.datasource.SQLite; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.settings.Settings; + +import javax.inject.Inject; +import java.io.File; +import java.sql.SQLException; + +/** + * Converts SQLite to H2 + * + */ +public class SqliteToH2 extends AbstractDataSourceConverter{ + + private final Settings settings; + private final File dataFolder; + + @Inject + SqliteToH2(Settings settings, DataSource dataSource, @DataFolder File dataFolder) { + super(dataSource, DataSourceType.H2); + this.settings = settings; + this.dataFolder = dataFolder; + } + + @Override + protected SQLite getSource() throws SQLException { + return new SQLite(settings, dataFolder); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/SqliteToSql.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/SqliteToSql.java new file mode 100644 index 0000000000..cc472da28a --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/SqliteToSql.java @@ -0,0 +1,32 @@ +package fr.xephi.authme.datasource.converter; + +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.datasource.DataSourceType; +import fr.xephi.authme.datasource.SQLite; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.settings.Settings; + +import javax.inject.Inject; +import java.io.File; +import java.sql.SQLException; + +/** + * Converts from SQLite to MySQL. + */ +public class SqliteToSql extends AbstractDataSourceConverter { + + private final Settings settings; + private final File dataFolder; + + @Inject + SqliteToSql(Settings settings, DataSource dataSource, @DataFolder File dataFolder) { + super(dataSource, DataSourceType.MYSQL); + this.settings = settings; + this.dataFolder = dataFolder; + } + + @Override + protected SQLite getSource() throws SQLException { + return new SQLite(settings, dataFolder); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/XAuthConverter.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/XAuthConverter.java new file mode 100644 index 0000000000..0f04310cb8 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/converter/XAuthConverter.java @@ -0,0 +1,149 @@ +package fr.xephi.authme.datasource.converter; + +import de.luricos.bukkit.xAuth.database.DatabaseTables; +import de.luricos.bukkit.xAuth.utils.xAuthLog; +import de.luricos.bukkit.xAuth.xAuth; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.util.Utils; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.PluginManager; + +import javax.inject.Inject; +import java.io.File; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import static fr.xephi.authme.util.FileUtils.makePath; + +public class XAuthConverter implements Converter { + + @Inject + @DataFolder + private File dataFolder; + @Inject + private DataSource database; + @Inject + private PluginManager pluginManager; + + XAuthConverter() { + } + + @Override + public void execute(CommandSender sender) { + try { + Class.forName("de.luricos.bukkit.xAuth.xAuth"); + convert(sender); + } catch (ClassNotFoundException ce) { + sender.sendMessage("xAuth has not been found, please put xAuth.jar in your plugin folder and restart!"); + } + } + + private void convert(CommandSender sender) { + if (pluginManager.getPlugin("xAuth") == null) { + sender.sendMessage("[AuthMe] xAuth plugin not found"); + return; + } + //TODO ljacqu 20160702: xAuthDb is not used except for the existence check -- is this intended? + File xAuthDb = new File(dataFolder.getParent(), makePath("xAuth", "xAuth.h2.db")); + if (!xAuthDb.exists()) { + sender.sendMessage("[AuthMe] xAuth H2 database not found, checking for MySQL or SQLite data..."); + } + List players = getXAuthPlayers(); + if (Utils.isCollectionEmpty(players)) { + sender.sendMessage("[AuthMe] Error while importing xAuthPlayers: did not find any players"); + return; + } + sender.sendMessage("[AuthMe] Starting import..."); + + for (int id : players) { + String pl = getIdPlayer(id); + String psw = getPassword(id); + if (psw != null && !psw.isEmpty() && pl != null) { + PlayerAuth auth = PlayerAuth.builder() + .name(pl.toLowerCase(Locale.ROOT)) + .realName(pl) + .password(psw, null).build(); + database.saveAuth(auth); + } + } + sender.sendMessage("[AuthMe] Successfully converted from xAuth database"); + } + + private String getIdPlayer(int id) { + String realPass = ""; + Connection conn = xAuth.getPlugin().getDatabaseController().getConnection(); + PreparedStatement ps = null; + ResultSet rs = null; + try { + String sql = String.format("SELECT `playername` FROM `%s` WHERE `id` = ?", + xAuth.getPlugin().getDatabaseController().getTable(DatabaseTables.ACCOUNT)); + ps = conn.prepareStatement(sql); + ps.setInt(1, id); + rs = ps.executeQuery(); + if (!rs.next()) { + return null; + } + realPass = rs.getString("playername").toLowerCase(Locale.ROOT); + } catch (SQLException e) { + xAuthLog.severe("Failed to retrieve name for account: " + id, e); + return null; + } finally { + xAuth.getPlugin().getDatabaseController().close(conn, ps, rs); + } + return realPass; + } + + private List getXAuthPlayers() { + List xP = new ArrayList<>(); + Connection conn = xAuth.getPlugin().getDatabaseController().getConnection(); + PreparedStatement ps = null; + ResultSet rs = null; + try { + String sql = String.format("SELECT * FROM `%s`", + xAuth.getPlugin().getDatabaseController().getTable(DatabaseTables.ACCOUNT)); + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + while (rs.next()) { + xP.add(rs.getInt("id")); + } + } catch (SQLException e) { + xAuthLog.severe("Cannot import xAuthPlayers", e); + return new ArrayList<>(); + } finally { + xAuth.getPlugin().getDatabaseController().close(conn, ps, rs); + } + return xP; + } + + private String getPassword(int accountId) { + String realPass = ""; + Connection conn = xAuth.getPlugin().getDatabaseController().getConnection(); + PreparedStatement ps = null; + ResultSet rs = null; + try { + String sql = String.format("SELECT `password`, `pwtype` FROM `%s` WHERE `id` = ?", + xAuth.getPlugin().getDatabaseController().getTable(DatabaseTables.ACCOUNT)); + ps = conn.prepareStatement(sql); + ps.setInt(1, accountId); + rs = ps.executeQuery(); + if (!rs.next()) { + return null; + } + realPass = rs.getString("password"); + } catch (SQLException e) { + xAuthLog.severe("Failed to retrieve password hash for account: " + accountId, e); + return null; + } finally { + xAuth.getPlugin().getDatabaseController().close(conn, ps, rs); + } + return realPass; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/Ipb4Extension.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/Ipb4Extension.java new file mode 100644 index 0000000000..2f39b8f7dc --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/Ipb4Extension.java @@ -0,0 +1,55 @@ +package fr.xephi.authme.datasource.mysqlextensions; + +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.Columns; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.HooksSettings; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +/** + * Extension for IPB4. + */ +class Ipb4Extension extends MySqlExtension { + + private final String ipbPrefix; + private final int ipbGroup; + + Ipb4Extension(Settings settings, Columns col) { + super(settings, col); + this.ipbPrefix = settings.getProperty(HooksSettings.IPB_TABLE_PREFIX); + this.ipbGroup = settings.getProperty(HooksSettings.IPB_ACTIVATED_GROUP_ID); + } + + @Override + public void saveAuth(PlayerAuth auth, Connection con) throws SQLException { + // Update player group in core_members + String sql = "UPDATE " + ipbPrefix + tableName + + " SET " + tableName + ".member_group_id=? WHERE " + col.NAME + "=?;"; + try (PreparedStatement pst2 = con.prepareStatement(sql)) { + pst2.setInt(1, ipbGroup); + pst2.setString(2, auth.getNickname()); + pst2.executeUpdate(); + } + // Get current time without ms + long time = System.currentTimeMillis() / 1000; + // update joined date + sql = "UPDATE " + ipbPrefix + tableName + + " SET " + tableName + ".joined=? WHERE " + col.NAME + "=?;"; + try (PreparedStatement pst2 = con.prepareStatement(sql)) { + pst2.setLong(1, time); + pst2.setString(2, auth.getNickname()); + pst2.executeUpdate(); + } + // Update last_visit + sql = "UPDATE " + ipbPrefix + tableName + + " SET " + tableName + ".last_visit=? WHERE " + col.NAME + "=?;"; + try (PreparedStatement pst2 = con.prepareStatement(sql)) { + pst2.setLong(1, time); + pst2.setString(2, auth.getNickname()); + pst2.executeUpdate(); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/MySqlExtension.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/MySqlExtension.java new file mode 100644 index 0000000000..07374dfbd2 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/MySqlExtension.java @@ -0,0 +1,96 @@ +package fr.xephi.authme.datasource.mysqlextensions; + +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.Columns; +import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.DatabaseSettings; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.OptionalInt; + +/** + * Extension for the MySQL data source for forums. For certain password hashes (e.g. phpBB), we want + * to hook into the forum board and execute some actions specific to the forum software. + */ +public abstract class MySqlExtension { + + protected final Columns col; + protected final String tableName; + + MySqlExtension(Settings settings, Columns col) { + this.col = col; + this.tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE); + } + + /** + * Performs additional actions when a new player is saved. + * + * @param auth the player auth that has been saved + * @param con connection to the sql table + * @throws SQLException . + */ + public void saveAuth(PlayerAuth auth, Connection con) throws SQLException { + // extend for custom behavior + } + + /** + * Writes properties to the given PlayerAuth object that need to be retrieved in a specific manner + * when a PlayerAuth object is read from the table. + * + * @param auth the player auth object to extend + * @param id the database id of the player auth entry + * @param con connection to the sql table + * @throws SQLException . + */ + public void extendAuth(PlayerAuth auth, int id, Connection con) throws SQLException { + // extend for custom behavior + } + + /** + * Performs additional actions when a user's password is changed. + * + * @param user the name of the player (lowercase) + * @param password the new password to set + * @param con connection to the sql table + * @throws SQLException . + */ + public void changePassword(String user, HashedPassword password, Connection con) throws SQLException { + // extend for custom behavior + } + + /** + * Performs additional actions when a player is removed from the database. + * + * @param user the user to remove + * @param con connection to the sql table + * @throws SQLException . + */ + public void removeAuth(String user, Connection con) throws SQLException { + // extend for custom behavior + } + + /** + * Fetches the database ID of the given name from the database. + * + * @param name the name to get the ID for + * @param con connection to the sql table + * @return id of the playerAuth, or empty OptionalInt if the name is not registered + * @throws SQLException . + */ + protected OptionalInt retrieveIdFromTable(String name, Connection con) throws SQLException { + String sql = "SELECT " + col.ID + " FROM " + tableName + " WHERE " + col.NAME + "=?;"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setString(1, name); + try (ResultSet rs = pst.executeQuery()) { + if (rs.next()) { + return OptionalInt.of(rs.getInt(col.ID)); + } + } + } + return OptionalInt.empty(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/MySqlExtensionsFactory.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/MySqlExtensionsFactory.java new file mode 100644 index 0000000000..dda94d784f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/MySqlExtensionsFactory.java @@ -0,0 +1,39 @@ +package fr.xephi.authme.datasource.mysqlextensions; + +import fr.xephi.authme.datasource.Columns; +import fr.xephi.authme.security.HashAlgorithm; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.SecuritySettings; + +import javax.inject.Inject; + +/** + * Creates the appropriate {@link MySqlExtension}, depending on the configured password hashing algorithm. + */ +public class MySqlExtensionsFactory { + + @Inject + private Settings settings; + + /** + * Creates a new {@link MySqlExtension} object according to the configured hash algorithm. + * + * @param columnsConfig the columns configuration + * @return the extension the MySQL data source should use + */ + public MySqlExtension buildExtension(Columns columnsConfig) { + HashAlgorithm hash = settings.getProperty(SecuritySettings.PASSWORD_HASH); + switch (hash) { + case IPB4: + return new Ipb4Extension(settings, columnsConfig); + case PHPBB: + return new PhpBbExtension(settings, columnsConfig); + case WORDPRESS: + return new WordpressExtension(settings, columnsConfig); + case XFBCRYPT: + return new XfBcryptExtension(settings, columnsConfig); + default: + return new NoOpExtension(settings, columnsConfig); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/NoOpExtension.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/NoOpExtension.java new file mode 100644 index 0000000000..6d15f837be --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/NoOpExtension.java @@ -0,0 +1,14 @@ +package fr.xephi.authme.datasource.mysqlextensions; + +import fr.xephi.authme.datasource.Columns; +import fr.xephi.authme.settings.Settings; + +/** + * Extension implementation that does not do anything. + */ +class NoOpExtension extends MySqlExtension { + + NoOpExtension(Settings settings, Columns col) { + super(settings, col); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/PhpBbExtension.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/PhpBbExtension.java new file mode 100644 index 0000000000..d78aded156 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/PhpBbExtension.java @@ -0,0 +1,83 @@ +package fr.xephi.authme.datasource.mysqlextensions; + +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.Columns; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.HooksSettings; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.OptionalInt; + +/** + * Extensions for phpBB when MySQL is used as data source. + */ +class PhpBbExtension extends MySqlExtension { + + private final String phpBbPrefix; + private final int phpBbGroup; + + PhpBbExtension(Settings settings, Columns col) { + super(settings, col); + this.phpBbPrefix = settings.getProperty(HooksSettings.PHPBB_TABLE_PREFIX); + this.phpBbGroup = settings.getProperty(HooksSettings.PHPBB_ACTIVATED_GROUP_ID); + } + + @Override + public void saveAuth(PlayerAuth auth, Connection con) throws SQLException { + OptionalInt authId = retrieveIdFromTable(auth.getNickname(), con); + if (authId.isPresent()) { + updateSpecificsOnSave(authId.getAsInt(), auth.getNickname(), con); + } + } + + private void updateSpecificsOnSave(int id, String name, Connection con) throws SQLException { + // Insert player in phpbb_user_group + String sql = "INSERT INTO " + phpBbPrefix + + "user_group (group_id, user_id, group_leader, user_pending) VALUES (?,?,?,?);"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setInt(1, phpBbGroup); + pst.setInt(2, id); + pst.setInt(3, 0); + pst.setInt(4, 0); + pst.executeUpdate(); + } + // Update username_clean in phpbb_users + sql = "UPDATE " + tableName + " SET " + tableName + ".username_clean=? WHERE " + col.NAME + "=?;"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setString(1, name); + pst.setString(2, name); + pst.executeUpdate(); + } + // Update player group in phpbb_users + sql = "UPDATE " + tableName + " SET " + tableName + ".group_id=? WHERE " + col.NAME + "=?;"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setInt(1, phpBbGroup); + pst.setString(2, name); + pst.executeUpdate(); + } + // Get current time without ms + long time = System.currentTimeMillis() / 1000; + // Update user_regdate + sql = "UPDATE " + tableName + " SET " + tableName + ".user_regdate=? WHERE " + col.NAME + "=?;"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setLong(1, time); + pst.setString(2, name); + pst.executeUpdate(); + } + // Update user_lastvisit + sql = "UPDATE " + tableName + " SET " + tableName + ".user_lastvisit=? WHERE " + col.NAME + "=?;"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setLong(1, time); + pst.setString(2, name); + pst.executeUpdate(); + } + // Increment num_users + sql = "UPDATE " + phpBbPrefix + + "config SET config_value = config_value + 1 WHERE config_name = 'num_users';"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.executeUpdate(); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/WordpressExtension.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/WordpressExtension.java new file mode 100644 index 0000000000..8105d2e551 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/WordpressExtension.java @@ -0,0 +1,84 @@ +package fr.xephi.authme.datasource.mysqlextensions; + +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.Columns; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.HooksSettings; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.OptionalInt; + +/** + * MySQL extensions for Wordpress. + */ +class WordpressExtension extends MySqlExtension { + + private final String wordpressPrefix; + + WordpressExtension(Settings settings, Columns col) { + super(settings, col); + this.wordpressPrefix = settings.getProperty(HooksSettings.WORDPRESS_TABLE_PREFIX); + } + + @Override + public void saveAuth(PlayerAuth auth, Connection con) throws SQLException { + OptionalInt authId = retrieveIdFromTable(auth.getNickname(), con); + if (authId.isPresent()) { + saveSpecifics(auth, authId.getAsInt(), con); + } + } + + /** + * Saves the required data to Wordpress tables. + * + * @param auth the player data + * @param id the player id + * @param con the sql connection + * @throws SQLException . + */ + private void saveSpecifics(PlayerAuth auth, int id, Connection con) throws SQLException { + String sql = "INSERT INTO " + wordpressPrefix + "usermeta (user_id, meta_key, meta_value) VALUES (?,?,?)"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + + new UserMetaBatchAdder(pst, id) + .addMetaRow("first_name", "") + .addMetaRow("last_name", "") + .addMetaRow("nickname", auth.getNickname()) + .addMetaRow("description", "") + .addMetaRow("rich_editing", "true") + .addMetaRow("comment_shortcuts", "false") + .addMetaRow("admin_color", "fresh") + .addMetaRow("use_ssl", "0") + .addMetaRow("show_admin_bar_front", "true") + .addMetaRow(wordpressPrefix + "capabilities", "a:1:{s:10:\"subscriber\";b:1;}") + .addMetaRow(wordpressPrefix + "user_level", "0") + .addMetaRow("default_password_nag", ""); + + // Execute queries + pst.executeBatch(); + pst.clearBatch(); + } + } + + /** Helper to add batch entries to the wrapped prepared statement. */ + private static final class UserMetaBatchAdder { + + private final PreparedStatement pst; + private final int userId; + + UserMetaBatchAdder(PreparedStatement pst, int userId) { + this.pst = pst; + this.userId = userId; + } + + UserMetaBatchAdder addMetaRow(String metaKey, String metaValue) throws SQLException { + pst.setInt(1, userId); + pst.setString(2, metaKey); + pst.setString(3, metaValue); + pst.addBatch(); + return this; + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/XfBcryptExtension.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/XfBcryptExtension.java new file mode 100644 index 0000000000..8d2a1ee94f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/datasource/mysqlextensions/XfBcryptExtension.java @@ -0,0 +1,148 @@ +package fr.xephi.authme.datasource.mysqlextensions; + +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.Columns; +import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.security.crypts.XfBCrypt; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.HooksSettings; + +import java.sql.Blob; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.OptionalInt; + +/** + * Extension for XFBCRYPT. + */ +class XfBcryptExtension extends MySqlExtension { + + private final String xfPrefix; + private final int xfGroup; + + XfBcryptExtension(Settings settings, Columns col) { + super(settings, col); + this.xfPrefix = settings.getProperty(HooksSettings.XF_TABLE_PREFIX); + this.xfGroup = settings.getProperty(HooksSettings.XF_ACTIVATED_GROUP_ID); + } + + @Override + public void saveAuth(PlayerAuth auth, Connection con) throws SQLException { + OptionalInt authId = retrieveIdFromTable(auth.getNickname(), con); + if (authId.isPresent()) { + updateXenforoTablesOnSave(auth, authId.getAsInt(), con); + } + } + + /** + * Updates the xenforo tables after a player auth has been saved. + * + * @param auth the player auth which was saved + * @param id the account id + * @param con connection to the database + */ + private void updateXenforoTablesOnSave(PlayerAuth auth, int id, Connection con) throws SQLException { + // Insert player password, salt in xf_user_authenticate + String sql = "INSERT INTO " + xfPrefix + "user_authenticate (user_id, scheme_class, data) VALUES (?,?,?)"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setInt(1, id); + pst.setString(2, XfBCrypt.SCHEME_CLASS); + String serializedHash = XfBCrypt.serializeHash(auth.getPassword().getHash()); + byte[] bytes = serializedHash.getBytes(); + Blob blob = con.createBlob(); + blob.setBytes(1, bytes); + pst.setBlob(3, blob); + pst.executeUpdate(); + } + // Update player group in xf_users + sql = "UPDATE " + tableName + " SET " + tableName + ".user_group_id=? WHERE " + col.NAME + "=?;"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setInt(1, xfGroup); + pst.setString(2, auth.getNickname()); + pst.executeUpdate(); + } + // Update player permission combination in xf_users + sql = "UPDATE " + tableName + " SET " + tableName + ".permission_combination_id=? WHERE " + col.NAME + "=?;"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setInt(1, xfGroup); + pst.setString(2, auth.getNickname()); + pst.executeUpdate(); + } + // Insert player privacy combination in xf_user_privacy + sql = "INSERT INTO " + xfPrefix + "user_privacy (user_id, allow_view_profile, allow_post_profile, " + + "allow_send_personal_conversation, allow_view_identities, allow_receive_news_feed) VALUES (?,?,?,?,?,?)"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setInt(1, id); + pst.setString(2, "everyone"); + pst.setString(3, "members"); + pst.setString(4, "members"); + pst.setString(5, "everyone"); + pst.setString(6, "everyone"); + pst.executeUpdate(); + } + // Insert player group relation in xf_user_group_relation + sql = "INSERT INTO " + xfPrefix + "user_group_relation (user_id, user_group_id, is_primary) VALUES (?,?,?)"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setInt(1, id); + pst.setInt(2, xfGroup); + pst.setString(3, "1"); + pst.executeUpdate(); + } + } + + @Override + public void extendAuth(PlayerAuth auth, int id, Connection con) throws SQLException { + try (PreparedStatement pst = con.prepareStatement( + "SELECT data FROM " + xfPrefix + "user_authenticate WHERE " + col.ID + "=?;")) { + pst.setInt(1, id); + try (ResultSet rs = pst.executeQuery()) { + if (rs.next()) { + Blob blob = rs.getBlob("data"); + byte[] bytes = blob.getBytes(1, (int) blob.length()); + auth.setPassword(new HashedPassword(XfBCrypt.getHashFromBlob(bytes))); + } + } + } + } + + @Override + public void changePassword(String user, HashedPassword password, Connection con) throws SQLException { + OptionalInt authId = retrieveIdFromTable(user, con); + if (authId.isPresent()) { + final int id = authId.getAsInt(); + // Insert password in the correct table + String sql = "UPDATE " + xfPrefix + "user_authenticate SET data=? WHERE " + col.ID + "=?;"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + String serializedHash = XfBCrypt.serializeHash(password.getHash()); + byte[] bytes = serializedHash.getBytes(); + Blob blob = con.createBlob(); + blob.setBytes(1, bytes); + pst.setBlob(1, blob); + pst.setInt(2, id); + pst.executeUpdate(); + } + + // ... + sql = "UPDATE " + xfPrefix + "user_authenticate SET scheme_class=? WHERE " + col.ID + "=?;"; + try (PreparedStatement pst = con.prepareStatement(sql)) { + pst.setString(1, XfBCrypt.SCHEME_CLASS); + pst.setInt(2, id); + pst.executeUpdate(); + } + } + } + + @Override + public void removeAuth(String user, Connection con) throws SQLException { + OptionalInt authId = retrieveIdFromTable(user, con); + if (authId.isPresent()) { + String sql = "DELETE FROM " + xfPrefix + "user_authenticate WHERE " + col.ID + "=?;"; + try (PreparedStatement xfDelete = con.prepareStatement(sql)) { + xfDelete.setInt(1, authId.getAsInt()); + xfDelete.executeUpdate(); + } + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AbstractTeleportEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AbstractTeleportEvent.java new file mode 100644 index 0000000000..51d366d90b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AbstractTeleportEvent.java @@ -0,0 +1,78 @@ +package fr.xephi.authme.events; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; + +/** + * Common supertype for all AuthMe teleport events. + */ +public abstract class AbstractTeleportEvent extends CustomEvent implements Cancellable { + + private final Player player; + private final Location from; + private Location to; + private boolean isCancelled; + + /** + * Constructor. + * + * @param isAsync Whether to fire the event asynchronously or not + * @param player The player + * @param to The teleport destination + */ + public AbstractTeleportEvent(boolean isAsync, Player player, Location to) { + super(isAsync); + this.player = player; + this.from = player.getLocation(); + this.to = to; + } + + /** + * Return the player planned to be teleported. + * + * @return The player + */ + public Player getPlayer() { + return player; + } + + /** + * Return the location the player is being teleported away from. + * + * @return The location prior to the teleport + */ + public Location getFrom() { + return from; + } + + /** + * Set the destination of the teleport. + * + * @param to The location to teleport the player to + */ + public void setTo(Location to) { + this.to = to; + } + + /** + * Return the destination the player is being teleported to. + * + * @return The teleport destination + */ + public Location getTo() { + return to; + } + + @Override + public void setCancelled(boolean isCancelled) { + this.isCancelled = isCancelled; + } + + @Override + public boolean isCancelled() { + return isCancelled; + } + + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AbstractUnregisterEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AbstractUnregisterEvent.java new file mode 100644 index 0000000000..ac07b2ced9 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AbstractUnregisterEvent.java @@ -0,0 +1,33 @@ +package fr.xephi.authme.events; + +import org.bukkit.entity.Player; + +/** + * Event fired when a player has been unregistered. + */ +public abstract class AbstractUnregisterEvent extends CustomEvent { + + private final Player player; + + /** + * Constructor for a player that has unregistered himself. + * + * @param player the player + * @param isAsync if the event is called asynchronously + */ + public AbstractUnregisterEvent(Player player, boolean isAsync) { + super(isAsync); + this.player = player; + } + + /** + * Returns the player that has been unregistered. + *

+ * This may be {@code null}! Please refer to the implementations of this class for details. + * + * @return the unregistered player, or null + */ + public Player getPlayer() { + return player; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AuthMeAsyncPreLoginEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AuthMeAsyncPreLoginEvent.java new file mode 100644 index 0000000000..dd2e21c3dd --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AuthMeAsyncPreLoginEvent.java @@ -0,0 +1,70 @@ +package fr.xephi.authme.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * This event is called when a player uses the login command, + * it's fired even when a user does a /login with invalid password. + * {@link #setCanLogin(boolean) event.setCanLogin(false)} prevents the player from logging in. + */ +public class AuthMeAsyncPreLoginEvent extends CustomEvent { + + private static final HandlerList handlers = new HandlerList(); + private final Player player; + private boolean canLogin = true; + + /** + * Constructor. + * + * @param player The player + * @param isAsync True if the event is async, false otherwise + */ + public AuthMeAsyncPreLoginEvent(Player player, boolean isAsync) { + super(isAsync); + this.player = player; + } + + /** + * Return the player concerned by this event. + * + * @return The player who executed a valid {@code /login} command + */ + public Player getPlayer() { + return player; + } + + /** + * Return whether the player is allowed to log in. + * + * @return True if the player can log in, false otherwise + */ + public boolean canLogin() { + return canLogin; + } + + /** + * Define whether or not the player may log in. + * + * @param canLogin True to allow the player to log in; false to prevent him + */ + public void setCanLogin(boolean canLogin) { + this.canLogin = canLogin; + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AuthMeAsyncPreRegisterEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AuthMeAsyncPreRegisterEvent.java new file mode 100644 index 0000000000..af26ad518f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AuthMeAsyncPreRegisterEvent.java @@ -0,0 +1,70 @@ +package fr.xephi.authme.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * This event is called when a player uses the register command, + * it's fired even when a user does a /register with invalid arguments. + * {@link #setCanRegister(boolean) event.setCanRegister(false)} prevents the player from registering. + */ +public class AuthMeAsyncPreRegisterEvent extends CustomEvent { + + private static final HandlerList handlers = new HandlerList(); + private final Player player; + private boolean canRegister = true; + + /** + * Constructor. + * + * @param player The player + * @param isAsync True if the event is async, false otherwise + */ + public AuthMeAsyncPreRegisterEvent(Player player, boolean isAsync) { + super(isAsync); + this.player = player; + } + + /** + * Return the player concerned by this event. + * + * @return The player who executed a valid {@code /login} command + */ + public Player getPlayer() { + return player; + } + + /** + * Return whether the player is allowed to register. + * + * @return True if the player can log in, false otherwise + */ + public boolean canRegister() { + return canRegister; + } + + /** + * Define whether or not the player may register. + * + * @param canRegister True to allow the player to log in; false to prevent him + */ + public void setCanRegister(boolean canRegister) { + this.canRegister = canRegister; + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AuthMeTeleportEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AuthMeTeleportEvent.java new file mode 100644 index 0000000000..ed8a08d351 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/AuthMeTeleportEvent.java @@ -0,0 +1,39 @@ +package fr.xephi.authme.events; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * This event is fired before AuthMe teleports a player for general purposes. + */ +public class AuthMeTeleportEvent extends AbstractTeleportEvent { + + private static final HandlerList handlers = new HandlerList(); + + /** + * Constructor. + * + * @param player The player + * @param to The teleport destination + */ + public AuthMeTeleportEvent(Player player, Location to) { + super(false, player, to); + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/CustomEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/CustomEvent.java new file mode 100644 index 0000000000..f647b6d597 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/CustomEvent.java @@ -0,0 +1,27 @@ +package fr.xephi.authme.events; + +import org.bukkit.event.Event; + +/** + * The parent of all AuthMe events. + */ +public abstract class CustomEvent extends Event { + + /** + * Constructor. + */ + public CustomEvent() { + super(false); + } + + /** + * Constructor, specifying whether the event is asynchronous or not. + * + * @param isAsync {@code true} to fire the event asynchronously, false otherwise + * @see Event#Event(boolean) + */ + public CustomEvent(boolean isAsync) { + super(isAsync); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/EmailChangedEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/EmailChangedEvent.java new file mode 100644 index 0000000000..e489c20282 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/EmailChangedEvent.java @@ -0,0 +1,85 @@ +package fr.xephi.authme.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * This event is called when a player adds or changes his email address. + */ +public class EmailChangedEvent extends CustomEvent implements Cancellable { + private static final HandlerList handlers = new HandlerList(); + private final Player player; + private final String oldEmail; + private final String newEmail; + private boolean isCancelled; + + /** + * Constructor + * + * @param player The player that changed email + * @param oldEmail Old email player had on file. Can be null when user adds an email + * @param newEmail New email that player tries to set. In case of adding email, this will contain + * the email is trying to set. + * @param isAsync should this event be called asynchronously? + */ + public EmailChangedEvent(Player player, String oldEmail, String newEmail, boolean isAsync) { + super(isAsync); + this.player = player; + this.oldEmail = oldEmail; + this.newEmail = newEmail; + } + + @Override + public boolean isCancelled() { + return isCancelled; + } + + /** + * Gets the player who changes the email + * + * @return The player who changed the email + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the old email in case user tries to change existing email. + * + * @return old email stored on file. Can be null when user never had an email and adds a new one. + */ + public String getOldEmail() { + return this.oldEmail; + } + + /** + * Gets the new email. + * + * @return the email user is trying to set. If user adds email and never had one before, + * this is where such email can be found. + */ + public String getNewEmail() { + return this.newEmail; + } + + @Override + public void setCancelled(boolean cancelled) { + this.isCancelled = cancelled; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/FailedLoginEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/FailedLoginEvent.java new file mode 100644 index 0000000000..c80ce65b85 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/FailedLoginEvent.java @@ -0,0 +1,46 @@ +package fr.xephi.authme.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * Event fired when a player enters a wrong password. + */ +public class FailedLoginEvent extends CustomEvent { + + private static final HandlerList handlers = new HandlerList(); + private final Player player; + + /** + * Constructor. + * + * @param player The player + * @param isAsync if the event is called asynchronously + */ + public FailedLoginEvent(Player player, boolean isAsync) { + super(isAsync); + this.player = player; + } + + /** + * @return The player entering a wrong password + */ + public Player getPlayer() { + return player; + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/FirstSpawnTeleportEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/FirstSpawnTeleportEvent.java new file mode 100644 index 0000000000..e5e6868d85 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/FirstSpawnTeleportEvent.java @@ -0,0 +1,40 @@ +package fr.xephi.authme.events; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * Event that is called if a player is teleported to the AuthMe first spawn, i.e. to the + * spawn location for players who have never played before. + */ +public class FirstSpawnTeleportEvent extends AbstractTeleportEvent { + + private static final HandlerList handlers = new HandlerList(); + + /** + * Constructor. + * + * @param player The player + * @param to The teleport destination + */ + public FirstSpawnTeleportEvent(Player player, Location to) { + super(false, player, to); + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/LoginEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/LoginEvent.java new file mode 100644 index 0000000000..eb38d62667 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/LoginEvent.java @@ -0,0 +1,58 @@ +package fr.xephi.authme.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * Event fired when a player has successfully logged in or registered. + */ +public class LoginEvent extends CustomEvent { + + private static final HandlerList handlers = new HandlerList(); + private final Player player; + + /** + * Constructor. + * + * @param player The player + */ + public LoginEvent(Player player) { + this.player = player; + } + + /** + * Return the player that has successfully logged in or registered. + * + * @return The player + */ + public Player getPlayer() { + return player; + } + + /** + * Ensures compatibility with plugins like GuiRules. + * + * @return true + * @deprecated this will always return true because this event is only called if it was successful + */ + @Deprecated + public boolean isLogin() { + return true; + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/LogoutEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/LogoutEvent.java new file mode 100644 index 0000000000..70fae0967f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/LogoutEvent.java @@ -0,0 +1,49 @@ +package fr.xephi.authme.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * This event is called when a player logs out through AuthMe, i.e. only when the player + * has executed the {@code /logout} command. This event is not fired if a player simply + * leaves the server. + */ +public class LogoutEvent extends CustomEvent { + + private static final HandlerList handlers = new HandlerList(); + private final Player player; + + /** + * Constructor. + * + * @param player The player + */ + public LogoutEvent(Player player) { + this.player = player; + } + + /** + * Return the player who logged out. + * + * @return The player + */ + public Player getPlayer() { + return this.player; + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/PasswordEncryptionEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/PasswordEncryptionEvent.java new file mode 100644 index 0000000000..2ad872262c --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/PasswordEncryptionEvent.java @@ -0,0 +1,57 @@ +package fr.xephi.authme.events; + +import fr.xephi.authme.security.crypts.EncryptionMethod; +import org.bukkit.event.HandlerList; + +/** + * This event is called when we need to compare or hash a password for a player and allows + * third-party listeners to change the encryption method. This is typically + * done with the {@link fr.xephi.authme.security.HashAlgorithm#CUSTOM} setting. + */ +public class PasswordEncryptionEvent extends CustomEvent { + + private static final HandlerList handlers = new HandlerList(); + private EncryptionMethod method; + + /** + * Constructor. + * + * @param method The method used to encrypt the password + */ + public PasswordEncryptionEvent(EncryptionMethod method) { + super(false); + this.method = method; + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link org.bukkit.event.Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + /** + * Return the encryption method used to hash the password. + * + * @return The encryption method + */ + public EncryptionMethod getMethod() { + return method; + } + + /** + * Set the encryption method to hash the password with. + * + * @param method The encryption method to use + */ + public void setMethod(EncryptionMethod method) { + this.method = method; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/ProtectInventoryEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/ProtectInventoryEvent.java new file mode 100644 index 0000000000..f2fba487d9 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/ProtectInventoryEvent.java @@ -0,0 +1,85 @@ +package fr.xephi.authme.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.bukkit.inventory.ItemStack; + +/** + * This event is called before the inventory data of a player is suppressed, + * i.e. the inventory of the player is not displayed until he has authenticated. + */ +public class ProtectInventoryEvent extends CustomEvent implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + private final ItemStack[] storedInventory; + private final ItemStack[] storedArmor; + private final Player player; + private boolean isCancelled; + + /** + * Constructor. + * + * @param player The player + * @param isAsync True if the event is async, false otherwise + */ + public ProtectInventoryEvent(Player player, boolean isAsync) { + super(isAsync); + this.player = player; + this.storedInventory = player.getInventory().getContents(); + this.storedArmor = player.getInventory().getArmorContents(); + } + + /** + * Return the inventory of the player. + * + * @return The player's inventory + */ + public ItemStack[] getStoredInventory() { + return storedInventory; + } + + /** + * Return the armor of the player. + * + * @return The player's armor + */ + public ItemStack[] getStoredArmor() { + return storedArmor; + } + + /** + * Return the player whose inventory will be hidden. + * + * @return The player associated with this event + */ + public Player getPlayer() { + return player; + } + + @Override + public void setCancelled(boolean isCancelled) { + this.isCancelled = isCancelled; + } + + @Override + public boolean isCancelled() { + return isCancelled; + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/RegisterEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/RegisterEvent.java new file mode 100644 index 0000000000..2a98d05449 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/RegisterEvent.java @@ -0,0 +1,47 @@ +package fr.xephi.authme.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * Event fired when a player has successfully registered. + */ +public class RegisterEvent extends CustomEvent { + + private static final HandlerList handlers = new HandlerList(); + private final Player player; + + /** + * Constructor. + * + * @param player The player + */ + public RegisterEvent(Player player) { + this.player = player; + } + + /** + * Return the player that has successfully logged in or registered. + * + * @return The player + */ + public Player getPlayer() { + return player; + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/RestoreInventoryEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/RestoreInventoryEvent.java new file mode 100644 index 0000000000..eb9bf71d84 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/RestoreInventoryEvent.java @@ -0,0 +1,60 @@ +package fr.xephi.authme.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * This event is fired when the inventory of a player is restored + * (the inventory data is no longer hidden from the user). + */ +public class RestoreInventoryEvent extends CustomEvent implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + private final Player player; + private boolean isCancelled; + + /** + * Constructor. + * + * @param player The player + */ + public RestoreInventoryEvent(Player player) { + this.player = player; + } + + /** + * Return the player whose inventory will be restored. + * + * @return Player + */ + public Player getPlayer() { + return player; + } + + @Override + public boolean isCancelled() { + return isCancelled; + } + + @Override + public void setCancelled(boolean isCancelled) { + this.isCancelled = isCancelled; + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/RestoreSessionEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/RestoreSessionEvent.java new file mode 100644 index 0000000000..abfffaa9c2 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/RestoreSessionEvent.java @@ -0,0 +1,51 @@ +package fr.xephi.authme.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; + +/** + * Event fired before a session is restored. + */ +public class RestoreSessionEvent extends CustomEvent implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + private final Player player; + private boolean isCancelled; + + public RestoreSessionEvent(Player player, boolean isAsync) { + super(isAsync); + this.player = player; + } + + @Override + public boolean isCancelled() { + return isCancelled; + } + + @Override + public void setCancelled(boolean isCancelled) { + this.isCancelled = isCancelled; + } + + /** + * @return the player for which the session will be enabled + */ + public Player getPlayer() { + return player; + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link org.bukkit.event.Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/SpawnTeleportEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/SpawnTeleportEvent.java new file mode 100644 index 0000000000..a1a85d8469 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/SpawnTeleportEvent.java @@ -0,0 +1,51 @@ +package fr.xephi.authme.events; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * Called if a player is teleported to a specific spawn upon joining or logging in. + */ +public class SpawnTeleportEvent extends AbstractTeleportEvent { + + private static final HandlerList handlers = new HandlerList(); + private final boolean isAuthenticated; + + /** + * Constructor. + * + * @param player The player + * @param to The teleport destination + * @param isAuthenticated Whether or not the player is logged in + */ + public SpawnTeleportEvent(Player player, Location to, boolean isAuthenticated) { + super(false, player, to); + this.isAuthenticated = isAuthenticated; + } + + /** + * Return whether or not the player is authenticated. + * + * @return true if the player is logged in, false otherwise + */ + public boolean isAuthenticated() { + return isAuthenticated; + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/UnregisterByAdminEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/UnregisterByAdminEvent.java new file mode 100644 index 0000000000..f12e51160d --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/UnregisterByAdminEvent.java @@ -0,0 +1,67 @@ +package fr.xephi.authme.events; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; + +/** + * Event fired after a player has been unregistered from an external source (by an admin or via the API). + *

+ * Note that only the {@code playerName} is guaranteed to be not {@code null} in any case. + *

+ * The {@code player} may be null if a name is supplied which has never been online on the server – + * due to migrations, data removal, etc. it is possible that a user exists in the database for which the + * server knows no {@link Player} object. + *

+ * If a player is unregistered via an API call, the {@code initiator} is null as the action has not been + * started by any {@link CommandSender}. Otherwise, the {@code initiator} is the user who performed the + * command to unregister the player name. + */ +public class UnregisterByAdminEvent extends AbstractUnregisterEvent { + + private static final HandlerList handlers = new HandlerList(); + private final String playerName; + private final CommandSender initiator; + + /** + * Constructor. + * + * @param player the player (may be null - see class JavaDoc) + * @param playerName the name of the player that was unregistered + * @param isAsync whether or not the event is async + * @param initiator the initiator of the unregister process (may be null - see class JavaDoc) + */ + public UnregisterByAdminEvent(Player player, String playerName, boolean isAsync, CommandSender initiator) { + super(player, isAsync); + this.playerName = playerName; + this.initiator = initiator; + } + + /** + * @return the name of the player that was unregistered + */ + public String getPlayerName() { + return playerName; + } + + /** + * @return the user who requested to unregister the name, or null if not applicable + */ + public CommandSender getInitiator() { + return initiator; + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link org.bukkit.event.Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/UnregisterByPlayerEvent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/UnregisterByPlayerEvent.java new file mode 100644 index 0000000000..cd96cd91db --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/events/UnregisterByPlayerEvent.java @@ -0,0 +1,36 @@ +package fr.xephi.authme.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; + +/** + * Event fired after a player has unregistered himself. + */ +public class UnregisterByPlayerEvent extends AbstractUnregisterEvent { + + private static final HandlerList handlers = new HandlerList(); + + /** + * Constructor. + * + * @param player the player (never null) + * @param isAsync if the event is called asynchronously + */ + public UnregisterByPlayerEvent(Player player, boolean isAsync) { + super(player, isAsync); + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link org.bukkit.event.Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/DataFolder.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/DataFolder.java new file mode 100644 index 0000000000..0288f45a77 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/DataFolder.java @@ -0,0 +1,14 @@ +package fr.xephi.authme.initialization; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Annotation for specifying the plugin's data folder. + */ +@Target({ElementType.PARAMETER, ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface DataFolder { +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/DataSourceProvider.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/DataSourceProvider.java new file mode 100644 index 0000000000..41e48f3f4b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/DataSourceProvider.java @@ -0,0 +1,115 @@ +package fr.xephi.authme.initialization; + +import com.alessiodp.libby.Library; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.datasource.CacheDataSource; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.datasource.DataSourceType; +import fr.xephi.authme.datasource.H2; +import fr.xephi.authme.datasource.MariaDB; +import fr.xephi.authme.datasource.MySQL; +import fr.xephi.authme.datasource.PostgreSqlDataSource; +import fr.xephi.authme.datasource.SQLite; +import fr.xephi.authme.datasource.mysqlextensions.MySqlExtensionsFactory; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.DatabaseSettings; + +import javax.inject.Inject; +import javax.inject.Provider; +import java.io.File; +import java.sql.SQLException; + +import static fr.xephi.authme.AuthMe.libraryManager; + +/** + * Creates the AuthMe data source. + */ +public class DataSourceProvider implements Provider { + + private static final int SQLITE_MAX_SIZE = 4000; + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(DataSourceProvider.class); + + @Inject + @DataFolder + private File dataFolder; + @Inject + private Settings settings; + @Inject + private BukkitService bukkitService; + @Inject + private PlayerCache playerCache; + @Inject + private MySqlExtensionsFactory mySqlExtensionsFactory; + + DataSourceProvider() { + } + + @Override + public DataSource get() { + try { + return createDataSource(); + } catch (Exception e) { + logger.logException("Could not create data source:", e); + throw new IllegalStateException("Error during initialization of data source", e); + } + } + + /** + * Sets up the data source. + * + * @return the constructed data source + * @throws SQLException when initialization of a SQL data source failed + */ + private DataSource createDataSource() throws SQLException { + DataSourceType dataSourceType = settings.getProperty(DatabaseSettings.BACKEND); + DataSource dataSource; + switch (dataSourceType) { + case MYSQL: + dataSource = new MySQL(settings, mySqlExtensionsFactory); + break; + case MARIADB: + dataSource = new MariaDB(settings, mySqlExtensionsFactory); + break; + case POSTGRESQL: + dataSource = new PostgreSqlDataSource(settings, mySqlExtensionsFactory); + break; + case SQLITE: + dataSource = new SQLite(settings, dataFolder); + break; + case H2: + Library h2 = Library.builder() + .groupId("com.h2database") + .artifactId("h2") + .version("2.2.224") + .build(); + libraryManager.addMavenCentral(); + libraryManager.loadLibrary(h2); + dataSource = new H2(settings, dataFolder); + break; + default: + throw new UnsupportedOperationException("Unknown data source type '" + dataSourceType + "'"); + } + + if (settings.getProperty(DatabaseSettings.USE_CACHING)) { + dataSource = new CacheDataSource(dataSource, playerCache); + } + if (DataSourceType.SQLITE.equals(dataSourceType)) { + checkDataSourceSize(dataSource); + } + return dataSource; + } + + private void checkDataSourceSize(DataSource dataSource) { + bukkitService.runTaskAsynchronously(() -> { + int accounts = dataSource.getAccountsRegistered(); + if (accounts >= SQLITE_MAX_SIZE) { + logger.warning("YOU'RE USING THE SQLITE DATABASE WITH " + + accounts + "+ ACCOUNTS; FOR BETTER PERFORMANCE, PLEASE UPGRADE TO MYSQL!!"); + } + }); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/HasCleanup.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/HasCleanup.java new file mode 100644 index 0000000000..351df4f69b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/HasCleanup.java @@ -0,0 +1,16 @@ +package fr.xephi.authme.initialization; + +/** + * Common interface for types which have data that becomes outdated + * and that can be cleaned up periodically. + * + * @see fr.xephi.authme.task.CleanupTask + */ +public interface HasCleanup { + + /** + * Performs the cleanup action. + */ + void performCleanup(); + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/OnShutdownPlayerSaver.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/OnShutdownPlayerSaver.java new file mode 100644 index 0000000000..261e7dd59f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/OnShutdownPlayerSaver.java @@ -0,0 +1,75 @@ +package fr.xephi.authme.initialization; + +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.data.limbo.LimboService; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.SpawnLoader; +import fr.xephi.authme.settings.properties.RestrictionSettings; +import fr.xephi.authme.util.PlayerUtils; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.Locale; + +/** + * Saves all players' data when the plugin shuts down. + */ +public class OnShutdownPlayerSaver { + + @Inject + private BukkitService bukkitService; + @Inject + private Settings settings; + @Inject + private ValidationService validationService; + @Inject + private DataSource dataSource; + @Inject + private SpawnLoader spawnLoader; + @Inject + private PlayerCache playerCache; + @Inject + private LimboService limboService; + + OnShutdownPlayerSaver() { + } + + /** + * Saves the data of all online players. + */ + public void saveAllPlayers() { + for (Player player : bukkitService.getOnlinePlayers()) { + savePlayer(player); + } + } + + private void savePlayer(Player player) { + String name = player.getName().toLowerCase(Locale.ROOT); + if (PlayerUtils.isNpc(player) || validationService.isUnrestricted(name)) { + return; + } + if (limboService.hasLimboPlayer(name)) { + limboService.restoreData(player); + } else { + saveLoggedinPlayer(player); + } + playerCache.removePlayer(name); + } + + private void saveLoggedinPlayer(Player player) { + if (settings.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) { + Location loc = spawnLoader.getPlayerLocationOrSpawn(player); + PlayerAuth auth = PlayerAuth.builder() + .name(player.getName().toLowerCase(Locale.ROOT)) + .realName(player.getName()) + .location(loc).build(); + dataSource.updateQuitLoc(auth); + // TODO: send an update when a messaging service will be implemented (QUITLOC) + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/OnStartupTasks.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/OnStartupTasks.java new file mode 100644 index 0000000000..705f3bcc1f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/OnStartupTasks.java @@ -0,0 +1,114 @@ +package fr.xephi.authme.initialization; + +import com.github.Anon8281.universalScheduler.UniversalRunnable; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.output.ConsoleFilter; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.output.Log4JFilter; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.DatabaseSettings; +import fr.xephi.authme.settings.properties.EmailSettings; +import fr.xephi.authme.settings.properties.PluginSettings; +import org.apache.logging.log4j.LogManager; +import org.bstats.bukkit.Metrics; +import org.bstats.charts.SimplePie; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; +import java.util.logging.Logger; + +import static fr.xephi.authme.service.BukkitService.TICKS_PER_MINUTE; +import static fr.xephi.authme.settings.properties.EmailSettings.RECALL_PLAYERS; + +/** + * Contains actions such as migrations that should be performed on startup. + */ +public class OnStartupTasks { + + private static ConsoleLogger consoleLogger = ConsoleLoggerFactory.get(OnStartupTasks.class); + + @Inject + private DataSource dataSource; + @Inject + private Settings settings; + @Inject + private BukkitService bukkitService; + @Inject + private Messages messages; + + OnStartupTasks() { + } + + /** + * Sends bstats metrics. + * + * @param plugin the plugin instance + * @param settings the settings + */ + public static void sendMetrics(AuthMe plugin, Settings settings) { + final Metrics metrics = new Metrics(plugin, 18479); + + metrics.addCustomChart(new SimplePie("messages_language", + () -> settings.getProperty(PluginSettings.MESSAGES_LANGUAGE))); + metrics.addCustomChart(new SimplePie("database_backend", + () -> settings.getProperty(DatabaseSettings.BACKEND).toString())); + } + + /** + * Sets up the console filter if enabled. + * + * @param logger the plugin logger + */ + public static void setupConsoleFilter(Logger logger) { + // Try to set the log4j filter + try { + Class.forName("org.apache.logging.log4j.core.filter.AbstractFilter"); + setLog4JFilter(); + } catch (ClassNotFoundException | NoClassDefFoundError e) { + // log4j is not available + consoleLogger.info("You're using Minecraft 1.6.x or older, Log4J support will be disabled"); + ConsoleFilter filter = new ConsoleFilter(); + logger.setFilter(filter); + Bukkit.getLogger().setFilter(filter); + Logger.getLogger("Minecraft").setFilter(filter); + } + } + + // Set the console filter to remove the passwords + private static void setLog4JFilter() { + org.apache.logging.log4j.core.Logger logger; + logger = (org.apache.logging.log4j.core.Logger) LogManager.getRootLogger(); + logger.addFilter(new Log4JFilter()); + } + + /** + * Starts a task that regularly reminds players without a defined email to set their email, + * if enabled. + */ + public void scheduleRecallEmailTask() { + if (!settings.getProperty(RECALL_PLAYERS)) { + return; + } + bukkitService.runTaskTimerAsynchronously(new UniversalRunnable() { + @Override + public void run() { + List loggedPlayersWithEmptyMail = dataSource.getLoggedPlayersWithEmptyMail(); + bukkitService.runTask(() -> { + for (String playerWithoutMail : loggedPlayersWithEmptyMail) { + Player player = bukkitService.getPlayerExact(playerWithoutMail); + if (player != null) { + messages.send(player, MessageKey.ADD_EMAIL_MESSAGE); + } + } + }); + } + }, 1, (long) TICKS_PER_MINUTE * settings.getProperty(EmailSettings.DELAY_RECALL)); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/Reloadable.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/Reloadable.java new file mode 100644 index 0000000000..65c3a3379f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/Reloadable.java @@ -0,0 +1,15 @@ +package fr.xephi.authme.initialization; + +/** + * Interface for reloadable entities. + * + * @see fr.xephi.authme.command.executable.authme.ReloadCommand + */ +public interface Reloadable { + + /** + * Performs the reload action. + */ + void reload(); + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/SettingsDependent.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/SettingsDependent.java new file mode 100644 index 0000000000..89d18318e6 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/SettingsDependent.java @@ -0,0 +1,18 @@ +package fr.xephi.authme.initialization; + +import fr.xephi.authme.settings.Settings; + +/** + * Interface for classes that keep a local copy of certain settings. + * + * @see fr.xephi.authme.command.executable.authme.ReloadCommand + */ +public interface SettingsDependent { + + /** + * Performs a reload with the provided settings instance. + * + * @param settings the settings instance + */ + void reload(Settings settings); +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/SettingsProvider.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/SettingsProvider.java new file mode 100644 index 0000000000..77133715f5 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/SettingsProvider.java @@ -0,0 +1,45 @@ +package fr.xephi.authme.initialization; + +import ch.jalu.configme.configurationdata.ConfigurationData; +import ch.jalu.configme.resource.PropertyResource; +import fr.xephi.authme.service.yaml.YamlFileResourceProvider; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.SettingsMigrationService; +import fr.xephi.authme.settings.properties.AuthMeSettingsRetriever; +import fr.xephi.authme.util.FileUtils; + +import javax.inject.Inject; +import javax.inject.Provider; +import java.io.File; + +/** + * Initializes the settings. + */ +public class SettingsProvider implements Provider { + + @Inject + @DataFolder + private File dataFolder; + @Inject + private SettingsMigrationService migrationService; + + SettingsProvider() { + } + + /** + * Loads the plugin's settings. + * + * @return the settings instance, or null if it could not be constructed + */ + @Override + public Settings get() { + File configFile = new File(dataFolder, "config.yml"); + if (!configFile.exists()) { + FileUtils.create(configFile); + } + PropertyResource resource = YamlFileResourceProvider.loadFromFile(configFile); + ConfigurationData configurationData = AuthMeSettingsRetriever.buildConfigurationData(); + return new Settings(dataFolder, resource, migrationService, configurationData); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/TaskCloser.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/TaskCloser.java new file mode 100644 index 0000000000..4cd6daa983 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/initialization/TaskCloser.java @@ -0,0 +1,33 @@ +package fr.xephi.authme.initialization; + +import com.github.Anon8281.universalScheduler.scheduling.schedulers.TaskScheduler; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.datasource.DataSource; + +/** + * Waits for asynchronous tasks to complete before closing the data source + * so the plugin can shut down properly. + */ +public class TaskCloser implements Runnable { + + private final TaskScheduler scheduler; + private final DataSource dataSource; + + /** + * Constructor. + * + * @param dataSource the data source (nullable) + */ + public TaskCloser(DataSource dataSource) { + this.scheduler = AuthMe.getScheduler(); + this.dataSource = dataSource; + } + + @Override + public void run() { + scheduler.cancelTasks(); + if (dataSource != null) { + dataSource.closeConnection(); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/AdvancedShulkerFixListener.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/AdvancedShulkerFixListener.java new file mode 100644 index 0000000000..64045591d4 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/AdvancedShulkerFixListener.java @@ -0,0 +1,20 @@ +package fr.xephi.authme.listener; + +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockDispenseEvent; + +//This fix is only for Minecraft 1.13- +public class AdvancedShulkerFixListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onDispenserActivate(BlockDispenseEvent event) { + Block block = event.getBlock(); + + if (block.getY() <= 0 || block.getY() >= block.getWorld().getMaxHeight() - 1) { + event.setCancelled(true); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/BedrockAutoLoginListener.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/BedrockAutoLoginListener.java new file mode 100644 index 0000000000..4f63e61020 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/BedrockAutoLoginListener.java @@ -0,0 +1,54 @@ +package fr.xephi.authme.listener; +/* Inspired by DongShaoNB/BedrockPlayerSupport **/ + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.api.v3.AuthMeApi; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.HooksSettings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +import javax.inject.Inject; +import java.util.UUID; + +import static org.bukkit.Bukkit.getServer; + +public class BedrockAutoLoginListener implements Listener { + private final AuthMeApi authmeApi = AuthMeApi.getInstance(); + @Inject + private BukkitService bukkitService; + @Inject + private AuthMe plugin; + @Inject + private Messages messages; + + @Inject + private Settings settings; + + public BedrockAutoLoginListener() { + } + + private boolean isBedrockPlayer(UUID uuid) { + return settings.getProperty(HooksSettings.HOOK_FLOODGATE_PLAYER) && settings.getProperty(SecuritySettings.FORCE_LOGIN_BEDROCK) && org.geysermc.floodgate.api.FloodgateApi.getInstance().isFloodgateId(uuid) && getServer().getPluginManager().getPlugin("floodgate") != null; + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + String name = event.getPlayer().getName(); + UUID uuid = event.getPlayer().getUniqueId(); + bukkitService.runTaskLater(player, () -> { + if (isBedrockPlayer(uuid) && !authmeApi.isAuthenticated(player) && authmeApi.isRegistered(name)) { + authmeApi.forceLogin(player, true); + messages.send(player, MessageKey.BEDROCK_AUTO_LOGGED_IN); + } + },20L); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/BlockListener.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/BlockListener.java new file mode 100644 index 0000000000..e40bf8d0b7 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/BlockListener.java @@ -0,0 +1,28 @@ +package fr.xephi.authme.listener; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; + +import javax.inject.Inject; + +public class BlockListener implements Listener { + + @Inject + private ListenerService listenerService; + + @EventHandler(ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) { + if (listenerService.shouldCancelEvent(event.getPlayer())) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true) + public void onBlockBreak(BlockBreakEvent event) { + if (listenerService.shouldCancelEvent(event.getPlayer())) { + event.setCancelled(true); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/DoubleLoginFixListener.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/DoubleLoginFixListener.java new file mode 100644 index 0000000000..2c0370a433 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/DoubleLoginFixListener.java @@ -0,0 +1,35 @@ +package fr.xephi.authme.listener; +//Prevent Ghost Players + +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.service.CommonService; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +import javax.inject.Inject; +import java.util.Collection; +import java.util.HashSet; + +public class DoubleLoginFixListener implements Listener { + @Inject + private CommonService service; + + public DoubleLoginFixListener() { + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Collection PlayerList = Bukkit.getServer().getOnlinePlayers(); + HashSet PlayerSet = new HashSet(); + for (Player ep : PlayerList) { + if (PlayerSet.contains(ep.getName().toLowerCase())) { + ep.kickPlayer(service.retrieveSingleMessage(ep.getPlayer(), MessageKey.DOUBLE_LOGIN_FIX)); + break; + } + PlayerSet.add(ep.getName().toLowerCase()); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/EntityListener.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/EntityListener.java new file mode 100644 index 0000000000..35e109204b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/EntityListener.java @@ -0,0 +1,99 @@ +package fr.xephi.authme.listener; + +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityInteractEvent; +import org.bukkit.event.entity.EntityRegainHealthEvent; +import org.bukkit.event.entity.EntityShootBowEvent; +import org.bukkit.event.entity.EntityTargetEvent; +import org.bukkit.event.entity.FoodLevelChangeEvent; +import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.projectiles.ProjectileSource; + +import javax.inject.Inject; + +public class EntityListener implements Listener { + + private final ListenerService listenerService; + + @Inject + EntityListener(ListenerService listenerService) { + this.listenerService = listenerService; + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onDamage(EntityDamageEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.getEntity().setFireTicks(0); + event.setDamage(0); + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onAttack(EntityDamageByEntityEvent event) { + if (listenerService.shouldCancelEvent(event.getDamager())) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onEntityTarget(EntityTargetEvent event) { + if (listenerService.shouldCancelEvent(event.getTarget())) { + event.setTarget(null); + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onFoodLevelChange(FoodLevelChangeEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void entityRegainHealthEvent(EntityRegainHealthEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setAmount(0); + event.setCancelled(true); + } + } + + //TODO sgdc3 20190808: We listen at the same event twice, does it make any sense? + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onEntityInteract(EntityInteractEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onLowestEntityInteract(EntityInteractEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onProjectileLaunch(ProjectileLaunchEvent event) { + final Projectile projectile = event.getEntity(); + + ProjectileSource shooter = projectile.getShooter(); + if (shooter instanceof Player && listenerService.shouldCancelEvent((Player) shooter)) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.NORMAL) + public void onShoot(EntityShootBowEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/FailedVerificationException.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/FailedVerificationException.java new file mode 100644 index 0000000000..0b887f92b4 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/FailedVerificationException.java @@ -0,0 +1,32 @@ +package fr.xephi.authme.listener; + +import fr.xephi.authme.message.MessageKey; + +/** + * Exception thrown when a verification has failed. + */ +public class FailedVerificationException extends Exception { + + private static final long serialVersionUID = 3903242223297960699L; + private final MessageKey reason; + private final String[] args; + + public FailedVerificationException(MessageKey reason, String... args) { + this.reason = reason; + this.args = args; + } + + public MessageKey getReason() { + return reason; + } + + public String[] getArgs() { + return args; + } + + @Override + public String toString() { + return getClass().getSimpleName() + ": reason=" + reason + + ";args=" + (args == null ? "null" : String.join(", ", args)); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/ListenerService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/ListenerService.java new file mode 100644 index 0000000000..3d582b0ea6 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/ListenerService.java @@ -0,0 +1,104 @@ +package fr.xephi.authme.listener; + +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.RegistrationSettings; +import fr.xephi.authme.util.PlayerUtils; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityEvent; +import org.bukkit.event.player.PlayerEvent; + +import javax.inject.Inject; + +/** + * Service class for the AuthMe listeners to determine whether an event should be canceled. + */ +class ListenerService implements SettingsDependent { + private final DataSource dataSource; + private final PlayerCache playerCache; + private final ValidationService validationService; + private boolean isRegistrationForced; + + + @Inject + ListenerService(Settings settings, DataSource dataSource, PlayerCache playerCache, + ValidationService validationService) { + this.dataSource = dataSource; + this.playerCache = playerCache; + this.validationService = validationService; + reload(settings); + } + + /** + * Returns whether an event should be canceled (for unauthenticated, non-NPC players). + * + * @param event the event to process + * @return true if the event should be canceled, false otherwise + */ + public boolean shouldCancelEvent(EntityEvent event) { + Entity entity = event.getEntity(); + return shouldCancelEvent(entity); + } + + /** + * Returns, based on the entity associated with the event, whether or not the event should be canceled. + * + * @param entity the player entity to verify + * @return true if the associated event should be canceled, false otherwise + */ + public boolean shouldCancelEvent(Entity entity) { + if (entity instanceof Player) { + Player player = (Player) entity; + return shouldCancelEvent(player); + } + return false; + } + + /** + * Returns whether an event should be canceled (for unauthenticated, non-NPC players). + * + * @param event the event to process + * @return true if the event should be canceled, false otherwise + */ + public boolean shouldCancelEvent(PlayerEvent event) { + Player player = event.getPlayer(); + return shouldCancelEvent(player); + } + + /** + * Returns, based on the player associated with the event, whether or not the event should be canceled. + * + * @param player the player to verify + * @return true if the associated event should be canceled, false otherwise + */ + + public boolean shouldCancelEvent(Player player) { + + return player != null && !checkAuth(player.getName()) && !PlayerUtils.isNpc(player); + } + @Override + public void reload(Settings settings) { + isRegistrationForced = settings.getProperty(RegistrationSettings.FORCE); + } + + /** + * Checks whether the player is allowed to perform actions (i.e. whether he is logged in + * or if other settings permit playing). + * + * @param name the name of the player to verify + * @return true if the player may play, false otherwise + */ + private boolean checkAuth(String name) { + if (validationService.isUnrestricted(name) || playerCache.isAuthenticated(name)){ + return true; + } + if (!isRegistrationForced && !dataSource.isAuthAvailable(name)) { + return true; + } + return false; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/LoginLocationFixListener.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/LoginLocationFixListener.java new file mode 100644 index 0000000000..1c64b68b5d --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/LoginLocationFixListener.java @@ -0,0 +1,118 @@ +package fr.xephi.authme.listener; + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.api.v3.AuthMeApi; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import fr.xephi.authme.util.TeleportUtils; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +import javax.inject.Inject; +import java.lang.reflect.Method; + + +public class LoginLocationFixListener implements Listener { + @Inject + private AuthMe plugin; + @Inject + private Messages messages; + @Inject + private Settings settings; + private final AuthMeApi authmeApi = AuthMeApi.getInstance(); + + public LoginLocationFixListener() { + } + + private static Material materialPortal = Material.matchMaterial("PORTAL"); + + private static boolean isAvailable; // false: unchecked/method not available true: method is available + BlockFace[] faces = {BlockFace.WEST, BlockFace.EAST, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.SOUTH_EAST, BlockFace.SOUTH_WEST, BlockFace.NORTH_EAST, BlockFace.NORTH_WEST}; + + static { + if (materialPortal == null) { + materialPortal = Material.matchMaterial("PORTAL_BLOCK"); + if (materialPortal == null) { + materialPortal = Material.matchMaterial("NETHER_PORTAL"); + } + } + try { + Method getMinHeightMethod = World.class.getMethod("getMinHeight"); + isAvailable = true; + } catch (NoSuchMethodException e) { + isAvailable = false; + } + } + + private int getMinHeight(World world) { + //This keeps compatibility of 1.16.x and lower + if (isAvailable) { + return world.getMinHeight(); + } else { + return 0; + } + } + + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + Location JoinLocation = player.getLocation(); + if (settings.getProperty(SecuritySettings.LOGIN_LOC_FIX_SUB_PORTAL)) { + if (!JoinLocation.getBlock().getType().equals(materialPortal) && !JoinLocation.getBlock().getRelative(BlockFace.UP).getType().equals(materialPortal)) { + return; + } + Block JoinBlock = JoinLocation.getBlock(); + boolean solved = false; + for (BlockFace face : faces) { + if (JoinBlock.getRelative(face).getType().equals(Material.AIR) && JoinBlock.getRelative(face).getRelative(BlockFace.UP).getType().equals(Material.AIR)) { + TeleportUtils.teleport(player, JoinBlock.getRelative(face).getLocation().add(0.5, 0.1, 0.5)); + solved = true; + break; + } + } + if (!solved) { + JoinBlock.getRelative(BlockFace.UP).breakNaturally(); + JoinBlock.breakNaturally(); + } + messages.send(player, MessageKey.LOCATION_FIX_PORTAL); + } + if (settings.getProperty(SecuritySettings.LOGIN_LOC_FIX_SUB_UNDERGROUND)) { + Material UpType = JoinLocation.getBlock().getRelative(BlockFace.UP).getType(); + World world = player.getWorld(); + int MaxHeight = world.getMaxHeight(); + int MinHeight = getMinHeight(world); + if (!UpType.isOccluding() && !UpType.equals(Material.LAVA)) { + return; + } + for (int i = MinHeight; i <= MaxHeight; i++) { + JoinLocation.setY(i); + Block JoinBlock = JoinLocation.getBlock(); + if ((JoinBlock.getRelative(BlockFace.DOWN).getType().isBlock()) + && JoinBlock.getType().equals(Material.AIR) + && JoinBlock.getRelative(BlockFace.UP).getType().equals(Material.AIR)) { + if (JoinBlock.getRelative(BlockFace.DOWN).getType().equals(Material.LAVA)) { + JoinBlock.getRelative(BlockFace.DOWN).setType(Material.DIRT); + } + TeleportUtils.teleport(player, JoinBlock.getLocation().add(0.5, 0.1, 0.5)); + messages.send(player, MessageKey.LOCATION_FIX_UNDERGROUND); + break; + } + if (i == MaxHeight) { + TeleportUtils.teleport(player, JoinBlock.getLocation().add(0.5, 1.1, 0.5)); + messages.send(player, MessageKey.LOCATION_FIX_UNDERGROUND_CANT_FIX); + } + } + } + + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java new file mode 100644 index 0000000000..a617c2fa88 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java @@ -0,0 +1,223 @@ +package fr.xephi.authme.listener; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.initialization.Reloadable; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.permission.PlayerStatePermission; +import fr.xephi.authme.service.AntiBotService; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.ProtectionSettings; +import fr.xephi.authme.settings.properties.RegistrationSettings; +import fr.xephi.authme.settings.properties.RestrictionSettings; +import fr.xephi.authme.util.StringUtils; +import fr.xephi.authme.util.Utils; +import org.bukkit.Server; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerLoginEvent; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import java.util.Collection; +import java.util.Locale; +import java.util.regex.Pattern; + +/** + * Service for performing various verifications when a player joins. + */ +public class OnJoinVerifier implements Reloadable { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(OnJoinVerifier.class); + + @Inject + private Settings settings; + @Inject + private DataSource dataSource; + @Inject + private Messages messages; + @Inject + private PermissionsManager permissionsManager; + @Inject + private AntiBotService antiBotService; + @Inject + private ValidationService validationService; + @Inject + private BukkitService bukkitService; + @Inject + private Server server; + + private Pattern nicknamePattern; + + OnJoinVerifier() { + } + + + @PostConstruct + @Override + public void reload() { + String nickRegEx = settings.getProperty(RestrictionSettings.ALLOWED_NICKNAME_CHARACTERS); + nicknamePattern = Utils.safePatternCompile(nickRegEx); + } + + /** + * Checks if Antibot is enabled. + * + * @param name the joining player name to check + * @param isAuthAvailable whether or not the player is registered + * @throws FailedVerificationException if the verification fails + */ + public void checkAntibot(String name, boolean isAuthAvailable) throws FailedVerificationException { + if (isAuthAvailable || permissionsManager.hasPermissionOffline(name, PlayerStatePermission.BYPASS_ANTIBOT)) { + return; + } + if (antiBotService.shouldKick()) { + antiBotService.addPlayerKick(name); + throw new FailedVerificationException(MessageKey.KICK_ANTIBOT); + } + } + + /** + * Checks whether non-registered players should be kicked, and if so, whether the player should be kicked. + * + * @param isAuthAvailable whether or not the player is registered + * @throws FailedVerificationException if the verification fails + */ + public void checkKickNonRegistered(boolean isAuthAvailable) throws FailedVerificationException { + if (!isAuthAvailable && settings.getProperty(RestrictionSettings.KICK_NON_REGISTERED)) { + throw new FailedVerificationException(MessageKey.MUST_REGISTER_MESSAGE); + } + } + + /** + * Checks that the name adheres to the configured username restrictions. + * + * @param name the name to verify + * @throws FailedVerificationException if the verification fails + */ + public void checkIsValidName(String name) throws FailedVerificationException { + if (name.length() > settings.getProperty(RestrictionSettings.MAX_NICKNAME_LENGTH) + || name.length() < settings.getProperty(RestrictionSettings.MIN_NICKNAME_LENGTH)) { + throw new FailedVerificationException(MessageKey.INVALID_NAME_LENGTH); + } + if (!nicknamePattern.matcher(name).matches()) { + throw new FailedVerificationException(MessageKey.INVALID_NAME_CHARACTERS, nicknamePattern.pattern()); + } + } + + /** + * Handles the case of a full server and verifies if the user's connection should really be refused + * by adjusting the event object accordingly. Attempts to kick a non-VIP player to make room if the + * joining player is a VIP. + * + * @param event the login event to verify + * + * @return true if the player's connection should be refused (i.e. the event does not need to be processed + * further), false if the player is not refused + */ + public boolean refusePlayerForFullServer(PlayerLoginEvent event) { + final Player player = event.getPlayer(); + if (event.getResult() != PlayerLoginEvent.Result.KICK_FULL) { + // Server is not full, no need to do anything + return false; + } else if (!permissionsManager.hasPermission(player, PlayerStatePermission.IS_VIP)) { + // Server is full and player is NOT VIP; set kick message and proceed with kick + event.setKickMessage(messages.retrieveSingle(player, MessageKey.KICK_FULL_SERVER)); + return true; + } + + // Server is full and player is VIP; attempt to kick a non-VIP player to make room + Collection onlinePlayers = bukkitService.getOnlinePlayers(); + if (onlinePlayers.size() < server.getMaxPlayers()) { + event.allow(); + return false; + } + Player nonVipPlayer = generateKickPlayer(onlinePlayers); + if (nonVipPlayer != null) { + // AuthMeReReloaded - Folia compatibility + bukkitService.runTaskIfFolia(nonVipPlayer, () -> nonVipPlayer.kickPlayer(messages.retrieveSingle(player, MessageKey.KICK_FOR_VIP))); + event.allow(); + return false; + } else { + logger.info("VIP player " + player.getName() + " tried to join, but the server was full"); + event.setKickMessage(messages.retrieveSingle(player, MessageKey.KICK_FULL_SERVER)); + return true; + } + } + + /** + * Checks that the casing in the username corresponds to the one in the database, if so configured. + * + * @param connectingName the player name to verify + * @param auth the auth object associated with the player + * @throws FailedVerificationException if the verification fails + */ + public void checkNameCasing(String connectingName, PlayerAuth auth) throws FailedVerificationException { + if (auth != null && settings.getProperty(RegistrationSettings.PREVENT_OTHER_CASE)) { + String realName = auth.getRealName(); // might be null or "Player" + + if (StringUtils.isBlank(realName) || "Player".equals(realName)) { + dataSource.updateRealName(connectingName.toLowerCase(Locale.ROOT), connectingName); + } else if (!realName.equals(connectingName)) { + throw new FailedVerificationException(MessageKey.INVALID_NAME_CASE, realName, connectingName); + } + } + } + + /** + * Checks that the player's country is admitted. + * + * @param name the joining player name to verify + * @param address the player address + * @param isAuthAvailable whether or not the user is registered + * @throws FailedVerificationException if the verification fails + */ + public void checkPlayerCountry(String name, String address, + boolean isAuthAvailable) throws FailedVerificationException { + if ((!isAuthAvailable || settings.getProperty(ProtectionSettings.ENABLE_PROTECTION_REGISTERED)) + && settings.getProperty(ProtectionSettings.ENABLE_PROTECTION) + && !permissionsManager.hasPermissionOffline(name, PlayerStatePermission.BYPASS_COUNTRY_CHECK) + && !validationService.isCountryAdmitted(address)) { + throw new FailedVerificationException(MessageKey.COUNTRY_BANNED_ERROR); + } + } + + /** + * Checks if a player with the same name (case-insensitive) is already playing and refuses the + * connection if so configured. + * + * @param name the player name to check + * @throws FailedVerificationException if the verification fails + */ + public void checkSingleSession(String name) throws FailedVerificationException { + if (!settings.getProperty(RestrictionSettings.FORCE_SINGLE_SESSION)) { + return; + } + + Player onlinePlayer = bukkitService.getPlayerExact(name); + if (onlinePlayer != null) { + throw new FailedVerificationException(MessageKey.USERNAME_ALREADY_ONLINE_ERROR); + } + } + + /** + * Selects a non-VIP player to kick when a VIP player joins the server when full. + * + * @param onlinePlayers list of online players + * + * @return the player to kick, or null if none applicable + */ + private Player generateKickPlayer(Collection onlinePlayers) { + for (Player player : onlinePlayers) { + if (!permissionsManager.hasPermission(player, PlayerStatePermission.IS_VIP)) { + return player; + } + } + return null; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListener.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListener.java new file mode 100644 index 0000000000..b24da9da2f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListener.java @@ -0,0 +1,567 @@ +package fr.xephi.authme.listener; + +import fr.xephi.authme.data.QuickCommandsProtectionManager; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.permission.PlayerStatePermission; +import fr.xephi.authme.process.Management; +import fr.xephi.authme.service.AntiBotService; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.JoinMessageService; +import fr.xephi.authme.service.TeleportationService; +import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.SpawnLoader; +import fr.xephi.authme.settings.properties.HooksSettings; +import fr.xephi.authme.settings.properties.PluginSettings; +import fr.xephi.authme.settings.properties.RegistrationSettings; +import fr.xephi.authme.settings.properties.RestrictionSettings; +import fr.xephi.authme.util.TeleportUtils; +import fr.xephi.authme.util.message.I18NUtils; +import fr.xephi.authme.util.message.MiniMessageUtils; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.SignChangeEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryOpenEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerBedEnterEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerEditBookEvent; +import org.bukkit.event.player.PlayerFishEvent; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerItemConsumeEvent; +import org.bukkit.event.player.PlayerItemHeldEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerKickEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerShearEntityEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +import static fr.xephi.authme.settings.properties.RestrictionSettings.ALLOWED_MOVEMENT_RADIUS; +import static fr.xephi.authme.settings.properties.RestrictionSettings.ALLOW_UNAUTHED_MOVEMENT; +import static org.bukkit.Bukkit.getServer; + +/** + * Listener class for player events. + */ +public class PlayerListener implements Listener { + @Inject + private Settings settings; + @Inject + private Messages messages; + @Inject + private DataSource dataSource; + @Inject + private AntiBotService antiBotService; + @Inject + private Management management; + @Inject + private BukkitService bukkitService; + @Inject + private SpawnLoader spawnLoader; + @Inject + private OnJoinVerifier onJoinVerifier; + @Inject + private ListenerService listenerService; + @Inject + private TeleportationService teleportationService; + @Inject + private ValidationService validationService; + @Inject + private JoinMessageService joinMessageService; + @Inject + private PermissionsManager permissionsManager; + @Inject + private QuickCommandsProtectionManager quickCommandsProtectionManager; + + public static List PENDING_INVENTORIES = new ArrayList<>(); + + // Lowest priority to apply fast protection checks + @EventHandler(priority = EventPriority.LOWEST) + public void onAsyncPlayerPreLoginEventLowest(AsyncPlayerPreLoginEvent event) { + + if (event.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { + return; + } + final String name = event.getName(); + + // NOTE: getAddress() sometimes returning null, we don't want to handle this race condition + if (event.getAddress() == null) { + event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, + messages.retrieveSingle(name, MessageKey.KICK_UNRESOLVED_HOSTNAME)); + return; + } + + if (validationService.isUnrestricted(name)) { + return; + } + if (settings.getProperty(HooksSettings.HOOK_FLOODGATE_PLAYER) && settings.getProperty(HooksSettings.IGNORE_BEDROCK_NAME_CHECK)) { + if (getServer().getPluginManager().getPlugin("floodgate") != null) { + if (org.geysermc.floodgate.api.FloodgateApi.getInstance().isFloodgateId(event.getUniqueId())) return; + } + } + // Non-blocking checks + try { + onJoinVerifier.checkIsValidName(name); + } catch (FailedVerificationException e) { + event.setKickMessage(messages.retrieveSingle(name, e.getReason(), e.getArgs())); + event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_OTHER); + + } + } + + /* + * Login/join/leave events + */ + + // Note: at this stage (HIGHEST priority) the user's permission data should already have been loaded by + // the permission handler, we don't need to call permissionsManager.loadUserData() + + @EventHandler(priority = EventPriority.HIGHEST) + public void onAsyncPlayerPreLoginEventHighest(AsyncPlayerPreLoginEvent event) { + if (event.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { + return; + } + final String name = event.getName(); + + if (validationService.isUnrestricted(name)) { + return; + } + + // Slow, blocking checks + try { + final PlayerAuth auth = dataSource.getAuth(name); + final boolean isAuthAvailable = auth != null; + onJoinVerifier.checkKickNonRegistered(isAuthAvailable); + onJoinVerifier.checkAntibot(name, isAuthAvailable); + onJoinVerifier.checkNameCasing(name, auth); + final String ip = event.getAddress().getHostAddress(); + onJoinVerifier.checkPlayerCountry(name, ip, isAuthAvailable); + } catch (FailedVerificationException e) { + event.setKickMessage(messages.retrieveSingle(name, e.getReason(), e.getArgs())); + event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_OTHER); + } + } + + // Note: We can't teleport the player in the PlayerLoginEvent listener + // as the new player location will be reverted by the server. + + @EventHandler(priority = EventPriority.LOW) + public void onPlayerLogin(PlayerLoginEvent event) { + final Player player = event.getPlayer(); + final String name = player.getName(); + + try { + onJoinVerifier.checkSingleSession(name); + } catch (FailedVerificationException e) { + event.setKickMessage(messages.retrieveSingle(name, e.getReason(), e.getArgs())); + event.setResult(PlayerLoginEvent.Result.KICK_OTHER); + return; + } + + if (validationService.isUnrestricted(name)) { + return; + } + + onJoinVerifier.refusePlayerForFullServer(event); + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onPlayerJoin(PlayerJoinEvent event) { + final Player player = event.getPlayer(); + if (!PlayerListener19Spigot.isPlayerSpawnLocationEventCalled()) { + teleportationService.teleportOnJoin(player); + } + + quickCommandsProtectionManager.processJoin(player); + + management.performJoin(player); + + teleportationService.teleportNewPlayerToFirstSpawn(player); + + } + + + @EventHandler(priority = EventPriority.HIGH) // HIGH as EssentialsX listens at HIGHEST + public void onJoinMessage(PlayerJoinEvent event) { + final Player player = event.getPlayer(); + + + // Note: join message can be null, despite api documentation says not + if (settings.getProperty(RegistrationSettings.REMOVE_JOIN_MESSAGE)) { + event.setJoinMessage(null); + return; + } + + String customJoinMessage = settings.getProperty(RegistrationSettings.CUSTOM_JOIN_MESSAGE); + if (!customJoinMessage.isEmpty()) { + customJoinMessage = ChatColor.translateAlternateColorCodes('&', MiniMessageUtils.parseMiniMessageToLegacy(customJoinMessage)); + event.setJoinMessage(customJoinMessage + .replace("{PLAYERNAME}", player.getName()) + .replace("{DISPLAYNAME}", player.getDisplayName()) + .replace("{DISPLAYNAMENOCOLOR}", ChatColor.stripColor(player.getDisplayName())) + ); + } + + if (!settings.getProperty(RegistrationSettings.DELAY_JOIN_MESSAGE)) { + return; + } + + String name = player.getName().toLowerCase(Locale.ROOT); + String joinMsg = event.getJoinMessage(); + + // Remove the join message while the player isn't logging in + if (joinMsg != null) { + event.setJoinMessage(null); + joinMessageService.putMessage(name, joinMsg); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + + // Note: quit message can be null, despite api documentation says not + if (settings.getProperty(RegistrationSettings.REMOVE_LEAVE_MESSAGE)) { + event.setQuitMessage(null); + } else if (settings.getProperty(RegistrationSettings.REMOVE_UNLOGGED_LEAVE_MESSAGE)) { + if (listenerService.shouldCancelEvent(event)) { + event.setQuitMessage(null); + } + } + + // Remove data from locale map when player quit + if (settings.getProperty(PluginSettings.I18N_MESSAGES)) { + I18NUtils.removeLocale(player.getUniqueId()); + } + + if (antiBotService.wasPlayerKicked(player.getName())) { + return; + } + + management.performQuit(player); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onPlayerKick(PlayerKickEvent event) { + // Note #831: Especially for offline CraftBukkit, we need to catch players being kicked because of + // "logged in from another location" and to cancel their kick + if (settings.getProperty(RestrictionSettings.FORCE_SINGLE_SESSION) + && event.getReason().contains("You logged in from another location")) { + event.setCancelled(true); + return; + } + + final Player player = event.getPlayer(); + if (!antiBotService.wasPlayerKicked(player.getName())) { + management.performQuit(player); + } + } + + /* + * Chat/command events + */ + + private void removeUnauthorizedRecipients(AsyncPlayerChatEvent event) { + if (settings.getProperty(RestrictionSettings.HIDE_CHAT)) { + event.getRecipients().removeIf(listenerService::shouldCancelEvent); + if (event.getRecipients().isEmpty()) { + event.setCancelled(true); + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerChat(AsyncPlayerChatEvent event) { + if (settings.getProperty(RestrictionSettings.ALLOW_CHAT)) { + return; + } + + final Player player = event.getPlayer(); + final boolean mayPlayerSendChat = !listenerService.shouldCancelEvent(player) + || permissionsManager.hasPermission(player, PlayerStatePermission.ALLOW_CHAT_BEFORE_LOGIN); + if (mayPlayerSendChat) { + removeUnauthorizedRecipients(event); + } else { + event.setCancelled(true); + messages.send(player, MessageKey.DENIED_CHAT); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { + String cmd = event.getMessage().split(" ")[0].toLowerCase(Locale.ROOT); + if (settings.getProperty(HooksSettings.USE_ESSENTIALS_MOTD) && "/motd".equals(cmd)) { + return; + } + if (settings.getProperty(RestrictionSettings.ALLOW_COMMANDS).contains(cmd)) { + return; + } + final Player player = event.getPlayer(); + if (!quickCommandsProtectionManager.isAllowed(player.getName())) { + event.setCancelled(true); + bukkitService.runTaskIfFolia(player, () -> player.kickPlayer(messages.retrieveSingle(player, MessageKey.QUICK_COMMAND_PROTECTION_KICK))); + // AuthMeReReloaded - Folia compatibility + return; + } + if (listenerService.shouldCancelEvent(player)) { + event.setCancelled(true); + messages.send(player, MessageKey.DENIED_COMMAND); + } + } + + /* + * Movement events + */ + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onPlayerMove(PlayerMoveEvent event) { + if (settings.getProperty(ALLOW_UNAUTHED_MOVEMENT) && settings.getProperty(ALLOWED_MOVEMENT_RADIUS) <= 0) { + return; + } + + Location from = event.getFrom(); + Location to = event.getTo(); + if (to == null) { + return; + } + + /* + * Limit player X and Z movements + * Deny player Y+ movements (allows falling) + */ + + if (from.getX() == to.getX() + && from.getZ() == to.getZ() + && from.getY() - to.getY() >= 0) { + return; + } + + Player player = event.getPlayer(); + if (!listenerService.shouldCancelEvent(player)) { + return; + } + + if (!settings.getProperty(RestrictionSettings.ALLOW_UNAUTHED_MOVEMENT)) { + // "cancel" the event + event.setTo(event.getFrom()); + return; + } + + if (settings.getProperty(RestrictionSettings.NO_TELEPORT)) { + return; + } + + Location spawn = spawnLoader.getSpawnLocation(player); + if (spawn != null && spawn.getWorld() != null) { + if (!player.getWorld().equals(spawn.getWorld())) { + TeleportUtils.teleport(player,spawn); + } else if (spawn.distance(player.getLocation()) > settings.getProperty(ALLOWED_MOVEMENT_RADIUS)) { + TeleportUtils.teleport(player,spawn); + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onPlayerRespawn(PlayerRespawnEvent event) { + if (settings.getProperty(RestrictionSettings.NO_TELEPORT)) { + return; + } + if (!listenerService.shouldCancelEvent(event)) { + return; + } + Location spawn = spawnLoader.getSpawnLocation(event.getPlayer()); + if (spawn != null && spawn.getWorld() != null) { + event.setRespawnLocation(spawn); + } + } + + /* + * Entity/block interaction events + */ + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerInteract(PlayerInteractEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerInteractAtEntity(PlayerInteractAtEntityEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerHitPlayerEvent(EntityDamageByEntityEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerShear(PlayerShearEntityEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerFish(PlayerFishEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerBedEnter(PlayerBedEnterEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerEditBook(PlayerEditBookEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onSignChange(SignChangeEvent event) { + Player player = event.getPlayer(); + if (listenerService.shouldCancelEvent(player)) { + event.setCancelled(true); + } + } + + /* + * Inventory interactions + */ + +// @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) +// public void onPlayerPickupItem(EntityPickupItemEvent event) { +// if (listenerService.shouldCancelEvent(event)) { +// event.setCancelled(true); +// } +// } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerDropItem(PlayerDropItemEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerHeldItem(PlayerItemHeldEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerConsumeItem(PlayerItemConsumeEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } + + private boolean isInventoryOpenedByApi(Inventory inventory) { + if (inventory == null) { + return false; + } + if (PENDING_INVENTORIES.contains(inventory)) { + PENDING_INVENTORIES.remove(inventory); + return true; + } else { + return false; + } + } + @SuppressWarnings("all") + private boolean isInventoryWhitelisted(InventoryView inventory) { + if (inventory == null) { + return false; + } + Set whitelist = settings.getProperty(RestrictionSettings.UNRESTRICTED_INVENTORIES); + if (whitelist.isEmpty()) { + return false; + } + //append a string for String whitelist + String invName = ChatColor.stripColor(inventory.getTitle()).toLowerCase(Locale.ROOT); + if (settings.getProperty(RestrictionSettings.STRICT_UNRESTRICTED_INVENTORIES_CHECK)) { + return whitelist.contains(invName); + } + for (String wl : whitelist) { + if (invName.contains(wl)) { + return true; + } + } + return false; + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerInventoryOpen(InventoryOpenEvent event) { + final HumanEntity player = event.getPlayer(); + if (listenerService.shouldCancelEvent(player) + && !isInventoryWhitelisted(event.getView()) + && !isInventoryOpenedByApi(event.getInventory())) { + event.setCancelled(true); + + /* + * @note little hack cause InventoryOpenEvent cannot be cancelled for + * real, cause no packet is sent to server by client for the main inv + */ + bukkitService.scheduleSyncDelayedTask(player::closeInventory, 1); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerInventoryClick(InventoryClickEvent event) { + if (listenerService.shouldCancelEvent(event.getWhoClicked()) + && !isInventoryWhitelisted(event.getView())) { + event.setCancelled(true); + } + } +// @EventHandler(priority = EventPriority.LOWEST) +// public void onSwitchHand(PlayerSwapHandItemsEvent event) { +// Player player = event.getPlayer(); +// if (!player.isSneaking() || !player.hasPermission("keybindings.use")) +// return; +// event.setCancelled(true); +// Bukkit.dispatchCommand(event.getPlayer(), "help"); +// } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListener111.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListener111.java new file mode 100644 index 0000000000..43b4ca339b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListener111.java @@ -0,0 +1,24 @@ +package fr.xephi.authme.listener; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityAirChangeEvent; + +import javax.inject.Inject; + +/** + * Listener of player events for events introduced in Minecraft 1.11. + */ +public class PlayerListener111 implements Listener { + + @Inject + private ListenerService listenerService; + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerAirChange(EntityAirChangeEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListener19.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListener19.java new file mode 100644 index 0000000000..aeb116dccb --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListener19.java @@ -0,0 +1,24 @@ +package fr.xephi.authme.listener; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerSwapHandItemsEvent; + +import javax.inject.Inject; + +/** + * Listener of player events for events introduced in Minecraft 1.9. + */ +public class PlayerListener19 implements Listener { + + @Inject + private ListenerService listenerService; + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListener19Spigot.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListener19Spigot.java new file mode 100644 index 0000000000..a068f27d27 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListener19Spigot.java @@ -0,0 +1,36 @@ +package fr.xephi.authme.listener; + +import fr.xephi.authme.service.TeleportationService; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.spigotmc.event.player.PlayerSpawnLocationEvent; + +import javax.inject.Inject; + +public class PlayerListener19Spigot implements Listener { + + private static boolean isPlayerSpawnLocationEventCalled = false; + + @Inject + private TeleportationService teleportationService; + + + public static boolean isPlayerSpawnLocationEventCalled() { + return isPlayerSpawnLocationEventCalled; + } + + // Note: the following event is called since MC1.9, in older versions we have to fallback on the PlayerJoinEvent + @EventHandler(priority = EventPriority.HIGH) + public void onPlayerSpawn(PlayerSpawnLocationEvent event) { + isPlayerSpawnLocationEventCalled = true; + final Player player = event.getPlayer(); + + Location customSpawnLocation = teleportationService.prepareOnJoinSpawnLocation(player); + if (customSpawnLocation != null) { + event.setSpawnLocation(customSpawnLocation); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListenerHigherThan18.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListenerHigherThan18.java new file mode 100644 index 0000000000..66c408a185 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PlayerListenerHigherThan18.java @@ -0,0 +1,37 @@ +package fr.xephi.authme.listener; + +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.PluginSettings; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.event.player.PlayerSwapHandItemsEvent; + +import javax.inject.Inject; + +public class PlayerListenerHigherThan18 implements Listener { + @Inject + private ListenerService listenerService; + + @Inject + private Settings settings; + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerPickupItem(EntityPickupItemEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onSwitchHand(PlayerSwapHandItemsEvent event) { + Player player = event.getPlayer(); + if (player.isSneaking() && player.hasPermission("keybindings.use") && settings.getProperty(PluginSettings.MENU_UNREGISTER_COMPATIBILITY)) { + event.setCancelled(true); + Bukkit.dispatchCommand(event.getPlayer(), "help"); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PurgeListener.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PurgeListener.java new file mode 100644 index 0000000000..dcc3db4e0e --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/PurgeListener.java @@ -0,0 +1,89 @@ +package fr.xephi.authme.listener; + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.api.v3.AuthMeApi; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; + +import javax.inject.Inject; +import java.io.File; +import java.util.UUID; + +public class PurgeListener implements Listener { + private final AuthMeApi authmeApi = AuthMeApi.getInstance(); + + @Inject + private Settings settings; + @Inject + private BukkitService bukkitService; + @Inject + private AuthMe plugin; + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + String name = player.getName(); + UUID playerUUID = event.getPlayer().getUniqueId(); + if (!authmeApi.isRegistered(name)) { + if (settings.getProperty(SecuritySettings.PURGE_DATA_ON_QUIT)) { + bukkitService.runTaskLater(() -> { + if (!player.isOnline()) { + deletePlayerData(playerUUID); + deletePlayerStats(playerUUID); + deleteAuthMePlayerData(playerUUID); + } + }, 100L); + } + } + } + + private void deletePlayerData(UUID playerUUID) { + // 获取服务器的存储文件夹路径 + File serverFolder = Bukkit.getServer().getWorldContainer(); + String worldFolderName = settings.getProperty(SecuritySettings.DELETE_PLAYER_DATA_WORLD); + // 构建playerdata文件夹路径 + File playerDataFolder = new File(serverFolder, File.separator + worldFolderName + File.separator + "playerdata"); + + // 构建玩家数据文件路径 + File playerDataFile = new File(playerDataFolder, File.separator + playerUUID + ".dat"); + File playerDataOldFile = new File(playerDataFolder, File.separator + playerUUID + ".dat_old"); + + // 删除玩家数据文件 + if (playerDataFile.exists()) { + playerDataFile.delete(); + } + if (playerDataOldFile.exists()) { + playerDataOldFile.delete(); + } + } + + private void deleteAuthMePlayerData(UUID playerUUID) { + File pluginFolder = plugin.getDataFolder(); + File path = new File(pluginFolder, File.separator + "playerdata" + File.separator + playerUUID); + File dataFile = new File(path, File.separator + "data.json"); + if (dataFile.exists()) { + dataFile.delete(); + path.delete(); + } + } + + private void deletePlayerStats(UUID playerUUID) { + // 获取服务器的存储文件夹路径 + File serverFolder = Bukkit.getServer().getWorldContainer(); + String worldFolderName = settings.getProperty(SecuritySettings.DELETE_PLAYER_DATA_WORLD); + // 构建stats文件夹路径 + File statsFolder = new File(serverFolder, File.separator + worldFolderName + File.separator + "stats"); + // 构建玩家统计数据文件路径 + File statsFile = new File(statsFolder, File.separator + playerUUID + ".json"); + // 删除玩家统计数据文件 + if (statsFile.exists()) { + statsFile.delete(); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/ServerListener.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/ServerListener.java new file mode 100644 index 0000000000..97cefa04cd --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/ServerListener.java @@ -0,0 +1,79 @@ +package fr.xephi.authme.listener; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.listener.protocollib.ProtocolLibService; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.service.PluginHookService; +import fr.xephi.authme.settings.SpawnLoader; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.server.PluginDisableEvent; +import org.bukkit.event.server.PluginEnableEvent; + +import javax.inject.Inject; + +/** + * Listener for server events. + */ +public class ServerListener implements Listener { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(ServerListener.class); + + @Inject + private PluginHookService pluginHookService; + @Inject + private SpawnLoader spawnLoader; + @Inject + private ProtocolLibService protocolLibService; + @Inject + private PermissionsManager permissionsManager; + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPluginDisable(PluginDisableEvent event) { + final String pluginName = event.getPlugin().getName(); + + // Call the onPluginDisable method in the permissions manager + permissionsManager.onPluginDisable(pluginName); + + if ("Essentials".equalsIgnoreCase(pluginName)) { + pluginHookService.unhookEssentials(); + logger.info("Essentials has been disabled: unhooking"); + } else if ("CMI".equalsIgnoreCase(pluginName)) { + pluginHookService.unhookCmi(); + spawnLoader.unloadCmiSpawn(); + logger.info("CMI has been disabled: unhooking"); + } else if ("Multiverse-Core".equalsIgnoreCase(pluginName)) { + pluginHookService.unhookMultiverse(); + logger.info("Multiverse-Core has been disabled: unhooking"); + } else if ("EssentialsSpawn".equalsIgnoreCase(pluginName)) { + spawnLoader.unloadEssentialsSpawn(); + logger.info("EssentialsSpawn has been disabled: unhooking"); + } else if ("ProtocolLib".equalsIgnoreCase(pluginName)) { + protocolLibService.disable(); + logger.warning("ProtocolLib has been disabled, unhooking packet adapters!"); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPluginEnable(PluginEnableEvent event) { + final String pluginName = event.getPlugin().getName(); + + // Call the onPluginEnable method in the permissions manager + permissionsManager.onPluginEnable(pluginName); + + if ("Essentials".equalsIgnoreCase(pluginName)) { + pluginHookService.tryHookToEssentials(); + } else if ("Multiverse-Core".equalsIgnoreCase(pluginName)) { + pluginHookService.tryHookToMultiverse(); + } else if ("EssentialsSpawn".equalsIgnoreCase(pluginName)) { + spawnLoader.loadEssentialsSpawn(); + } else if ("CMI".equalsIgnoreCase(pluginName)) { + pluginHookService.tryHookToCmi(); + spawnLoader.loadCmiSpawn(); + } else if ("ProtocolLib".equalsIgnoreCase(pluginName)) { + protocolLibService.setup(); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/protocollib/I18NGetLocalePacketAdapter.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/protocollib/I18NGetLocalePacketAdapter.java new file mode 100644 index 0000000000..60148ba5eb --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/protocollib/I18NGetLocalePacketAdapter.java @@ -0,0 +1,36 @@ +package fr.xephi.authme.listener.protocollib; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.ListenerPriority; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketEvent; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.util.message.I18NUtils; + +import java.util.UUID; + +class I18NGetLocalePacketAdapter extends PacketAdapter { + + I18NGetLocalePacketAdapter(AuthMe plugin) { + super(plugin, ListenerPriority.NORMAL, PacketType.Play.Client.SETTINGS); + } + + @Override + public void onPacketReceiving(PacketEvent event) { + if (event.getPacketType() == PacketType.Play.Client.SETTINGS) { + String locale = event.getPacket().getStrings().read(0).toLowerCase(); + UUID uuid = event.getPlayer().getUniqueId(); + + I18NUtils.addLocale(uuid, locale); + } + } + + public void register() { + ProtocolLibrary.getProtocolManager().addPacketListener(this); + } + + public void unregister() { + ProtocolLibrary.getProtocolManager().removePacketListener(this); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/protocollib/InventoryPacketAdapter.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/protocollib/InventoryPacketAdapter.java new file mode 100644 index 0000000000..c83b992ba0 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/protocollib/InventoryPacketAdapter.java @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2015 AuthMe-Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package fr.xephi.authme.listener.protocollib; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.events.PacketEvent; +import com.comphenix.protocol.reflect.StructureModifier; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.service.BukkitService; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.Arrays; +import java.util.List; + +class InventoryPacketAdapter extends PacketAdapter { + + private static final int PLAYER_INVENTORY = 0; + // http://wiki.vg/Inventory#Inventory (0-4 crafting, 5-8 armor, 9-35 main inventory, 36-44 hotbar, 45 off hand) + // +1 because an index starts with 0 + private static final int CRAFTING_SIZE = 5; + private static final int ARMOR_SIZE = 4; + private static final int MAIN_SIZE = 27; + private static final int HOTBAR_SIZE = 9; + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(InventoryPacketAdapter.class); + private final PlayerCache playerCache; + private final DataSource dataSource; + + InventoryPacketAdapter(AuthMe plugin, PlayerCache playerCache, DataSource dataSource) { + super(plugin, PacketType.Play.Server.SET_SLOT, PacketType.Play.Server.WINDOW_ITEMS); + this.playerCache = playerCache; + this.dataSource = dataSource; + } + + @Override + public void onPacketSending(PacketEvent packetEvent) { + Player player = packetEvent.getPlayer(); + PacketContainer packet = packetEvent.getPacket(); + + int windowId = packet.getIntegers().read(0); + if (windowId == PLAYER_INVENTORY && shouldHideInventory(player.getName())) { + packetEvent.setCancelled(true); + } + } + + /** + * Registers itself to ProtocolLib and blanks out the inventory packet to any applicable players. + * + * @param bukkitService the bukkit service (for retrieval of online players) + */ + public void register(BukkitService bukkitService) { + ProtocolLibrary.getProtocolManager().addPacketListener(this); + + bukkitService.getOnlinePlayers().stream() + .filter(player -> shouldHideInventory(player.getName())) + .forEach(this::sendBlankInventoryPacket); + } + + private boolean shouldHideInventory(String playerName) { + return !playerCache.isAuthenticated(playerName) && dataSource.isAuthAvailable(playerName); + } + + public void unregister() { + ProtocolLibrary.getProtocolManager().removePacketListener(this); + } + + /** + * Sends a blanked out packet to the given player in order to hide the inventory. + * + * @param player the player to send the blank inventory packet to + */ + public void sendBlankInventoryPacket(Player player) { + ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); + PacketContainer inventoryPacket = protocolManager.createPacket(PacketType.Play.Server.WINDOW_ITEMS); + inventoryPacket.getIntegers().write(0, PLAYER_INVENTORY); + int inventorySize = CRAFTING_SIZE + ARMOR_SIZE + MAIN_SIZE + HOTBAR_SIZE; + + ItemStack[] blankInventory = new ItemStack[inventorySize]; + Arrays.fill(blankInventory, new ItemStack(Material.AIR)); + + //old minecraft versions + StructureModifier itemArrayModifier = inventoryPacket.getItemArrayModifier(); + if (itemArrayModifier.size() > 0) { + itemArrayModifier.write(0, blankInventory); + } else { + //minecraft versions above 1.11 + StructureModifier> itemListModifier = inventoryPacket.getItemListModifier(); + itemListModifier.write(0, Arrays.asList(blankInventory)); + } + + protocolManager.sendServerPacket(player, inventoryPacket, false); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/protocollib/ProtocolLibService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/protocollib/ProtocolLibService.java new file mode 100644 index 0000000000..f0297b3387 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/protocollib/ProtocolLibService.java @@ -0,0 +1,159 @@ +package fr.xephi.authme.listener.protocollib; + +import ch.jalu.injector.annotations.NoFieldScan; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.PluginSettings; +import fr.xephi.authme.settings.properties.RestrictionSettings; +import fr.xephi.authme.util.Utils; +import org.bukkit.entity.Player; + +import javax.inject.Inject; + +@NoFieldScan +public class ProtocolLibService implements SettingsDependent { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(ProtocolLibService.class); + + /* Packet Adapters */ + private InventoryPacketAdapter inventoryPacketAdapter; + private TabCompletePacketAdapter tabCompletePacketAdapter; + private I18NGetLocalePacketAdapter i18nGetLocalePacketAdapter; + + /* Settings */ + private boolean protectInvBeforeLogin; + private boolean denyTabCompleteBeforeLogin; + private boolean i18nMessagesSending; + + /* Service */ + private boolean isEnabled; + private final AuthMe plugin; + private final BukkitService bukkitService; + private final PlayerCache playerCache; + private final DataSource dataSource; + + @Inject + ProtocolLibService(AuthMe plugin, Settings settings, BukkitService bukkitService, PlayerCache playerCache, + DataSource dataSource) { + this.plugin = plugin; + this.bukkitService = bukkitService; + this.playerCache = playerCache; + this.dataSource = dataSource; + reload(settings); + } + + /** + * Set up the ProtocolLib packet adapters. + */ + public void setup() { + // Check if ProtocolLib is enabled on the server. + if (!plugin.getServer().getPluginManager().isPluginEnabled("ProtocolLib")) { + if (protectInvBeforeLogin) { + logger.warning("WARNING! The protectInventory feature requires ProtocolLib! Disabling it..."); + } + + if (denyTabCompleteBeforeLogin) { + logger.warning("WARNING! The denyTabComplete feature requires ProtocolLib! Disabling it..."); + } + + if (i18nMessagesSending) { + logger.warning("WARNING! The i18n Messages feature requires ProtocolLib on lower version (< 1.15.2)! Disabling it..."); + } + + this.isEnabled = false; + return; + } + + // Set up packet adapters + if (protectInvBeforeLogin) { + if (inventoryPacketAdapter == null) { + // register the packet listener and start hiding it for all already online players (reload) + inventoryPacketAdapter = new InventoryPacketAdapter(plugin, playerCache, dataSource); + inventoryPacketAdapter.register(bukkitService); + } + } else if (inventoryPacketAdapter != null) { + inventoryPacketAdapter.unregister(); + inventoryPacketAdapter = null; + } + + if (denyTabCompleteBeforeLogin) { + if (tabCompletePacketAdapter == null) { + tabCompletePacketAdapter = new TabCompletePacketAdapter(plugin, playerCache); + tabCompletePacketAdapter.register(); + } + } else if (tabCompletePacketAdapter != null) { + tabCompletePacketAdapter.unregister(); + tabCompletePacketAdapter = null; + } + + if (i18nMessagesSending) { + if (i18nGetLocalePacketAdapter == null) { + i18nGetLocalePacketAdapter = new I18NGetLocalePacketAdapter(plugin); + i18nGetLocalePacketAdapter.register(); + } + } else if (i18nGetLocalePacketAdapter != null) { + i18nGetLocalePacketAdapter.unregister(); + i18nGetLocalePacketAdapter = null; + } + + this.isEnabled = true; + } + + /** + * Stops all features based on ProtocolLib. + */ + public void disable() { + isEnabled = false; + + if (inventoryPacketAdapter != null) { + inventoryPacketAdapter.unregister(); + inventoryPacketAdapter = null; + } + if (tabCompletePacketAdapter != null) { + tabCompletePacketAdapter.unregister(); + tabCompletePacketAdapter = null; + } + if (i18nGetLocalePacketAdapter != null) { + i18nGetLocalePacketAdapter.unregister(); + i18nGetLocalePacketAdapter = null; + } + } + + /** + * Send a packet to the player to give them a blank inventory. + * + * @param player The player to send the packet to. + */ + public void sendBlankInventoryPacket(Player player) { + if (isEnabled && inventoryPacketAdapter != null) { + inventoryPacketAdapter.sendBlankInventoryPacket(player); + } + } + + @Override + public void reload(Settings settings) { + boolean oldProtectInventory = this.protectInvBeforeLogin; + + this.protectInvBeforeLogin = settings.getProperty(RestrictionSettings.PROTECT_INVENTORY_BEFORE_LOGIN); + this.denyTabCompleteBeforeLogin = settings.getProperty(RestrictionSettings.DENY_TABCOMPLETE_BEFORE_LOGIN); + this.i18nMessagesSending = settings.getProperty(PluginSettings.I18N_MESSAGES) && Utils.MAJOR_VERSION <= 15; + + //it was true and will be deactivated now, so we need to restore the inventory for every player + if (oldProtectInventory && !protectInvBeforeLogin && inventoryPacketAdapter != null) { + inventoryPacketAdapter.unregister(); + for (Player onlinePlayer : bukkitService.getOnlinePlayers()) { + if (!playerCache.isAuthenticated(onlinePlayer.getName())) { + onlinePlayer.updateInventory(); + } + } + } + setup(); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/protocollib/TabCompletePacketAdapter.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/protocollib/TabCompletePacketAdapter.java new file mode 100644 index 0000000000..3f0bb31611 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/listener/protocollib/TabCompletePacketAdapter.java @@ -0,0 +1,44 @@ +package fr.xephi.authme.listener.protocollib; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.ListenerPriority; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketEvent; +import com.comphenix.protocol.reflect.FieldAccessException; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.output.ConsoleLoggerFactory; + +class TabCompletePacketAdapter extends PacketAdapter { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(TabCompletePacketAdapter.class); + private final PlayerCache playerCache; + + TabCompletePacketAdapter(AuthMe plugin, PlayerCache playerCache) { + super(plugin, ListenerPriority.NORMAL, PacketType.Play.Client.TAB_COMPLETE); + this.playerCache = playerCache; + } + + @Override + public void onPacketReceiving(PacketEvent event) { + if (event.getPacketType() == PacketType.Play.Client.TAB_COMPLETE) { + try { + if (!playerCache.isAuthenticated(event.getPlayer().getName())) { + event.setCancelled(true); + } + } catch (FieldAccessException e) { + logger.logException("Couldn't access field:", e); + } + } + } + + public void register() { + ProtocolLibrary.getProtocolManager().addPacketListener(this); + } + + public void unregister() { + ProtocolLibrary.getProtocolManager().removePacketListener(this); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/mail/EmailService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/mail/EmailService.java new file mode 100644 index 0000000000..76968fb949 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/mail/EmailService.java @@ -0,0 +1,223 @@ +package fr.xephi.authme.mail; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.EmailSettings; +import fr.xephi.authme.settings.properties.PluginSettings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import fr.xephi.authme.util.FileUtils; +import org.apache.commons.mail.EmailException; +import org.apache.commons.mail.HtmlEmail; + +import javax.activation.DataSource; +import javax.activation.FileDataSource; +import javax.imageio.ImageIO; +import javax.inject.Inject; +import java.io.File; +import java.io.IOException; + +/** + * Creates emails and sends them. + */ +public class EmailService { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(EmailService.class); + + private final File dataFolder; + private final Settings settings; + private final SendMailSsl sendMailSsl; + + @Inject + EmailService(@DataFolder File dataFolder, Settings settings, SendMailSsl sendMailSsl) { + this.dataFolder = dataFolder; + this.settings = settings; + this.sendMailSsl = sendMailSsl; + } + + public boolean hasAllInformation() { + return sendMailSsl.hasAllInformation(); + } + + public boolean sendNewPasswordMail(String name, String mailAddress, String newPass,String ip,String time) { + HtmlEmail email; + try { + email = sendMailSsl.initializeMail(mailAddress); + } catch (EmailException e) { + logger.logException("Failed to create email with the given settings:", e); + return false; + } + + String mailText = replaceTagsForPasswordMail(settings.getNewPasswordEmailMessage(), name, newPass,ip,time); + File file = null; + if (settings.getProperty(EmailSettings.PASSWORD_AS_IMAGE)) { + try { + file = generatePasswordImage(name, newPass); + mailText = embedImageIntoEmailContent(file, email, mailText); + } catch (IOException | EmailException e) { + logger.logException( + "Unable to send new password as image for email " + mailAddress + ":", e); + } + } + + boolean couldSendEmail = sendMailSsl.sendEmail(mailText, email); + FileUtils.delete(file); + return couldSendEmail; + } + + /** + * Sends an email to the user with his new password. + * + * @param name the name of the player + * @param mailAddress the player's email + * @param newPass the new password + * @return true if email could be sent, false otherwise + */ + public boolean sendPasswordMail(String name, String mailAddress, String newPass, String time) { + if (!hasAllInformation()) { + logger.warning("Cannot perform email registration: not all email settings are complete"); + return false; + } + + HtmlEmail email; + try { + email = sendMailSsl.initializeMail(mailAddress); + } catch (EmailException e) { + logger.logException("Failed to create email with the given settings:", e); + return false; + } + + String mailText = replaceTagsForPasswordMail(settings.getPasswordEmailMessage(), name, newPass,time); + // Generate an image? + File file = null; + if (settings.getProperty(EmailSettings.PASSWORD_AS_IMAGE)) { + try { + file = generatePasswordImage(name, newPass); + mailText = embedImageIntoEmailContent(file, email, mailText); + } catch (IOException | EmailException e) { + logger.logException( + "Unable to send new password as image for email " + mailAddress + ":", e); + } + } + + boolean couldSendEmail = sendMailSsl.sendEmail(mailText, email); + FileUtils.delete(file); + return couldSendEmail; + } + /** + * Sends an email to the user with the temporary verification code. + * + * @param name the name of the player + * @param mailAddress the player's email + * @param code the verification code + */ + public void sendVerificationMail(String name, String mailAddress, String code, String time) { + if (!hasAllInformation()) { + logger.warning("Cannot send verification email: not all email settings are complete"); + return; + } + + HtmlEmail email; + try { + email = sendMailSsl.initializeMail(mailAddress); + } catch (EmailException e) { + logger.logException("Failed to create verification email with the given settings:", e); + return; + } + + String mailText = replaceTagsForVerificationEmail(settings.getVerificationEmailMessage(), name, code, + settings.getProperty(SecuritySettings.VERIFICATION_CODE_EXPIRATION_MINUTES),time); + sendMailSsl.sendEmail(mailText, email); + } + + /** + * Sends an email to the user with a recovery code for the password recovery process. + * + * @param name the name of the player + * @param email the player's email address + * @param code the recovery code + * @return true if email could be sent, false otherwise + */ + public boolean sendRecoveryCode(String name, String email, String code, String time) { + HtmlEmail htmlEmail; + try { + htmlEmail = sendMailSsl.initializeMail(email); + } catch (EmailException e) { + logger.logException("Failed to create email for recovery code:", e); + return false; + } + + String message = replaceTagsForRecoveryCodeMail(settings.getRecoveryCodeEmailMessage(), + name, code, settings.getProperty(SecuritySettings.RECOVERY_CODE_HOURS_VALID),time); + return sendMailSsl.sendEmail(message, htmlEmail); + } + + public void sendShutDown(String email, String time) { + HtmlEmail htmlEmail; + try { + htmlEmail = sendMailSsl.initializeMail(email); + } catch (EmailException e) { + logger.logException("Failed to create email for shutdown:", e); + return; + } + + String message = replaceTagsForShutDownMail(settings.getShutdownEmailMessage(), time); + sendMailSsl.sendEmail(message, htmlEmail); + } + + private File generatePasswordImage(String name, String newPass) throws IOException { + ImageGenerator gen = new ImageGenerator(newPass); + File file = new File(dataFolder, name + "_new_pass.jpg"); + ImageIO.write(gen.generateImage(), "jpg", file); + return file; + } + + private static String embedImageIntoEmailContent(File image, HtmlEmail email, String content) + throws EmailException { + DataSource source = new FileDataSource(image); + String tag = email.embed(source, image.getName()); + return content.replace("", ""); + } + + private String replaceTagsForPasswordMail(String mailText, String name, String newPass,String ip,String time) { + return mailText + .replace("", name) + .replace("", settings.getProperty(PluginSettings.SERVER_NAME)) + .replace("", newPass) + .replace("", ip) + .replace("

+ * Only the "XOAUTH2" mechanism is supported. The {@code callbackHandler} is + * passed to the OAuth2SaslClient. Other parameters are ignored. + */ +public class OAuth2SaslClientFactory implements SaslClientFactory { + + private static final Logger logger = Logger.getLogger(OAuth2SaslClientFactory.class.getName()); + + public static final String OAUTH_TOKEN_PROP = "mail.smpt.sasl.mechanisms.oauth2.oauthToken"; + + public SaslClient createSaslClient(String[] mechanisms, + String authorizationId, String protocol, String serverName, + Map props, CallbackHandler callbackHandler) { + boolean matchedMechanism = false; + for (int i = 0; i < mechanisms.length; ++i) { + if ("XOAUTH2".equalsIgnoreCase(mechanisms[i])) { + matchedMechanism = true; + break; + } + } + if (!matchedMechanism) { + logger.info("Failed to match any mechanisms"); + return null; + } + return new OAuth2SaslClient((String) props.get(OAUTH_TOKEN_PROP), callbackHandler); + } + + public String[] getMechanismNames(Map props) { + return new String[] { "XOAUTH2" }; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/mail/SendMailSsl.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/mail/SendMailSsl.java new file mode 100644 index 0000000000..b7e9fd41f2 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/mail/SendMailSsl.java @@ -0,0 +1,158 @@ +package fr.xephi.authme.mail; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.output.LogLevel; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.EmailSettings; +import fr.xephi.authme.settings.properties.PluginSettings; +import fr.xephi.authme.util.StringUtils; +import org.apache.commons.mail.EmailConstants; +import org.apache.commons.mail.EmailException; +import org.apache.commons.mail.HtmlEmail; + +import javax.activation.CommandMap; +import javax.activation.MailcapCommandMap; +import javax.inject.Inject; +import javax.mail.Session; +import java.security.Security; +import java.util.Properties; + +import static fr.xephi.authme.settings.properties.EmailSettings.MAIL_ACCOUNT; +import static fr.xephi.authme.settings.properties.EmailSettings.MAIL_PASSWORD; + + +/** + * Sends emails to players on behalf of the server. + */ +public class SendMailSsl { + + private ConsoleLogger logger = ConsoleLoggerFactory.get(SendMailSsl.class); + + @Inject + private Settings settings; + + /** + * Returns whether all necessary settings are set for sending mails. + * + * @return true if the necessary email settings are set, false otherwise + */ + public boolean hasAllInformation() { + return !settings.getProperty(MAIL_ACCOUNT).isEmpty() + && !settings.getProperty(MAIL_PASSWORD).isEmpty(); + } + + /** + * Creates a {@link HtmlEmail} object configured as per the AuthMe config + * with the given email address as recipient. + * + * @param emailAddress the email address the email is destined for + * @return the created HtmlEmail object + * @throws EmailException if the mail is invalid + */ + public HtmlEmail initializeMail(String emailAddress) throws EmailException { + String senderMail = StringUtils.isBlank(settings.getProperty(EmailSettings.MAIL_ADDRESS)) + ? settings.getProperty(EmailSettings.MAIL_ACCOUNT) + : settings.getProperty(EmailSettings.MAIL_ADDRESS); + + String senderName = StringUtils.isBlank(settings.getProperty(EmailSettings.MAIL_SENDER_NAME)) + ? senderMail + : settings.getProperty(EmailSettings.MAIL_SENDER_NAME); + String mailPassword = settings.getProperty(EmailSettings.MAIL_PASSWORD); + int port = settings.getProperty(EmailSettings.SMTP_PORT); + + HtmlEmail email = new HtmlEmail(); + email.setCharset(EmailConstants.UTF_8); + email.setSmtpPort(port); + email.setHostName(settings.getProperty(EmailSettings.SMTP_HOST)); + email.addTo(emailAddress); + email.setFrom(senderMail, senderName); + email.setSubject(settings.getProperty(EmailSettings.RECOVERY_MAIL_SUBJECT)); + email.setAuthentication(settings.getProperty(EmailSettings.MAIL_ACCOUNT), mailPassword); + if (settings.getProperty(PluginSettings.LOG_LEVEL).includes(LogLevel.DEBUG)) { + email.setDebug(true); + } + + setPropertiesForPort(email, port); + return email; + } + + /** + * Sets the given content to the HtmlEmail object and sends it. + * + * @param content the content to set + * @param email the email object to send + * @return true upon success, false otherwise + */ + public boolean sendEmail(String content, HtmlEmail email) { + Thread.currentThread().setContextClassLoader(SendMailSsl.class.getClassLoader()); + // Issue #999: Prevent UnsupportedDataTypeException: no object DCH for MIME type multipart/alternative + // cf. http://stackoverflow.com/questions/21856211/unsupporteddatatypeexception-no-object-dch-for-mime-type + MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); + mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); + mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); + mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); + mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); + mc.addMailcap("message/rfc822;; x-java-content- handler=com.sun.mail.handlers.message_rfc822"); + + try { + email.setHtmlMsg(content); + email.setTextMsg(content); + } catch (EmailException e) { + logger.logException("Your email.html config contains an error and cannot be sent:", e); + return false; + } + try { + email.send(); + return true; + } catch (EmailException e) { + logger.logException("Failed to send a mail to " + email.getToAddresses() + ":", e); + return false; + } + } + + /** + * Sets properties to the given HtmlEmail object based on the port from which it will be sent. + * + * @param email the email object to configure + * @param port the configured outgoing port + */ + private void setPropertiesForPort(HtmlEmail email, int port) throws EmailException { + switch (port) { + case 587: + String oAuth2Token = settings.getProperty(EmailSettings.OAUTH2_TOKEN); + if (!oAuth2Token.isEmpty()) { + if (Security.getProvider("Google OAuth2 Provider") == null) { + Security.addProvider(new OAuth2Provider()); + } + Properties mailProperties = email.getMailSession().getProperties(); + mailProperties.setProperty("mail.smtp.ssl.enable", "true"); + mailProperties.setProperty("mail.smtp.auth.mechanisms", "XOAUTH2"); + mailProperties.setProperty("mail.smtp.sasl.enable", "true"); + mailProperties.setProperty("mail.smtp.sasl.mechanisms", "XOAUTH2"); + mailProperties.setProperty("mail.smtp.auth.login.disable", "true"); + mailProperties.setProperty("mail.smtp.auth.plain.disable", "true"); + mailProperties.setProperty(OAuth2SaslClientFactory.OAUTH_TOKEN_PROP, oAuth2Token); + email.setMailSession(Session.getInstance(mailProperties)); + } else { + email.setStartTLSEnabled(true); + email.setStartTLSRequired(true); + } + break; + case 25: + if (settings.getProperty(EmailSettings.PORT25_USE_TLS)) { + email.setStartTLSEnabled(true); + email.setSSLCheckServerIdentity(true); + } + break; + case 465: + email.setSslSmtpPort(Integer.toString(port)); + email.setSSLOnConnect(true); + break; + default: + email.setStartTLSEnabled(true); + email.setSSLOnConnect(true); + email.setSSLCheckServerIdentity(true); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/AbstractMessageFileHandler.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/AbstractMessageFileHandler.java new file mode 100644 index 0000000000..8211d53c0c --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/AbstractMessageFileHandler.java @@ -0,0 +1,170 @@ +package fr.xephi.authme.message; + +import com.google.common.annotations.VisibleForTesting; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.initialization.Reloadable; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.PluginSettings; +import fr.xephi.authme.util.FileUtils; +import fr.xephi.authme.util.message.I18NUtils; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import java.io.File; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import static fr.xephi.authme.message.MessagePathHelper.DEFAULT_LANGUAGE; + +/** + * Handles a YAML message file with a default file fallback. + */ +public abstract class AbstractMessageFileHandler implements Reloadable { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(AbstractMessageFileHandler.class); + + @DataFolder + @Inject + private File dataFolder; + + @Inject + private Settings settings; + + private String filename; + private FileConfiguration configuration; + private Map i18nConfiguration; + private final String defaultFile; + + protected AbstractMessageFileHandler() { + this.defaultFile = createFilePath(DEFAULT_LANGUAGE); + } + + @Override + @PostConstruct + public void reload() { + String language = settings.getProperty(PluginSettings.MESSAGES_LANGUAGE); + filename = createFilePath(language); + File messagesFile = initializeFile(filename); + configuration = YamlConfiguration.loadConfiguration(messagesFile); + i18nConfiguration = null; + } + + protected String getLanguage() { + return settings.getProperty(PluginSettings.MESSAGES_LANGUAGE); + } + + protected File getUserLanguageFile() { + return new File(dataFolder, filename); + } + + protected String getFilename() { + return filename; + } + + /** + * Returns whether the message file configuration has an entry at the given path. + * + * @param path the path to verify + * @return true if an entry exists for the path in the messages file, false otherwise + */ + public boolean hasSection(String path) { + return configuration.get(path) != null; + } + + /** + * Returns the message for the given key. + * + * @param key the key to retrieve the message for + * @return the message + */ + public String getMessage(String key) { + String message = configuration.getString(key); + return message == null + ? "Error retrieving message '" + key + "'" + : message; + } + + /** + * Returns the i18n message for the given key and given locale. + * + * @param key the key to retrieve the message for + * @param locale the locale that player client setting uses + * @return the message + */ + public String getMessageByLocale(String key, String locale) { + if (locale == null || !settings.getProperty(PluginSettings.I18N_MESSAGES)) { + return getMessage(key); + } + + String message = getI18nConfiguration(locale).getString(key); + return message == null + ? "Error retrieving message '" + key + "'" + : message; + } + + /** + * Returns the message for the given key only if it exists, + * i.e. without falling back to the default file. + * + * @param key the key to retrieve the message for + * @return the message, or {@code null} if not available + */ + public String getMessageIfExists(String key) { + return configuration.getString(key); + } + + public FileConfiguration getI18nConfiguration(String locale) { + if (i18nConfiguration == null) { + i18nConfiguration = new ConcurrentHashMap<>(); + } + + locale = I18NUtils.localeToCode(locale, settings); + + if (i18nConfiguration.containsKey(locale)) { + return i18nConfiguration.get(locale); + } else { + // Sync with reload(); + String i18nFilename = createFilePath(locale); + File i18nMessagesFile = initializeFile(i18nFilename); + FileConfiguration config = YamlConfiguration.loadConfiguration(i18nMessagesFile); + + i18nConfiguration.put(locale, config); + + return config; + } + } + + /** + * Creates the path to the messages file for the given language code. + * + * @param language the language code + * @return path to the message file for the given language + */ + protected abstract String createFilePath(String language); + + /** + * Copies the messages file from the JAR to the local messages/ folder if it doesn't exist. + * + * @param filePath path to the messages file to use + * @return the messages file to use + */ + @VisibleForTesting + File initializeFile(String filePath) { + File file = new File(dataFolder, filePath); + // Check that JAR file exists to avoid logging an error + if (FileUtils.getResourceFromJar(filePath) != null && FileUtils.copyFileFromResource(file, filePath)) { + return file; + } + + if (FileUtils.copyFileFromResource(file, defaultFile)) { + return file; + } else { + logger.warning("Wanted to copy default messages file '" + defaultFile + "' from JAR but it didn't exist"); + return null; + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/HelpMessagesFileHandler.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/HelpMessagesFileHandler.java new file mode 100644 index 0000000000..89dc522453 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/HelpMessagesFileHandler.java @@ -0,0 +1,67 @@ +package fr.xephi.authme.message; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.util.FileUtils; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import javax.inject.Inject; +import java.io.InputStream; +import java.io.InputStreamReader; + +import static fr.xephi.authme.message.MessagePathHelper.DEFAULT_LANGUAGE; + +/** + * File handler for the help_xx.yml resource. + */ +public class HelpMessagesFileHandler extends AbstractMessageFileHandler { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(HelpMessagesFileHandler.class); + + private FileConfiguration defaultConfiguration; + + @Inject // Trigger injection in the superclass + HelpMessagesFileHandler() { + } + + /** + * Returns the message for the given key. + * + * @param key the key to retrieve the message for + * @return the message + */ + @Override + public String getMessage(String key) { + String message = getMessageIfExists(key); + + if (message == null) { + logger.warning("Error getting message with key '" + key + "'. " + + "Please update your config file '" + getFilename() + "' or run /authme messages help"); + return getDefault(key); + } + return message; + } + + /** + * Gets the message from the default file. + * + * @param key the key to retrieve the message for + * @return the message from the default file + */ + private String getDefault(String key) { + if (defaultConfiguration == null) { + InputStream stream = FileUtils.getResourceFromJar(createFilePath(DEFAULT_LANGUAGE)); + defaultConfiguration = YamlConfiguration.loadConfiguration(new InputStreamReader(stream)); + } + String message = defaultConfiguration.getString(key); + return message == null + ? "Error retrieving message '" + key + "'" + : message; + } + + @Override + protected String createFilePath(String language) { + return MessagePathHelper.createHelpMessageFilePath(language); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/MessageKey.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/MessageKey.java new file mode 100644 index 0000000000..ab05738dfc --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/MessageKey.java @@ -0,0 +1,399 @@ +package fr.xephi.authme.message; + +/** + * Keys for translatable messages managed by {@link Messages}. + */ +public enum MessageKey { + /** + * You have been disconnected due to doubled login. + */ + DOUBLE_LOGIN_FIX("double_login_fix.fix_message"), + + /** + * You are stuck in portal during Login. + */ + LOCATION_FIX_PORTAL("login_location_fix.fix_portal"), + + /** + * You are stuck underground during Login. + */ + LOCATION_FIX_UNDERGROUND("login_location_fix.fix_underground"), + + /** + * You are stuck underground during Login, but we cant fix it. + */ + LOCATION_FIX_UNDERGROUND_CANT_FIX("login_location_fix.cannot_fix_underground"), + + /** + * Bedrock auto login success! + */ + BEDROCK_AUTO_LOGGED_IN("bedrock_auto_login.success"), + + /** + * In order to use this command you must be authenticated! + */ + DENIED_COMMAND("error.denied_command"), + + /** + * A player with the same IP is already in game! + */ + SAME_IP_ONLINE("on_join_validation.same_ip_online"), + + /** + * In order to chat you must be authenticated! + */ + DENIED_CHAT("error.denied_chat"), + + /** AntiBot protection mode is enabled! You have to wait some minutes before joining the server. */ + KICK_ANTIBOT("antibot.kick_antibot"), + + /** This user isn't registered! */ + UNKNOWN_USER("error.unregistered_user"), + + /** You're not logged in! */ + NOT_LOGGED_IN("error.not_logged_in"), + + /** Usage: /login <password> */ + USAGE_LOGIN("login.command_usage"), + + /** Wrong password! */ + WRONG_PASSWORD("login.wrong_password"), + + /** Successfully unregistered! */ + UNREGISTERED_SUCCESS("unregister.success"), + + /** In-game registration is disabled! */ + REGISTRATION_DISABLED("registration.disabled"), + + /** Logged-in due to Session Reconnection. */ + SESSION_RECONNECTION("session.valid_session"), + + /** Successful login! */ + LOGIN_SUCCESS("login.success"), + + /** Your account isn't activated yet, please check your emails! */ + ACCOUNT_NOT_ACTIVATED("misc.account_not_activated"), + + /** You already have registered this username! */ + NAME_ALREADY_REGISTERED("registration.name_taken"), + + /** You don't have the permission to perform this action! */ + NO_PERMISSION("error.no_permission"), + + /** An unexpected error occurred, please contact an administrator! */ + ERROR("error.unexpected_error"), + + /** Please, login with the command: /login <password> */ + LOGIN_MESSAGE("login.login_request"), + + /** Please, register to the server with the command: /register <password> <ConfirmPassword> */ + REGISTER_MESSAGE("registration.register_request"), + + /** You have exceeded the maximum number of registrations (%reg_count/%max_acc %reg_names) for your connection! */ + MAX_REGISTER_EXCEEDED("error.max_registration", "%max_acc", "%reg_count", "%reg_names"), + + /** Usage: /register <password> <ConfirmPassword> */ + USAGE_REGISTER("registration.command_usage"), + + /** Usage: /unregister <password> */ + USAGE_UNREGISTER("unregister.command_usage"), + + /** Password changed successfully! */ + PASSWORD_CHANGED_SUCCESS("misc.password_changed"), + + /** Passwords didn't match, check them again! */ + PASSWORD_MATCH_ERROR("password.match_error"), + + /** You can't use your name as password, please choose another one... */ + PASSWORD_IS_USERNAME_ERROR("password.name_in_password"), + + /** The chosen password isn't safe, please choose another one... */ + PASSWORD_UNSAFE_ERROR("password.unsafe_password"), + + /** Your chosen password is not secure. It was used %pwned_count times already! Please use a stronger password... */ + PASSWORD_PWNED_ERROR("password.pwned_password", "%pwned_count"), + + /** Your password contains illegal characters. Allowed chars: %valid_chars */ + PASSWORD_CHARACTERS_ERROR("password.forbidden_characters", "%valid_chars"), + + /** Your IP has been changed and your session data has expired! */ + SESSION_EXPIRED("session.invalid_session"), + + /** Only registered users can join the server! Please visit http://example.com to register yourself! */ + MUST_REGISTER_MESSAGE("registration.reg_only"), + + /** You're already logged in! */ + ALREADY_LOGGED_IN_ERROR("error.logged_in"), + + /** Logged out successfully! */ + LOGOUT_SUCCESS("misc.logout"), + + /** The same username is already playing on the server! */ + USERNAME_ALREADY_ONLINE_ERROR("on_join_validation.same_nick_online"), + + /** Successfully registered! */ + REGISTER_SUCCESS("registration.success"), + + /** Your password is too short or too long! Please try with another one! */ + INVALID_PASSWORD_LENGTH("password.wrong_length"), + + /** Configuration and database have been reloaded correctly! */ + CONFIG_RELOAD_SUCCESS("misc.reload"), + + /** Login timeout exceeded, you have been kicked from the server, please try again! */ + LOGIN_TIMEOUT_ERROR("login.timeout_error"), + + /** Usage: /changepassword <oldPassword> <newPassword> */ + USAGE_CHANGE_PASSWORD("misc.usage_change_password"), + + /** Your username is either too short or too long! */ + INVALID_NAME_LENGTH("on_join_validation.name_length"), + + /** Your username contains illegal characters. Allowed chars: %valid_chars */ + INVALID_NAME_CHARACTERS("on_join_validation.characters_in_name", "%valid_chars"), + + /** Please add your email to your account with the command: /email add <yourEmail> <confirmEmail> */ + ADD_EMAIL_MESSAGE("email.add_email_request"), + + /** Forgot your password? Please use the command: /email recovery <yourEmail> */ + FORGOT_PASSWORD_MESSAGE("recovery.forgot_password_hint"), + + /** To log in you have to solve a captcha code, please use the command: /captcha %captcha_code */ + USAGE_CAPTCHA("captcha.usage_captcha", "%captcha_code"), + + /** Wrong captcha, please type "/captcha %captcha_code" into the chat! */ + CAPTCHA_WRONG_ERROR("captcha.wrong_captcha", "%captcha_code"), + + /** Captcha code solved correctly! */ + CAPTCHA_SUCCESS("captcha.valid_captcha"), + + /** To register you have to solve a captcha first, please use the command: /captcha %captcha_code */ + CAPTCHA_FOR_REGISTRATION_REQUIRED("captcha.captcha_for_registration", "%captcha_code"), + + /** Valid captcha! You may now register with /register */ + REGISTER_CAPTCHA_SUCCESS("captcha.register_captcha_valid"), + + /** A VIP player has joined the server when it was full! */ + KICK_FOR_VIP("error.kick_for_vip"), + + /** The server is full, try again later! */ + KICK_FULL_SERVER("on_join_validation.kick_full_server"), + + /** An error occurred: unresolved player hostname! **/ + KICK_UNRESOLVED_HOSTNAME("error.kick_unresolved_hostname"), + + /** Usage: /email add <email> <confirmEmail> */ + USAGE_ADD_EMAIL("email.usage_email_add"), + + /** Usage: /email change <oldEmail> <newEmail> */ + USAGE_CHANGE_EMAIL("email.usage_email_change"), + + /** Usage: /email recovery <Email> */ + USAGE_RECOVER_EMAIL("recovery.command_usage"), + + /** Invalid new email, try again! */ + INVALID_NEW_EMAIL("email.new_email_invalid"), + + /** Invalid old email, try again! */ + INVALID_OLD_EMAIL("email.old_email_invalid"), + + /** Invalid email address, try again! */ + INVALID_EMAIL("email.invalid"), + + /** Email address successfully added to your account! */ + EMAIL_ADDED_SUCCESS("email.added"), + + /** Adding email was not allowed */ + EMAIL_ADD_NOT_ALLOWED("email.add_not_allowed"), + + /** Please confirm your email address! */ + CONFIRM_EMAIL_MESSAGE("email.request_confirmation"), + + /** Email address changed correctly! */ + EMAIL_CHANGED_SUCCESS("email.changed"), + + /** Changing email was not allowed */ + EMAIL_CHANGE_NOT_ALLOWED("email.change_not_allowed"), + + /** Your current email address is: %email */ + EMAIL_SHOW("email.email_show", "%email"), + + /** You currently don't have email address associated with this account. */ + SHOW_NO_EMAIL("email.no_email_for_account"), + + /** Recovery email sent successfully! Please check your email inbox! */ + RECOVERY_EMAIL_SENT_MESSAGE("recovery.email_sent"), + + /** Your country is banned from this server! */ + COUNTRY_BANNED_ERROR("on_join_validation.country_banned"), + + /** [AntiBotService] AntiBot enabled due to the huge number of connections! */ + ANTIBOT_AUTO_ENABLED_MESSAGE("antibot.auto_enabled"), + + /** [AntiBotService] AntiBot disabled after %m minutes! */ + ANTIBOT_AUTO_DISABLED_MESSAGE("antibot.auto_disabled", "%m"), + + /** The email address is already being used */ + EMAIL_ALREADY_USED_ERROR("email.already_used"), + + /** Your secret code is %code. You can scan it from here %url */ + TWO_FACTOR_CREATE("two_factor.code_created", "%code", "%url"), + + /** Please confirm your code with /2fa confirm <code> */ + TWO_FACTOR_CREATE_CONFIRMATION_REQUIRED("two_factor.confirmation_required"), + + /** Please submit your two-factor authentication code with /2fa code <code> */ + TWO_FACTOR_CODE_REQUIRED("two_factor.code_required"), + + /** Two-factor authentication is already enabled for your account! */ + TWO_FACTOR_ALREADY_ENABLED("two_factor.already_enabled"), + + /** No 2fa key has been generated for you or it has expired. Please run /2fa add */ + TWO_FACTOR_ENABLE_ERROR_NO_CODE("two_factor.enable_error_no_code"), + + /** Successfully enabled two-factor authentication for your account */ + TWO_FACTOR_ENABLE_SUCCESS("two_factor.enable_success"), + + /** Wrong code or code has expired. Please run /2fa add */ + TWO_FACTOR_ENABLE_ERROR_WRONG_CODE("two_factor.enable_error_wrong_code"), + + /** Two-factor authentication is not enabled for your account. Run /2fa add */ + TWO_FACTOR_NOT_ENABLED_ERROR("two_factor.not_enabled_error"), + + /** Successfully removed two-factor auth from your account */ + TWO_FACTOR_REMOVED_SUCCESS("two_factor.removed_success"), + + /** Invalid code! */ + TWO_FACTOR_INVALID_CODE("two_factor.invalid_code"), + + /** You are not the owner of this account. Please choose another name! */ + NOT_OWNER_ERROR("on_join_validation.not_owner_error"), + + /** You should join using username %valid, not %invalid. */ + INVALID_NAME_CASE("on_join_validation.invalid_name_case", "%valid", "%invalid"), + + /** You have been temporarily banned for failing to log in too many times. */ + TEMPBAN_MAX_LOGINS("error.tempban_max_logins"), + + /** You own %count accounts: */ + ACCOUNTS_OWNED_SELF("misc.accounts_owned_self", "%count"), + + /** The player %name has %count accounts: */ + ACCOUNTS_OWNED_OTHER("misc.accounts_owned_other", "%name", "%count"), + + /** An admin just registered you; please log in again */ + KICK_FOR_ADMIN_REGISTER("registration.kicked_admin_registered"), + + /** Error: not all required settings are set for sending emails. Please contact an admin. */ + INCOMPLETE_EMAIL_SETTINGS("email.incomplete_settings"), + + /** The email could not be sent. Please contact an administrator. */ + EMAIL_SEND_FAILURE("email.send_failure"), + + /** A recovery code to reset your password has been sent to your email. */ + RECOVERY_CODE_SENT("recovery.code.code_sent"), + + /** The recovery code is not correct! You have %count tries remaining. */ + INCORRECT_RECOVERY_CODE("recovery.code.incorrect", "%count"), + + /** + * You have exceeded the maximum number of attempts to enter the recovery code. + * Use "/email recovery [email]" to generate a new one. + */ + RECOVERY_TRIES_EXCEEDED("recovery.code.tries_exceeded"), + + /** Recovery code entered correctly! */ + RECOVERY_CODE_CORRECT("recovery.code.correct"), + + /** Please use the command /email setpassword to change your password immediately. */ + RECOVERY_CHANGE_PASSWORD("recovery.code.change_password"), + + /** You cannot change your password using this command anymore. */ + CHANGE_PASSWORD_EXPIRED("email.change_password_expired"), + + /** An email was already sent recently. You must wait %time before you can send a new one. */ + EMAIL_COOLDOWN_ERROR("email.email_cooldown_error", "%time"), + + /** + * This command is sensitive and requires an email verification! + * Check your inbox and follow the email's instructions. + */ + VERIFICATION_CODE_REQUIRED("verification.code_required"), + + /** Usage: /verification <code> */ + USAGE_VERIFICATION_CODE("verification.command_usage"), + + /** Incorrect code, please type "/verification <code>" into the chat, using the code you received by email */ + INCORRECT_VERIFICATION_CODE("verification.incorrect_code"), + + /** Your identity has been verified! You can now execute all commands within the current session! */ + VERIFICATION_CODE_VERIFIED("verification.success"), + + /** You can already execute every sensitive command within the current session! */ + VERIFICATION_CODE_ALREADY_VERIFIED("verification.already_verified"), + + /** Your code has expired! Execute another sensitive command to get a new code! */ + VERIFICATION_CODE_EXPIRED("verification.code_expired"), + + /** To verify your identity you need to link an email address with your account! */ + VERIFICATION_CODE_EMAIL_NEEDED("verification.email_needed"), + + /** You used a command too fast! Please, join the server again and wait more before using any command. */ + QUICK_COMMAND_PROTECTION_KICK("on_join_validation.quick_command"), + + /** second */ + SECOND("time.second"), + + /** seconds */ + SECONDS("time.seconds"), + + /** minute */ + MINUTE("time.minute"), + + /** minutes */ + MINUTES("time.minutes"), + + /** hour */ + HOUR("time.hour"), + + /** hours */ + HOURS("time.hours"), + + /** day */ + DAY("time.day"), + + /** days */ + DAYS("time.days"); + + + private String key; + private String[] tags; + + MessageKey(String key, String... tags) { + this.key = key; + this.tags = tags; + } + + /** + * Return the key used in the messages file. + * + * @return The key + */ + public String getKey() { + return key; + } + + /** + * Return a list of tags (texts) that are replaced with actual content in AuthMe. + * + * @return List of tags + */ + public String[] getTags() { + return tags; + } + + @Override + public String toString() { + return key; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/MessagePathHelper.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/MessagePathHelper.java new file mode 100644 index 0000000000..82c829d159 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/MessagePathHelper.java @@ -0,0 +1,77 @@ +package fr.xephi.authme.message; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Helper for creating and processing paths to message files. + */ +public final class MessagePathHelper { + + /** The default language (used as fallback, assumed to be complete, etc.). */ + public static final String DEFAULT_LANGUAGE = "en"; + /** Local path to the folder containing the message files. */ + public static final String MESSAGES_FOLDER = "messages/"; + /** Local path to the default messages file (messages/messages_en.yml). */ + public static final String DEFAULT_MESSAGES_FILE = createMessageFilePath(DEFAULT_LANGUAGE); + + private static final Pattern MESSAGE_FILE_PATTERN = Pattern.compile("messages_([a-z]+)\\.yml"); + private static final Pattern HELP_MESSAGES_FILE = Pattern.compile("help_[a-z]+\\.yml"); + + private MessagePathHelper() { + } + + /** + * Creates the local path to the messages file for the provided language code. + * + * @param languageCode the language code + * @return local path to the messages file of the given language + */ + public static String createMessageFilePath(String languageCode) { + return "messages/messages_" + languageCode + ".yml"; + } + + /** + * Creates the local path to the help messages file for the provided language code. + * + * @param languageCode the language code + * @return local path to the help messages file of the given language + */ + public static String createHelpMessageFilePath(String languageCode) { + return "messages/help_" + languageCode + ".yml"; + } + + /** + * Returns whether the given file name is a messages file. + * + * @param filename the file name to test + * @return true if it is a messages file, false otherwise + */ + public static boolean isMessagesFile(String filename) { + return MESSAGE_FILE_PATTERN.matcher(filename).matches(); + } + + /** + * Returns the language code the given file name is for if it is a messages file, otherwise null is returned. + * + * @param filename the file name to process + * @return the language code the file name is a messages file for, or null if not applicable + */ + public static String getLanguageIfIsMessagesFile(String filename) { + Matcher matcher = MESSAGE_FILE_PATTERN.matcher(filename); + if (matcher.matches()) { + return matcher.group(1); + } + return null; + } + + /** + * Returns whether the given file name is a help messages file. + * + * @param filename the file name to test + * @return true if it is a help messages file, false otherwise + */ + public static boolean isHelpFile(String filename) { + return HELP_MESSAGES_FILE.matcher(filename).matches(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/Messages.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/Messages.java new file mode 100644 index 0000000000..0d7ec317e4 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/Messages.java @@ -0,0 +1,201 @@ +package fr.xephi.authme.message; + +import com.google.common.collect.ImmutableMap; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.mail.EmailService; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.util.expiring.Duration; +import fr.xephi.authme.util.message.I18NUtils; +import fr.xephi.authme.util.message.MiniMessageUtils; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Class for retrieving and sending translatable messages to players. + */ +public class Messages { + + // Custom Authme tag replaced to new line + private static final String NEWLINE_TAG = "%nl%"; + + // Global tag replacements + private static final String USERNAME_TAG = "%username%"; + private static final String DISPLAYNAME_TAG = "%displayname%"; + + /** Contains the keys of the singular messages for time units. */ + private static final Map TIME_UNIT_SINGULARS = ImmutableMap.builder() + .put(TimeUnit.SECONDS, MessageKey.SECOND) + .put(TimeUnit.MINUTES, MessageKey.MINUTE) + .put(TimeUnit.HOURS, MessageKey.HOUR) + .put(TimeUnit.DAYS, MessageKey.DAY).build(); + + /** Contains the keys of the plural messages for time units. */ + private static final Map TIME_UNIT_PLURALS = ImmutableMap.builder() + .put(TimeUnit.SECONDS, MessageKey.SECONDS) + .put(TimeUnit.MINUTES, MessageKey.MINUTES) + .put(TimeUnit.HOURS, MessageKey.HOURS) + .put(TimeUnit.DAYS, MessageKey.DAYS).build(); + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(EmailService.class); + + private MessagesFileHandler messagesFileHandler; + + /* + * Constructor. + */ + @Inject + Messages(MessagesFileHandler messagesFileHandler) { + this.messagesFileHandler = messagesFileHandler; + } + + /** + * Send the given message code to the player. + * + * @param sender The entity to send the message to + * @param key The key of the message to send + */ + public void send(CommandSender sender, MessageKey key) { + String[] lines = retrieve(key, sender); + for (String line : lines) { + sender.sendMessage(line); + } + } + + /** + * Send the given message code to the player with the given tag replacements. Note that this method + * logs an error if the number of supplied replacements doesn't correspond to the number of tags + * the message key contains. + * + * @param sender The entity to send the message to + * @param key The key of the message to send + * @param replacements The replacements to apply for the tags + */ + public void send(CommandSender sender, MessageKey key, String... replacements) { + String message = retrieveSingle(sender, key, replacements); + for (String line : message.split("\n")) { + sender.sendMessage(line); + } + } + + /** + * Retrieve the message from the text file and return it split by new line as an array. + * + * @param key The message key to retrieve + * @param sender The entity to send the message to + * @return The message split by new lines + */ + public String[] retrieve(MessageKey key, CommandSender sender) { + String message = retrieveMessage(key, sender); + if (message.isEmpty()) { + // Return empty array instead of array with 1 empty string as entry + return new String[0]; + } + return message.split("\n"); + } + + /** + * Returns the textual representation for the given duration. + * Note that this class only supports the time units days, hour, minutes and seconds. + * + * @param duration the duration to build a text of + * @return text of the duration + */ + public String formatDuration(Duration duration) { + long value = duration.getDuration(); + MessageKey timeUnitKey = value == 1 + ? TIME_UNIT_SINGULARS.get(duration.getTimeUnit()) + : TIME_UNIT_PLURALS.get(duration.getTimeUnit()); + + return value + " " + retrieveMessage(timeUnitKey, ""); + } + + /** + * Retrieve the message from the text file. + * + * @param key The message key to retrieve + * @param sender The entity to send the message to + * @return The message from the file + */ + private String retrieveMessage(MessageKey key, CommandSender sender) { + String locale = sender instanceof Player + ? I18NUtils.getLocale((Player) sender) + : null; + String message = messagesFileHandler.getMessageByLocale(key.getKey(), locale); + String displayName = sender.getName(); + if (sender instanceof Player) { + displayName = ((Player) sender).getDisplayName(); + } + + return ChatColor.translateAlternateColorCodes('&', MiniMessageUtils.parseMiniMessageToLegacy(message)) + .replace(NEWLINE_TAG, "\n") + .replace(USERNAME_TAG, sender.getName()) + .replace(DISPLAYNAME_TAG, displayName); + } + + /** + * Retrieve the message from the text file. + * + * @param key The message key to retrieve + * @param name The name of the entity to send the message to + * @return The message from the file + */ + private String retrieveMessage(MessageKey key, String name) { + String message = messagesFileHandler.getMessage(key.getKey()); + + return ChatColor.translateAlternateColorCodes('&', MiniMessageUtils.parseMiniMessageToLegacy(message)) + .replace(NEWLINE_TAG, "\n") + .replace(USERNAME_TAG, name) + .replace(DISPLAYNAME_TAG, name); + } + + /** + * Retrieve the given message code with the given tag replacements. Note that this method + * logs an error if the number of supplied replacements doesn't correspond to the number of tags + * the message key contains. + * + * @param sender The entity to send the message to + * @param key The key of the message to send + * @param replacements The replacements to apply for the tags + * @return The message from the file with replacements + */ + public String retrieveSingle(CommandSender sender, MessageKey key, String... replacements) { + String message = retrieveMessage(key, sender); + String[] tags = key.getTags(); + if (replacements.length == tags.length) { + for (int i = 0; i < tags.length; ++i) { + message = message.replace(tags[i], replacements[i]); + } + } else { + logger.warning("Invalid number of replacements for message key '" + key + "'"); + } + return message; + } + + /** + * Retrieve the given message code with the given tag replacements. Note that this method + * logs an error if the number of supplied replacements doesn't correspond to the number of tags + * the message key contains. + * + * @param name The name of the entity to send the message to + * @param key The key of the message to send + * @param replacements The replacements to apply for the tags + * @return The message from the file with replacements + */ + public String retrieveSingle(String name, MessageKey key, String... replacements) { + String message = retrieveMessage(key, name); + String[] tags = key.getTags(); + if (replacements.length == tags.length) { + for (int i = 0; i < tags.length; ++i) { + message = message.replace(tags[i], replacements[i]); + } + } else { + logger.warning("Invalid number of replacements for message key '" + key + "'"); + } + return message; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/MessagesFileHandler.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/MessagesFileHandler.java new file mode 100644 index 0000000000..b62be93f6b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/MessagesFileHandler.java @@ -0,0 +1,48 @@ +package fr.xephi.authme.message; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.message.updater.MessageUpdater; +import fr.xephi.authme.output.ConsoleLoggerFactory; + +import javax.inject.Inject; + +import static fr.xephi.authme.message.MessagePathHelper.DEFAULT_LANGUAGE; + +/** + * File handler for the messages_xx.yml resource. + */ +public class MessagesFileHandler extends AbstractMessageFileHandler { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(MessagesFileHandler.class); + + @Inject + private MessageUpdater messageUpdater; + + MessagesFileHandler() { + } + + @Override + public void reload() { + reloadInternal(false); + } + + private void reloadInternal(boolean isFromReload) { + super.reload(); + + String language = getLanguage(); + boolean hasChange = messageUpdater.migrateAndSave( + getUserLanguageFile(), createFilePath(language), createFilePath(DEFAULT_LANGUAGE)); + if (hasChange) { + if (isFromReload) { + logger.warning("Migration after reload attempt"); + } else { + reloadInternal(true); + } + } + } + + @Override + protected String createFilePath(String language) { + return MessagePathHelper.createMessageFilePath(language); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/JarMessageSource.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/JarMessageSource.java new file mode 100644 index 0000000000..73075f4e85 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/JarMessageSource.java @@ -0,0 +1,59 @@ +package fr.xephi.authme.message.updater; + +import ch.jalu.configme.properties.Property; +import ch.jalu.configme.resource.PropertyReader; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.util.FileUtils; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Returns messages from the JAR's message files. Favors a local JAR (e.g. messages_nl.yml) + * before falling back to the default language (messages_en.yml). + */ +public class JarMessageSource { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(JarMessageSource.class); + private final PropertyReader localJarMessages; + private final PropertyReader defaultJarMessages; + + /** + * Constructor. + * + * @param localJarPath path to the messages file of the language the plugin is configured to use (may not exist) + * @param defaultJarPath path to the default messages file in the JAR (must exist) + */ + public JarMessageSource(String localJarPath, String defaultJarPath) { + localJarMessages = localJarPath.equals(defaultJarPath) ? null : loadJarFile(localJarPath); + defaultJarMessages = loadJarFile(defaultJarPath); + + if (defaultJarMessages == null) { + throw new IllegalStateException("Default JAR file '" + defaultJarPath + "' could not be loaded"); + } + } + + public String getMessageFromJar(Property property) { + String key = property.getPath(); + String message = getString(key, localJarMessages); + return message == null ? getString(key, defaultJarMessages) : message; + } + + private static String getString(String path, PropertyReader reader) { + return reader == null ? null : reader.getString(path); + } + + private MessageMigraterPropertyReader loadJarFile(String jarPath) { + try (InputStream stream = FileUtils.getResourceFromJar(jarPath)) { + if (stream == null) { + logger.debug("Could not load '" + jarPath + "' from JAR"); + return null; + } + return MessageMigraterPropertyReader.loadFromStream(stream); + } catch (IOException e) { + logger.logException("Exception while handling JAR path '" + jarPath + "'", e); + } + return null; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/MessageKeyConfigurationData.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/MessageKeyConfigurationData.java new file mode 100644 index 0000000000..cf3c1c7822 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/MessageKeyConfigurationData.java @@ -0,0 +1,53 @@ +package fr.xephi.authme.message.updater; + +import ch.jalu.configme.configurationdata.ConfigurationDataImpl; +import ch.jalu.configme.properties.Property; +import ch.jalu.configme.properties.convertresult.PropertyValue; +import ch.jalu.configme.resource.PropertyReader; +import fr.xephi.authme.message.MessageKey; + +import java.util.List; +import java.util.Map; + +public class MessageKeyConfigurationData extends ConfigurationDataImpl { + + /** + * Constructor. + * + * @param propertyListBuilder property list builder for message key properties + * @param allComments registered comments + */ + public MessageKeyConfigurationData(MessageUpdater.MessageKeyPropertyListBuilder propertyListBuilder, + Map> allComments) { + super(propertyListBuilder.getAllProperties(), allComments); + } + + @Override + public void initializeValues(PropertyReader reader) { + for (Property property : getAllMessageProperties()) { + PropertyValue value = property.determineValue(reader); + if (value.isValidInResource()) { + setValue(property, value.getValue()); + } + } + } + + @Override + public T getValue(Property property) { + // Override to silently return null if property is unknown + return (T) getValues().get(property.getPath()); + } + + @SuppressWarnings("unchecked") + public List> getAllMessageProperties() { + return (List) getProperties(); + } + + public String getMessage(MessageKey messageKey) { + return getValue(new MessageUpdater.MessageKeyProperty(messageKey)); + } + + public void setMessage(MessageKey messageKey, String message) { + setValue(new MessageUpdater.MessageKeyProperty(messageKey), message); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/MessageMigraterPropertyReader.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/MessageMigraterPropertyReader.java new file mode 100644 index 0000000000..a994df898f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/MessageMigraterPropertyReader.java @@ -0,0 +1,126 @@ +package fr.xephi.authme.message.updater; + +import ch.jalu.configme.exception.ConfigMeException; +import ch.jalu.configme.resource.PropertyReader; +import org.yaml.snakeyaml.Yaml; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Implementation of {@link PropertyReader} which can read a file or a stream with + * a specified charset. + */ +final class MessageMigraterPropertyReader implements PropertyReader { + + private static final Charset CHARSET = StandardCharsets.UTF_8; + + private Map root; + + private MessageMigraterPropertyReader(Map valuesMap) { + root = valuesMap; + } + + /** + * Creates a new property reader for the given file. + * + * @param file the file to load + * @return the created property reader + */ + public static MessageMigraterPropertyReader loadFromFile(File file) { + try (InputStream is = new FileInputStream(file)) { + return loadFromStream(is); + } catch (IOException e) { + throw new IllegalStateException("Error while reading file '" + file + "'", e); + } + } + + public static MessageMigraterPropertyReader loadFromStream(InputStream inputStream) { + Map valuesMap = readStreamToMap(inputStream); + return new MessageMigraterPropertyReader(valuesMap); + } + + @Override + public boolean contains(String path) { + return getObject(path) != null; + } + + @Override + public Set getKeys(boolean b) { + throw new UnsupportedOperationException(); + } + + @Override + public Set getChildKeys(String s) { + throw new UnsupportedOperationException(); + } + + @Override + public Object getObject(String path) { + if (path.isEmpty()) { + return root.get(""); + } + Object node = root; + String[] keys = path.split("\\."); + for (String key : keys) { + node = getIfIsMap(key, node); + if (node == null) { + return null; + } + } + return node; + } + + @Override + public String getString(String path) { + Object o = getObject(path); + return o instanceof String ? (String) o : null; + } + + @Override + public Integer getInt(String path) { + throw new UnsupportedOperationException(); + } + + @Override + public Double getDouble(String path) { + throw new UnsupportedOperationException(); + } + + @Override + public Boolean getBoolean(String path) { + throw new UnsupportedOperationException(); + } + + @Override + public List getList(String path) { + throw new UnsupportedOperationException(); + } + + private static Map readStreamToMap(InputStream inputStream) { + try (InputStreamReader isr = new InputStreamReader(inputStream, CHARSET)) { + Object obj = new Yaml().load(isr); + return obj == null ? new HashMap<>() : (Map) obj; + } catch (IOException e) { + throw new ConfigMeException("Could not read stream", e); + } catch (ClassCastException e) { + throw new ConfigMeException("Top-level is not a map", e); + } + } + + private static Object getIfIsMap(String key, Object value) { + if (value instanceof Map) { + return ((Map) value).get(key); + } + return null; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/MessageUpdater.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/MessageUpdater.java new file mode 100644 index 0000000000..f3f718c889 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/MessageUpdater.java @@ -0,0 +1,202 @@ +package fr.xephi.authme.message.updater; + +import ch.jalu.configme.configurationdata.ConfigurationData; +import ch.jalu.configme.configurationdata.PropertyListBuilder; +import ch.jalu.configme.properties.Property; +import ch.jalu.configme.properties.StringProperty; +import ch.jalu.configme.properties.convertresult.ConvertErrorRecorder; +import ch.jalu.configme.resource.PropertyReader; +import ch.jalu.configme.resource.PropertyResource; +import com.google.common.collect.ImmutableMap; +import com.google.common.io.Files; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.util.FileUtils; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static java.util.Collections.singletonList; + +/** + * Migrates the used messages file to a complete, up-to-date version when necessary. + */ +public class MessageUpdater { + + private ConsoleLogger logger = ConsoleLoggerFactory.get(MessageUpdater.class); + + /** + * Applies any necessary migrations to the user's messages file and saves it if it has been modified. + * + * @param userFile the user's messages file (yml file in the plugin's folder) + * @param localJarPath path to the messages file in the JAR for the same language (may not exist) + * @param defaultJarPath path to the messages file in the JAR for the default language + * @return true if the file has been migrated and saved, false if it is up-to-date + */ + public boolean migrateAndSave(File userFile, String localJarPath, String defaultJarPath) { + JarMessageSource jarMessageSource = new JarMessageSource(localJarPath, defaultJarPath); + return migrateAndSave(userFile, jarMessageSource); + } + + /** + * Performs the migration. + * + * @param userFile the file to verify and migrate + * @param jarMessageSource jar message source to get texts from if missing + * @return true if the file has been migrated and saved, false if it is up-to-date + */ + private boolean migrateAndSave(File userFile, JarMessageSource jarMessageSource) { + // YamlConfiguration escapes all special characters when saving, making the file hard to use, so use ConfigMe + MessageKeyConfigurationData configurationData = createConfigurationData(); + PropertyResource userResource = new MigraterYamlFileResource(userFile); + + PropertyReader reader = userResource.createReader(); + configurationData.initializeValues(reader); + + // Step 1: Migrate any old keys in the file to the new paths + boolean movedOldKeys = migrateOldKeys(reader, configurationData); + // Step 2: Perform newer migrations + boolean movedNewerKeys = migrateKeys(reader, configurationData); + // Step 3: Take any missing messages from the message files shipped in the AuthMe JAR + boolean addedMissingKeys = addMissingKeys(jarMessageSource, configurationData); + + if (movedOldKeys || movedNewerKeys || addedMissingKeys) { + backupMessagesFile(userFile); + + userResource.exportProperties(configurationData); + logger.debug("Successfully saved {0}", userFile); + return true; + } + return false; + } + + private boolean migrateKeys(PropertyReader propertyReader, MessageKeyConfigurationData configurationData) { + return moveIfApplicable(propertyReader, configurationData, + "misc.two_factor_create", MessageKey.TWO_FACTOR_CREATE); + } + + private static boolean moveIfApplicable(PropertyReader reader, MessageKeyConfigurationData configurationData, + String oldPath, MessageKey messageKey) { + if (configurationData.getMessage(messageKey) == null && reader.getString(oldPath) != null) { + configurationData.setMessage(messageKey, reader.getString(oldPath)); + return true; + } + return false; + } + + private boolean migrateOldKeys(PropertyReader propertyReader, MessageKeyConfigurationData configurationData) { + boolean hasChange = OldMessageKeysMigrater.migrateOldPaths(propertyReader, configurationData); + if (hasChange) { + logger.info("Old keys have been moved to the new ones in your messages_xx.yml file"); + } + return hasChange; + } + + private boolean addMissingKeys(JarMessageSource jarMessageSource, MessageKeyConfigurationData configurationData) { + List addedKeys = new ArrayList<>(); + for (Property property : configurationData.getAllMessageProperties()) { + final String key = property.getPath(); + if (configurationData.getValue(property) == null) { + configurationData.setValue(property, jarMessageSource.getMessageFromJar(property)); + addedKeys.add(key); + } + } + if (!addedKeys.isEmpty()) { + logger.info( + "Added " + addedKeys.size() + " missing keys to your messages_xx.yml file: " + addedKeys); + return true; + } + return false; + } + + private static void backupMessagesFile(File messagesFile) { + String backupName = FileUtils.createBackupFilePath(messagesFile); + File backupFile = new File(backupName); + try { + Files.copy(messagesFile, backupFile); + } catch (IOException e) { + throw new IllegalStateException("Could not back up '" + messagesFile + "' to '" + backupFile + "'", e); + } + } + + /** + * Constructs the {@link ConfigurationData} for exporting a messages file in its entirety. + * + * @return the configuration data to export with + */ + public static MessageKeyConfigurationData createConfigurationData() { + Map comments = ImmutableMap.builder() + .put("registration", "Registration") + .put("password", "Password errors on registration") + .put("login", "Login") + .put("error", "Errors") + .put("antibot", "AntiBot") + .put("unregister", "Unregister") + .put("misc", "Other messages") + .put("session", "Session messages") + .put("on_join_validation", "Error messages when joining") + .put("email", "Email") + .put("recovery", "Password recovery by email") + .put("captcha", "Captcha") + .put("verification", "Verification code") + .put("time", "Time units") + .put("two_factor", "Two-factor authentication") + .put("bedrock_auto_login", "3rd party features: Bedrock Auto Login") + .put("login_location_fix", "3rd party features: Login Location Fix") + .put("double_login_fix", "3rd party features: Double Login Fix") + .build(); + + Set addedKeys = new HashSet<>(); + MessageKeyPropertyListBuilder builder = new MessageKeyPropertyListBuilder(); + // Add one key per section based on the comments map above so that the order is clear + for (String path : comments.keySet()) { + MessageKey key = Arrays.stream(MessageKey.values()).filter(p -> p.getKey().startsWith(path + ".")) + .findFirst().orElseThrow(() -> new IllegalStateException(path)); + builder.addMessageKey(key); + addedKeys.add(key.getKey()); + } + // Add all remaining keys to the property list builder + Arrays.stream(MessageKey.values()) + .filter(key -> !addedKeys.contains(key.getKey())) + .forEach(builder::addMessageKey); + + // Create ConfigurationData instance + Map> commentsMap = comments.entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, e -> singletonList(e.getValue()))); + return new MessageKeyConfigurationData(builder, commentsMap); + } + + static final class MessageKeyProperty extends StringProperty { + + MessageKeyProperty(MessageKey messageKey) { + super(messageKey.getKey(), ""); + } + + @Override + protected String getFromReader(PropertyReader reader, ConvertErrorRecorder errorRecorder) { + return reader.getString(getPath()); + } + } + + static final class MessageKeyPropertyListBuilder { + + private PropertyListBuilder propertyListBuilder = new PropertyListBuilder(); + + void addMessageKey(MessageKey key) { + propertyListBuilder.add(new MessageKeyProperty(key)); + } + + @SuppressWarnings("unchecked") + List getAllProperties() { + return (List) propertyListBuilder.create(); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/MigraterYamlFileResource.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/MigraterYamlFileResource.java new file mode 100644 index 0000000000..b0122215ba --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/MigraterYamlFileResource.java @@ -0,0 +1,47 @@ +package fr.xephi.authme.message.updater; + +import ch.jalu.configme.resource.PropertyReader; +import ch.jalu.configme.resource.YamlFileResource; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; + +import java.io.File; + +/** + * Extension of {@link YamlFileResource} to fine-tune the export style. + */ +public class MigraterYamlFileResource extends YamlFileResource { + + private Yaml singleQuoteYaml; + + public MigraterYamlFileResource(File file) { + super(file); + } + + @Override + public PropertyReader createReader() { + return MessageMigraterPropertyReader.loadFromFile(getFile()); + } + + @Override + protected Yaml createNewYaml() { + if (singleQuoteYaml == null) { + DumperOptions options = new DumperOptions(); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + options.setAllowUnicode(true); + options.setDefaultScalarStyle(DumperOptions.ScalarStyle.SINGLE_QUOTED); + // Overridden setting: don't split lines + options.setSplitLines(false); + singleQuoteYaml = new Yaml(options); + } + return singleQuoteYaml; + } + + // Because we set the YAML object to put strings in single quotes, this method by default uses that YAML object + // and also puts all paths as single quotes. Override to just always return the same string since we know those + // are only message names (so never any conflicting strings like "true" or "0"). + @Override + protected String escapePathElementIfNeeded(String path) { + return path; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/OldMessageKeysMigrater.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/OldMessageKeysMigrater.java new file mode 100644 index 0000000000..739a449d3e --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/message/updater/OldMessageKeysMigrater.java @@ -0,0 +1,170 @@ +package fr.xephi.authme.message.updater; + +import ch.jalu.configme.resource.PropertyReader; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableMap; +import fr.xephi.authme.message.MessageKey; + +import java.util.Map; + +import static com.google.common.collect.ImmutableMap.of; + +/** + * Migrates message files from the old keys (before 5.5) to the new ones. + * + * @see Issue #1467 + */ +final class OldMessageKeysMigrater { + + @VisibleForTesting + static final Map KEYS_TO_OLD_PATH = ImmutableMap.builder() + .put(MessageKey.LOGIN_SUCCESS, "login") + .put(MessageKey.ERROR, "error") + .put(MessageKey.DENIED_COMMAND, "denied_command") + .put(MessageKey.SAME_IP_ONLINE, "same_ip_online") + .put(MessageKey.DENIED_CHAT, "denied_chat") + .put(MessageKey.KICK_ANTIBOT, "kick_antibot") + .put(MessageKey.UNKNOWN_USER, "unknown_user") + .put(MessageKey.NOT_LOGGED_IN, "not_logged_in") + .put(MessageKey.USAGE_LOGIN, "usage_log") + .put(MessageKey.WRONG_PASSWORD, "wrong_pwd") + .put(MessageKey.UNREGISTERED_SUCCESS, "unregistered") + .put(MessageKey.REGISTRATION_DISABLED, "reg_disabled") + .put(MessageKey.SESSION_RECONNECTION, "valid_session") + .put(MessageKey.ACCOUNT_NOT_ACTIVATED, "vb_nonActiv") + .put(MessageKey.NAME_ALREADY_REGISTERED, "user_regged") + .put(MessageKey.NO_PERMISSION, "no_perm") + .put(MessageKey.LOGIN_MESSAGE, "login_msg") + .put(MessageKey.REGISTER_MESSAGE, "reg_msg") + .put(MessageKey.MAX_REGISTER_EXCEEDED, "max_reg") + .put(MessageKey.USAGE_REGISTER, "usage_reg") + .put(MessageKey.USAGE_UNREGISTER, "usage_unreg") + .put(MessageKey.PASSWORD_CHANGED_SUCCESS, "pwd_changed") + .put(MessageKey.PASSWORD_MATCH_ERROR, "password_error") + .put(MessageKey.PASSWORD_IS_USERNAME_ERROR, "password_error_nick") + .put(MessageKey.PASSWORD_UNSAFE_ERROR, "password_error_unsafe") + .put(MessageKey.PASSWORD_CHARACTERS_ERROR, "password_error_chars") + .put(MessageKey.SESSION_EXPIRED, "invalid_session") + .put(MessageKey.MUST_REGISTER_MESSAGE, "reg_only") + .put(MessageKey.ALREADY_LOGGED_IN_ERROR, "logged_in") + .put(MessageKey.LOGOUT_SUCCESS, "logout") + .put(MessageKey.USERNAME_ALREADY_ONLINE_ERROR, "same_nick") + .put(MessageKey.REGISTER_SUCCESS, "registered") + .put(MessageKey.INVALID_PASSWORD_LENGTH, "pass_len") + .put(MessageKey.CONFIG_RELOAD_SUCCESS, "reload") + .put(MessageKey.LOGIN_TIMEOUT_ERROR, "timeout") + .put(MessageKey.USAGE_CHANGE_PASSWORD, "usage_changepassword") + .put(MessageKey.INVALID_NAME_LENGTH, "name_len") + .put(MessageKey.INVALID_NAME_CHARACTERS, "regex") + .put(MessageKey.ADD_EMAIL_MESSAGE, "add_email") + .put(MessageKey.FORGOT_PASSWORD_MESSAGE, "recovery_email") + .put(MessageKey.USAGE_CAPTCHA, "usage_captcha") + .put(MessageKey.CAPTCHA_WRONG_ERROR, "wrong_captcha") + .put(MessageKey.CAPTCHA_SUCCESS, "valid_captcha") + .put(MessageKey.CAPTCHA_FOR_REGISTRATION_REQUIRED, "captcha_for_registration") + .put(MessageKey.REGISTER_CAPTCHA_SUCCESS, "register_captcha_valid") + .put(MessageKey.KICK_FOR_VIP, "kick_forvip") + .put(MessageKey.KICK_FULL_SERVER, "kick_fullserver") + .put(MessageKey.USAGE_ADD_EMAIL, "usage_email_add") + .put(MessageKey.USAGE_CHANGE_EMAIL, "usage_email_change") + .put(MessageKey.USAGE_RECOVER_EMAIL, "usage_email_recovery") + .put(MessageKey.INVALID_NEW_EMAIL, "new_email_invalid") + .put(MessageKey.INVALID_OLD_EMAIL, "old_email_invalid") + .put(MessageKey.INVALID_EMAIL, "email_invalid") + .put(MessageKey.EMAIL_ADDED_SUCCESS, "email_added") + .put(MessageKey.CONFIRM_EMAIL_MESSAGE, "email_confirm") + .put(MessageKey.EMAIL_CHANGED_SUCCESS, "email_changed") + .put(MessageKey.EMAIL_SHOW, "email_show") + .put(MessageKey.SHOW_NO_EMAIL, "show_no_email") + .put(MessageKey.RECOVERY_EMAIL_SENT_MESSAGE, "email_send") + .put(MessageKey.COUNTRY_BANNED_ERROR, "country_banned") + .put(MessageKey.ANTIBOT_AUTO_ENABLED_MESSAGE, "antibot_auto_enabled") + .put(MessageKey.ANTIBOT_AUTO_DISABLED_MESSAGE, "antibot_auto_disabled") + .put(MessageKey.EMAIL_ALREADY_USED_ERROR, "email_already_used") + .put(MessageKey.TWO_FACTOR_CREATE, "two_factor_create") + .put(MessageKey.NOT_OWNER_ERROR, "not_owner_error") + .put(MessageKey.INVALID_NAME_CASE, "invalid_name_case") + .put(MessageKey.TEMPBAN_MAX_LOGINS, "tempban_max_logins") + .put(MessageKey.ACCOUNTS_OWNED_SELF, "accounts_owned_self") + .put(MessageKey.ACCOUNTS_OWNED_OTHER, "accounts_owned_other") + .put(MessageKey.KICK_FOR_ADMIN_REGISTER, "kicked_admin_registered") + .put(MessageKey.INCOMPLETE_EMAIL_SETTINGS, "incomplete_email_settings") + .put(MessageKey.EMAIL_SEND_FAILURE, "email_send_failure") + .put(MessageKey.RECOVERY_CODE_SENT, "recovery_code_sent") + .put(MessageKey.INCORRECT_RECOVERY_CODE, "recovery_code_incorrect") + .put(MessageKey.RECOVERY_TRIES_EXCEEDED, "recovery_tries_exceeded") + .put(MessageKey.RECOVERY_CODE_CORRECT, "recovery_code_correct") + .put(MessageKey.RECOVERY_CHANGE_PASSWORD, "recovery_change_password") + .put(MessageKey.CHANGE_PASSWORD_EXPIRED, "change_password_expired") + .put(MessageKey.EMAIL_COOLDOWN_ERROR, "email_cooldown_error") + .put(MessageKey.VERIFICATION_CODE_REQUIRED, "verification_code_required") + .put(MessageKey.USAGE_VERIFICATION_CODE, "usage_verification_code") + .put(MessageKey.INCORRECT_VERIFICATION_CODE, "incorrect_verification_code") + .put(MessageKey.VERIFICATION_CODE_VERIFIED, "verification_code_verified") + .put(MessageKey.VERIFICATION_CODE_ALREADY_VERIFIED, "verification_code_already_verified") + .put(MessageKey.VERIFICATION_CODE_EXPIRED, "verification_code_expired") + .put(MessageKey.VERIFICATION_CODE_EMAIL_NEEDED, "verification_code_email_needed") + .put(MessageKey.SECOND, "second") + .put(MessageKey.SECONDS, "seconds") + .put(MessageKey.MINUTE, "minute") + .put(MessageKey.MINUTES, "minutes") + .put(MessageKey.HOUR, "hour") + .put(MessageKey.HOURS, "hours") + .put(MessageKey.DAY, "day") + .put(MessageKey.DAYS, "days") + .build(); + + private static final Map> PLACEHOLDER_REPLACEMENTS = + ImmutableMap.>builder() + .put(MessageKey.PASSWORD_CHARACTERS_ERROR, of("REG_EX", "%valid_chars")) + .put(MessageKey.INVALID_NAME_CHARACTERS, of("REG_EX", "%valid_chars")) + .put(MessageKey.USAGE_CAPTCHA, of("", "%captcha_code")) + .put(MessageKey.CAPTCHA_FOR_REGISTRATION_REQUIRED, of("", "%captcha_code")) + .put(MessageKey.CAPTCHA_WRONG_ERROR, of("THE_CAPTCHA", "%captcha_code")) + .build(); + + private OldMessageKeysMigrater() { + } + + /** + * Migrates any existing old key paths to their new paths if no text has been defined for the new key. + * + * @param reader the property reader to get values from + * @param configurationData the configuration data to write to + * @return true if at least one message could be migrated, false otherwise + */ + static boolean migrateOldPaths(PropertyReader reader, MessageKeyConfigurationData configurationData) { + boolean wasPropertyMoved = false; + for (Map.Entry migrationEntry : KEYS_TO_OLD_PATH.entrySet()) { + wasPropertyMoved |= moveIfApplicable(reader, configurationData, + migrationEntry.getKey(), migrationEntry.getValue()); + } + return wasPropertyMoved; + } + + private static boolean moveIfApplicable(PropertyReader reader, MessageKeyConfigurationData configurationData, + MessageKey messageKey, String oldPath) { + if (configurationData.getMessage(messageKey) == null) { + String textAtOldPath = reader.getString(oldPath); + if (textAtOldPath != null) { + textAtOldPath = replaceOldPlaceholders(messageKey, textAtOldPath); + configurationData.setMessage(messageKey, textAtOldPath); + return true; + } + } + return false; + } + + private static String replaceOldPlaceholders(MessageKey key, String text) { + Map replacements = PLACEHOLDER_REPLACEMENTS.get(key); + if (replacements == null) { + return text; + } + + String newText = text; + for (Map.Entry replacement : replacements.entrySet()) { + newText = newText.replace(replacement.getKey(), replacement.getValue()); + } + return newText; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/ConsoleFilter.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/ConsoleFilter.java new file mode 100644 index 0000000000..975cc4cc32 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/ConsoleFilter.java @@ -0,0 +1,26 @@ +package fr.xephi.authme.output; + +import java.util.logging.Filter; +import java.util.logging.LogRecord; + +/** + * Console filter to replace sensitive AuthMe commands with a generic message. + * + * @author Xephi59 + */ +public class ConsoleFilter implements Filter { + + @Override + public boolean isLoggable(LogRecord record) { + if (record == null || record.getMessage() == null) { + return true; + } + + if (LogFilterHelper.isSensitiveAuthMeCommand(record.getMessage())) { + String playerName = record.getMessage().split(" ")[0]; + record.setMessage(playerName + " issued an AuthMe command"); + } + return true; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/ConsoleLoggerFactory.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/ConsoleLoggerFactory.java new file mode 100644 index 0000000000..fb51043d9c --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/ConsoleLoggerFactory.java @@ -0,0 +1,55 @@ +package fr.xephi.authme.output; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.settings.Settings; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Creates and keeps track of {@link ConsoleLogger} instances. + */ +public final class ConsoleLoggerFactory { + + private static final Map consoleLoggers = new ConcurrentHashMap<>(); + private static Settings settings; + + private ConsoleLoggerFactory() { + } + + /** + * Creates or returns the already existing logger associated with the given class. + * + * @param owningClass the class whose logger should be retrieved + * @return logger for the given class + */ + public static ConsoleLogger get(Class owningClass) { + String name = owningClass.getCanonicalName(); + return consoleLoggers.computeIfAbsent(name, ConsoleLoggerFactory::createLogger); + } + + /** + * Sets up all loggers according to the properties returned by the settings instance. + * + * @param settings the settings instance + */ + public static void reloadSettings(Settings settings) { + ConsoleLoggerFactory.settings = settings; + ConsoleLogger.initializeSharedSettings(settings); + + consoleLoggers.values() + .forEach(logger -> logger.initializeSettings(settings)); + } + + public static int getTotalLoggers() { + return consoleLoggers.size(); + } + + private static ConsoleLogger createLogger(String name) { + ConsoleLogger logger = new ConsoleLogger(name); + if (settings != null) { + logger.initializeSettings(settings); + } + return logger; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/Log4JFilter.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/Log4JFilter.java new file mode 100644 index 0000000000..1ebf5141f6 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/Log4JFilter.java @@ -0,0 +1,75 @@ +package fr.xephi.authme.output; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.core.filter.AbstractFilter; +import org.apache.logging.log4j.message.Message; + +/** + * Implements a filter for Log4j to skip sensitive AuthMe commands. + * + * @author Xephi59 + */ +public class Log4JFilter extends AbstractFilter { + + private static final long serialVersionUID = -5594073755007974254L; + + /** + * Validates a Message instance and returns the {@link Result} value + * depending on whether the message contains sensitive AuthMe data. + * + * @param message The Message object to verify + * + * @return The Result value + */ + private static Result validateMessage(Message message) { + if (message == null) { + return Result.NEUTRAL; + } + return validateMessage(message.getFormattedMessage()); + } + + /** + * Validates a message and returns the {@link Result} value depending + * on whether the message contains sensitive AuthMe data. + * + * @param message The message to verify + * + * @return The Result value + */ + private static Result validateMessage(String message) { + return LogFilterHelper.isSensitiveAuthMeCommand(message) + ? Result.DENY + : Result.NEUTRAL; + } + + @Override + public Result filter(LogEvent event) { + Message candidate = null; + if (event != null) { + candidate = event.getMessage(); + } + return validateMessage(candidate); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, Message msg, Throwable t) { + return validateMessage(msg); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, String msg, Object... params) { + return validateMessage(msg); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, Object msg, Throwable t) { + String candidate = null; + if (msg != null) { + candidate = msg.toString(); + } + return validateMessage(candidate); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/LogFilterHelper.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/LogFilterHelper.java new file mode 100644 index 0000000000..6058584ae0 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/LogFilterHelper.java @@ -0,0 +1,51 @@ +package fr.xephi.authme.output; + +import com.google.common.annotations.VisibleForTesting; +import fr.xephi.authme.util.StringUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Locale; + +/** + * Service class for the log filters. + */ +final class LogFilterHelper { + + @VisibleForTesting + static final List COMMANDS_TO_SKIP = withAndWithoutAuthMePrefix( + "/login ", "/l ", "/log ", "/register ", "/reg ", "/unregister ", "/unreg ", + "/changepassword ", "/cp ", "/changepass ", "/authme register ", "/authme reg ", "/authme r ", + "/authme changepassword ", "/authme password ", "/authme changepass ", "/authme cp ", "/email setpassword "); + + private static final String ISSUED_COMMAND_TEXT = "issued server command:"; + + private LogFilterHelper() { + // Util class + } + + /** + * Validate a message and return whether the message contains a sensitive AuthMe command. + * + * @param message The message to verify + * + * @return True if it is a sensitive AuthMe command, false otherwise + */ + static boolean isSensitiveAuthMeCommand(String message) { + if (message == null) { + return false; + } + String lowerMessage = message.toLowerCase(Locale.ROOT); + return lowerMessage.contains(ISSUED_COMMAND_TEXT) && StringUtils.containsAny(lowerMessage, COMMANDS_TO_SKIP); + } + + private static List withAndWithoutAuthMePrefix(String... commands) { + List commandList = new ArrayList<>(commands.length * 2); + for (String command : commands) { + commandList.add(command); + commandList.add(command.substring(0, 1) + "authme:" + command.substring(1)); + } + return Collections.unmodifiableList(commandList); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/LogLevel.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/LogLevel.java new file mode 100644 index 0000000000..f958e6d449 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/output/LogLevel.java @@ -0,0 +1,38 @@ +package fr.xephi.authme.output; + +/** + * Log level. + */ +public enum LogLevel { + + /** Info: general messages. */ + INFO(3), + + /** Fine: more detailed messages that may still be interesting to plugin users. */ + FINE(2), + + /** Debug: very detailed messages for debugging. */ + DEBUG(1); + + private int value; + + /** + * Constructor. + * + * @param value the log level; the higher the number the more "important" the level. + * A log level enables its number and all above. + */ + LogLevel(int value) { + this.value = value; + } + + /** + * Return whether the current log level includes the given log level. + * + * @param level the level to process + * @return true if the level is enabled, false otherwise + */ + public boolean includes(LogLevel level) { + return value <= level.value; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/AdminPermission.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/AdminPermission.java new file mode 100644 index 0000000000..20e27f2fc1 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/AdminPermission.java @@ -0,0 +1,166 @@ +package fr.xephi.authme.permission; + +/** + * AuthMe admin command permissions. + */ +public enum AdminPermission implements PermissionNode { + + /** + * Administrator command to register a new user. + */ + REGISTER("authme.admin.register"), + + /** + * Administrator command to unregister an existing user. + */ + UNREGISTER("authme.admin.unregister"), + + /** + * Administrator command to force-login an existing user. + */ + FORCE_LOGIN("authme.admin.forcelogin"), + + /** + * Administrator command to change the password of a user. + */ + CHANGE_PASSWORD("authme.admin.changepassword"), + + /** + * Administrator command to see the last login date and time of a user. + */ + LAST_LOGIN("authme.admin.lastlogin"), + + /** + * Administrator command to see all accounts associated with a user. + */ + ACCOUNTS("authme.admin.accounts"), + + /** + * Administrator command to get the email address of a user, if set. + */ + GET_EMAIL("authme.admin.getemail"), + + /** + * Administrator command to set or change the email address of a user. + */ + CHANGE_EMAIL("authme.admin.changemail"), + + /** + * Administrator command to see whether a player has enabled two-factor authentication. + */ + VIEW_TOTP_STATUS("authme.admin.totpviewstatus"), + + /** + * Administrator command to disable the two-factor auth of a user. + */ + DISABLE_TOTP("authme.admin.totpdisable"), + + /** + * Administrator command to get the last known IP of a user. + */ + GET_IP("authme.admin.getip"), + + /** + * Administrator command to see the last recently logged in players. + */ + SEE_RECENT_PLAYERS("authme.admin.seerecent"), + + /** + * Administrator command to teleport to the AuthMe spawn. + */ + SPAWN("authme.admin.spawn"), + + /** + * Administrator command to set the AuthMe spawn. + */ + SET_SPAWN("authme.admin.setspawn"), + + /** + * Administrator command to teleport to the first AuthMe spawn. + */ + FIRST_SPAWN("authme.admin.firstspawn"), + + /** + * Administrator command to set the first AuthMe spawn. + */ + SET_FIRST_SPAWN("authme.admin.setfirstspawn"), + + /** + * Administrator command to purge old user data. + */ + PURGE("authme.admin.purge"), + + /** + * Administrator command to purge the last position of a user. + */ + PURGE_LAST_POSITION("authme.admin.purgelastpos"), + + /** + * Administrator command to purge all data associated with banned players. + */ + PURGE_BANNED_PLAYERS("authme.admin.purgebannedplayers"), + + /** + * Administrator command to purge a given player. + */ + PURGE_PLAYER("authme.admin.purgeplayer"), + + /** + * Administrator command to toggle the AntiBot protection status. + */ + SWITCH_ANTIBOT("authme.admin.switchantibot"), + + /** + * Administrator command to convert old or other data to AuthMe data. + */ + CONVERTER("authme.admin.converter"), + + /** + * Administrator command to reload the plugin configuration. + */ + RELOAD("authme.admin.reload"), + + /** + * Permission to see Antibot messages. + */ + ANTIBOT_MESSAGES("authme.admin.antibotmessages"), + + /** + * Permission to use the update messages command. + */ + UPDATE_MESSAGES("authme.admin.updatemessages"), + + /** + * Permission to see the other accounts of the players that log in. + */ + SEE_OTHER_ACCOUNTS("authme.admin.seeotheraccounts"), + + /** + * Allows to use the backup command. + */ + BACKUP("authme.admin.backup"); + + /** + * The permission node. + */ + private String node; + + /** + * Constructor. + * + * @param node Permission node. + */ + AdminPermission(String node) { + this.node = node; + } + + @Override + public String getNode() { + return node; + } + + @Override + public DefaultPermission getDefaultPermission() { + return DefaultPermission.OP_ONLY; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/DebugSectionPermissions.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/DebugSectionPermissions.java new file mode 100644 index 0000000000..6461c29afa --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/DebugSectionPermissions.java @@ -0,0 +1,61 @@ +package fr.xephi.authme.permission; + +/** + * Permissions for the debug sections (/authme debug). + */ +public enum DebugSectionPermissions implements PermissionNode { + + /** General permission to use the /authme debug command. */ + DEBUG_COMMAND("authme.debug.command"), + + /** Permission to use the country lookup section. */ + COUNTRY_LOOKUP("authme.debug.country"), + + /** Permission to use the stats section. */ + DATA_STATISTICS("authme.debug.stats"), + + /** Permission to use the permission checker. */ + HAS_PERMISSION_CHECK("authme.debug.perm"), + + /** Permission to use sample validation. */ + INPUT_VALIDATOR("authme.debug.valid"), + + /** Permission to use the limbo data viewer. */ + LIMBO_PLAYER_VIEWER("authme.debug.limbo"), + + /** Permission to view permission groups. */ + PERM_GROUPS("authme.debug.group"), + + /** Permission to view data from the database. */ + PLAYER_AUTH_VIEWER("authme.debug.db"), + + /** Permission to change nullable status of MySQL columns. */ + MYSQL_DEFAULT_CHANGER("authme.debug.mysqldef"), + + /** Permission to view spawn information. */ + SPAWN_LOCATION("authme.debug.spawn"), + + /** Permission to use the test email sender. */ + TEST_EMAIL("authme.debug.mail"); + + private final String node; + + /** + * Constructor. + * + * @param node the permission node + */ + DebugSectionPermissions(String node) { + this.node = node; + } + + @Override + public String getNode() { + return node; + } + + @Override + public DefaultPermission getDefaultPermission() { + return DefaultPermission.OP_ONLY; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/DefaultPermission.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/DefaultPermission.java new file mode 100644 index 0000000000..1d0e0f3eab --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/DefaultPermission.java @@ -0,0 +1,42 @@ +package fr.xephi.authme.permission; + +import org.bukkit.permissions.ServerOperator; + +/** + * The default permission to fall back to if there is no support for permission nodes. + */ +public enum DefaultPermission { + + /** No one has permission. */ + NOT_ALLOWED { + @Override + public boolean evaluate(ServerOperator sender) { + return false; + } + }, + + /** Only players with OP status have permission. */ + OP_ONLY { + @Override + public boolean evaluate(ServerOperator sender) { + return sender != null && sender.isOp(); + } + }, + + /** Everyone is granted permission. */ + ALLOWED { + @Override + public boolean evaluate(ServerOperator sender) { + return true; + } + }; + + /** + * Evaluates whether permission is granted to the sender or not. + * + * @param sender the sender to process + * @return true if the sender has permission, false otherwise + */ + public abstract boolean evaluate(ServerOperator sender); + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PermissionNode.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PermissionNode.java new file mode 100644 index 0000000000..189f97b58b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PermissionNode.java @@ -0,0 +1,21 @@ +package fr.xephi.authme.permission; + +/** + * Common interface for AuthMe permission nodes. + */ +public interface PermissionNode { + + /** + * Return the node of the permission, e.g. "authme.player.unregister". + * + * @return The name of the permission node + */ + String getNode(); + + /** + * Return the default permission for this node, e.g. "OP_ONLY" + * + * @return The default level of permission + */ + DefaultPermission getDefaultPermission(); +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PermissionsManager.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PermissionsManager.java new file mode 100644 index 0000000000..7399d0ca09 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PermissionsManager.java @@ -0,0 +1,466 @@ +package fr.xephi.authme.permission; + +import com.google.common.annotations.VisibleForTesting; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.limbo.UserGroup; +import fr.xephi.authme.initialization.Reloadable; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.permission.handlers.LuckPermsHandler; +import fr.xephi.authme.permission.handlers.PermissionHandler; +import fr.xephi.authme.permission.handlers.PermissionHandlerException; +import fr.xephi.authme.permission.handlers.PermissionLoadUserException; +import fr.xephi.authme.permission.handlers.PermissionsExHandler; +import fr.xephi.authme.permission.handlers.VaultHandler; +import fr.xephi.authme.permission.handlers.ZPermissionsHandler; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.PluginSettings; +import fr.xephi.authme.util.StringUtils; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginManager; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import java.util.Collection; +import java.util.Collections; +import java.util.UUID; + +/** + * PermissionsManager. + *

+ * A permissions manager, to manage and use various permissions systems. + * This manager supports dynamic plugin hooking and various other features. + *

+ * Written by Tim Visée. + * + * @author Tim Visée, http://timvisee.com + * @version 0.3 + */ +public class PermissionsManager implements Reloadable { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(PermissionsManager.class); + private final Server server; + private final PluginManager pluginManager; + private final Settings settings; + + /** + * The permission handler that is currently in use. + * Null if no permission system is hooked. + */ + private PermissionHandler handler = null; + + @Inject + PermissionsManager(Server server, PluginManager pluginManager, Settings settings) { + this.server = server; + this.pluginManager = pluginManager; + this.settings = settings; + } + + /** + * Check if the permissions manager is currently hooked into any of the supported permissions systems. + * + * @return False if there isn't any permissions system used. + */ + public boolean isEnabled() { + return handler != null; + } + + /** + * Setup and hook into the permissions systems. + */ + @PostConstruct + @VisibleForTesting + void setup() { + if (settings.getProperty(PluginSettings.FORCE_VAULT_HOOK)) { + try { + PermissionHandler handler = createPermissionHandler(PermissionsSystemType.VAULT); + if (handler != null) { + // Show a success message and return + this.handler = handler; + logger.info("Hooked into " + PermissionsSystemType.VAULT.getDisplayName() + "!"); + return; + } + } catch (PermissionHandlerException e) { + logger.logException("Failed to create Vault hook (forced):", e); + } + } else { + // Loop through all the available permissions system types + for (PermissionsSystemType type : PermissionsSystemType.values()) { + try { + PermissionHandler handler = createPermissionHandler(type); + if (handler != null) { + // Show a success message and return + this.handler = handler; + logger.info("Hooked into " + type.getDisplayName() + "!"); + return; + } + } catch (Exception ex) { + // An error occurred, show a warning message + logger.logException("Error while hooking into " + type.getDisplayName(), ex); + } + } + } + + // No recognized permissions system found, show a message and return + logger.info("No supported permissions system found! Permissions are disabled!"); + } + + /** + * Creates a permission handler for the provided permission systems if possible. + * + * @param type the permission systems type for which to create a corresponding permission handler + * + * @return the permission handler, or {@code null} if not possible + * + * @throws PermissionHandlerException during initialization of the permission handler + */ + private PermissionHandler createPermissionHandler(PermissionsSystemType type) throws PermissionHandlerException { + // Try to find the plugin for the current permissions system + Plugin plugin = pluginManager.getPlugin(type.getPluginName()); + + if (plugin == null) { + return null; + } + + // Make sure the plugin is enabled before hooking + if (!plugin.isEnabled()) { + logger.info("Not hooking into " + type.getDisplayName() + " because it's disabled!"); + return null; + } + + switch (type) { + case LUCK_PERMS: + return new LuckPermsHandler(); + case PERMISSIONS_EX: + return new PermissionsExHandler(); + case Z_PERMISSIONS: + return new ZPermissionsHandler(); + case VAULT: + return new VaultHandler(server); + default: + throw new IllegalStateException("Unhandled permission type '" + type + "'"); + } + } + + /** + * Break the hook with all permission systems. + */ + private void unhook() { + // Reset the current used permissions system + this.handler = null; + + // Print a status message to the console + logger.info("Unhooked from Permissions!"); + } + + /** + * Reload the permissions manager, and re-hook all permission plugins. + */ + @Override + public void reload() { + // Unhook all permission plugins + unhook(); + + // Set up the permissions manager again + setup(); + } + + /** + * Method called when a plugin is being enabled. + * + * @param pluginName The name of the plugin being enabled. + */ + public void onPluginEnable(String pluginName) { + // Check if any known permissions system is enabling + if (PermissionsSystemType.isPermissionSystem(pluginName)) { + logger.info(pluginName + " plugin enabled, dynamically updating permissions hooks!"); + setup(); + } + } + + /** + * Method called when a plugin is being disabled. + * + * @param pluginName The name of the plugin being disabled. + */ + public void onPluginDisable(String pluginName) { + // Check if any known permission system is being disabled + if (PermissionsSystemType.isPermissionSystem(pluginName)) { + logger.info(pluginName + " plugin disabled, updating hooks!"); + setup(); + } + } + + /** + * Return the permissions system that is hooked into. + * + * @return The permissions system, or null. + */ + public PermissionsSystemType getPermissionSystem() { + return isEnabled() ? handler.getPermissionSystem() : null; + } + + /** + * Check if the command sender has permission for the given permissions node. If no permissions system is used or + * if the sender is not a player (e.g. console user), the player has to be OP in order to have the permission. + * + * @param sender The command sender. + * @param permissionNode The permissions node to verify. + * + * @return True if the sender has the permission, false otherwise. + */ + public boolean hasPermission(CommandSender sender, PermissionNode permissionNode) { + // Check if the permission node is null + if (permissionNode == null) { + return true; + } + + // Return default if sender is not a player or no permission system is in use + if (!(sender instanceof Player) || !isEnabled()) { + return permissionNode.getDefaultPermission().evaluate(sender); + } + + Player player = (Player) sender; + return player.hasPermission(permissionNode.getNode()); + } + + /** + * Check if a player has permission for the given permission node. This is for offline player checks. + * If no permissions system is used, then the player will not have permission. + * + * @param player The offline player + * @param permissionNode The permission node to verify + * + * @return true if the player has permission, false otherwise + */ + public boolean hasPermissionOffline(OfflinePlayer player, PermissionNode permissionNode) { + // Check if the permission node is null + if (permissionNode == null) { + return true; + } + + if (!isEnabled()) { + return permissionNode.getDefaultPermission().evaluate(player); + } + + return handler.hasPermissionOffline(player.getName(), permissionNode); + } + + /** + * Check whether the offline player with the given name has permission for the given permission node. + * This method is used as a last resort when nothing besides the name is known. + * + * @param name The name of the player + * @param permissionNode The permission node to verify + * + * @return true if the player has permission, false otherwise + */ + public boolean hasPermissionOffline(String name, PermissionNode permissionNode) { + if (permissionNode == null) { + return true; + } + if (!isEnabled()) { + return permissionNode.getDefaultPermission().evaluate(null); + } + + return handler.hasPermissionOffline(name, permissionNode); + } + + /** + * Check whether the current permissions system has group support. + * If no permissions system is hooked, false will be returned. + * + * @return True if the current permissions system supports groups, false otherwise. + */ + public boolean hasGroupSupport() { + return isEnabled() && handler.hasGroupSupport(); + } + + /** + * Get the permission groups of a player, if available. + * + * @param player The player. + * + * @return Permission groups, or an empty collection if this feature is not supported. + */ + public Collection getGroups(OfflinePlayer player) { + return isEnabled() ? handler.getGroups(player) : Collections.emptyList(); + } + + /** + * Get the primary group of a player, if available. + * + * @param player The player. + * + * @return The name of the primary permission group. Or null. + */ + public UserGroup getPrimaryGroup(OfflinePlayer player) { + return isEnabled() ? handler.getPrimaryGroup(player) : null; + } + + /** + * Check whether the player is in the specified group. + * + * @param player The player. + * @param groupName The group name. + * + * @return True if the player is in the specified group, false otherwise. + * False is also returned if groups aren't supported by the used permissions system. + */ + public boolean isInGroup(OfflinePlayer player, UserGroup groupName) { + return isEnabled() && handler.isInGroup(player, groupName); + } + + /** + * Add the permission group of a player, if supported. + * + * @param player The player + * @param groupName The name of the group. + * + * @return True if succeed, false otherwise. + * False is also returned if this feature isn't supported for the current permissions system. + */ + public boolean addGroup(OfflinePlayer player, UserGroup groupName) { + if (!isEnabled() || StringUtils.isBlank(groupName.getGroupName())) { + return false; + } + return handler.addToGroup(player, groupName); + } + + /** + * Add the permission groups of a player, if supported. + * + * @param player The player + * @param groupNames The name of the groups to add. + * + * @return True if at least one group was added, false otherwise. + * False is also returned if this feature isn't supported for the current permissions system. + */ + public boolean addGroups(OfflinePlayer player, Collection groupNames) { + // If no permissions system is used, return false + if (!isEnabled()) { + return false; + } + + // Add each group to the user + boolean result = false; + for (UserGroup group : groupNames) { + if (!group.getGroupName().isEmpty()) { + result |= handler.addToGroup(player, group); + } + } + + // Return the result + return result; + } + + /** + * Remove the permission group of a player, if supported. + * + * @param player The player + * @param group The name of the group. + * + * @return True if succeed, false otherwise. + * False is also returned if this feature isn't supported for the current permissions system. + */ + public boolean removeGroup(OfflinePlayer player, UserGroup group) { + return isEnabled() && handler.removeFromGroup(player, group); + } + + /** + * Remove the permission groups of a player, if supported. + * + * @param player The player + * @param groupNames The name of the groups to remove. + * + * @return True if at least one group was removed, false otherwise. + * False is also returned if this feature isn't supported for the current permissions system. + */ + public boolean removeGroups(OfflinePlayer player, Collection groupNames) { + // If no permissions system is used, return false + if (!isEnabled()) { + return false; + } + + // Add each group to the user + boolean result = false; + for (UserGroup group : groupNames) { + if (!group.getGroupName().isEmpty()) { + result |= handler.removeFromGroup(player, group); + } + } + + // Return the result + return result; + } + + /** + * Set the permission group of a player, if supported. + * This clears the current groups of the player. + * + * @param player The player + * @param group The name of the group. + * + * @return True if succeed, false otherwise. + * False is also returned if this feature isn't supported for the current permissions system. + */ + public boolean setGroup(OfflinePlayer player, UserGroup group) { + return isEnabled() && handler.setGroup(player, group); + } + + /** + * Remove all groups of the specified player, if supported. + * Systems like Essentials GroupManager don't allow all groups to be removed from a player, thus the user will stay + * in its primary group. All the subgroups are removed just fine. + * + * @param player The player to remove all groups from. + * + * @return True if succeed, false otherwise. + * False will also be returned if this feature isn't supported for the used permissions system. + */ + public boolean removeAllGroups(OfflinePlayer player) { + // If no permissions system is used, return false + if (!isEnabled()) { + return false; + } + + // Get a list of current groups + Collection groups = getGroups(player); + + // Remove each group + return removeGroups(player, groups); + } + + /** + * Loads the permission data of the given player. + * + * @param offlinePlayer the offline player. + * @return true if the load was successful. + */ + public boolean loadUserData(OfflinePlayer offlinePlayer) { + try { + loadUserData(offlinePlayer.getUniqueId()); + } catch (PermissionLoadUserException e) { + logger.logException("Unable to load the permission data of user " + offlinePlayer.getName(), e); + return false; + } + return true; + } + + /** + * Loads the permission data of the given player unique identifier. + * + * @param uuid the {@link UUID} of the player. + * @throws PermissionLoadUserException if the action failed. + */ + public void loadUserData(UUID uuid) throws PermissionLoadUserException { + if (!isEnabled()) { + return; + } + handler.loadUserData(uuid); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PermissionsSystemType.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PermissionsSystemType.java new file mode 100644 index 0000000000..00f0103622 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PermissionsSystemType.java @@ -0,0 +1,91 @@ +package fr.xephi.authme.permission; + +/** + * Enum representing the permissions systems AuthMe supports. + */ +public enum PermissionsSystemType { + + /** + * LuckPerms. + */ + LUCK_PERMS("LuckPerms", "LuckPerms"), + + /** + * Permissions Ex. + */ + PERMISSIONS_EX("PermissionsEx", "PermissionsEx"), + + /** + * zPermissions. + */ + Z_PERMISSIONS("zPermissions", "zPermissions"), + + /** + * Vault. + */ + VAULT("Vault", "Vault"); + + /** + * The display name of the permissions system. + */ + private String displayName; + + /** + * The name of the permissions system plugin. + */ + private String pluginName; + + /** + * Constructor for PermissionsSystemType. + * + * @param displayName Display name of the permissions system. + * @param pluginName Name of the plugin. + */ + PermissionsSystemType(String displayName, String pluginName) { + this.displayName = displayName; + this.pluginName = pluginName; + } + + /** + * Get the display name of the permissions system. + * + * @return Display name. + */ + public String getDisplayName() { + return this.displayName; + } + + /** + * Return the plugin name. + * + * @return Plugin name. + */ + public String getPluginName() { + return this.pluginName; + } + + /** + * Cast the permissions system type to a string. + * + * @return The display name of the permissions system. + */ + @Override + public String toString() { + return getDisplayName(); + } + + /** + * Check if a given plugin is a permissions system. + * + * @param name The name of the plugin to check. + * @return If the plugin is a valid permissions system. + */ + public static boolean isPermissionSystem(String name) { + for (PermissionsSystemType permissionsSystemType : values()) { + if (permissionsSystemType.pluginName.equals(name)) { + return true; + } + } + return false; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PlayerPermission.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PlayerPermission.java new file mode 100644 index 0000000000..d7427f46a9 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PlayerPermission.java @@ -0,0 +1,112 @@ +package fr.xephi.authme.permission; + +/** + * AuthMe player permission nodes, for regular players. + */ +public enum PlayerPermission implements PermissionNode { + + /** + * Command permission to login. + */ + LOGIN("authme.player.login"), + + /** + * Command permission to logout. + */ + LOGOUT("authme.player.logout"), + + /** + * Command permission to register. + */ + REGISTER("authme.player.register"), + + /** + * Command permission to unregister. + */ + UNREGISTER("authme.player.unregister"), + + /** + * Command permission to change the password. + */ + CHANGE_PASSWORD("authme.player.changepassword"), + + /** + * Command permission to see the own email address. + */ + SEE_EMAIL("authme.player.email.see"), + + /** + * Command permission to add an email address. + */ + ADD_EMAIL("authme.player.email.add"), + + /** + * Command permission to change the email address. + */ + CHANGE_EMAIL("authme.player.email.change"), + + /** + * Command permission to recover an account using its email address. + */ + RECOVER_EMAIL("authme.player.email.recover"), + + /** + * Command permission to use captcha. + */ + CAPTCHA("authme.player.captcha"), + + /** + * Permission for users a login can be forced to. + */ + CAN_LOGIN_BE_FORCED("authme.player.canbeforced"), + + /** + * Permission to use to see own other accounts. + */ + SEE_OWN_ACCOUNTS("authme.player.seeownaccounts"), + + /** + * Permission to use the email verification codes feature. + */ + VERIFICATION_CODE("authme.player.security.verificationcode"), + + /** + * Permission that enables on join quick commands checks for the player. + */ + QUICK_COMMANDS_PROTECTION("authme.player.protection.quickcommandsprotection"), + + /** + * Permission to enable two-factor authentication. + */ + ENABLE_TWO_FACTOR_AUTH("authme.player.totpadd"), + + /** + * Permission to disable two-factor authentication. + */ + DISABLE_TWO_FACTOR_AUTH("authme.player.totpremove"); + + /** + * The permission node. + */ + private String node; + + /** + * Constructor. + * + * @param node Permission node. + */ + PlayerPermission(String node) { + this.node = node; + } + + @Override + public String getNode() { + return node; + } + + @Override + public DefaultPermission getDefaultPermission() { + return DefaultPermission.ALLOWED; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PlayerStatePermission.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PlayerStatePermission.java new file mode 100644 index 0000000000..b9fe17e763 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/PlayerStatePermission.java @@ -0,0 +1,79 @@ +package fr.xephi.authme.permission; + +/** + * Permission nodes that give a player a status (e.g. VIP) + * or grant them more freedom (e.g. less restrictions). + */ +public enum PlayerStatePermission implements PermissionNode { + + /** + * Permission node to bypass AntiBot protection. + */ + BYPASS_ANTIBOT("authme.bypassantibot", DefaultPermission.OP_ONLY), + + /** + * Permission node to bypass BungeeCord server teleportation. + */ + BYPASS_BUNGEE_SEND("authme.bypassbungeesend", DefaultPermission.NOT_ALLOWED), + + /** + * Permission for users to bypass force-survival mode. + */ + BYPASS_FORCE_SURVIVAL("authme.bypassforcesurvival", DefaultPermission.OP_ONLY), + + /** + * When the server is full and someone with this permission joins the server, someone will be kicked. + */ + IS_VIP("authme.vip", DefaultPermission.NOT_ALLOWED), + + /** + * Permission to be able to register multiple accounts. + */ + ALLOW_MULTIPLE_ACCOUNTS("authme.allowmultipleaccounts", DefaultPermission.OP_ONLY), + + /** + * Permission to bypass the purging process. + */ + BYPASS_PURGE("authme.bypasspurge", DefaultPermission.NOT_ALLOWED), + + /** + * Permission to bypass the GeoIp country code check. + */ + BYPASS_COUNTRY_CHECK("authme.bypasscountrycheck", DefaultPermission.NOT_ALLOWED), + + /** + * Permission to send chat messages before being logged in. + */ + ALLOW_CHAT_BEFORE_LOGIN("authme.allowchatbeforelogin", DefaultPermission.NOT_ALLOWED); + + /** + * The permission node. + */ + private String node; + + /** + * The default permission level. + */ + private DefaultPermission defaultPermission; + + /** + * Constructor. + * + * @param node Permission node + * @param defaultPermission The default permission + */ + PlayerStatePermission(String node, DefaultPermission defaultPermission) { + this.node = node; + this.defaultPermission = defaultPermission; + } + + @Override + public String getNode() { + return node; + } + + @Override + public DefaultPermission getDefaultPermission() { + return defaultPermission; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/LuckPermGroup.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/LuckPermGroup.java new file mode 100644 index 0000000000..81a34a4eca --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/LuckPermGroup.java @@ -0,0 +1,23 @@ +package fr.xephi.authme.permission.handlers; + +import net.luckperms.api.context.ImmutableContextSet; +import net.luckperms.api.model.group.Group; + +public class LuckPermGroup { + private Group group; + private ImmutableContextSet contexts; + + public LuckPermGroup(Group group, ImmutableContextSet contexts) { + this.group = group; + + this.contexts = contexts; + } + + public Group getGroup() { + return group; + } + + public ImmutableContextSet getContexts() { + return contexts; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java new file mode 100644 index 0000000000..3e786f33dc --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java @@ -0,0 +1,227 @@ +package fr.xephi.authme.permission.handlers; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.limbo.UserGroup; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.permission.PermissionsSystemType; +import net.luckperms.api.LuckPerms; +import net.luckperms.api.LuckPermsProvider; +import net.luckperms.api.cacheddata.CachedPermissionData; +import net.luckperms.api.context.ContextSetFactory; +import net.luckperms.api.model.data.DataMutateResult; +import net.luckperms.api.model.group.Group; +import net.luckperms.api.model.user.User; +import net.luckperms.api.node.NodeEqualityPredicate; +import net.luckperms.api.node.types.InheritanceNode; +import net.luckperms.api.query.QueryMode; +import net.luckperms.api.query.QueryOptions; +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; + +/** + * Handler for LuckPerms. + * + * @see LuckPerms SpigotMC page + * @see LuckPerms on Github + */ +public class LuckPermsHandler implements PermissionHandler { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(LuckPermsHandler.class); + private LuckPerms luckPerms; + + public LuckPermsHandler() throws PermissionHandlerException { + try { + luckPerms = LuckPermsProvider.get(); + } catch (IllegalStateException e) { + throw new PermissionHandlerException("Could not get api of LuckPerms", e); + } + } + + @Override + public boolean addToGroup(OfflinePlayer player, UserGroup group) { + Group newGroup = luckPerms.getGroupManager().getGroup(group.getGroupName()); + if (newGroup == null) { + return false; + } + + String playerName = player.getName(); + if (playerName == null) { + return false; + } + User user = luckPerms.getUserManager().getUser(playerName); + if (user == null) { + return false; + } + + InheritanceNode node = buildGroupNode(group); + + DataMutateResult result = user.data().add(node); + if (result == DataMutateResult.FAIL) { + return false; + } + + luckPerms.getUserManager().saveUser(user); + return true; + } + + @Override + public boolean hasGroupSupport() { + return true; + } + + @Override + public boolean hasPermissionOffline(String name, PermissionNode node) { + User user = luckPerms.getUserManager().getUser(name); + if (user == null) { + logger.warning("LuckPermsHandler: tried to check permission for offline user " + + name + " but it isn't loaded!"); + return false; + } + + CachedPermissionData permissionData = user.getCachedData() + .getPermissionData(QueryOptions.builder(QueryMode.CONTEXTUAL).build()); + return permissionData.checkPermission(node.getNode()).asBoolean(); + } + + @Override + public boolean isInGroup(OfflinePlayer player, UserGroup group) { + String playerName = player.getName(); + if (playerName == null) { + return false; + } + User user = luckPerms.getUserManager().getUser(playerName); + if (user == null) { + logger.warning("LuckPermsHandler: tried to check group for offline user " + + player.getName() + " but it isn't loaded!"); + return false; + } + + InheritanceNode inheritanceNode = InheritanceNode.builder(group.getGroupName()).build(); + return user.data().contains(inheritanceNode, NodeEqualityPredicate.EXACT).asBoolean(); + } + + @Override + public boolean removeFromGroup(OfflinePlayer player, UserGroup group) { + String playerName = player.getName(); + if (playerName == null) { + return false; + } + User user = luckPerms.getUserManager().getUser(playerName); + if (user == null) { + logger.warning("LuckPermsHandler: tried to remove group for offline user " + + player.getName() + " but it isn't loaded!"); + return false; + } + + InheritanceNode groupNode = InheritanceNode.builder(group.getGroupName()).build(); + boolean result = user.data().remove(groupNode) != DataMutateResult.FAIL; + + luckPerms.getUserManager().saveUser(user); + return result; + } + + @Override + public boolean setGroup(OfflinePlayer player, UserGroup group) { + String playerName = player.getName(); + if (playerName == null) { + return false; + } + User user = luckPerms.getUserManager().getUser(playerName); + if (user == null) { + logger.warning("LuckPermsHandler: tried to set group for offline user " + + player.getName() + " but it isn't loaded!"); + return false; + } + + InheritanceNode groupNode = buildGroupNode(group); + + DataMutateResult result = user.data().add(groupNode); + if (result == DataMutateResult.FAIL) { + return false; + } + user.data().clear(node -> { + if (!(node instanceof InheritanceNode)) { + return false; + } + InheritanceNode inheritanceNode = (InheritanceNode) node; + return !inheritanceNode.equals(groupNode); + }); + + luckPerms.getUserManager().saveUser(user); + return true; + } + + @Override + public List getGroups(OfflinePlayer player) { + String playerName = player.getName(); + if (playerName == null) { + return Collections.emptyList(); + } + User user = luckPerms.getUserManager().getUser(playerName); + if (user == null) { + logger.warning("LuckPermsHandler: tried to get groups for offline user " + + player.getName() + " but it isn't loaded!"); + return Collections.emptyList(); + } + + return user.getDistinctNodes().stream() + .filter(node -> node instanceof InheritanceNode) + .map(node -> (InheritanceNode) node) + .map(node -> { + Group group = luckPerms.getGroupManager().getGroup(node.getGroupName()); + if (group == null) { + return null; + } + return new LuckPermGroup(group, node.getContexts()); + }) + .filter(Objects::nonNull) + .sorted((o1, o2) -> sortGroups(user, o1, o2)) + .map(g -> new UserGroup(g.getGroup().getName(), g.getContexts().toFlattenedMap())) + .collect(Collectors.toList()); + } + + @Override + public PermissionsSystemType getPermissionSystem() { + return PermissionsSystemType.LUCK_PERMS; + } + + @Override + public void loadUserData(UUID uuid) throws PermissionLoadUserException { + try { + luckPerms.getUserManager().loadUser(uuid).get(5, TimeUnit.SECONDS); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + throw new PermissionLoadUserException("Unable to load the permission data of the user " + uuid, e); + } + } + + @NotNull + private InheritanceNode buildGroupNode(UserGroup group) { + ContextSetFactory contextSetFactory = luckPerms.getContextManager().getContextSetFactory(); + InheritanceNode.Builder builder = InheritanceNode.builder(group.getGroupName()); + if (group.getContextMap() != null) { + group.getContextMap().forEach((k, v) -> builder.withContext((contextSetFactory.immutableOf(k, v)))); + } + return builder.build(); + } + + private int sortGroups(User user, LuckPermGroup o1, LuckPermGroup o2) { + Group group1 = o1.getGroup(); + Group group2 = o2.getGroup(); + if (group1.getName().equals(user.getPrimaryGroup()) || group2.getName().equals(user.getPrimaryGroup())) { + return group1.getName().equals(user.getPrimaryGroup()) ? 1 : -1; + } + + int i = Integer.compare(group2.getWeight().orElse(0), group1.getWeight().orElse(0)); + return i != 0 ? i : group1.getName().compareToIgnoreCase(group2.getName()); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/PermissionHandler.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/PermissionHandler.java new file mode 100644 index 0000000000..efdc989e3f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/PermissionHandler.java @@ -0,0 +1,114 @@ +package fr.xephi.authme.permission.handlers; + +import fr.xephi.authme.data.limbo.UserGroup; +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.permission.PermissionsSystemType; +import fr.xephi.authme.util.Utils; +import org.bukkit.OfflinePlayer; + +import java.util.Collection; +import java.util.UUID; + +public interface PermissionHandler { + + /** + * Add the permission group of a player, if supported. + * + * @param player The player + * @param group The name of the group. + * + * @return True if succeed, false otherwise. + * False is also returned if this feature isn't supported for the current permissions system. + */ + boolean addToGroup(OfflinePlayer player, UserGroup group); + + /** + * Check whether the current permissions system has group support. + * If no permissions system is hooked, false will be returned. + * + * @return True if the current permissions system supports groups, false otherwise. + */ + boolean hasGroupSupport(); + + /** + * Check if a player has permission by their name. + * Used to check an offline player's permission. + * + * @param name The player's name. + * @param node The permission node. + * + * @return True if the player has permission. + */ + boolean hasPermissionOffline(String name, PermissionNode node); + + /** + * Check whether the player is in the specified group. + * + * @param player The player. + * @param group The group name. + * + * @return True if the player is in the specified group, false otherwise. + * False is also returned if groups aren't supported by the used permissions system. + */ + default boolean isInGroup(OfflinePlayer player, UserGroup group) { + return getGroups(player).contains(group); + } + + /** + * Remove the permission group of a player, if supported. + * + * @param player The player + * @param group The name of the group. + * + * @return True if succeed, false otherwise. + * False is also returned if this feature isn't supported for the current permissions system. + */ + boolean removeFromGroup(OfflinePlayer player, UserGroup group); + + /** + * Set the permission group of a player, if supported. + * This clears the current groups of the player. + * + * @param player The player + * @param group The name of the group. + * + * @return True if succeed, false otherwise. + * False is also returned if this feature isn't supported for the current permissions system. + */ + boolean setGroup(OfflinePlayer player, UserGroup group); + + /** + * Get the permission groups of a player, if available. + * + * @param player The player. + * + * @return Permission groups, or an empty list if this feature is not supported. + */ + Collection getGroups(OfflinePlayer player); + + /** + * Get the primary group of a player, if available. + * + * @param player The player. + * + * @return The name of the primary permission group. Or null. + */ + default UserGroup getPrimaryGroup(OfflinePlayer player) { + Collection groups = getGroups(player); + if (Utils.isCollectionEmpty(groups)) { + return null; + } + return groups.iterator().next(); + } + + /** + * Get the permission system that is being used. + * + * @return The permission system. + */ + PermissionsSystemType getPermissionSystem(); + + default void loadUserData(UUID uuid) throws PermissionLoadUserException { + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/PermissionHandlerException.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/PermissionHandlerException.java new file mode 100644 index 0000000000..a0de9ada16 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/PermissionHandlerException.java @@ -0,0 +1,16 @@ +package fr.xephi.authme.permission.handlers; + +/** + * Exception during the instantiation of a {@link PermissionHandler}. + */ +@SuppressWarnings("serial") +public class PermissionHandlerException extends Exception { + + public PermissionHandlerException(String message) { + super(message); + } + + public PermissionHandlerException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/PermissionLoadUserException.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/PermissionLoadUserException.java new file mode 100644 index 0000000000..697b491822 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/PermissionLoadUserException.java @@ -0,0 +1,13 @@ +package fr.xephi.authme.permission.handlers; + +import java.util.UUID; + +/** + * Exception thrown when a {@link PermissionHandler#loadUserData(UUID uuid)} request fails. + */ +public class PermissionLoadUserException extends Exception { + + public PermissionLoadUserException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/PermissionsExHandler.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/PermissionsExHandler.java new file mode 100644 index 0000000000..db834ca4fc --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/PermissionsExHandler.java @@ -0,0 +1,90 @@ +package fr.xephi.authme.permission.handlers; + +import fr.xephi.authme.data.limbo.UserGroup; +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.permission.PermissionsSystemType; +import org.bukkit.OfflinePlayer; +import ru.tehkode.permissions.PermissionManager; +import ru.tehkode.permissions.PermissionUser; +import ru.tehkode.permissions.bukkit.PermissionsEx; + +import java.util.ArrayList; +import java.util.List; + +import static java.util.stream.Collectors.toList; + +/** + * Handler for PermissionsEx. + * + * @see PermissionsEx Bukkit page + * @see PermissionsEx on Github + */ +public class PermissionsExHandler implements PermissionHandler { + + private PermissionManager permissionManager; + + public PermissionsExHandler() throws PermissionHandlerException { + permissionManager = PermissionsEx.getPermissionManager(); + if (permissionManager == null) { + throw new PermissionHandlerException("Could not get manager of PermissionsEx"); + } + } + + @Override + public boolean addToGroup(OfflinePlayer player, UserGroup group) { + if (!PermissionsEx.getPermissionManager().getGroupNames().contains(group)) { + return false; + } + + PermissionUser user = PermissionsEx.getUser(player.getName()); + user.addGroup(group.getGroupName()); + return true; + } + + @Override + public boolean hasGroupSupport() { + return true; + } + + @Override + public boolean hasPermissionOffline(String name, PermissionNode node) { + PermissionUser user = permissionManager.getUser(name); + return user.has(node.getNode()); + } + + @Override + public boolean isInGroup(OfflinePlayer player, UserGroup group) { + PermissionUser user = permissionManager.getUser(player.getName()); + return user.inGroup(group.getGroupName()); + } + + @Override + public boolean removeFromGroup(OfflinePlayer player, UserGroup group) { + PermissionUser user = permissionManager.getUser(player.getName()); + user.removeGroup(group.getGroupName()); + return true; + } + + @Override + public boolean setGroup(OfflinePlayer player, UserGroup group) { + List groups = new ArrayList<>(); + groups.add(group.getGroupName()); + + PermissionUser user = permissionManager.getUser(player.getName()); + user.setParentsIdentifier(groups); + return true; + } + + @Override + public List getGroups(OfflinePlayer player) { + PermissionUser user = permissionManager.getUser(player.getName()); + return user.getParentIdentifiers(null).stream() + .map(i -> new UserGroup(i, null)) + .collect(toList()); + } + + @Override + public PermissionsSystemType getPermissionSystem() { + return PermissionsSystemType.PERMISSIONS_EX; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/VaultHandler.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/VaultHandler.java new file mode 100644 index 0000000000..87f5fc2724 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/VaultHandler.java @@ -0,0 +1,105 @@ +package fr.xephi.authme.permission.handlers; + +import com.google.common.annotations.VisibleForTesting; +import fr.xephi.authme.data.limbo.UserGroup; +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.permission.PermissionsSystemType; +import net.milkbowl.vault.permission.Permission; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.plugin.RegisteredServiceProvider; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static java.util.stream.Collectors.toList; + +/** + * Handler for permissions via Vault. + * + * @see Vault Bukkit page + * @see Vault on Github + */ +public class VaultHandler implements PermissionHandler { + + private Permission vaultProvider; + + public VaultHandler(Server server) throws PermissionHandlerException { + this.vaultProvider = getVaultPermission(server); + } + + /** + * Returns the Vault Permission interface. + * + * @param server the bukkit server instance + * @return the vault permission instance + * @throws PermissionHandlerException if the vault permission instance cannot be retrieved + */ + @VisibleForTesting + Permission getVaultPermission(Server server) throws PermissionHandlerException { + // Get the permissions provider service + RegisteredServiceProvider permissionProvider = server + .getServicesManager().getRegistration(Permission.class); + if (permissionProvider == null) { + throw new PermissionHandlerException("Could not load permissions provider service"); + } + + // Get the Vault provider and make sure it's valid + Permission vaultPerms = permissionProvider.getProvider(); + if (vaultPerms == null) { + throw new PermissionHandlerException("Could not load Vault permissions provider"); + } + return vaultPerms; + } + + @Override + public boolean addToGroup(OfflinePlayer player, UserGroup group) { + return vaultProvider.playerAddGroup(null, player, group.getGroupName()); + } + + @Override + public boolean hasGroupSupport() { + return vaultProvider.hasGroupSupport(); + } + + @Override + public boolean hasPermissionOffline(String name, PermissionNode node) { + return vaultProvider.has((String) null, name, node.getNode()); + } + + @Override + public boolean isInGroup(OfflinePlayer player, UserGroup group) { + return vaultProvider.playerInGroup(null, player, group.getGroupName()); + } + + @Override + public boolean removeFromGroup(OfflinePlayer player, UserGroup group) { + return vaultProvider.playerRemoveGroup(null, player, group.getGroupName()); + } + + @Override + public boolean setGroup(OfflinePlayer player, UserGroup group) { + for (UserGroup g : getGroups(player)) { + removeFromGroup(player, g); + } + + return vaultProvider.playerAddGroup(null, player, group.getGroupName()); + } + + @Override + public List getGroups(OfflinePlayer player) { + String[] groups = vaultProvider.getPlayerGroups(null, player); + return groups == null ? Collections.emptyList() : Arrays.stream(groups).map(UserGroup::new).collect(toList()); + } + + @Override + public UserGroup getPrimaryGroup(OfflinePlayer player) { + return new UserGroup(vaultProvider.getPrimaryGroup(null, player)); + } + + @Override + public PermissionsSystemType getPermissionSystem() { + return PermissionsSystemType.VAULT; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/ZPermissionsHandler.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/ZPermissionsHandler.java new file mode 100644 index 0000000000..0b632de6ba --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/permission/handlers/ZPermissionsHandler.java @@ -0,0 +1,79 @@ +package fr.xephi.authme.permission.handlers; + +import fr.xephi.authme.data.limbo.UserGroup; +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.permission.PermissionsSystemType; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.tyrannyofheaven.bukkit.zPermissions.ZPermissionsService; + +import java.util.Collection; +import java.util.Map; + +import static java.util.stream.Collectors.toList; + +/** + * Handler for zPermissions. + * + * @see zPermissions Bukkit page + * @see zPermissions on Github + */ +public class ZPermissionsHandler implements PermissionHandler { + + private ZPermissionsService zPermissionsService; + + public ZPermissionsHandler() throws PermissionHandlerException { + // Set the zPermissions service and make sure it's valid + ZPermissionsService zPermissionsService = Bukkit.getServicesManager().load(ZPermissionsService.class); + if (zPermissionsService == null) { + throw new PermissionHandlerException("Failed to get the ZPermissions service!"); + } + this.zPermissionsService = zPermissionsService; + } + + @Override + public boolean addToGroup(OfflinePlayer player, UserGroup group) { + return Bukkit.dispatchCommand(Bukkit.getConsoleSender(), + "permissions player " + player.getName() + " addgroup " + group.getGroupName()); + } + + @Override + public boolean hasGroupSupport() { + return true; + } + + @Override + public boolean hasPermissionOffline(String name, PermissionNode node) { + Map perms = zPermissionsService.getPlayerPermissions(null, null, name); + return perms.getOrDefault(node.getNode(), false); + } + + @Override + public boolean removeFromGroup(OfflinePlayer player, UserGroup group) { + return Bukkit.dispatchCommand(Bukkit.getConsoleSender(), + "permissions player " + player.getName() + " removegroup " + group.getGroupName()); + } + + @Override + public boolean setGroup(OfflinePlayer player, UserGroup group) { + return Bukkit.dispatchCommand(Bukkit.getConsoleSender(), + "permissions player " + player.getName() + " setgroup " + group.getGroupName()); + } + + @Override + public Collection getGroups(OfflinePlayer player) { + return zPermissionsService.getPlayerGroups(player.getName()).stream() + .map(UserGroup::new) + .collect(toList()); + } + + @Override + public UserGroup getPrimaryGroup(OfflinePlayer player) { + return new UserGroup(zPermissionsService.getPlayerPrimaryGroup(player.getName())); + } + + @Override + public PermissionsSystemType getPermissionSystem() { + return PermissionsSystemType.Z_PERMISSIONS; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/AsynchronousProcess.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/AsynchronousProcess.java new file mode 100644 index 0000000000..80c0631304 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/AsynchronousProcess.java @@ -0,0 +1,10 @@ +package fr.xephi.authme.process; + +/** + * Marker interface for asynchronous AuthMe processes. + *

+ * These processes handle intensive (I/O or otherwise) actions and are + * therefore scheduled to run asynchronously. + */ +public interface AsynchronousProcess { +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/Management.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/Management.java new file mode 100644 index 0000000000..454c0c1859 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/Management.java @@ -0,0 +1,107 @@ +package fr.xephi.authme.process; + +import fr.xephi.authme.process.changepassword.AsyncChangePassword; +import fr.xephi.authme.process.email.AsyncAddEmail; +import fr.xephi.authme.process.email.AsyncChangeEmail; +import fr.xephi.authme.process.join.AsynchronousJoin; +import fr.xephi.authme.process.login.AsynchronousLogin; +import fr.xephi.authme.process.logout.AsynchronousLogout; +import fr.xephi.authme.process.quit.AsynchronousQuit; +import fr.xephi.authme.process.register.AsyncRegister; +import fr.xephi.authme.process.register.executors.RegistrationMethod; +import fr.xephi.authme.process.register.executors.RegistrationParameters; +import fr.xephi.authme.process.unregister.AsynchronousUnregister; +import fr.xephi.authme.service.BukkitService; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.inject.Inject; + +/** + * Performs auth actions, e.g. when a player joins, registers or wants to change his password. + */ +public class Management { + + @Inject + private BukkitService bukkitService; + + // Processes + @Inject + private AsyncAddEmail asyncAddEmail; + @Inject + private AsyncChangeEmail asyncChangeEmail; + @Inject + private AsynchronousLogout asynchronousLogout; + @Inject + private AsynchronousQuit asynchronousQuit; + @Inject + private AsynchronousJoin asynchronousJoin; + @Inject + private AsyncRegister asyncRegister; + @Inject + private AsynchronousLogin asynchronousLogin; + @Inject + private AsynchronousUnregister asynchronousUnregister; + @Inject + private AsyncChangePassword asyncChangePassword; + + Management() { + } + + + public void performLogin(Player player, String password) { + runTask(() -> asynchronousLogin.login(player, password)); + } + + public void forceLogin(Player player) { + runTask(() -> asynchronousLogin.forceLogin(player)); + } + + public void forceLogin(Player player, boolean quiet) { + runTask(() -> asynchronousLogin.forceLogin(player, quiet)); + } + + public void performLogout(Player player) { + runTask(() -> asynchronousLogout.logout(player)); + } + + public

void performRegister(RegistrationMethod

variant, P parameters) { + runTask(() -> asyncRegister.register(variant, parameters)); + } + + public void performUnregister(Player player, String password) { + runTask(() -> asynchronousUnregister.unregister(player, password)); + } + + public void performUnregisterByAdmin(CommandSender initiator, String name, Player player) { + runTask(() -> asynchronousUnregister.adminUnregister(initiator, name, player)); + } + + public void performJoin(Player player) { + runTask(() -> asynchronousJoin.processJoin(player)); + } + + public void performQuit(Player player) { + runTask(() -> asynchronousQuit.processQuit(player)); + } + + public void performAddEmail(Player player, String newEmail) { + runTask(() -> asyncAddEmail.addEmail(player, newEmail)); + } + + public void performChangeEmail(Player player, String oldEmail, String newEmail) { + runTask(() -> asyncChangeEmail.changeEmail(player, oldEmail, newEmail)); + } + + public void performPasswordChange(Player player, String oldPassword, String newPassword) { + runTask(() -> asyncChangePassword.changePassword(player, oldPassword, newPassword)); + } + + public void performPasswordChangeAsAdmin(CommandSender sender, String playerName, String newPassword) { + runTask(() -> asyncChangePassword.changePasswordAsAdmin(sender, playerName, newPassword)); + } + + private void runTask(Runnable runnable) { + bukkitService.runTaskOptionallyAsync(runnable); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/SyncProcessManager.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/SyncProcessManager.java new file mode 100644 index 0000000000..0fdfdde3de --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/SyncProcessManager.java @@ -0,0 +1,62 @@ +package fr.xephi.authme.process; + +import fr.xephi.authme.process.login.ProcessSyncPlayerLogin; +import fr.xephi.authme.process.logout.ProcessSyncPlayerLogout; +import fr.xephi.authme.process.quit.ProcessSyncPlayerQuit; +import fr.xephi.authme.process.register.ProcessSyncEmailRegister; +import fr.xephi.authme.process.register.ProcessSyncPasswordRegister; +import fr.xephi.authme.service.BukkitService; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; + +/** + * Manager for scheduling synchronous processes internally from the asynchronous processes. + * These synchronous processes are a continuation of the associated async processes; they only + * contain certain tasks which may only be run synchronously (most interactions with Bukkit). + * These synchronous tasks should never be called aside from the asynchronous processes. + * + * @see Management + */ +public class SyncProcessManager { + + @Inject + private BukkitService bukkitService; + + @Inject + private ProcessSyncEmailRegister processSyncEmailRegister; + @Inject + private ProcessSyncPasswordRegister processSyncPasswordRegister; + @Inject + private ProcessSyncPlayerLogin processSyncPlayerLogin; + @Inject + private ProcessSyncPlayerLogout processSyncPlayerLogout; + @Inject + private ProcessSyncPlayerQuit processSyncPlayerQuit; + + + public void processSyncEmailRegister(Player player) { + runTask(() -> processSyncEmailRegister.processEmailRegister(player)); + } + + public void processSyncPasswordRegister(Player player) { + runTask(() -> processSyncPasswordRegister.processPasswordRegister(player)); + } + + public void processSyncPlayerLogout(Player player) { + runTask(() -> processSyncPlayerLogout.processSyncLogout(player)); + } + + public void processSyncPlayerLogin(Player player, boolean isFirstLogin, List authsWithSameIp) { + runTask(() -> processSyncPlayerLogin.processPlayerLogin(player, isFirstLogin, authsWithSameIp)); + } + + public void processSyncPlayerQuit(Player player, boolean wasLoggedIn) { + runTask(() -> processSyncPlayerQuit.processSyncQuit(player, wasLoggedIn)); + } + + private void runTask(Runnable runnable) { + bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(runnable); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/SynchronousProcess.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/SynchronousProcess.java new file mode 100644 index 0000000000..6c23a0f81f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/SynchronousProcess.java @@ -0,0 +1,10 @@ +package fr.xephi.authme.process; + +/** + * Marker interface for synchronous processes. + *

+ * Such processes are scheduled by {@link AsynchronousProcess asynchronous tasks} to perform tasks + * which are required to be executed synchronously (e.g. interactions with the Bukkit API). + */ +public interface SynchronousProcess { +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/changepassword/AsyncChangePassword.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/changepassword/AsyncChangePassword.java new file mode 100644 index 0000000000..aa45d228f7 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/changepassword/AsyncChangePassword.java @@ -0,0 +1,102 @@ +package fr.xephi.authme.process.changepassword; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.process.AsynchronousProcess; +import fr.xephi.authme.security.PasswordSecurity; +import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.service.CommonService; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.Locale; + +public class AsyncChangePassword implements AsynchronousProcess { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(AsyncChangePassword.class); + + @Inject + private DataSource dataSource; + + @Inject + private CommonService commonService; + + @Inject + private PasswordSecurity passwordSecurity; + + @Inject + private PlayerCache playerCache; + + AsyncChangePassword() { + } + + /** + * Change password for an online player + * + * @param player the player + * @param oldPassword the old password used by the player + * @param newPassword the new password chosen by the player + */ + public void changePassword(Player player, String oldPassword, String newPassword) { + String name = player.getName().toLowerCase(Locale.ROOT); + PlayerAuth auth = playerCache.getAuth(name); + if (passwordSecurity.comparePassword(oldPassword, auth.getPassword(), player.getName())) { + HashedPassword hashedPassword = passwordSecurity.computeHash(newPassword, name); + auth.setPassword(hashedPassword); + + if (!dataSource.updatePassword(auth)) { + commonService.send(player, MessageKey.ERROR); + return; + } + + // TODO: send an update when a messaging service will be implemented (PASSWORD_CHANGED) + + playerCache.updatePlayer(auth); + commonService.send(player, MessageKey.PASSWORD_CHANGED_SUCCESS); + logger.info(player.getName() + " changed his password"); + } else { + commonService.send(player, MessageKey.WRONG_PASSWORD); + } + } + + /** + * Change a user's password as an administrator, without asking for the previous one + * + * @param sender who is performing the operation, null if called by other plugins + * @param playerName the player name + * @param newPassword the new password chosen for the player + */ + public void changePasswordAsAdmin(CommandSender sender, String playerName, String newPassword) { + String lowerCaseName = playerName.toLowerCase(Locale.ROOT); + if (!(playerCache.isAuthenticated(lowerCaseName) || dataSource.isAuthAvailable(lowerCaseName))) { + if (sender == null) { + logger.warning("Tried to change password for user " + lowerCaseName + " but it doesn't exist!"); + } else { + commonService.send(sender, MessageKey.UNKNOWN_USER); + } + return; + } + + HashedPassword hashedPassword = passwordSecurity.computeHash(newPassword, lowerCaseName); + if (dataSource.updatePassword(lowerCaseName, hashedPassword)) { + // TODO: send an update when a messaging service will be implemented (PASSWORD_CHANGED) + + if (sender != null) { + commonService.send(sender, MessageKey.PASSWORD_CHANGED_SUCCESS); + logger.info(sender.getName() + " changed password of " + lowerCaseName); + } else { + logger.info("Changed password of " + lowerCaseName); + } + } else { + if (sender != null) { + commonService.send(sender, MessageKey.ERROR); + } + logger.warning("An error occurred while changing password for user " + lowerCaseName + "!"); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/email/AsyncAddEmail.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/email/AsyncAddEmail.java new file mode 100644 index 0000000000..4001420c0f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/email/AsyncAddEmail.java @@ -0,0 +1,95 @@ +package fr.xephi.authme.process.email; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.events.EmailChangedEvent; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.process.AsynchronousProcess; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.util.Utils; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.Locale; + +/** + * Async task to add an email to an account. + */ +public class AsyncAddEmail implements AsynchronousProcess { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(AsyncAddEmail.class); + + @Inject + private CommonService service; + + @Inject + private DataSource dataSource; + + @Inject + private PlayerCache playerCache; + + @Inject + private ValidationService validationService; + + @Inject + private BukkitService bukkitService; + + AsyncAddEmail() { + } + + /** + * Handles the request to add the given email to the player's account. + * + * @param player the player to add the email to + * @param email the email to add + */ + public void addEmail(Player player, String email) { + String playerName = player.getName().toLowerCase(Locale.ROOT); + + if (playerCache.isAuthenticated(playerName)) { + PlayerAuth auth = playerCache.getAuth(playerName); + String currentEmail = auth.getEmail(); + + if (!Utils.isEmailEmpty(currentEmail)) { + service.send(player, MessageKey.USAGE_CHANGE_EMAIL); + } else if (!validationService.validateEmail(email)) { + service.send(player, MessageKey.INVALID_EMAIL); + } else if (!validationService.isEmailFreeForRegistration(email, player)) { + service.send(player, MessageKey.EMAIL_ALREADY_USED_ERROR); + } else { + EmailChangedEvent event = bukkitService.createAndCallEvent(isAsync + -> new EmailChangedEvent(player, null, email, isAsync)); + if (event.isCancelled()) { + logger.info("Could not add email to player '" + player + "' – event was cancelled"); + service.send(player, MessageKey.EMAIL_ADD_NOT_ALLOWED); + return; + } + auth.setEmail(email); + if (dataSource.updateEmail(auth)) { + playerCache.updatePlayer(auth); + // TODO: send an update when a messaging service will be implemented (ADD_MAIL) + service.send(player, MessageKey.EMAIL_ADDED_SUCCESS); + } else { + logger.warning("Could not save email for player '" + player + "'"); + service.send(player, MessageKey.ERROR); + } + } + } else { + sendUnloggedMessage(player); + } + } + + private void sendUnloggedMessage(Player player) { + if (dataSource.isAuthAvailable(player.getName())) { + service.send(player, MessageKey.LOGIN_MESSAGE); + } else { + service.send(player, MessageKey.REGISTER_MESSAGE); + } + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/email/AsyncChangeEmail.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/email/AsyncChangeEmail.java new file mode 100644 index 0000000000..74d9c39bb6 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/email/AsyncChangeEmail.java @@ -0,0 +1,107 @@ +package fr.xephi.authme.process.email; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.events.EmailChangedEvent; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.process.AsynchronousProcess; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.ValidationService; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.Locale; + +/** + * Async task for changing the email. + */ +public class AsyncChangeEmail implements AsynchronousProcess { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(AsyncChangeEmail.class); + + @Inject + private CommonService service; + + @Inject + private PlayerCache playerCache; + + @Inject + private DataSource dataSource; + + @Inject + private ValidationService validationService; + + @Inject + private BukkitService bukkitService; + + AsyncChangeEmail() { + } + + /** + * Handles the request to change the player's email address. + * + * @param player the player to change the email for + * @param oldEmail provided old email + * @param newEmail provided new email + */ + public void changeEmail(Player player, String oldEmail, String newEmail) { + String playerName = player.getName().toLowerCase(Locale.ROOT); + if (playerCache.isAuthenticated(playerName)) { + PlayerAuth auth = playerCache.getAuth(playerName); + String currentEmail = auth.getEmail(); + + if (currentEmail == null) { + service.send(player, MessageKey.USAGE_ADD_EMAIL); + } else if (newEmail == null || !validationService.validateEmail(newEmail)) { + service.send(player, MessageKey.INVALID_NEW_EMAIL); + } else if (!oldEmail.equalsIgnoreCase(currentEmail)) { + service.send(player, MessageKey.INVALID_OLD_EMAIL); + } else if (!validationService.isEmailFreeForRegistration(newEmail, player)) { + service.send(player, MessageKey.EMAIL_ALREADY_USED_ERROR); + } else { + saveNewEmail(auth, player, oldEmail, newEmail); + } + } else { + outputUnloggedMessage(player); + } + } + + /** + * Saves the new email value into the database and informs services. + * + * @param auth the player auth object + * @param player the player object + * @param oldEmail the old email value + * @param newEmail the new email value + */ + private void saveNewEmail(PlayerAuth auth, Player player, String oldEmail, String newEmail) { + EmailChangedEvent event = bukkitService.createAndCallEvent(isAsync + -> new EmailChangedEvent(player, oldEmail, newEmail, isAsync)); + if (event.isCancelled()) { + logger.info("Could not change email for player '" + player + "' – event was cancelled"); + service.send(player, MessageKey.EMAIL_CHANGE_NOT_ALLOWED); + return; + } + + auth.setEmail(newEmail); + if (dataSource.updateEmail(auth)) { + playerCache.updatePlayer(auth); + // TODO: send an update when a messaging service will be implemented (CHANGE_MAIL) + service.send(player, MessageKey.EMAIL_CHANGED_SUCCESS); + } else { + service.send(player, MessageKey.ERROR); + } + } + + private void outputUnloggedMessage(Player player) { + if (dataSource.isAuthAvailable(player.getName())) { + service.send(player, MessageKey.LOGIN_MESSAGE); + } else { + service.send(player, MessageKey.REGISTER_MESSAGE); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java new file mode 100644 index 0000000000..424c49896b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java @@ -0,0 +1,246 @@ +package fr.xephi.authme.process.join; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.ProxySessionManager; +import fr.xephi.authme.data.limbo.LimboService; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.events.ProtectInventoryEvent; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.permission.PlayerStatePermission; +import fr.xephi.authme.process.AsynchronousProcess; +import fr.xephi.authme.process.login.AsynchronousLogin; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.PluginHookService; +import fr.xephi.authme.service.SessionService; +import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.service.bungeecord.BungeeSender; +import fr.xephi.authme.service.bungeecord.MessageType; +import fr.xephi.authme.service.velocity.VMessageType; +import fr.xephi.authme.service.velocity.VelocitySender; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.commandconfig.CommandManager; +import fr.xephi.authme.settings.properties.HooksSettings; +import fr.xephi.authme.settings.properties.RegistrationSettings; +import fr.xephi.authme.settings.properties.RestrictionSettings; +import fr.xephi.authme.util.InternetProtocolUtils; +import fr.xephi.authme.util.PlayerUtils; +import org.bukkit.GameMode; +import org.bukkit.Server; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.Locale; + +import static fr.xephi.authme.service.BukkitService.TICKS_PER_SECOND; +import static fr.xephi.authme.settings.properties.RestrictionSettings.PROTECT_INVENTORY_BEFORE_LOGIN; + +/** + * Asynchronous process for when a player joins. + */ +public class AsynchronousJoin implements AsynchronousProcess { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(AsynchronousJoin.class); + + @Inject + private Server server; + + @Inject + private Settings settings; + + @Inject + private DataSource database; + + @Inject + private CommonService service; + + @Inject + private LimboService limboService; + + @Inject + private PluginHookService pluginHookService; + + @Inject + private BukkitService bukkitService; + + @Inject + private AsynchronousLogin asynchronousLogin; + + @Inject + private CommandManager commandManager; + + @Inject + private ValidationService validationService; + + @Inject + private SessionService sessionService; + + @Inject + private BungeeSender bungeeSender; + + @Inject + private VelocitySender velocitySender; + + @Inject + private ProxySessionManager proxySessionManager; + + AsynchronousJoin() { + } + + /** + * Processes the given player that has just joined. + * + * @param player the player to process + */ + public void processJoin(Player player) { + String name = player.getName().toLowerCase(Locale.ROOT); + String ip = PlayerUtils.getPlayerIp(player); + + if (!validationService.fulfillsNameRestrictions(player)) { + handlePlayerWithUnmetNameRestriction(player, ip); + return; + } + + if (service.getProperty(RestrictionSettings.UNRESTRICTED_NAMES).contains(name)) { + return; + } + + if (service.getProperty(RestrictionSettings.FORCE_SURVIVAL_MODE) + && player.getGameMode() != GameMode.SURVIVAL + && !service.hasPermission(player, PlayerStatePermission.BYPASS_FORCE_SURVIVAL)) { + bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(() -> player.setGameMode(GameMode.SURVIVAL)); + } + + if (service.getProperty(HooksSettings.DISABLE_SOCIAL_SPY)) { + pluginHookService.setEssentialsSocialSpyStatus(player, false); + } + + if (!validatePlayerCountForIp(player, ip)) { + return; + } + + boolean isAuthAvailable = database.isAuthAvailable(name); + + if (isAuthAvailable) { + // Protect inventory + if (service.getProperty(PROTECT_INVENTORY_BEFORE_LOGIN)) { + ProtectInventoryEvent ev = bukkitService.createAndCallEvent( + isAsync -> new ProtectInventoryEvent(player, isAsync)); + if (ev.isCancelled()) { + player.updateInventory(); + logger.fine("ProtectInventoryEvent has been cancelled for " + player.getName() + "..."); + } + } + + // Session logic + if (sessionService.canResumeSession(player)) { + if (velocitySender.isEnabled()) { + bukkitService.scheduleSyncDelayedTask(() -> + velocitySender.sendAuthMeVelocityMessage(player, VMessageType.LOGIN), service.getProperty(HooksSettings.PROXY_SEND_DELAY)); + } + service.send(player, MessageKey.SESSION_RECONNECTION); + // Run commands + bukkitService.scheduleSyncTaskFromOptionallyAsyncTask( + () -> commandManager.runCommandsOnSessionLogin(player)); + bukkitService.runTaskOptionallyAsync(() -> asynchronousLogin.forceLogin(player)); + return; + } else if (proxySessionManager.shouldResumeSession(name)) { + service.send(player, MessageKey.SESSION_RECONNECTION); + // Run commands + bukkitService.scheduleSyncTaskFromOptionallyAsyncTask( + () -> commandManager.runCommandsOnSessionLogin(player)); + bukkitService.runTaskOptionallyAsync(() -> asynchronousLogin.forceLogin(player)); + logger.info("The user " + player.getName() + " has been automatically logged in, " + + "as present in autologin queue."); + return; + } + } else if (!service.getProperty(RegistrationSettings.FORCE)) { + + // Skip if registration is optional + + if (bungeeSender.isEnabled()) { + // As described at https://www.spigotmc.org/wiki/bukkit-bungee-plugin-messaging-channel/ + // "Keep in mind that you can't send plugin messages directly after a player joins." + bukkitService.scheduleSyncDelayedTask(() -> + bungeeSender.sendAuthMeBungeecordMessage(player, MessageType.LOGIN), settings.getProperty(HooksSettings.PROXY_SEND_DELAY)); + } + if (velocitySender.isEnabled()) { + bukkitService.scheduleSyncDelayedTask(() -> + velocitySender.sendAuthMeVelocityMessage(player, VMessageType.LOGIN), settings.getProperty(HooksSettings.PROXY_SEND_DELAY)); + } + return; + } + + processJoinSync(player, isAuthAvailable); + } + + private void handlePlayerWithUnmetNameRestriction(Player player, String ip) { + bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(() -> { + player.kickPlayer(service.retrieveSingleMessage(player, MessageKey.NOT_OWNER_ERROR)); + if (service.getProperty(RestrictionSettings.BAN_UNKNOWN_IP)) { + server.banIP(ip); + } + }); + } + + /** + * Performs various operations in sync mode for an unauthenticated player (such as blindness effect and + * limbo player creation). + * + * @param player the player to process + * @param isAuthAvailable true if the player is registered, false otherwise + */ + private void processJoinSync(Player player, boolean isAuthAvailable) { + int registrationTimeout = service.getProperty(RestrictionSettings.TIMEOUT) * TICKS_PER_SECOND; + + bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(() -> { + limboService.createLimboPlayer(player, isAuthAvailable); + + player.setNoDamageTicks(registrationTimeout); + if (pluginHookService.isEssentialsAvailable() && service.getProperty(HooksSettings.USE_ESSENTIALS_MOTD)) { + player.performCommand("motd"); + } + if (service.getProperty(RegistrationSettings.APPLY_BLIND_EFFECT)) { + // Allow infinite blindness effect + int blindTimeOut = (registrationTimeout <= 0) ? 99999 : registrationTimeout; + + // AuthMeReReloaded - Fix potion apply on Folia + bukkitService.runTaskIfFolia(player, () -> player.addPotionEffect(bukkitService.createBlindnessEffect(blindTimeOut))); + } + commandManager.runCommandsOnJoin(player); + }); + } + + /** + * Checks whether the maximum number of accounts has been exceeded for the given IP address (according to + * settings and permissions). If this is the case, the player is kicked. + * + * @param player the player to verify + * @param ip the ip address of the player + * + * @return true if the verification is OK (no infraction), false if player has been kicked + */ + private boolean validatePlayerCountForIp(Player player, String ip) { + if (service.getProperty(RestrictionSettings.MAX_JOIN_PER_IP) > 0 + && !service.hasPermission(player, PlayerStatePermission.ALLOW_MULTIPLE_ACCOUNTS) + && !InternetProtocolUtils.isLoopbackAddress(ip) + && countOnlinePlayersByIp(ip) > service.getProperty(RestrictionSettings.MAX_JOIN_PER_IP)) { + + bukkitService.scheduleSyncTaskFromOptionallyAsyncTask( + () -> player.kickPlayer(service.retrieveSingleMessage(player, MessageKey.SAME_IP_ONLINE))); + return false; + } + return true; + } + + private int countOnlinePlayersByIp(String ip) { + int count = 0; + for (Player player : bukkitService.getOnlinePlayers()) { + if (ip.equalsIgnoreCase(PlayerUtils.getPlayerIp(player))) { + ++count; + } + } + return count; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java new file mode 100644 index 0000000000..988124d9a4 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java @@ -0,0 +1,395 @@ +package fr.xephi.authme.process.login; + +import com.google.common.annotations.VisibleForTesting; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.TempbanManager; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.data.captcha.LoginCaptchaManager; +import fr.xephi.authme.data.limbo.LimboMessageType; +import fr.xephi.authme.data.limbo.LimboPlayerState; +import fr.xephi.authme.data.limbo.LimboService; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.events.AuthMeAsyncPreLoginEvent; +import fr.xephi.authme.events.FailedLoginEvent; +import fr.xephi.authme.mail.EmailService; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.permission.AdminPermission; +import fr.xephi.authme.permission.PlayerPermission; +import fr.xephi.authme.permission.PlayerStatePermission; +import fr.xephi.authme.process.AsynchronousProcess; +import fr.xephi.authme.process.SyncProcessManager; +import fr.xephi.authme.security.PasswordSecurity; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.SessionService; +import fr.xephi.authme.service.bungeecord.BungeeSender; +import fr.xephi.authme.service.bungeecord.MessageType; +import fr.xephi.authme.service.velocity.VelocitySender; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.DatabaseSettings; +import fr.xephi.authme.settings.properties.EmailSettings; +import fr.xephi.authme.settings.properties.HooksSettings; +import fr.xephi.authme.settings.properties.PluginSettings; +import fr.xephi.authme.settings.properties.RestrictionSettings; +import fr.xephi.authme.util.InternetProtocolUtils; +import fr.xephi.authme.util.PlayerUtils; +import fr.xephi.authme.util.Utils; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +/** + * Asynchronous task for a player login. + */ +public class AsynchronousLogin implements AsynchronousProcess { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(AsynchronousLogin.class); + + @Inject + private DataSource dataSource; + + @Inject + private CommonService service; + + @Inject + private PlayerCache playerCache; + + @Inject + private SyncProcessManager syncProcessManager; + + @Inject + private BukkitService bukkitService; + + @Inject + private PasswordSecurity passwordSecurity; + + @Inject + private LoginCaptchaManager loginCaptchaManager; + + @Inject + private TempbanManager tempbanManager; + + @Inject + private LimboService limboService; + + @Inject + private EmailService emailService; + + @Inject + private SessionService sessionService; + @Inject + private Settings settings; + @Inject + private BungeeSender bungeeSender; + @Inject + private VelocitySender velocitySender; + + AsynchronousLogin() { + } + + /** + * Processes a player's login request. + * + * @param player the player to log in + * @param password the password to log in with + */ + public void login(Player player, String password) { + PlayerAuth auth = getPlayerAuth(player); + if (auth != null && checkPlayerInfo(player, auth, password)) { + if (auth.getTotpKey() != null) { + limboService.resetMessageTask(player, LimboMessageType.TOTP_CODE); + limboService.getLimboPlayer(player.getName()).setState(LimboPlayerState.TOTP_REQUIRED); + // TODO #1141: Check if we should check limbo state before processing password + } else { + performLogin(player, auth); + } + } + } + + /** + * Logs a player in without requiring a password. + * + * @param player the player to log in + */ + public synchronized void forceLogin(Player player) { + PlayerAuth auth = getPlayerAuth(player); + if (auth != null) { + performLogin(player, auth); + } + } + + /** + * Logs a player in without requiring a password. + * + * @param player the player to log in + * @param quiet if true no messages will be sent + */ + public void forceLogin(Player player, boolean quiet) { + PlayerAuth auth = getPlayerAuth(player, quiet); + if (auth != null) { + performLogin(player, auth); + } + } + + /** + * Checks the precondition for authentication (like user known) and returns + * the player's {@link PlayerAuth} object. + * + * @param player the player to check + * @return the PlayerAuth object, or {@code null} if the player doesn't exist or may not log in + * (e.g. because he is already logged in) + */ + private PlayerAuth getPlayerAuth(Player player) { + return getPlayerAuth(player, false); + } + + /** + * Checks the precondition for authentication (like user known) and returns + * the player's {@link PlayerAuth} object. + * + * @param player the player to check + * @param quiet don't send messages + * @return the PlayerAuth object, or {@code null} if the player doesn't exist or may not log in + * (e.g. because he is already logged in) + */ + private PlayerAuth getPlayerAuth(Player player, boolean quiet) { + String name = player.getName().toLowerCase(Locale.ROOT); + if (playerCache.isAuthenticated(name)) { + if (!quiet) { + service.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR); + } + return null; + } + + PlayerAuth auth = dataSource.getAuth(name); + if (auth == null) { + if (!quiet) { + service.send(player, MessageKey.UNKNOWN_USER); + } + // Recreate the message task to immediately send the message again as response + limboService.resetMessageTask(player, LimboMessageType.REGISTER); + return null; + } + + if (!service.getProperty(DatabaseSettings.MYSQL_COL_GROUP).isEmpty() + && auth.getGroupId() == service.getProperty(HooksSettings.NON_ACTIVATED_USERS_GROUP)) { + if (!quiet) { + service.send(player, MessageKey.ACCOUNT_NOT_ACTIVATED); + } + return null; + } + + String ip = PlayerUtils.getPlayerIp(player); + if (hasReachedMaxLoggedInPlayersForIp(player, ip)) { + if (!quiet) { + service.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR); + } + return null; + } + + boolean isAsync = service.getProperty(PluginSettings.USE_ASYNC_TASKS); + AuthMeAsyncPreLoginEvent event = new AuthMeAsyncPreLoginEvent(player, isAsync); + bukkitService.callEvent(event); + if (!event.canLogin()) { + return null; + } + return auth; + } + + /** + * Checks various conditions for regular player login (not used in force login). + * + * @param player the player requesting to log in + * @param auth the PlayerAuth object of the player + * @param password the password supplied by the player + * @return true if the password matches and all other conditions are met (e.g. no captcha required), + * false otherwise + */ + private boolean checkPlayerInfo(Player player, PlayerAuth auth, String password) { + String name = player.getName().toLowerCase(Locale.ROOT); + + // If captcha is required send a message to the player and deny to log in + if (loginCaptchaManager.isCaptchaRequired(name)) { + service.send(player, MessageKey.USAGE_CAPTCHA, loginCaptchaManager.getCaptchaCodeOrGenerateNew(name)); + return false; + } + + String ip = PlayerUtils.getPlayerIp(player); + + // Increase the counts here before knowing the result of the login. + loginCaptchaManager.increaseLoginFailureCount(name); + tempbanManager.increaseCount(ip, name); + + if (passwordSecurity.comparePassword(password, auth.getPassword(), player.getName())) { + return true; + } else { + handleWrongPassword(player, auth, ip); + return false; + } + } + + /** + * Handles a login with wrong password. + * + * @param player the player who attempted to log in + * @param auth the PlayerAuth object of the player + * @param ip the ip address of the player + */ + private void handleWrongPassword(Player player, PlayerAuth auth, String ip) { + logger.fine(player.getName() + " used the wrong password"); + + bukkitService.createAndCallEvent(isAsync -> new FailedLoginEvent(player, isAsync)); + if (tempbanManager.shouldTempban(ip)) { + tempbanManager.tempbanPlayer(player); + } else if (service.getProperty(RestrictionSettings.KICK_ON_WRONG_PASSWORD)) { + bukkitService.scheduleSyncTaskFromOptionallyAsyncTask( + () -> player.kickPlayer(service.retrieveSingleMessage(player, MessageKey.WRONG_PASSWORD))); + } else { + service.send(player, MessageKey.WRONG_PASSWORD); + + // If the authentication fails check if Captcha is required and send a message to the player + if (loginCaptchaManager.isCaptchaRequired(player.getName())) { + limboService.muteMessageTask(player); + service.send(player, MessageKey.USAGE_CAPTCHA, + loginCaptchaManager.getCaptchaCodeOrGenerateNew(player.getName())); + } else if (emailService.hasAllInformation() && !Utils.isEmailEmpty(auth.getEmail())) { + service.send(player, MessageKey.FORGOT_PASSWORD_MESSAGE); + } + } + } + + /** + * Sets the player to the logged in state. + * + * @param player the player to log in + * @param auth the associated PlayerAuth object + */ + public void performLogin(Player player, PlayerAuth auth) { + if (player.isOnline()) { + boolean isFirstLogin = (auth.getLastLogin() == null); + + // Update auth to reflect this new login + String ip = PlayerUtils.getPlayerIp(player); + auth.setRealName(player.getName()); + auth.setLastLogin(System.currentTimeMillis()); + auth.setLastIp(ip); + dataSource.updateSession(auth); + + // TODO: send an update when a messaging service will be implemented (SESSION) + + // Successful login, so reset the captcha & temp ban count + String name = player.getName(); + loginCaptchaManager.resetLoginFailureCount(name); + tempbanManager.resetCount(ip, name); + player.setNoDamageTicks(0); + + service.send(player, MessageKey.LOGIN_SUCCESS); + + // Other auths + List auths = dataSource.getAllAuthsByIp(auth.getLastIp()); + displayOtherAccounts(auths, player); + + String email = auth.getEmail(); + if (service.getProperty(EmailSettings.RECALL_PLAYERS) && Utils.isEmailEmpty(email)) { + service.send(player, MessageKey.ADD_EMAIL_MESSAGE); + } + + logger.fine(player.getName() + " logged in " + ip); + + // makes player loggedin + playerCache.updatePlayer(auth); + dataSource.setLogged(name); + sessionService.grantSession(name); + + if (bungeeSender.isEnabled()) { + // As described at https://www.spigotmc.org/wiki/bukkit-bungee-plugin-messaging-channel/ + // "Keep in mind that you can't send plugin messages directly after a player joins." + bukkitService.scheduleSyncDelayedTask(() -> + bungeeSender.sendAuthMeBungeecordMessage(player, MessageType.LOGIN), settings.getProperty(HooksSettings.PROXY_SEND_DELAY)); + } + + // As the scheduling executes the Task most likely after the current + // task, we schedule it in the end + // so that we can be sure, and have not to care if it might be + // processed in other order. + syncProcessManager.processSyncPlayerLogin(player, isFirstLogin, auths); + } else { + logger.warning("Player '" + player.getName() + "' wasn't online during login process, aborted..."); + } + } + + /** + * Sends info about the other accounts owned by the given player to the configured users. + * + * @param auths the names of the accounts also owned by the player + * @param player the player + */ + private void displayOtherAccounts(List auths, Player player) { + if (!service.getProperty(RestrictionSettings.DISPLAY_OTHER_ACCOUNTS) || auths.size() <= 1) { + return; + } + + List formattedNames = new ArrayList<>(auths.size()); + for (String currentName : auths) { + Player currentPlayer = bukkitService.getPlayerExact(currentName); + if (currentPlayer != null && currentPlayer.isOnline()) { + formattedNames.add(ChatColor.GREEN + currentPlayer.getName() + ChatColor.GRAY); + } else { + formattedNames.add(currentName); + } + } + + String message = ChatColor.GRAY + String.join(", ", formattedNames) + "."; + + logger.fine("The user " + player.getName() + " has " + auths.size() + " accounts:"); + logger.fine(message); + + for (Player onlinePlayer : bukkitService.getOnlinePlayers()) { + if (onlinePlayer.getName().equalsIgnoreCase(player.getName()) + && service.hasPermission(onlinePlayer, PlayerPermission.SEE_OWN_ACCOUNTS)) { + service.send(onlinePlayer, MessageKey.ACCOUNTS_OWNED_SELF, Integer.toString(auths.size())); + onlinePlayer.sendMessage(message); + } else if (service.hasPermission(onlinePlayer, AdminPermission.SEE_OTHER_ACCOUNTS)) { + service.send(onlinePlayer, MessageKey.ACCOUNTS_OWNED_OTHER, + player.getName(), Integer.toString(auths.size())); + onlinePlayer.sendMessage(message); + } + } + } + + /** + * Checks whether the maximum threshold of logged in player per IP address has been reached + * for the given player and IP address. + * + * @param player the player to process + * @param ip the associated ip address + * @return true if the threshold has been reached, false otherwise + */ + @VisibleForTesting + boolean hasReachedMaxLoggedInPlayersForIp(Player player, String ip) { + // Do not perform the check if player has multiple accounts permission or if IP is localhost + if (service.getProperty(RestrictionSettings.MAX_LOGIN_PER_IP) <= 0 + || service.hasPermission(player, PlayerStatePermission.ALLOW_MULTIPLE_ACCOUNTS) + || InternetProtocolUtils.isLoopbackAddress(ip)) { + return false; + } + + // Count logged in players with same IP address + String name = player.getName(); + int count = 0; + for (Player onlinePlayer : bukkitService.getOnlinePlayers()) { + if (ip.equalsIgnoreCase(PlayerUtils.getPlayerIp(onlinePlayer)) + && !onlinePlayer.getName().equals(name) + && dataSource.isLogged(onlinePlayer.getName().toLowerCase(Locale.ROOT))) { + ++count; + } + } + return count >= service.getProperty(RestrictionSettings.MAX_LOGIN_PER_IP); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/login/ProcessSyncPlayerLogin.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/login/ProcessSyncPlayerLogin.java new file mode 100644 index 0000000000..ac022405d2 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/login/ProcessSyncPlayerLogin.java @@ -0,0 +1,132 @@ +package fr.xephi.authme.process.login; + +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.data.limbo.LimboPlayer; +import fr.xephi.authme.data.limbo.LimboService; +import fr.xephi.authme.events.LoginEvent; +import fr.xephi.authme.events.RestoreInventoryEvent; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.permission.PlayerStatePermission; +import fr.xephi.authme.process.SynchronousProcess; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.JoinMessageService; +import fr.xephi.authme.service.TeleportationService; +import fr.xephi.authme.service.bungeecord.BungeeSender; +import fr.xephi.authme.service.velocity.VMessageType; +import fr.xephi.authme.service.velocity.VelocitySender; +import fr.xephi.authme.settings.commandconfig.CommandManager; +import fr.xephi.authme.settings.properties.HooksSettings; +import fr.xephi.authme.settings.properties.RegistrationSettings; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffectType; + +import javax.inject.Inject; +import java.util.List; +import java.util.Locale; + +import static fr.xephi.authme.settings.properties.RestrictionSettings.PROTECT_INVENTORY_BEFORE_LOGIN; + +public class ProcessSyncPlayerLogin implements SynchronousProcess { + + @Inject + private BungeeSender bungeeSender; + + @Inject + private VelocitySender velocitySender; + + @Inject + private LimboService limboService; + + @Inject + private BukkitService bukkitService; + + @Inject + private TeleportationService teleportationService; + + @Inject + private PlayerCache playerCache; + + @Inject + private CommandManager commandManager; + + @Inject + private CommonService commonService; + + @Inject + private JoinMessageService joinMessageService; + + @Inject + private PermissionsManager permissionsManager; + + ProcessSyncPlayerLogin() { + } + + private void restoreInventory(Player player) { + RestoreInventoryEvent event = new RestoreInventoryEvent(player); + bukkitService.callEvent(event); + if (!event.isCancelled()) { + player.updateInventory(); + } + } + + /** + * Performs operations in sync mode for a player that has just logged in. + * + * @param player the player that was logged in + * @param isFirstLogin true if this is the first time the player logged in + * @param authsWithSameIp registered names with the same IP address as the player's + */ + public void processPlayerLogin(Player player, boolean isFirstLogin, List authsWithSameIp) { + final String name = player.getName().toLowerCase(Locale.ROOT); + final LimboPlayer limbo = limboService.getLimboPlayer(name); + + // Limbo contains the State of the Player before /login + if (limbo != null) { + limboService.restoreData(player); + } + + if (commonService.getProperty(PROTECT_INVENTORY_BEFORE_LOGIN)) { + restoreInventory(player); + } + + final PlayerAuth auth = playerCache.getAuth(name); + + // AuthMeReReloaded start - Fix #57 + if (isFirstLogin) { + auth.setQuitLocation(player.getLocation()); + } + // AuthMeReReloaded end - Fix #57 + + teleportationService.teleportOnLogin(player, auth, limbo); + + // We can now display the join message (if delayed) + joinMessageService.sendMessage(name); + + if (commonService.getProperty(RegistrationSettings.APPLY_BLIND_EFFECT)) { + player.removePotionEffect(PotionEffectType.BLINDNESS); + } + + // AuthMeVelocity start - send on player login + if (velocitySender.isEnabled()) { + bukkitService.scheduleSyncDelayedTask(() -> + velocitySender.sendAuthMeVelocityMessage(player, VMessageType.LOGIN), commonService.getProperty(HooksSettings.PROXY_SEND_DELAY)); + } + // AuthMeVelocity end + + // The Login event now fires (as intended) after everything is processed + bukkitService.callEvent(new LoginEvent(player)); + + // Login is now finished; we can force all commands + if (isFirstLogin) { + commandManager.runCommandsOnFirstLogin(player, authsWithSameIp); + } + commandManager.runCommandsOnLogin(player, authsWithSameIp); + + if (!permissionsManager.hasPermission(player, PlayerStatePermission.BYPASS_BUNGEE_SEND)) { + // Send Bungee stuff. The service will check if it is enabled or not. + bungeeSender.connectPlayerOnLogin(player); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/logout/AsynchronousLogout.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/logout/AsynchronousLogout.java new file mode 100644 index 0000000000..4b6af1e5a8 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/logout/AsynchronousLogout.java @@ -0,0 +1,81 @@ +package fr.xephi.authme.process.logout; + +import fr.xephi.authme.data.VerificationCodeManager; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.process.AsynchronousProcess; +import fr.xephi.authme.process.SyncProcessManager; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.SessionService; +import fr.xephi.authme.service.bungeecord.BungeeSender; +import fr.xephi.authme.service.bungeecord.MessageType; +import fr.xephi.authme.service.velocity.VMessageType; +import fr.xephi.authme.service.velocity.VelocitySender; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.Locale; + +/** + * Async task when a player wants to log out. + */ +public class AsynchronousLogout implements AsynchronousProcess { + + @Inject + private DataSource database; + + @Inject + private CommonService service; + + @Inject + private PlayerCache playerCache; + + @Inject + private VerificationCodeManager codeManager; + + @Inject + private SyncProcessManager syncProcessManager; + + @Inject + private SessionService sessionService; + + @Inject + private BungeeSender bungeeSender; + @Inject + private VelocitySender velocitySender; + + AsynchronousLogout() { + } + + /** + * Handles a player's request to log out. + * + * @param player the player wanting to log out + */ + public void logout(Player player) { + String name = player.getName().toLowerCase(Locale.ROOT); + if (!playerCache.isAuthenticated(name)) { + service.send(player, MessageKey.NOT_LOGGED_IN); + return; + } + + PlayerAuth auth = playerCache.getAuth(name); + database.updateSession(auth); + // TODO: send an update when a messaging service will be implemented (SESSION) + //if (service.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) { + auth.setQuitLocation(player.getLocation()); + database.updateQuitLoc(auth); + // TODO: send an update when a messaging service will be implemented (QUITLOC) + //} AuthMeReReloaded - Always save quit location + + playerCache.removePlayer(name); + codeManager.unverify(name); + database.setUnlogged(name); + sessionService.revokeSession(name); + bungeeSender.sendAuthMeBungeecordMessage(player, MessageType.LOGOUT); + velocitySender.sendAuthMeVelocityMessage(player, VMessageType.LOGOUT); + syncProcessManager.processSyncPlayerLogout(player); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/logout/ProcessSyncPlayerLogout.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/logout/ProcessSyncPlayerLogout.java new file mode 100644 index 0000000000..96865e21c3 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/logout/ProcessSyncPlayerLogout.java @@ -0,0 +1,83 @@ +package fr.xephi.authme.process.logout; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.limbo.LimboService; +import fr.xephi.authme.events.LogoutEvent; +import fr.xephi.authme.listener.protocollib.ProtocolLibService; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.process.SynchronousProcess; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.TeleportationService; +import fr.xephi.authme.settings.commandconfig.CommandManager; +import fr.xephi.authme.settings.properties.RegistrationSettings; +import fr.xephi.authme.settings.properties.RestrictionSettings; +import org.bukkit.entity.Player; + +import javax.inject.Inject; + +import static fr.xephi.authme.service.BukkitService.TICKS_PER_SECOND; + + +public class ProcessSyncPlayerLogout implements SynchronousProcess { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(ProcessSyncPlayerLogout.class); + + @Inject + private CommonService service; + + @Inject + private BukkitService bukkitService; + + @Inject + private ProtocolLibService protocolLibService; + + @Inject + private LimboService limboService; + + @Inject + private TeleportationService teleportationService; + + @Inject + private CommandManager commandManager; + + ProcessSyncPlayerLogout() { + } + + /** + * Processes a player which has been logged out. + * + * @param player the player logging out + */ + public void processSyncLogout(Player player) { + if (service.getProperty(RestrictionSettings.PROTECT_INVENTORY_BEFORE_LOGIN)) { + protocolLibService.sendBlankInventoryPacket(player); + } + + applyLogoutEffect(player); + commandManager.runCommandsOnLogout(player); + + // Player is now logout... Time to fire event ! + bukkitService.callEvent(new LogoutEvent(player)); + + service.send(player, MessageKey.LOGOUT_SUCCESS); + logger.info(player.getName() + " logged out"); + } + + private void applyLogoutEffect(Player player) { + // dismount player + player.leaveVehicle(); + teleportationService.teleportOnJoin(player); + + // Apply Blindness effect + if (service.getProperty(RegistrationSettings.APPLY_BLIND_EFFECT)) { + int timeout = service.getProperty(RestrictionSettings.TIMEOUT) * TICKS_PER_SECOND; + player.addPotionEffect(bukkitService.createBlindnessEffect(timeout)); + } + + // Set player's data to unauthenticated + limboService.createLimboPlayer(player, true); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java new file mode 100644 index 0000000000..31bb707877 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java @@ -0,0 +1,113 @@ +package fr.xephi.authme.process.quit; + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.data.VerificationCodeManager; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.process.AsynchronousProcess; +import fr.xephi.authme.process.SyncProcessManager; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.SessionService; +import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.settings.SpawnLoader; +import fr.xephi.authme.settings.properties.PluginSettings; +import fr.xephi.authme.util.PlayerUtils; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.Locale; + +/** + * Async process called when a player quits the server. + */ +public class AsynchronousQuit implements AsynchronousProcess { + + @Inject + private AuthMe plugin; + + @Inject + private DataSource database; + + @Inject + private CommonService service; + + @Inject + private PlayerCache playerCache; + + @Inject + private SyncProcessManager syncProcessManager; + + @Inject + private SpawnLoader spawnLoader; + + @Inject + private ValidationService validationService; + + @Inject + private VerificationCodeManager codeManager; + + @Inject + private SessionService sessionService; + + AsynchronousQuit() { + } + + /** + * Processes that the given player has quit the server. + * + * @param player the player who left + */ + public void processQuit(Player player) { + if (player == null || validationService.isUnrestricted(player.getName())) { + return; + } + String name = player.getName().toLowerCase(Locale.ROOT); + boolean wasLoggedIn = playerCache.isAuthenticated(name); + + if (wasLoggedIn) { + //if (service.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) { + // AuthMeReReloaded - Always save quit location on quit + Location loc = spawnLoader.getPlayerLocationOrSpawn(player); + PlayerAuth authLoc = PlayerAuth.builder() + .name(name).location(loc) + .realName(player.getName()).build(); + database.updateQuitLoc(authLoc); + // AuthMeReReloaded - Fix AuthMe#2769 -1 + //} + + + String ip = PlayerUtils.getPlayerIp(player); + PlayerAuth auth = PlayerAuth.builder() + .name(name) + .realName(player.getName()) + .lastIp(ip) + .lastLogin(System.currentTimeMillis()) + .build(); + database.updateSession(auth); + + // TODO: send an update when a messaging service will be implemented (QUITLOC) + } + + //always unauthenticate the player - use session only for auto logins on the same ip + playerCache.removePlayer(name); + codeManager.unverify(name); + + //always update the database when the player quit the game (if sessions are disabled) + if (wasLoggedIn) { + database.setUnlogged(name); + if (!service.getProperty(PluginSettings.SESSIONS_ENABLED)) { + sessionService.revokeSession(name); + } + } + + if (plugin.isEnabled()) { + syncProcessManager.processSyncPlayerQuit(player, wasLoggedIn); + } + + // remove player from cache + database.invalidateCache(name); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/quit/ProcessSyncPlayerQuit.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/quit/ProcessSyncPlayerQuit.java new file mode 100644 index 0000000000..42048ef1ed --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/quit/ProcessSyncPlayerQuit.java @@ -0,0 +1,37 @@ +package fr.xephi.authme.process.quit; + +import com.github.Anon8281.universalScheduler.UniversalScheduler; +import fr.xephi.authme.data.limbo.LimboService; +import fr.xephi.authme.process.SynchronousProcess; +import fr.xephi.authme.settings.commandconfig.CommandManager; +import org.bukkit.entity.Player; + +import javax.inject.Inject; + + +public class ProcessSyncPlayerQuit implements SynchronousProcess { + + @Inject + private LimboService limboService; + + @Inject + private CommandManager commandManager; + + /** + * Processes a player having quit. + * + * @param player the player that left + * @param wasLoggedIn true if the player was logged in when leaving, false otherwise + */ + public void processSyncQuit(Player player, boolean wasLoggedIn) { + if (wasLoggedIn) { + commandManager.runCommandsOnLogout(player); + } else { + limboService.restoreData(player); + if (!UniversalScheduler.isFolia) { // AuthMeReReloaded - Fix #146 (Very stupid solution, but works) + player.saveData(); // #1238: Speed is sometimes not restored properly + } + } + player.leaveVehicle(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/AsyncRegister.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/AsyncRegister.java new file mode 100644 index 0000000000..a13bcf3c53 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/AsyncRegister.java @@ -0,0 +1,131 @@ +package fr.xephi.authme.process.register; + +import ch.jalu.injector.factory.SingletonStore; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.events.AuthMeAsyncPreRegisterEvent; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.process.AsynchronousProcess; +import fr.xephi.authme.process.register.executors.RegistrationExecutor; +import fr.xephi.authme.process.register.executors.RegistrationMethod; +import fr.xephi.authme.process.register.executors.RegistrationParameters; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.settings.properties.RegistrationSettings; +import fr.xephi.authme.settings.properties.RestrictionSettings; +import fr.xephi.authme.util.InternetProtocolUtils; +import fr.xephi.authme.util.PlayerUtils; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.List; +import java.util.Locale; + +import static fr.xephi.authme.permission.PlayerStatePermission.ALLOW_MULTIPLE_ACCOUNTS; + +/** + * Asynchronous processing of a request for registration. + */ +public class AsyncRegister implements AsynchronousProcess { + + @Inject + private DataSource database; + @Inject + private PlayerCache playerCache; + @Inject + private BukkitService bukkitService; + @Inject + private CommonService service; + @Inject + private SingletonStore registrationExecutorFactory; + + AsyncRegister() { + } + + /** + * Performs the registration process for the given player. + * + * @param variant the registration method + * @param parameters the parameters + * @param

parameters type + */ + public synchronized

void register(RegistrationMethod

variant, P parameters) { + if (preRegisterCheck(variant, parameters.getPlayer())) { + RegistrationExecutor

executor = registrationExecutorFactory.getSingleton(variant.getExecutorClass()); + if (executor.isRegistrationAdmitted(parameters)) { + executeRegistration(parameters, executor); + } + } + } + + /** + * Checks if the player is able to register, in that case the {@link AuthMeAsyncPreRegisterEvent} is invoked. + * + * @param variant the registration type variant. + * @param player the player which is trying to register. + * + * @return true if the checks are successful and the event hasn't marked the action as denied, false otherwise. + */ + private boolean preRegisterCheck(RegistrationMethod variant, Player player) { + String name = player.getName().toLowerCase(Locale.ROOT); + if (playerCache.isAuthenticated(name)) { + service.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR); + return false; + } else if (!service.getProperty(RegistrationSettings.IS_ENABLED)) { + service.send(player, MessageKey.REGISTRATION_DISABLED); + return false; + } else if (database.isAuthAvailable(name)) { + service.send(player, MessageKey.NAME_ALREADY_REGISTERED); + return false; + } + + AuthMeAsyncPreRegisterEvent event = bukkitService.createAndCallEvent( + isAsync -> new AuthMeAsyncPreRegisterEvent(player, isAsync)); + if (!event.canRegister()) { + return false; + } + + return variant == RegistrationMethod.API_REGISTRATION || isPlayerIpAllowedToRegister(player); + } + + /** + * Executes the registration. + * + * @param parameters the registration parameters + * @param executor the executor to perform the registration process with + * @param

registration params type + */ + private

+ void executeRegistration(P parameters, RegistrationExecutor

executor) { + PlayerAuth auth = executor.buildPlayerAuth(parameters); + if (database.saveAuth(auth)) { + executor.executePostPersistAction(parameters); + } else { + service.send(parameters.getPlayer(), MessageKey.ERROR); + } + } + + /** + * Checks whether the registration threshold has been exceeded for the given player's IP address. + * + * @param player the player to check + * + * @return true if registration may take place, false otherwise (IP check failed) + */ + private boolean isPlayerIpAllowedToRegister(Player player) { + int maxRegPerIp = service.getProperty(RestrictionSettings.MAX_REGISTRATION_PER_IP); + String ip = PlayerUtils.getPlayerIp(player); + if (maxRegPerIp > 0 + && !InternetProtocolUtils.isLoopbackAddress(ip) + && !service.hasPermission(player, ALLOW_MULTIPLE_ACCOUNTS)) { + List otherAccounts = database.getAllAuthsByIp(ip); + if (otherAccounts.size() >= maxRegPerIp) { + service.send(player, MessageKey.MAX_REGISTER_EXCEEDED, Integer.toString(maxRegPerIp), + Integer.toString(otherAccounts.size()), String.join(", ", otherAccounts)); + return false; + } + } + return true; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/ProcessSyncEmailRegister.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/ProcessSyncEmailRegister.java new file mode 100644 index 0000000000..0fe19acf37 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/ProcessSyncEmailRegister.java @@ -0,0 +1,52 @@ +package fr.xephi.authme.process.register; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.limbo.LimboService; +import fr.xephi.authme.events.RegisterEvent; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.process.SynchronousProcess; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.velocity.VMessageType; +import fr.xephi.authme.service.velocity.VelocitySender; +import fr.xephi.authme.util.PlayerUtils; +import org.bukkit.entity.Player; + +import javax.inject.Inject; + +/** + * Performs synchronous tasks after a successful {@link RegistrationType#EMAIL email registration}. + */ +public class ProcessSyncEmailRegister implements SynchronousProcess { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(ProcessSyncEmailRegister.class); + + @Inject + private BukkitService bukkitService; + + @Inject + private CommonService service; + + @Inject + private LimboService limboService; + @Inject + private VelocitySender velocitySender; + + ProcessSyncEmailRegister() { + } + + /** + * Performs sync tasks for a player which has just registered by email. + * + * @param player the recently registered player + */ + public void processEmailRegister(Player player) { + service.send(player, MessageKey.ACCOUNT_NOT_ACTIVATED); + limboService.replaceTasksAfterRegistration(player); + velocitySender.sendAuthMeVelocityMessage(player, VMessageType.REGISTER); + bukkitService.callEvent(new RegisterEvent(player)); + logger.fine(player.getName() + " registered " + PlayerUtils.getPlayerIp(player)); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/ProcessSyncPasswordRegister.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/ProcessSyncPasswordRegister.java new file mode 100644 index 0000000000..f68ba015dd --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/ProcessSyncPasswordRegister.java @@ -0,0 +1,96 @@ +package fr.xephi.authme.process.register; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.limbo.LimboService; +import fr.xephi.authme.events.RegisterEvent; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.process.SynchronousProcess; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.bungeecord.BungeeSender; +import fr.xephi.authme.service.velocity.VMessageType; +import fr.xephi.authme.service.velocity.VelocitySender; +import fr.xephi.authme.settings.commandconfig.CommandManager; +import fr.xephi.authme.settings.properties.EmailSettings; +import fr.xephi.authme.settings.properties.RegistrationSettings; +import fr.xephi.authme.util.PlayerUtils; +import org.bukkit.entity.Player; + +import javax.inject.Inject; + +/** + * Performs synchronous tasks after a successful {@link RegistrationType#PASSWORD password registration}. + */ +public class ProcessSyncPasswordRegister implements SynchronousProcess { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(ProcessSyncPasswordRegister.class); + + @Inject + private BungeeSender bungeeSender; + + @Inject + private VelocitySender velocitySender; + + @Inject + private CommonService service; + + @Inject + private LimboService limboService; + + @Inject + private CommandManager commandManager; + + @Inject + private BukkitService bukkitService; + + ProcessSyncPasswordRegister() { + } + + /** + * Request that the player log in. + * + * @param player the player + */ + private void requestLogin(Player player) { + limboService.replaceTasksAfterRegistration(player); + + if (player.isInsideVehicle() && player.getVehicle() != null) { + player.getVehicle().eject(); + } + } + + /** + * Processes a player having registered with a password. + * + * @param player the newly registered player + */ + public void processPasswordRegister(Player player) { + service.send(player, MessageKey.REGISTER_SUCCESS); + + if (!service.getProperty(EmailSettings.MAIL_ACCOUNT).isEmpty()) { + service.send(player, MessageKey.ADD_EMAIL_MESSAGE); + } + velocitySender.sendAuthMeVelocityMessage(player, VMessageType.REGISTER); + bukkitService.callEvent(new RegisterEvent(player)); + logger.fine(player.getName() + " registered " + PlayerUtils.getPlayerIp(player)); + + // Kick Player after Registration is enabled, kick the player + if (service.getProperty(RegistrationSettings.FORCE_KICK_AFTER_REGISTER)) { + player.kickPlayer(service.retrieveSingleMessage(player, MessageKey.REGISTER_SUCCESS)); + return; + } + + // Register is now finished; we can force all commands + commandManager.runCommandsOnRegister(player); + + // Request login after registration + if (service.getProperty(RegistrationSettings.FORCE_LOGIN_AFTER_REGISTER)) { + requestLogin(player); + return; + } + + // Send Bungee stuff. The service will check if it is enabled or not. + bungeeSender.connectPlayerOnLogin(player); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/RegisterSecondaryArgument.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/RegisterSecondaryArgument.java new file mode 100644 index 0000000000..4ac4f2d560 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/RegisterSecondaryArgument.java @@ -0,0 +1,20 @@ +package fr.xephi.authme.process.register; + +/** + * Type of the second argument of the {@code /register} command. + */ +public enum RegisterSecondaryArgument { + + /** No second argument. */ + NONE, + + /** Confirmation of the first argument. */ + CONFIRMATION, + + /** For password registration, mandatory secondary argument is email. */ + EMAIL_MANDATORY, + + /** For password registration, optional secondary argument is email. */ + EMAIL_OPTIONAL + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/RegistrationType.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/RegistrationType.java new file mode 100644 index 0000000000..7b03b1c244 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/RegistrationType.java @@ -0,0 +1,19 @@ +package fr.xephi.authme.process.register; + +/** + * Registration type. + */ +public enum RegistrationType { + + /** + * Password registration: account is registered with a password supplied by the player. + */ + PASSWORD, + + /** + * Email registration: account is registered with an email supplied by the player. A password + * is generated and sent to the email address. + */ + EMAIL + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/AbstractPasswordRegisterExecutor.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/AbstractPasswordRegisterExecutor.java new file mode 100644 index 0000000000..179aa59df8 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/AbstractPasswordRegisterExecutor.java @@ -0,0 +1,99 @@ +package fr.xephi.authme.process.register.executors; + +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.process.SyncProcessManager; +import fr.xephi.authme.process.login.AsynchronousLogin; +import fr.xephi.authme.security.PasswordSecurity; +import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.settings.properties.PluginSettings; +import fr.xephi.authme.settings.properties.RegistrationSettings; +import org.bukkit.entity.Player; + +import javax.inject.Inject; + +/** + * Registration executor for registration methods where the password + * is supplied by the user. + * + * @param

the parameters type + */ +abstract class AbstractPasswordRegisterExecutor

+ implements RegistrationExecutor

{ + + /** + * Number of ticks to wait before running the login action when it is run synchronously. + * A small delay is necessary or the database won't return the newly saved PlayerAuth object + * and the login process thinks the user is not registered. + */ + private static final int SYNC_LOGIN_DELAY = 5; + + @Inject + private ValidationService validationService; + + @Inject + private CommonService commonService; + + @Inject + private PasswordSecurity passwordSecurity; + + @Inject + private BukkitService bukkitService; + + @Inject + private SyncProcessManager syncProcessManager; + + @Inject + private AsynchronousLogin asynchronousLogin; + + @Override + public boolean isRegistrationAdmitted(P params) { + ValidationService.ValidationResult passwordValidation = validationService.validatePassword( + params.getPassword(), params.getPlayer().getName()); + if (passwordValidation.hasError()) { + commonService.send(params.getPlayer(), passwordValidation.getMessageKey(), passwordValidation.getArgs()); + return false; + } + return true; + } + + @Override + public PlayerAuth buildPlayerAuth(P params) { + HashedPassword hashedPassword = passwordSecurity.computeHash(params.getPassword(), params.getPlayerName()); + params.setHashedPassword(hashedPassword); + return createPlayerAuthObject(params); + } + + /** + * Creates the PlayerAuth object to store into the database, based on the registration parameters. + * + * @param params the parameters + * @return the PlayerAuth representing the new account to register + */ + protected abstract PlayerAuth createPlayerAuthObject(P params); + + /** + * Returns whether the player should be automatically logged in after registration. + * + * @param params the registration parameters + * @return true if the player should be logged in, false otherwise + */ + protected boolean performLoginAfterRegister(P params) { + return !commonService.getProperty(RegistrationSettings.FORCE_LOGIN_AFTER_REGISTER); + } + + @Override + public void executePostPersistAction(P params) { + final Player player = params.getPlayer(); + if (performLoginAfterRegister(params)) { + if (commonService.getProperty(PluginSettings.USE_ASYNC_TASKS)) { + bukkitService.runTaskAsynchronously(() -> asynchronousLogin.forceLogin(player)); + } else { + bukkitService.scheduleSyncDelayedTask(() -> asynchronousLogin.forceLogin(player), SYNC_LOGIN_DELAY); + } + } + syncProcessManager.processSyncPasswordRegister(player); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/AbstractPasswordRegisterParams.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/AbstractPasswordRegisterParams.java new file mode 100644 index 0000000000..0c7a1d5154 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/AbstractPasswordRegisterParams.java @@ -0,0 +1,48 @@ +package fr.xephi.authme.process.register.executors; + +import fr.xephi.authme.security.crypts.HashedPassword; +import org.bukkit.entity.Player; + +/** + * Common params type for implementors of {@link AbstractPasswordRegisterExecutor}. + * Password must be supplied on creation and cannot be changed later on. The {@link HashedPassword} + * is stored on the params object for later use. + */ +public abstract class AbstractPasswordRegisterParams extends RegistrationParameters { + + private final String password; + private HashedPassword hashedPassword; + + /** + * Constructor. + * + * @param player the player to register + * @param password the password to use + */ + public AbstractPasswordRegisterParams(Player player, String password) { + super(player); + this.password = password; + } + + /** + * Constructor with no defined password. Use for registration methods which + * have no implicit password (like two factor authentication). + * + * @param player the player to register + */ + public AbstractPasswordRegisterParams(Player player) { + this(player, null); + } + + public String getPassword() { + return password; + } + + void setHashedPassword(HashedPassword hashedPassword) { + this.hashedPassword = hashedPassword; + } + + HashedPassword getHashedPassword() { + return hashedPassword; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/ApiPasswordRegisterExecutor.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/ApiPasswordRegisterExecutor.java new file mode 100644 index 0000000000..6005c8e41e --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/ApiPasswordRegisterExecutor.java @@ -0,0 +1,20 @@ +package fr.xephi.authme.process.register.executors; + +import fr.xephi.authme.data.auth.PlayerAuth; + +/** + * Executor for password registration via API call. + */ +class ApiPasswordRegisterExecutor extends AbstractPasswordRegisterExecutor { + + @Override + protected PlayerAuth createPlayerAuthObject(ApiPasswordRegisterParams params) { + return PlayerAuthBuilderHelper + .createPlayerAuth(params.getPlayer(), params.getHashedPassword(), null); + } + + @Override + protected boolean performLoginAfterRegister(ApiPasswordRegisterParams params) { + return params.getLoginAfterRegister(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/ApiPasswordRegisterParams.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/ApiPasswordRegisterParams.java new file mode 100644 index 0000000000..357d32c220 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/ApiPasswordRegisterParams.java @@ -0,0 +1,35 @@ +package fr.xephi.authme.process.register.executors; + +import org.bukkit.entity.Player; + +/** + * Parameters for {@link ApiPasswordRegisterExecutor}. + */ +public class ApiPasswordRegisterParams extends PasswordRegisterParams { + + private final boolean loginAfterRegister; + + protected ApiPasswordRegisterParams(Player player, String password, boolean loginAfterRegister) { + super(player, password, null); + this.loginAfterRegister = loginAfterRegister; + } + + /** + * Creates a parameters object. + * + * @param player the player to register + * @param password the password to register with + * @param loginAfterRegister whether the player should be logged in after registration + * @return params object with the given data + */ + public static ApiPasswordRegisterParams of(Player player, String password, boolean loginAfterRegister) { + return new ApiPasswordRegisterParams(player, password, loginAfterRegister); + } + + /** + * @return true if the player should be logged in after being registered, false otherwise + */ + public boolean getLoginAfterRegister() { + return loginAfterRegister; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/EmailRegisterExecutor.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/EmailRegisterExecutor.java new file mode 100644 index 0000000000..2224c23ced --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/EmailRegisterExecutor.java @@ -0,0 +1,81 @@ +package fr.xephi.authme.process.register.executors; + +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.mail.EmailService; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.process.SyncProcessManager; +import fr.xephi.authme.security.PasswordSecurity; +import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.settings.properties.EmailSettings; +import fr.xephi.authme.util.PlayerUtils; +import fr.xephi.authme.util.RandomStringUtils; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.text.SimpleDateFormat; +import java.util.Date; + +import static fr.xephi.authme.permission.PlayerStatePermission.ALLOW_MULTIPLE_ACCOUNTS; +import static fr.xephi.authme.process.register.executors.PlayerAuthBuilderHelper.createPlayerAuth; +import static fr.xephi.authme.settings.properties.EmailSettings.RECOVERY_PASSWORD_LENGTH; + +/** + * Executor for email registration: the player only provides his email address, + * to which a generated password is sent. + */ +class EmailRegisterExecutor implements RegistrationExecutor { + + @Inject + private DataSource dataSource; + + @Inject + private CommonService commonService; + + @Inject + private EmailService emailService; + + @Inject + private SyncProcessManager syncProcessManager; + + @Inject + private PasswordSecurity passwordSecurity; + + @Override + public boolean isRegistrationAdmitted(EmailRegisterParams params) { + final int maxRegPerEmail = commonService.getProperty(EmailSettings.MAX_REG_PER_EMAIL); + if (maxRegPerEmail > 0 && !commonService.hasPermission(params.getPlayer(), ALLOW_MULTIPLE_ACCOUNTS)) { + int otherAccounts = dataSource.countAuthsByEmail(params.getEmail()); + if (otherAccounts >= maxRegPerEmail) { + commonService.send(params.getPlayer(), MessageKey.MAX_REGISTER_EXCEEDED, + Integer.toString(maxRegPerEmail), Integer.toString(otherAccounts), "@"); + return false; + } + } + return true; + } + + @Override + public PlayerAuth buildPlayerAuth(EmailRegisterParams params) { + String password = RandomStringUtils.generate(commonService.getProperty(RECOVERY_PASSWORD_LENGTH)); + HashedPassword hashedPassword = passwordSecurity.computeHash(password, params.getPlayer().getName()); + params.setPassword(password); + return createPlayerAuth(params.getPlayer(), hashedPassword, params.getEmail()); + } + + @Override + public void executePostPersistAction(EmailRegisterParams params) { + Player player = params.getPlayer(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy'年'MM'月'dd'日' HH:mm:ss"); + Date date = new Date(System.currentTimeMillis()); + boolean couldSendMail = emailService.sendNewPasswordMail( + player.getName(), params.getEmail(), params.getPassword(), PlayerUtils.getPlayerIp(player), dateFormat.format(date)); + if (couldSendMail) { + syncProcessManager.processSyncEmailRegister(player); + } else { + commonService.send(player, MessageKey.EMAIL_SEND_FAILURE); + } + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/EmailRegisterParams.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/EmailRegisterParams.java new file mode 100644 index 0000000000..94d03acc57 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/EmailRegisterParams.java @@ -0,0 +1,43 @@ +package fr.xephi.authme.process.register.executors; + +import org.bukkit.entity.Player; + +/** + * Parameters for email registration. + */ +public class EmailRegisterParams extends RegistrationParameters { + + private final String email; + private String password; + + protected EmailRegisterParams(Player player, String email) { + super(player); + this.email = email; + } + + /** + * Creates a params object for email registration. + * + * @param player the player to register + * @param email the player's email + * @return params object with the given data + */ + public static EmailRegisterParams of(Player player, String email) { + return new EmailRegisterParams(player, email); + } + + public String getEmail() { + return email; + } + + void setPassword(String password) { + this.password = password; + } + + /** + * @return the password generated for the player + */ + String getPassword() { + return password; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/PasswordRegisterExecutor.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/PasswordRegisterExecutor.java new file mode 100644 index 0000000000..5b1558bcb8 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/PasswordRegisterExecutor.java @@ -0,0 +1,17 @@ +package fr.xephi.authme.process.register.executors; + +import fr.xephi.authme.data.auth.PlayerAuth; + +import static fr.xephi.authme.process.register.executors.PlayerAuthBuilderHelper.createPlayerAuth; + +/** + * Registration executor for password registration. + */ +class PasswordRegisterExecutor extends AbstractPasswordRegisterExecutor { + + @Override + public synchronized PlayerAuth createPlayerAuthObject(PasswordRegisterParams params) { + return createPlayerAuth(params.getPlayer(), params.getHashedPassword(), params.getEmail()); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/PasswordRegisterParams.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/PasswordRegisterParams.java new file mode 100644 index 0000000000..f21861bffa --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/PasswordRegisterParams.java @@ -0,0 +1,32 @@ +package fr.xephi.authme.process.register.executors; + +import org.bukkit.entity.Player; + +/** + * Parameters for registration with a given password, and optionally an email address. + */ +public class PasswordRegisterParams extends AbstractPasswordRegisterParams { + + private final String email; + + protected PasswordRegisterParams(Player player, String password, String email) { + super(player, password); + this.email = email; + } + + /** + * Creates a params object. + * + * @param player the player to register + * @param password the password to register with + * @param email the email of the player (may be null) + * @return params object with the given data + */ + public static PasswordRegisterParams of(Player player, String password, String email) { + return new PasswordRegisterParams(player, password, email); + } + + public String getEmail() { + return email; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/PlayerAuthBuilderHelper.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/PlayerAuthBuilderHelper.java new file mode 100644 index 0000000000..9b29dac2ff --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/PlayerAuthBuilderHelper.java @@ -0,0 +1,37 @@ +package fr.xephi.authme.process.register.executors; + +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.util.PlayerUtils; +import org.bukkit.entity.Player; + +import java.util.Locale; + +/** + * Helper for constructing PlayerAuth objects. + */ +final class PlayerAuthBuilderHelper { + + private PlayerAuthBuilderHelper() { + } + + /** + * Creates a {@link PlayerAuth} object with the given data. + * + * @param player the player to create a PlayerAuth for + * @param hashedPassword the hashed password + * @param email the email address (nullable) + * @return the generated PlayerAuth object + */ + static PlayerAuth createPlayerAuth(Player player, HashedPassword hashedPassword, String email) { + return PlayerAuth.builder() + .name(player.getName().toLowerCase(Locale.ROOT)) + .realName(player.getName()) + .password(hashedPassword) + .email(email) + .registrationIp(PlayerUtils.getPlayerIp(player)) + .registrationDate(System.currentTimeMillis()) + .uuid(player.getUniqueId()) + .build(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/RegistrationExecutor.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/RegistrationExecutor.java new file mode 100644 index 0000000000..32bfd95172 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/RegistrationExecutor.java @@ -0,0 +1,39 @@ +package fr.xephi.authme.process.register.executors; + +import fr.xephi.authme.data.auth.PlayerAuth; + +/** + * Performs the registration action. + * + * @param

the registration parameters type + */ +public interface RegistrationExecutor

{ + + /** + * Returns whether the registration may take place. Use this method to execute + * checks specific to the registration method. + *

+ * If this method returns {@code false}, it is expected that the executor inform + * the player about the error within this method call. + * + * @param params the parameters for the registration + * @return true if registration may be performed, false otherwise + */ + boolean isRegistrationAdmitted(P params); + + /** + * Constructs the PlayerAuth object to persist into the database. + * + * @param params the parameters for the registration + * @return the player auth to register in the data source + */ + PlayerAuth buildPlayerAuth(P params); + + /** + * Follow-up method called after the player auth could be added into the database. + * + * @param params the parameters for the registration + */ + void executePostPersistAction(P params); + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/RegistrationMethod.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/RegistrationMethod.java new file mode 100644 index 0000000000..f5f38b8667 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/RegistrationMethod.java @@ -0,0 +1,53 @@ +package fr.xephi.authme.process.register.executors; + +/** + * Methods with which a player can be registered. + *

+ * These constants each define a different way of registering a player and define the + * {@link RegistrationParameters parameters} and {@link RegistrationExecutor executor} + * classes which perform this registration method. This is essentially a typed enum + * as passing a constant of this class along with a parameters object to a method can + * be restricted to the correct parameters type. + * + * @param

the registration parameters type the method uses + */ +public final class RegistrationMethod

{ + + /** + * Password registration. + */ + public static final RegistrationMethod PASSWORD_REGISTRATION = + new RegistrationMethod<>(PasswordRegisterExecutor.class); + + /** + * Registration with two-factor authentication as login means. + */ + public static final RegistrationMethod TWO_FACTOR_REGISTRATION = + new RegistrationMethod<>(TwoFactorRegisterExecutor.class); + + /** + * Email registration: an email address is provided, to which a generated password is sent. + */ + public static final RegistrationMethod EMAIL_REGISTRATION = + new RegistrationMethod<>(EmailRegisterExecutor.class); + + /** + * API registration: player and password are provided via an API method. + */ + public static final RegistrationMethod API_REGISTRATION = + new RegistrationMethod<>(ApiPasswordRegisterExecutor.class); + + + private final Class> executorClass; + + private RegistrationMethod(Class> executorClass) { + this.executorClass = executorClass; + } + + /** + * @return the executor class to perform the registration method + */ + public Class> getExecutorClass() { + return executorClass; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/RegistrationParameters.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/RegistrationParameters.java new file mode 100644 index 0000000000..c92d57ffa0 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/RegistrationParameters.java @@ -0,0 +1,28 @@ +package fr.xephi.authme.process.register.executors; + +import org.bukkit.entity.Player; + +/** + * Parent of all registration parameters. + */ +public abstract class RegistrationParameters { + + private final Player player; + + /** + * Constructor. + * + * @param player the player to perform the registration for + */ + public RegistrationParameters(Player player) { + this.player = player; + } + + public Player getPlayer() { + return player; + } + + public String getPlayerName() { + return player.getName(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/TwoFactorRegisterExecutor.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/TwoFactorRegisterExecutor.java new file mode 100644 index 0000000000..c84a70ab23 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/TwoFactorRegisterExecutor.java @@ -0,0 +1,43 @@ +package fr.xephi.authme.process.register.executors; + +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.security.crypts.TwoFactor; +import fr.xephi.authme.service.CommonService; +import org.bukkit.Bukkit; + +import javax.inject.Inject; + +import static fr.xephi.authme.process.register.executors.PlayerAuthBuilderHelper.createPlayerAuth; + +/** + * Executor for two-factor registration. + */ +class TwoFactorRegisterExecutor extends AbstractPasswordRegisterExecutor { + + @Inject + private CommonService commonService; + + @Override + public boolean isRegistrationAdmitted(TwoFactorRegisterParams params) { + // nothing to check + return true; + } + + @Override + protected PlayerAuth createPlayerAuthObject(TwoFactorRegisterParams params) { + return createPlayerAuth(params.getPlayer(), params.getHashedPassword(), null); + } + + @Override + public void executePostPersistAction(TwoFactorRegisterParams params) { + super.executePostPersistAction(params); + + // Note ljacqu 20170317: This two-factor registration type is only invoked when the password hash is configured + // to two-factor authentication. Therefore, the hashed password is the result of the TwoFactor EncryptionMethod + // implementation (contains the TOTP secret). + String hash = params.getHashedPassword().getHash(); + String qrCodeUrl = TwoFactor.getQrBarcodeUrl(params.getPlayerName(), Bukkit.getIp(), hash); + commonService.send(params.getPlayer(), MessageKey.TWO_FACTOR_CREATE, hash, qrCodeUrl); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/TwoFactorRegisterParams.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/TwoFactorRegisterParams.java new file mode 100644 index 0000000000..a7a7587505 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/register/executors/TwoFactorRegisterParams.java @@ -0,0 +1,23 @@ +package fr.xephi.authme.process.register.executors; + +import org.bukkit.entity.Player; + +/** + * Parameters for registration with two-factor authentication. + */ +public class TwoFactorRegisterParams extends AbstractPasswordRegisterParams { + + protected TwoFactorRegisterParams(Player player) { + super(player); + } + + /** + * Creates a parameters object. + * + * @param player the player to register + * @return params object with the given player + */ + public static TwoFactorRegisterParams of(Player player) { + return new TwoFactorRegisterParams(player); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/unregister/AsynchronousUnregister.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/unregister/AsynchronousUnregister.java new file mode 100644 index 0000000000..caecd295e3 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/process/unregister/AsynchronousUnregister.java @@ -0,0 +1,155 @@ +package fr.xephi.authme.process.unregister; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.data.limbo.LimboService; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.events.UnregisterByAdminEvent; +import fr.xephi.authme.events.UnregisterByPlayerEvent; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.process.AsynchronousProcess; +import fr.xephi.authme.security.PasswordSecurity; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.TeleportationService; +import fr.xephi.authme.service.bungeecord.BungeeSender; +import fr.xephi.authme.service.bungeecord.MessageType; +import fr.xephi.authme.service.velocity.VMessageType; +import fr.xephi.authme.service.velocity.VelocitySender; +import fr.xephi.authme.settings.commandconfig.CommandManager; +import fr.xephi.authme.settings.properties.RegistrationSettings; +import fr.xephi.authme.settings.properties.RestrictionSettings; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.inject.Inject; + +import static fr.xephi.authme.service.BukkitService.TICKS_PER_SECOND; + +public class AsynchronousUnregister implements AsynchronousProcess { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(AsynchronousUnregister.class); + + @Inject + private DataSource dataSource; + + @Inject + private CommonService service; + + @Inject + private PasswordSecurity passwordSecurity; + + @Inject + private PlayerCache playerCache; + + @Inject + private BukkitService bukkitService; + + @Inject + private LimboService limboService; + + @Inject + private TeleportationService teleportationService; + + @Inject + private CommandManager commandManager; + + @Inject + private VelocitySender velocitySender; + + @Inject + private BungeeSender bungeeSender; + + AsynchronousUnregister() { + } + + /** + * Processes a player's request to unregister himself. Unregisters the player after + * successful password check. + * + * @param player the player + * @param password the input password to check before unregister + */ + public void unregister(Player player, String password) { + String name = player.getName(); + PlayerAuth cachedAuth = playerCache.getAuth(name); + if (passwordSecurity.comparePassword(password, cachedAuth.getPassword(), name)) { + if (dataSource.removeAuth(name)) { + performPostUnregisterActions(name, player); + logger.info(name + " unregistered himself"); + velocitySender.sendAuthMeVelocityMessage(player, VMessageType.UNREGISTER); + bukkitService.createAndCallEvent(isAsync -> new UnregisterByPlayerEvent(player, isAsync)); + } else { + service.send(player, MessageKey.ERROR); + } + } else { + service.send(player, MessageKey.WRONG_PASSWORD); + } + } + + /** + * Unregisters a player as administrator or console. + * + * @param initiator the initiator of this process (nullable) + * @param name the name of the player + * @param player the according Player object (nullable) + */ + // We need to have the name and the player separate because Player might be null in this case: + // we might have some player in the database that has never been online on the server + public void adminUnregister(CommandSender initiator, String name, Player player) { + if (dataSource.removeAuth(name)) { + performPostUnregisterActions(name, player); + if (player != null) velocitySender.sendAuthMeVelocityMessage(player, VMessageType.FORCE_UNREGISTER); + bukkitService.createAndCallEvent(isAsync -> new UnregisterByAdminEvent(player, name, isAsync, initiator)); + if (initiator == null) { + logger.info(name + " was unregistered"); + } else { + logger.info(name + " was unregistered by " + initiator.getName()); + service.send(initiator, MessageKey.UNREGISTERED_SUCCESS); + } + } else if (initiator != null) { + service.send(initiator, MessageKey.ERROR); + } + } + + /** + * Process the post unregister actions. Makes the user status consistent. + * + * @param name the name of the player + * @param player the according Player object (nullable) + */ + private void performPostUnregisterActions(String name, Player player) { + if (player != null && playerCache.isAuthenticated(name)) { + bungeeSender.sendAuthMeBungeecordMessage(player, MessageType.LOGOUT); + } + playerCache.removePlayer(name); + + // TODO: send an update when a messaging service will be implemented (UNREGISTER) + + if (player == null || !player.isOnline()) { + return; + } + bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(() -> + commandManager.runCommandsOnUnregister(player)); + + if (service.getProperty(RegistrationSettings.FORCE)) { + teleportationService.teleportOnJoin(player); + + bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(() -> { + limboService.createLimboPlayer(player, false); + applyBlindEffect(player); + }); + } + service.send(player, MessageKey.UNREGISTERED_SUCCESS); + } + + private void applyBlindEffect(Player player) { + if (service.getProperty(RegistrationSettings.APPLY_BLIND_EFFECT)) { + int timeout = service.getProperty(RestrictionSettings.TIMEOUT) * TICKS_PER_SECOND; + bukkitService.runTaskIfFolia(player, () -> player.addPotionEffect(bukkitService.createBlindnessEffect(timeout))); + } + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/HashAlgorithm.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/HashAlgorithm.java new file mode 100644 index 0000000000..d1085fde15 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/HashAlgorithm.java @@ -0,0 +1,60 @@ +package fr.xephi.authme.security; + +import fr.xephi.authme.security.crypts.EncryptionMethod; + +/** + * Hash algorithms supported by AuthMe. + */ +public enum HashAlgorithm { + + ARGON2(fr.xephi.authme.security.crypts.Argon2.class), + BCRYPT(fr.xephi.authme.security.crypts.BCrypt.class), + BCRYPT2Y(fr.xephi.authme.security.crypts.BCrypt2y.class), + CMW(fr.xephi.authme.security.crypts.CmwCrypt.class), + CRAZYCRYPT1(fr.xephi.authme.security.crypts.CrazyCrypt1.class), + IPB3(fr.xephi.authme.security.crypts.Ipb3.class), + IPB4(fr.xephi.authme.security.crypts.Ipb4.class), + JOOMLA(fr.xephi.authme.security.crypts.Joomla.class), + MD5VB(fr.xephi.authme.security.crypts.Md5vB.class), + MYBB(fr.xephi.authme.security.crypts.MyBB.class), + PBKDF2(fr.xephi.authme.security.crypts.Pbkdf2.class), + PBKDF2DJANGO(fr.xephi.authme.security.crypts.Pbkdf2Django.class), + PHPBB(fr.xephi.authme.security.crypts.PhpBB.class), + PHPFUSION(fr.xephi.authme.security.crypts.PhpFusion.class), + ROYALAUTH(fr.xephi.authme.security.crypts.RoyalAuth.class), + SALTED2MD5(fr.xephi.authme.security.crypts.Salted2Md5.class), + SALTEDSHA512(fr.xephi.authme.security.crypts.SaltedSha512.class), + SHA256(fr.xephi.authme.security.crypts.Sha256.class), + SMF(fr.xephi.authme.security.crypts.Smf.class), + TWO_FACTOR(fr.xephi.authme.security.crypts.TwoFactor.class), + WBB3(fr.xephi.authme.security.crypts.Wbb3.class), + WBB4(fr.xephi.authme.security.crypts.Wbb4.class), + WORDPRESS(fr.xephi.authme.security.crypts.Wordpress.class), + XAUTH(fr.xephi.authme.security.crypts.XAuth.class), + XFBCRYPT(fr.xephi.authme.security.crypts.XfBCrypt.class), + NOCRYPT(fr.xephi.authme.security.crypts.NoCrypt.class), + CUSTOM(null), + + @Deprecated DOUBLEMD5(fr.xephi.authme.security.crypts.DoubleMd5.class), + @Deprecated MD5(fr.xephi.authme.security.crypts.Md5.class), + @Deprecated PLAINTEXT(null), + @Deprecated SHA1(fr.xephi.authme.security.crypts.Sha1.class), + @Deprecated SHA512(fr.xephi.authme.security.crypts.Sha512.class), + @Deprecated WHIRLPOOL(fr.xephi.authme.security.crypts.Whirlpool.class); + + private final Class clazz; + + /** + * Constructor for HashAlgorithm. + * + * @param clazz The class of the hash implementation. + */ + HashAlgorithm(Class clazz) { + this.clazz = clazz; + } + + public Class getClazz() { + return clazz; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/HashUtils.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/HashUtils.java new file mode 100644 index 0000000000..e808807842 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/HashUtils.java @@ -0,0 +1,121 @@ +package fr.xephi.authme.security; + +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * Hashing utilities (interface for common hashing algorithms). + */ +public final class HashUtils { + + private HashUtils() { + } + + /** + * Generate the SHA-1 digest of the given message. + * + * @param message The message to hash + * @return The resulting SHA-1 digest + */ + public static String sha1(String message) { + return hash(message, MessageDigestAlgorithm.SHA1); + } + + /** + * Generate the SHA-256 digest of the given message. + * + * @param message The message to hash + * @return The resulting SHA-256 digest + */ + public static String sha256(String message) { + return hash(message, MessageDigestAlgorithm.SHA256); + } + + /** + * Generate the SHA-512 digest of the given message. + * + * @param message The message to hash + * @return The resulting SHA-512 digest + */ + public static String sha512(String message) { + return hash(message, MessageDigestAlgorithm.SHA512); + } + + /** + * Generate the MD5 digest of the given message. + * + * @param message The message to hash + * @return The resulting MD5 digest + */ + public static String md5(String message) { + return hash(message, MessageDigestAlgorithm.MD5); + } + + /** + * Return a {@link MessageDigest} instance for the given algorithm. + * + * @param algorithm The desired algorithm + * @return MessageDigest instance for the given algorithm + */ + public static MessageDigest getDigest(MessageDigestAlgorithm algorithm) { + try { + return MessageDigest.getInstance(algorithm.getKey()); + } catch (NoSuchAlgorithmException e) { + throw new UnsupportedOperationException("Your system seems not to support the hash algorithm '" + + algorithm.getKey() + "'"); + } + } + + /** + * Return whether the given hash starts like a BCrypt hash. Checking with this method + * beforehand prevents the BCryptHasher from throwing certain exceptions. + * + * @param hash The salt to verify + * @return True if the salt is valid, false otherwise + */ + public static boolean isValidBcryptHash(String hash) { + return hash.length() == 60 && hash.substring(0, 2).equals("$2"); + } + + /** + * Checks whether the two strings are equal to each other in a time-constant manner. + * This helps to avoid timing side channel attacks, + * cf. issue #1561. + * + * @param string1 first string + * @param string2 second string + * @return true if the strings are equal to each other, false otherwise + */ + public static boolean isEqual(String string1, String string2) { + return MessageDigest.isEqual( + string1.getBytes(StandardCharsets.UTF_8), string2.getBytes(StandardCharsets.UTF_8)); + } + + /** + * Hash the message with the given algorithm and return the hash in its hexadecimal notation. + * + * @param message The message to hash + * @param algorithm The algorithm to hash the message with + * @return The digest in its hexadecimal representation + */ + public static String hash(String message, MessageDigest algorithm) { + algorithm.reset(); + algorithm.update(message.getBytes()); + byte[] digest = algorithm.digest(); + return String.format("%0" + (digest.length << 1) + "x", new BigInteger(1, digest)); + } + + /** + * Hash the message with the given algorithm and return the hash in its hexadecimal notation. + * + * @param message The message to hash + * @param algorithm The algorithm to hash the message with + * @return The digest in its hexadecimal representation + */ + private static String hash(String message, MessageDigestAlgorithm algorithm) { + return hash(message, getDigest(algorithm)); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/MessageDigestAlgorithm.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/MessageDigestAlgorithm.java new file mode 100644 index 0000000000..51ff2a5d43 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/MessageDigestAlgorithm.java @@ -0,0 +1,30 @@ +package fr.xephi.authme.security; + +import java.security.MessageDigest; + +/** + * The Java-supported names to get a {@link MessageDigest} instance with. + * + * @see + * Crypto Spec Appendix A: Standard Names + */ +public enum MessageDigestAlgorithm { + + MD5("MD5"), + + SHA1("SHA-1"), + + SHA256("SHA-256"), + + SHA512("SHA-512"); + + private final String key; + + MessageDigestAlgorithm(String key) { + this.key = key; + } + + public String getKey() { + return key; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/PasswordSecurity.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/PasswordSecurity.java new file mode 100644 index 0000000000..012fd3e51f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/PasswordSecurity.java @@ -0,0 +1,164 @@ +package fr.xephi.authme.security; + +import ch.jalu.injector.factory.Factory; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.events.PasswordEncryptionEvent; +import fr.xephi.authme.initialization.Reloadable; +import fr.xephi.authme.security.crypts.EncryptionMethod; +import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import org.bukkit.plugin.PluginManager; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import java.util.Collection; +import java.util.Locale; + +/** + * Manager class for password-related operations. + */ +public class PasswordSecurity implements Reloadable { + + @Inject + private Settings settings; + + @Inject + private DataSource dataSource; + + @Inject + private PluginManager pluginManager; + + @Inject + private Factory encryptionMethodFactory; + + private EncryptionMethod encryptionMethod; + private Collection legacyAlgorithms; + + /** + * Load or reload the configuration. + */ + @PostConstruct + @Override + public void reload() { + HashAlgorithm algorithm = settings.getProperty(SecuritySettings.PASSWORD_HASH); + this.encryptionMethod = initializeEncryptionMethodWithEvent(algorithm); + this.legacyAlgorithms = settings.getProperty(SecuritySettings.LEGACY_HASHES); + } + + /** + * Compute the hash of the configured algorithm for the given password and username. + * + * @param password The password to hash + * @param playerName The player's name + * + * @return The password hash + */ + public HashedPassword computeHash(String password, String playerName) { + String playerLowerCase = playerName.toLowerCase(Locale.ROOT); + return encryptionMethod.computeHash(password, playerLowerCase); + } + + /** + * Check if the given password matches the player's stored password. + * + * @param password The password to check + * @param playerName The player to check for + * + * @return True if the password is correct, false otherwise + */ + public boolean comparePassword(String password, String playerName) { + HashedPassword auth = dataSource.getPassword(playerName); + return auth != null && comparePassword(password, auth, playerName); + } + + /** + * Check if the given password matches the given hashed password. + * + * @param password The password to check + * @param hashedPassword The hashed password to check against + * @param playerName The player to check for + * + * @return True if the password matches, false otherwise + */ + public boolean comparePassword(String password, HashedPassword hashedPassword, String playerName) { + String playerLowerCase = playerName.toLowerCase(Locale.ROOT); + return methodMatches(encryptionMethod, password, hashedPassword, playerLowerCase) + || compareWithLegacyHashes(password, hashedPassword, playerLowerCase); + } + + /** + * Compare the given hash with the configured legacy encryption methods to support + * the migration to a new encryption method. Upon a successful match, the password + * will be hashed with the new encryption method and persisted. + * + * @param password The clear-text password to check + * @param hashedPassword The encrypted password to test the clear-text password against + * @param playerName The name of the player + * + * @return True if there was a password match with a configured legacy encryption method, false otherwise + */ + private boolean compareWithLegacyHashes(String password, HashedPassword hashedPassword, String playerName) { + for (HashAlgorithm algorithm : legacyAlgorithms) { + EncryptionMethod method = initializeEncryptionMethod(algorithm); + if (methodMatches(method, password, hashedPassword, playerName)) { + hashAndSavePasswordWithNewAlgorithm(password, playerName); + return true; + } + } + return false; + } + + /** + * Verify with the given encryption method whether the password matches the hash after checking that + * the method can be called safely with the given data. + * + * @param method The encryption method to use + * @param password The password to check + * @param hashedPassword The hash to check against + * @param playerName The name of the player + * + * @return True if the password matched, false otherwise + */ + private static boolean methodMatches(EncryptionMethod method, String password, + HashedPassword hashedPassword, String playerName) { + return method != null && (!method.hasSeparateSalt() || hashedPassword.getSalt() != null) + && method.comparePassword(password, hashedPassword, playerName); + } + + /** + * Get the encryption method from the given {@link HashAlgorithm} value and emit a + * {@link PasswordEncryptionEvent}. The encryption method from the event is then returned, + * which may have been changed by an external listener. + * + * @param algorithm The algorithm to retrieve the encryption method for + * + * @return The encryption method + */ + private EncryptionMethod initializeEncryptionMethodWithEvent(HashAlgorithm algorithm) { + EncryptionMethod method = initializeEncryptionMethod(algorithm); + PasswordEncryptionEvent event = new PasswordEncryptionEvent(method); + pluginManager.callEvent(event); + return event.getMethod(); + } + + /** + * Initialize the encryption method associated with the given hash algorithm. + * + * @param algorithm The algorithm to retrieve the encryption method for + * + * @return The associated encryption method, or null if CUSTOM / deprecated + */ + private EncryptionMethod initializeEncryptionMethod(HashAlgorithm algorithm) { + if (HashAlgorithm.CUSTOM.equals(algorithm) || HashAlgorithm.PLAINTEXT.equals(algorithm)) { + return null; + } + return encryptionMethodFactory.newInstance(algorithm.getClazz()); + } + + private void hashAndSavePasswordWithNewAlgorithm(String password, String playerName) { + HashedPassword hashedPassword = encryptionMethod.computeHash(password, playerName); + dataSource.updatePassword(playerName, hashedPassword); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Argon2.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Argon2.java new file mode 100644 index 0000000000..e002886baa --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Argon2.java @@ -0,0 +1,51 @@ +package fr.xephi.authme.security.crypts; + +import de.mkammerer.argon2.Argon2Constants; +import de.mkammerer.argon2.Argon2Factory; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.security.crypts.description.HasSalt; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.SaltType; +import fr.xephi.authme.security.crypts.description.Usage; + +@Recommendation(Usage.RECOMMENDED) +@HasSalt(value = SaltType.TEXT, length = Argon2Constants.DEFAULT_SALT_LENGTH) +// Note: Argon2 is actually a salted algorithm but salt generation is handled internally +// and isn't exposed to the outside, so we treat it as an unsalted implementation +public class Argon2 extends UnsaltedMethod { + + private static ConsoleLogger logger = ConsoleLoggerFactory.get(Argon2.class); + + private de.mkammerer.argon2.Argon2 argon2; + + public Argon2() { + argon2 = Argon2Factory.create(); + } + + /** + * Checks if the argon2 library is available in java.library.path. + * + * @return true if the library is present, false otherwise + */ + public static boolean isLibraryLoaded() { + try { + System.loadLibrary("argon2"); + return true; + } catch (UnsatisfiedLinkError e) { + logger.logException( + "Cannot find argon2 library: https://github.com/AuthMe/AuthMeReloaded/wiki/Argon2-as-Password-Hash", e); + } + return false; + } + + @Override + public String computeHash(String password) { + return argon2.hash(2, 65536, 1, password); + } + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String name) { + return argon2.verify(hashedPassword.getHash(), password); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/BCrypt.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/BCrypt.java new file mode 100644 index 0000000000..5b75c89afe --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/BCrypt.java @@ -0,0 +1,23 @@ +package fr.xephi.authme.security.crypts; + +import at.favre.lib.crypto.bcrypt.BCrypt.Version; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.HooksSettings; + +import javax.inject.Inject; + +/** + * BCrypt hash algorithm with configurable cost factor. + */ +public class BCrypt extends BCryptBasedHash { + + @Inject + public BCrypt(Settings settings) { + super(createHasher(settings)); + } + + private static BCryptHasher createHasher(Settings settings) { + int bCryptLog2Rounds = settings.getProperty(HooksSettings.BCRYPT_LOG2_ROUND); + return new BCryptHasher(Version.VERSION_2A, bCryptLog2Rounds); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/BCrypt2y.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/BCrypt2y.java new file mode 100644 index 0000000000..2558fa98ab --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/BCrypt2y.java @@ -0,0 +1,20 @@ +package fr.xephi.authme.security.crypts; + +import at.favre.lib.crypto.bcrypt.BCrypt; + +import javax.inject.Inject; + +/** + * Hash for BCrypt in the $2y$ variant. Uses a fixed cost factor of 10. + */ +public class BCrypt2y extends BCryptBasedHash { + + @Inject + public BCrypt2y() { + this(10); + } + + public BCrypt2y(int cost) { + super(new BCryptHasher(BCrypt.Version.VERSION_2Y, cost)); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/BCryptBasedHash.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/BCryptBasedHash.java new file mode 100644 index 0000000000..919c9bf2f4 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/BCryptBasedHash.java @@ -0,0 +1,48 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.crypts.description.HasSalt; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.SaltType; +import fr.xephi.authme.security.crypts.description.Usage; + +import static fr.xephi.authme.security.crypts.BCryptHasher.SALT_LENGTH_ENCODED; +import static java.nio.charset.StandardCharsets.UTF_8; + +/** + * Abstract parent for BCrypt-based hash algorithms. + */ +@Recommendation(Usage.RECOMMENDED) +@HasSalt(value = SaltType.TEXT, length = SALT_LENGTH_ENCODED) +public abstract class BCryptBasedHash implements EncryptionMethod { + + private final BCryptHasher bCryptHasher; + + public BCryptBasedHash(BCryptHasher bCryptHasher) { + this.bCryptHasher = bCryptHasher; + } + + @Override + public HashedPassword computeHash(String password, String name) { + return bCryptHasher.hash(password); + } + + @Override + public String computeHash(String password, String salt, String name) { + return bCryptHasher.hashWithRawSalt(password, salt.getBytes(UTF_8)); + } + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String name) { + return BCryptHasher.comparePassword(password, hashedPassword.getHash()); + } + + @Override + public String generateSalt() { + return BCryptHasher.generateSalt(); + } + + @Override + public boolean hasSeparateSalt() { + return false; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/BCryptHasher.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/BCryptHasher.java new file mode 100644 index 0000000000..ffa1064dc7 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/BCryptHasher.java @@ -0,0 +1,78 @@ +package fr.xephi.authme.security.crypts; + +import at.favre.lib.crypto.bcrypt.BCrypt; +import fr.xephi.authme.security.HashUtils; +import fr.xephi.authme.util.RandomStringUtils; + +import static java.nio.charset.StandardCharsets.UTF_8; + +/** + * Wraps a {@link BCrypt.Hasher} instance and provides methods suitable for use in AuthMe. + */ +public class BCryptHasher { + + /** Number of bytes in a BCrypt salt (not encoded). */ + public static final int BYTES_IN_SALT = 16; + /** Number of characters of the salt in its radix64-encoded form. */ + public static final int SALT_LENGTH_ENCODED = 22; + + private final BCrypt.Hasher hasher; + private final int costFactor; + + /** + * Constructor. + * + * @param version the BCrypt version the instance should generate + * @param costFactor the log2 cost factor to use + */ + public BCryptHasher(BCrypt.Version version, int costFactor) { + this.hasher = BCrypt.with(version); + this.costFactor = costFactor; + } + + public HashedPassword hash(String password) { + byte[] hash = hasher.hash(costFactor, password.getBytes(UTF_8)); + return new HashedPassword(new String(hash, UTF_8)); + } + + public String hashWithRawSalt(String password, byte[] rawSalt) { + byte[] hash = hasher.hash(costFactor, rawSalt, password.getBytes(UTF_8)); + return new String(hash, UTF_8); + } + + /** + * Verifies that the given password is correct for the provided BCrypt hash. + * + * @param password the password to check with + * @param hash the hash to check against + * @return true if the password matches the hash, false otherwise + */ + public static boolean comparePassword(String password, String hash) { + if (HashUtils.isValidBcryptHash(hash)) { + BCrypt.Result result = BCrypt.verifyer().verify(password.getBytes(UTF_8), hash.getBytes(UTF_8)); + return result.verified; + } + return false; + } + + /** + * Generates a salt for usage in BCrypt. The returned salt is not yet encoded. + *

+ * Internally, the BCrypt library in {@link BCrypt.Hasher#hash(int, byte[])} uses the following: + * {@code Bytes.random(16, secureRandom).encodeUtf8();} + *

+ * Because our {@link EncryptionMethod} interface works with {@code String} types we need to make sure that the + * generated bytes in the salt are suitable for conversion into a String, such that calling String#getBytes will + * yield the same number of bytes again. Thus, we are forced to limit the range of characters we use. Ideally we'd + * only have to pass the salt in its encoded form so that we could make use of the entire "spectrum" of values, + * which proves difficult to achieve with the underlying BCrypt library. However, the salt needs to be generated + * manually only for testing purposes; production code should always hash passwords using + * {@link EncryptionMethod#computeHash(String, String)}, which internally may represent salts in more suitable + * formats. + * + * @return the salt for a BCrypt hash + */ + public static String generateSalt() { + return RandomStringUtils.generateLowerUpper(BYTES_IN_SALT); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/CmwCrypt.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/CmwCrypt.java new file mode 100644 index 0000000000..2b94dc038b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/CmwCrypt.java @@ -0,0 +1,14 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.HashUtils; + +/** + * Hash algorithm to hook into the CMS Craft My Website. + */ +public class CmwCrypt extends UnsaltedMethod { + + @Override + public String computeHash(String password) { + return HashUtils.md5(HashUtils.sha1(password)); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/CrazyCrypt1.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/CrazyCrypt1.java new file mode 100644 index 0000000000..6130c6a127 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/CrazyCrypt1.java @@ -0,0 +1,31 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.HashUtils; +import fr.xephi.authme.security.MessageDigestAlgorithm; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; + +public class CrazyCrypt1 extends UsernameSaltMethod { + + private static final char[] CRYPTCHARS = + {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + + private static String byteArrayToHexString(final byte... args) { + final char[] chars = new char[args.length * 2]; + for (int i = 0; i < args.length; i++) { + chars[i * 2] = CRYPTCHARS[(args[i] >> 4) & 0xF]; + chars[i * 2 + 1] = CRYPTCHARS[(args[i]) & 0xF]; + } + return new String(chars); + } + + @Override + public HashedPassword computeHash(String password, String name) { + final String text = "ÜÄaeut//&/=I " + password + "7421€547" + name + "__+IÄIH§%NK " + password; + final MessageDigest md = HashUtils.getDigest(MessageDigestAlgorithm.SHA512); + md.update(text.getBytes(StandardCharsets.UTF_8), 0, text.length()); + return new HashedPassword(byteArrayToHexString(md.digest())); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/DoubleMd5.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/DoubleMd5.java new file mode 100644 index 0000000000..12e9680824 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/DoubleMd5.java @@ -0,0 +1,17 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.Usage; + +import static fr.xephi.authme.security.HashUtils.md5; + +@Deprecated +@Recommendation(Usage.DEPRECATED) +public class DoubleMd5 extends UnsaltedMethod { + + @Override + public String computeHash(String password) { + return md5(md5(password)); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/EncryptionMethod.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/EncryptionMethod.java new file mode 100644 index 0000000000..83cc6c8c0d --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/EncryptionMethod.java @@ -0,0 +1,61 @@ +package fr.xephi.authme.security.crypts; + +/** + * Public interface for custom password encryption methods. + *

+ * Instantiation of these methods is done via automatic dependency injection. + */ +public interface EncryptionMethod { + + /** + * Hash the given password for the given player name. + * + * @param password The password to hash + * @param name The name of the player (sometimes required to generate a salt with) + * + * @return The hash result for the password. + * @see HashedPassword + */ + HashedPassword computeHash(String password, String name); + + /** + * Hash the given password with the given salt for the given player. + * + * @param password The password to hash + * @param salt The salt to add to the hash + * @param name The player's name (sometimes required to generate a salt with) + * + * @return The hashed password + * @see #hasSeparateSalt() + */ + String computeHash(String password, String salt, String name); + + /** + * Check whether the given hash matches the clear-text password. + * + * @param password The clear-text password to verify + * @param hashedPassword The hash to check the password against + * @param name The player name to do the check for (sometimes required for generating the salt) + * + * @return True if the password matches, false otherwise + */ + boolean comparePassword(String password, HashedPassword hashedPassword, String name); + + /** + * Generate a new salt to hash a password with. + * + * @return The generated salt, null if the method does not use a random text-based salt + */ + String generateSalt(); + + /** + * Return whether the encryption method requires the salt to be stored separately and + * passed again to {@link #comparePassword(String, HashedPassword, String)}. Note that + * an encryption method returning {@code false} does not imply that it uses no salt; it + * may be embedded into the hash or it may use the username as salt. + * + * @return True if the salt has to be stored and retrieved separately, false otherwise + */ + boolean hasSeparateSalt(); + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/HashedPassword.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/HashedPassword.java new file mode 100644 index 0000000000..f2e40aa4e2 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/HashedPassword.java @@ -0,0 +1,48 @@ +package fr.xephi.authme.security.crypts; + +/** + * The result of a hash computation. See {@link #salt} for details. + */ +public class HashedPassword { + + /** The generated hash. */ + private final String hash; + /** + * The generated salt; may be null if no salt is used or if the salt is included + * in the hash output. The salt is only not null if {@link EncryptionMethod#hasSeparateSalt()} + * returns true for the associated encryption method. + *

+ * When the field is not null, it must be stored into the salt column of the data source + * and retrieved again to compare a password with the hash. + */ + private final String salt; + + /** + * Constructor. + * + * @param hash The computed hash + * @param salt The generated salt + */ + public HashedPassword(String hash, String salt) { + this.hash = hash; + this.salt = salt; + } + + /** + * Constructor for a hash with no separate salt. + * + * @param hash The computed hash + */ + public HashedPassword(String hash) { + this(hash, null); + } + + public String getHash() { + return hash; + } + + public String getSalt() { + return salt; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/HexSaltedMethod.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/HexSaltedMethod.java new file mode 100644 index 0000000000..81e7677224 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/HexSaltedMethod.java @@ -0,0 +1,40 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.crypts.description.HasSalt; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.SaltType; +import fr.xephi.authme.security.crypts.description.Usage; +import fr.xephi.authme.util.RandomStringUtils; + +/** + * Common type for encryption methods which use a random String of hexadecimal characters + * and store the salt with the hash itself. + */ +@Recommendation(Usage.ACCEPTABLE) +@HasSalt(SaltType.TEXT) // See getSaltLength() for length +public abstract class HexSaltedMethod implements EncryptionMethod { + + public abstract int getSaltLength(); + + @Override + public abstract String computeHash(String password, String salt, String name); + + @Override + public HashedPassword computeHash(String password, String name) { + String salt = generateSalt(); + return new HashedPassword(computeHash(password, salt, null)); + } + + @Override + public abstract boolean comparePassword(String password, HashedPassword hashedPassword, String name); + + @Override + public String generateSalt() { + return RandomStringUtils.generateHex(getSaltLength()); + } + + @Override + public boolean hasSeparateSalt() { + return false; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Ipb3.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Ipb3.java new file mode 100644 index 0000000000..b29df4fc53 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Ipb3.java @@ -0,0 +1,25 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.crypts.description.HasSalt; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.SaltType; +import fr.xephi.authme.security.crypts.description.Usage; +import fr.xephi.authme.util.RandomStringUtils; + +import static fr.xephi.authme.security.HashUtils.md5; + +@Recommendation(Usage.ACCEPTABLE) +@HasSalt(value = SaltType.TEXT, length = 5) +public class Ipb3 extends SeparateSaltMethod { + + @Override + public String computeHash(String password, String salt, String name) { + return md5(md5(salt) + md5(password)); + } + + @Override + public String generateSalt() { + return RandomStringUtils.generateHex(5); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Ipb4.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Ipb4.java new file mode 100644 index 0000000000..e176d0aabf --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Ipb4.java @@ -0,0 +1,67 @@ +package fr.xephi.authme.security.crypts; + +import at.favre.lib.crypto.bcrypt.BCrypt; +import at.favre.lib.crypto.bcrypt.IllegalBCryptFormatException; +import fr.xephi.authme.security.crypts.description.HasSalt; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.SaltType; +import fr.xephi.authme.security.crypts.description.Usage; +import fr.xephi.authme.util.RandomStringUtils; + +import static java.nio.charset.StandardCharsets.UTF_8; + + +/** + * Implementation for Ipb4 (Invision Power Board 4). + *

+ * The hash uses standard BCrypt with 13 as log2 number of rounds. Additionally, + * Ipb4 requires that the salt be stored in the column "members_pass_hash" as well + * (even though BCrypt hashes already contain the salt within themselves). + */ +@Recommendation(Usage.DOES_NOT_WORK) +@HasSalt(value = SaltType.TEXT, length = BCryptHasher.SALT_LENGTH_ENCODED) +public class Ipb4 implements EncryptionMethod { + + private BCryptHasher bCryptHasher = new BCryptHasher(BCrypt.Version.VERSION_2A, 13); + + @Override + public String computeHash(String password, String salt, String name) { + // Since the radix64-encoded salt is necessary to be stored separately as well, the incoming salt here is + // radix64-encoded (see #generateSalt()). This means we first need to decode it before passing into the + // bcrypt hasher... We cheat by inserting the encoded salt into a dummy bcrypt hash so that we can parse it + // with the BCrypt utilities. + // This method (with specific salt) is only used for testing purposes, so this approach should be OK. + + String dummyHash = "$2a$10$" + salt + "3Cfb5GnwvKhJ20r.hMjmcNkIT9.Uh9K"; + try { + BCrypt.HashData parseResult = BCrypt.Version.VERSION_2A.parser.parse(dummyHash.getBytes(UTF_8)); + return bCryptHasher.hashWithRawSalt(password, parseResult.rawSalt); + } catch (IllegalBCryptFormatException |IllegalArgumentException e) { + throw new IllegalStateException("Cannot parse hash with salt '" + salt + "'", e); + } + } + + @Override + public HashedPassword computeHash(String password, String name) { + HashedPassword hash = bCryptHasher.hash(password); + + // 7 chars prefix, then 22 chars which is the encoded salt, which we need again + String salt = hash.getHash().substring(7, 29); + return new HashedPassword(hash.getHash(), salt); + } + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String name) { + return BCryptHasher.comparePassword(password, hashedPassword.getHash()); + } + + @Override + public String generateSalt() { + return RandomStringUtils.generateLowerUpper(22); + } + + @Override + public boolean hasSeparateSalt() { + return true; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Joomla.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Joomla.java new file mode 100644 index 0000000000..2ecc1d8d3d --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Joomla.java @@ -0,0 +1,29 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.HashUtils; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.Usage; + +import static fr.xephi.authme.security.HashUtils.isEqual; + +@Recommendation(Usage.ACCEPTABLE) +public class Joomla extends HexSaltedMethod { + + @Override + public String computeHash(String password, String salt, String name) { + return HashUtils.md5(password + salt) + ":" + salt; + } + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String unusedName) { + String hash = hashedPassword.getHash(); + String[] hashParts = hash.split(":"); + return hashParts.length == 2 && isEqual(hash, computeHash(password, hashParts[1], null)); + } + + @Override + public int getSaltLength() { + return 32; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Md5.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Md5.java new file mode 100644 index 0000000000..55e07a1738 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Md5.java @@ -0,0 +1,16 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.HashUtils; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.Usage; + +@Deprecated +@Recommendation(Usage.DEPRECATED) +public class Md5 extends UnsaltedMethod { + + @Override + public String computeHash(String password) { + return HashUtils.md5(password); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Md5vB.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Md5vB.java new file mode 100644 index 0000000000..00656964f6 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Md5vB.java @@ -0,0 +1,25 @@ +package fr.xephi.authme.security.crypts; + +import static fr.xephi.authme.security.HashUtils.isEqual; +import static fr.xephi.authme.security.HashUtils.md5; + +public class Md5vB extends HexSaltedMethod { + + @Override + public String computeHash(String password, String salt, String name) { + return "$MD5vb$" + salt + "$" + md5(md5(password) + salt); + } + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String name) { + String hash = hashedPassword.getHash(); + String[] line = hash.split("\\$"); + return line.length == 4 && isEqual(hash, computeHash(password, line[2], name)); + } + + @Override + public int getSaltLength() { + return 16; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/MyBB.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/MyBB.java new file mode 100644 index 0000000000..3ff0ee5e0b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/MyBB.java @@ -0,0 +1,26 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.crypts.description.HasSalt; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.SaltType; +import fr.xephi.authme.security.crypts.description.Usage; +import fr.xephi.authme.util.RandomStringUtils; + +import static fr.xephi.authme.security.HashUtils.md5; + +@Recommendation(Usage.ACCEPTABLE) +@HasSalt(value = SaltType.TEXT, length = 8) +@SuppressWarnings({"checkstyle:AbbreviationAsWordInName"}) +public class MyBB extends SeparateSaltMethod { + + @Override + public String computeHash(String password, String salt, String name) { + return md5(md5(salt) + md5(password)); + } + + @Override + public String generateSalt() { + return RandomStringUtils.generateLowerUpper(8); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/NoCrypt.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/NoCrypt.java new file mode 100644 index 0000000000..afd298ec16 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/NoCrypt.java @@ -0,0 +1,15 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.Usage; + +@Deprecated +@Recommendation(Usage.DEPRECATED) +public class NoCrypt extends UnsaltedMethod { + + @Override + public String computeHash(String password) { + return password; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Pbkdf2.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Pbkdf2.java new file mode 100644 index 0000000000..c79647ab79 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Pbkdf2.java @@ -0,0 +1,62 @@ +package fr.xephi.authme.security.crypts; + +import com.google.common.primitives.Ints; +import de.rtner.misc.BinTools; +import de.rtner.security.auth.spi.PBKDF2Engine; +import de.rtner.security.auth.spi.PBKDF2Parameters; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.Usage; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.SecuritySettings; + +import javax.inject.Inject; + +@Recommendation(Usage.RECOMMENDED) +public class Pbkdf2 extends HexSaltedMethod { + + private static final int DEFAULT_ROUNDS = 10_000; + private final ConsoleLogger logger = ConsoleLoggerFactory.get(Pbkdf2.class); + private int numberOfRounds; + + @Inject + Pbkdf2(Settings settings) { + int configuredRounds = settings.getProperty(SecuritySettings.PBKDF2_NUMBER_OF_ROUNDS); + this.numberOfRounds = configuredRounds > 0 ? configuredRounds : DEFAULT_ROUNDS; + } + + @Override + public String computeHash(String password, String salt, String name) { + String result = "pbkdf2_sha256$" + numberOfRounds + "$" + salt + "$"; + PBKDF2Parameters params = new PBKDF2Parameters("HmacSHA256", "UTF-8", salt.getBytes(), numberOfRounds); + PBKDF2Engine engine = new PBKDF2Engine(params); + + return result + BinTools.bin2hex(engine.deriveKey(password, 64)); + } + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String unusedName) { + String[] line = hashedPassword.getHash().split("\\$"); + if (line.length != 4) { + return false; + } + Integer iterations = Ints.tryParse(line[1]); + if (iterations == null) { + logger.warning("Cannot read number of rounds for Pbkdf2: '" + line[1] + "'"); + return false; + } + + String salt = line[2]; + byte[] derivedKey = BinTools.hex2bin(line[3]); + PBKDF2Parameters params = new PBKDF2Parameters("HmacSHA256", "UTF-8", salt.getBytes(), iterations, derivedKey); + PBKDF2Engine engine = new PBKDF2Engine(params); + return engine.verifyKey(password); + } + + @Override + public int getSaltLength() { + return 16; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Pbkdf2Django.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Pbkdf2Django.java new file mode 100644 index 0000000000..a0877cd4b8 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Pbkdf2Django.java @@ -0,0 +1,51 @@ +package fr.xephi.authme.security.crypts; + +import com.google.common.primitives.Ints; +import de.rtner.security.auth.spi.PBKDF2Engine; +import de.rtner.security.auth.spi.PBKDF2Parameters; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.security.crypts.description.AsciiRestricted; + +import java.util.Base64; + +@AsciiRestricted +public class Pbkdf2Django extends HexSaltedMethod { + + private static final int DEFAULT_ITERATIONS = 24000; + private final ConsoleLogger logger = ConsoleLoggerFactory.get(Pbkdf2Django.class); + + @Override + public String computeHash(String password, String salt, String name) { + String result = "pbkdf2_sha256$" + DEFAULT_ITERATIONS + "$" + salt + "$"; + PBKDF2Parameters params = new PBKDF2Parameters("HmacSHA256", "ASCII", salt.getBytes(), DEFAULT_ITERATIONS); + PBKDF2Engine engine = new PBKDF2Engine(params); + + return result + Base64.getEncoder().encodeToString(engine.deriveKey(password, 32)); + } + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String unusedName) { + String[] line = hashedPassword.getHash().split("\\$"); + if (line.length != 4) { + return false; + } + Integer iterations = Ints.tryParse(line[1]); + if (iterations == null) { + logger.warning("Cannot read number of rounds for Pbkdf2Django: '" + line[1] + "'"); + return false; + } + + String salt = line[2]; + byte[] derivedKey = Base64.getDecoder().decode(line[3]); + PBKDF2Parameters params = new PBKDF2Parameters("HmacSHA256", "ASCII", salt.getBytes(), iterations, derivedKey); + PBKDF2Engine engine = new PBKDF2Engine(params); + return engine.verifyKey(password); + } + + @Override + public int getSaltLength() { + return 12; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/PhpBB.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/PhpBB.java new file mode 100644 index 0000000000..c4e27e9d76 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/PhpBB.java @@ -0,0 +1,162 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.HashUtils; +import fr.xephi.authme.security.MessageDigestAlgorithm; +import fr.xephi.authme.security.crypts.description.HasSalt; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.SaltType; +import fr.xephi.authme.security.crypts.description.Usage; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; + +import static fr.xephi.authme.security.HashUtils.isEqual; +import static fr.xephi.authme.security.crypts.BCryptHasher.SALT_LENGTH_ENCODED; + +/** + * Encryption method compatible with phpBB3. + *

+ * As tested with phpBB 3.2.1, by default new passwords are encrypted with BCrypt $2y$. + * For backwards compatibility, phpBB3 supports other hashes for comparison. This implementation + * successfully checks against phpBB's salted MD5 hashing algorithm (adaptation of phpass), + * as well as plain MD5. + */ +@Recommendation(Usage.ACCEPTABLE) +@HasSalt(value = SaltType.TEXT, length = SALT_LENGTH_ENCODED) +public class PhpBB implements EncryptionMethod { + + private final BCrypt2y bCrypt2y = new BCrypt2y(); + + @Override + public HashedPassword computeHash(String password, String name) { + return bCrypt2y.computeHash(password, name); + } + + @Override + public String computeHash(String password, String salt, String name) { + return bCrypt2y.computeHash(password, salt, name); + } + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String name) { + final String hash = hashedPassword.getHash(); + if (HashUtils.isValidBcryptHash(hash)) { + return bCrypt2y.comparePassword(password, hashedPassword, name); + } else if (hash.length() == 34) { + return PhpassSaltedMd5.phpbb_check_hash(password, hash); + } else { + return isEqual(hash, PhpassSaltedMd5.md5(password)); + } + } + + @Override + public String generateSalt() { + // Salt length 22, as seen in https://github.com/phpbb/phpbb/blob/master/phpBB/phpbb/passwords/driver/bcrypt.php + // Ours generates 16 chars because the salt must not yet be encoded. + return BCryptHasher.generateSalt(); + } + + @Override + public boolean hasSeparateSalt() { + return false; + } + + /** + * Java implementation of the salted MD5 as used in phpBB (adapted from phpass). + * + * @see phpBB's salted_md5.php + * @see phpass + */ + private static final class PhpassSaltedMd5 { + + private static final String itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + private static String md5(String data) { + try { + byte[] bytes = data.getBytes("ISO-8859-1"); + MessageDigest md5er = HashUtils.getDigest(MessageDigestAlgorithm.MD5); + byte[] hash = md5er.digest(bytes); + return bytes2hex(hash); + } catch (UnsupportedEncodingException e) { + throw new UnsupportedOperationException(e); + } + } + + private static int hexToInt(char ch) { + if (ch >= '0' && ch <= '9') + return ch - '0'; + ch = Character.toUpperCase(ch); + if (ch >= 'A' && ch <= 'F') + return ch - 'A' + 0xA; + throw new IllegalArgumentException("Not a hex character: " + ch); + } + + private static String bytes2hex(byte[] bytes) { + StringBuilder r = new StringBuilder(32); + for (byte b : bytes) { + String x = Integer.toHexString(b & 0xff); + if (x.length() < 2) + r.append('0'); + r.append(x); + } + return r.toString(); + } + + private static String pack(String hex) { + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < hex.length(); i += 2) { + char c1 = hex.charAt(i); + char c2 = hex.charAt(i + 1); + char packed = (char) (hexToInt(c1) * 16 + hexToInt(c2)); + buf.append(packed); + } + return buf.toString(); + } + + private static String _hash_encode64(String input, int count) { + StringBuilder output = new StringBuilder(); + int i = 0; + do { + int value = input.charAt(i++); + output.append(itoa64.charAt(value & 0x3f)); + if (i < count) + value |= input.charAt(i) << 8; + output.append(itoa64.charAt((value >> 6) & 0x3f)); + if (i++ >= count) + break; + if (i < count) + value |= input.charAt(i) << 16; + output.append(itoa64.charAt((value >> 12) & 0x3f)); + if (i++ >= count) + break; + output.append(itoa64.charAt((value >> 18) & 0x3f)); + } while (i < count); + return output.toString(); + } + + private static String _hash_crypt_private(String password, String setting) { + String output = "*"; + if (!setting.substring(0, 3).equals("$H$")) + return output; + int count_log2 = itoa64.indexOf(setting.charAt(3)); + if (count_log2 < 7 || count_log2 > 30) + return output; + int count = 1 << count_log2; + String salt = setting.substring(4, 12); + if (salt.length() != 8) + return output; + String m1 = md5(salt + password); + String hash = pack(m1); + do { + hash = pack(md5(hash + password)); + } while (--count > 0); + output = setting.substring(0, 12); + output += _hash_encode64(hash, 16); + return output; + } + + private static boolean phpbb_check_hash(String password, String hash) { + return isEqual(hash, _hash_crypt_private(password, hash)); // #1561: fix timing issue + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/PhpFusion.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/PhpFusion.java new file mode 100644 index 0000000000..b97441171b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/PhpFusion.java @@ -0,0 +1,48 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.HashUtils; +import fr.xephi.authme.security.crypts.description.AsciiRestricted; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.Usage; +import fr.xephi.authme.util.RandomStringUtils; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.UnsupportedEncodingException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +@Recommendation(Usage.DO_NOT_USE) +@AsciiRestricted +public class PhpFusion extends SeparateSaltMethod { + + @Override + public String computeHash(String password, String salt, String name) { + String algo = "HmacSHA256"; + String keyString = HashUtils.sha1(salt); + try { + SecretKeySpec key = new SecretKeySpec(keyString.getBytes("UTF-8"), algo); + Mac mac = Mac.getInstance(algo); + mac.init(key); + byte[] bytes = mac.doFinal(password.getBytes("ASCII")); + StringBuilder hash = new StringBuilder(); + for (byte aByte : bytes) { + String hex = Integer.toHexString(0xFF & aByte); + if (hex.length() == 1) { + hash.append('0'); + } + hash.append(hex); + } + return hash.toString(); + } catch (UnsupportedEncodingException | InvalidKeyException | NoSuchAlgorithmException e) { + throw new UnsupportedOperationException("Cannot create PHPFUSION hash for " + name, e); + } + } + + @Override + public String generateSalt() { + return RandomStringUtils.generateHex(12); + } + + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/RoyalAuth.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/RoyalAuth.java new file mode 100644 index 0000000000..9f55743803 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/RoyalAuth.java @@ -0,0 +1,19 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.HashUtils; +import fr.xephi.authme.security.MessageDigestAlgorithm; + +import java.security.MessageDigest; + +public class RoyalAuth extends UnsaltedMethod { + + @Override + public String computeHash(String password) { + MessageDigest algorithm = HashUtils.getDigest(MessageDigestAlgorithm.SHA512); + for (int i = 0; i < 25; ++i) { + password = HashUtils.hash(password, algorithm); + } + return password; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Salted2Md5.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Salted2Md5.java new file mode 100644 index 0000000000..3d2166a75a --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Salted2Md5.java @@ -0,0 +1,37 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.crypts.description.HasSalt; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.SaltType; +import fr.xephi.authme.security.crypts.description.Usage; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import fr.xephi.authme.util.RandomStringUtils; + +import javax.inject.Inject; + +import static fr.xephi.authme.security.HashUtils.md5; + +@Recommendation(Usage.ACCEPTABLE) // presuming that length is something sensible (>= 8) +@HasSalt(value = SaltType.TEXT) // length defined by the doubleMd5SaltLength setting +public class Salted2Md5 extends SeparateSaltMethod { + + private final int saltLength; + + @Inject + public Salted2Md5(Settings settings) { + saltLength = settings.getProperty(SecuritySettings.DOUBLE_MD5_SALT_LENGTH); + } + + @Override + public String computeHash(String password, String salt, String name) { + return md5(md5(password) + salt); + } + + @Override + public String generateSalt() { + return RandomStringUtils.generateHex(saltLength); + } + + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/SaltedSha512.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/SaltedSha512.java new file mode 100644 index 0000000000..b5578b93b5 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/SaltedSha512.java @@ -0,0 +1,20 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.HashUtils; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.Usage; +import fr.xephi.authme.util.RandomStringUtils; + +@Recommendation(Usage.RECOMMENDED) +public class SaltedSha512 extends SeparateSaltMethod { + + @Override + public String computeHash(String password, String salt, String name) { + return HashUtils.sha512(password + salt); + } + + @Override + public String generateSalt() { + return RandomStringUtils.generateHex(32); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/SeparateSaltMethod.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/SeparateSaltMethod.java new file mode 100644 index 0000000000..c0ec13dd74 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/SeparateSaltMethod.java @@ -0,0 +1,32 @@ +package fr.xephi.authme.security.crypts; + +import static fr.xephi.authme.security.HashUtils.isEqual; + +/** + * Common supertype for encryption methods which store their salt separately from the hash. + */ +public abstract class SeparateSaltMethod implements EncryptionMethod { + + @Override + public abstract String computeHash(String password, String salt, String name); + + @Override + public HashedPassword computeHash(String password, String name) { + String salt = generateSalt(); + return new HashedPassword(computeHash(password, salt, name), salt); + } + + @Override + public abstract String generateSalt(); + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String name) { + return isEqual(hashedPassword.getHash(), computeHash(password, hashedPassword.getSalt(), null)); + } + + @Override + public boolean hasSeparateSalt() { + return true; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Sha1.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Sha1.java new file mode 100644 index 0000000000..6d095b4a21 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Sha1.java @@ -0,0 +1,16 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.HashUtils; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.Usage; + +@Deprecated +@Recommendation(Usage.DEPRECATED) +public class Sha1 extends UnsaltedMethod { + + @Override + public String computeHash(String password) { + return HashUtils.sha1(password); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Sha256.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Sha256.java new file mode 100644 index 0000000000..ce6b254928 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Sha256.java @@ -0,0 +1,29 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.Usage; + +import static fr.xephi.authme.security.HashUtils.isEqual; +import static fr.xephi.authme.security.HashUtils.sha256; + +@Recommendation(Usage.RECOMMENDED) +public class Sha256 extends HexSaltedMethod { + + @Override + public String computeHash(String password, String salt, String name) { + return "$SHA$" + salt + "$" + sha256(sha256(password) + salt); + } + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String name) { + String hash = hashedPassword.getHash(); + String[] line = hash.split("\\$"); + return line.length == 4 && isEqual(hash, computeHash(password, line[2], name)); + } + + @Override + public int getSaltLength() { + return 16; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Sha512.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Sha512.java new file mode 100644 index 0000000000..36dc5a342e --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Sha512.java @@ -0,0 +1,16 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.HashUtils; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.Usage; + +@Deprecated +@Recommendation(Usage.DEPRECATED) +public class Sha512 extends UnsaltedMethod { + + @Override + public String computeHash(String password) { + return HashUtils.sha512(password); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Smf.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Smf.java new file mode 100644 index 0000000000..19193d633e --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Smf.java @@ -0,0 +1,51 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.HashUtils; +import fr.xephi.authme.security.crypts.description.HasSalt; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.SaltType; +import fr.xephi.authme.security.crypts.description.Usage; +import fr.xephi.authme.util.RandomStringUtils; + +import java.util.Locale; + +import static fr.xephi.authme.security.HashUtils.isEqual; + +/** + * Hashing algorithm for SMF forums. + *

+ * The hash algorithm is {@code sha1(strtolower($username) . $password)}. However, an additional four-character + * salt is generated for each user, used to generate the login cookie. Therefore, this implementation generates a salt + * and declares that it requires a separate salt (the SMF members table has a not-null constraint on the salt column). + * + * @see Simple Machines Forum + */ +@Recommendation(Usage.DO_NOT_USE) +@HasSalt(SaltType.USERNAME) +public class Smf implements EncryptionMethod { + + @Override + public HashedPassword computeHash(String password, String name) { + return new HashedPassword(computeHash(password, null, name), generateSalt()); + } + + @Override + public String computeHash(String password, String salt, String name) { + return HashUtils.sha1(name.toLowerCase(Locale.ROOT) + password); + } + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String name) { + return isEqual(hashedPassword.getHash(), computeHash(password, null, name)); + } + + @Override + public String generateSalt() { + return RandomStringUtils.generate(4); + } + + @Override + public boolean hasSeparateSalt() { + return true; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/TwoFactor.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/TwoFactor.java new file mode 100644 index 0000000000..67b22c7807 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/TwoFactor.java @@ -0,0 +1,140 @@ +package fr.xephi.authme.security.crypts; + +import com.google.common.escape.Escaper; +import com.google.common.io.BaseEncoding; +import com.google.common.net.UrlEscapers; +import com.google.common.primitives.Ints; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.security.crypts.description.HasSalt; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.SaltType; +import fr.xephi.authme.security.crypts.description.Usage; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Arrays; +import java.util.Calendar; +import java.util.concurrent.TimeUnit; + +/** + * Two factor authentication. + * + * @see Original source + */ +@Recommendation(Usage.DOES_NOT_WORK) +@HasSalt(SaltType.NONE) +public class TwoFactor extends UnsaltedMethod { + + private static final int SCRET_BYTE = 10; + private static final int SCRATCH_CODES = 5; + private static final int BYTES_PER_SCRATCH_CODE = 4; + + private static final int TIME_PRECISION = 3; + private static final String CRYPTO_ALGO = "HmacSHA1"; + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(TwoFactor.class); + + /** + * Creates a link to a QR barcode with the provided secret. + * + * @param user the player's name + * @param host the server host + * @param secret the TOTP secret + * @return URL leading to a QR code + */ + public static String getQrBarcodeUrl(String user, String host, String secret) { + String format = "https://www.google.com/chart?chs=130x130&chld=M%%7C0&cht=qr&chl=" + + "otpauth://totp/" + + "%s@%s%%3Fsecret%%3D%s"; + Escaper urlEscaper = UrlEscapers.urlFragmentEscaper(); + return String.format(format, urlEscaper.escape(user), urlEscaper.escape(host), secret); + } + + @Override + public String computeHash(String password) { + // Allocating the buffer + byte[] buffer = new byte[SCRET_BYTE + SCRATCH_CODES * BYTES_PER_SCRATCH_CODE]; + + // Filling the buffer with random numbers. + // Notice: you want to reuse the same random generator + // while generating larger random number sequences. + new SecureRandom().nextBytes(buffer); + + // Getting the key and converting it to Base32 + byte[] secretKey = Arrays.copyOf(buffer, SCRET_BYTE); + return BaseEncoding.base32().encode(secretKey); + } + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String name) { + try { + return checkPassword(hashedPassword.getHash(), password); + } catch (Exception e) { + logger.logException("Failed to verify two auth code:", e); + return false; + } + } + + private boolean checkPassword(String secretKey, String userInput) + throws NoSuchAlgorithmException, InvalidKeyException { + Integer code = Ints.tryParse(userInput); + if (code == null) { + //code is not an integer + return false; + } + + long currentTime = Calendar.getInstance().getTimeInMillis() / TimeUnit.SECONDS.toMillis(30); + return checkCode(secretKey, code, currentTime); + } + + private boolean checkCode(String secret, long code, long t) throws NoSuchAlgorithmException, InvalidKeyException { + byte[] decodedKey = BaseEncoding.base32().decode(secret); + + // Window is used to check codes generated in the near past. + // You can use this value to tune how far you're willing to go. + int window = TIME_PRECISION; + for (int i = -window; i <= window; ++i) { + long hash = verifyCode(decodedKey, t + i); + + if (hash == code) { + return true; + } + } + + // The validation code is invalid. + return false; + } + + private int verifyCode(byte[] key, long t) throws NoSuchAlgorithmException, InvalidKeyException { + byte[] data = new byte[8]; + long value = t; + for (int i = 8; i-- > 0; value >>>= 8) { + data[i] = (byte) value; + } + + SecretKeySpec signKey = new SecretKeySpec(key, CRYPTO_ALGO); + Mac mac = Mac.getInstance(CRYPTO_ALGO); + mac.init(signKey); + byte[] hash = mac.doFinal(data); + + int offset = hash[20 - 1] & 0xF; + + // We're using a long because Java hasn't got unsigned int. + long truncatedHash = 0; + for (int i = 0; i < 4; ++i) { + truncatedHash <<= 8; + // We are dealing with signed bytes: + // we just keep the first byte. + truncatedHash |= (hash[offset + i] & 0xFF); + } + + truncatedHash &= 0x7FFF_FFFF; + truncatedHash %= 1_000_000; + + return (int) truncatedHash; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/UnsaltedMethod.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/UnsaltedMethod.java new file mode 100644 index 0000000000..33815ec77a --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/UnsaltedMethod.java @@ -0,0 +1,43 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.crypts.description.HasSalt; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.SaltType; +import fr.xephi.authme.security.crypts.description.Usage; + +import static fr.xephi.authme.security.HashUtils.isEqual; + +/** + * Common type for encryption methods which do not use any salt whatsoever. + */ +@Recommendation(Usage.DO_NOT_USE) +@HasSalt(SaltType.NONE) +public abstract class UnsaltedMethod implements EncryptionMethod { + + public abstract String computeHash(String password); + + @Override + public HashedPassword computeHash(String password, String name) { + return new HashedPassword(computeHash(password)); + } + + @Override + public String computeHash(String password, String salt, String name) { + return computeHash(password); + } + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String name) { + return isEqual(hashedPassword.getHash(), computeHash(password)); + } + + @Override + public String generateSalt() { + return null; + } + + @Override + public boolean hasSeparateSalt() { + return false; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/UsernameSaltMethod.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/UsernameSaltMethod.java new file mode 100644 index 0000000000..f5930fcf5a --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/UsernameSaltMethod.java @@ -0,0 +1,41 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.crypts.description.HasSalt; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.SaltType; +import fr.xephi.authme.security.crypts.description.Usage; + +import static fr.xephi.authme.security.HashUtils.isEqual; + +/** + * Common supertype of encryption methods that use a player's username + * (or something based on it) as embedded salt. + */ +@Recommendation(Usage.DO_NOT_USE) +@HasSalt(SaltType.USERNAME) +public abstract class UsernameSaltMethod implements EncryptionMethod { + + @Override + public abstract HashedPassword computeHash(String password, String name); + + @Override + public String computeHash(String password, String salt, String name) { + return computeHash(password, name).getHash(); + } + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String name) { + return isEqual(hashedPassword.getHash(), computeHash(password, name).getHash()); + } + + @Override + public String generateSalt() { + return null; + } + + @Override + public boolean hasSeparateSalt() { + return false; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Wbb3.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Wbb3.java new file mode 100644 index 0000000000..8e26463bba --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Wbb3.java @@ -0,0 +1,25 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.crypts.description.HasSalt; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.SaltType; +import fr.xephi.authme.security.crypts.description.Usage; +import fr.xephi.authme.util.RandomStringUtils; + +import static fr.xephi.authme.security.HashUtils.sha1; + +@Recommendation(Usage.ACCEPTABLE) +@HasSalt(value = SaltType.TEXT, length = 40) +public class Wbb3 extends SeparateSaltMethod { + + @Override + public String computeHash(String password, String salt, String name) { + return sha1(salt.concat(sha1(salt.concat(sha1(password))))); + } + + @Override + public String generateSalt() { + return RandomStringUtils.generateHex(40); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Wbb4.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Wbb4.java new file mode 100644 index 0000000000..a55a2d48bf --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Wbb4.java @@ -0,0 +1,74 @@ +package fr.xephi.authme.security.crypts; + +import at.favre.lib.crypto.bcrypt.BCrypt; +import at.favre.lib.crypto.bcrypt.IllegalBCryptFormatException; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.security.crypts.description.HasSalt; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.SaltType; +import fr.xephi.authme.security.crypts.description.Usage; + +import java.security.SecureRandom; + +import static fr.xephi.authme.security.HashUtils.isEqual; +import static fr.xephi.authme.security.crypts.BCryptHasher.BYTES_IN_SALT; +import static fr.xephi.authme.security.crypts.BCryptHasher.SALT_LENGTH_ENCODED; +import static java.nio.charset.StandardCharsets.UTF_8; + +@Recommendation(Usage.RECOMMENDED) +@HasSalt(value = SaltType.TEXT, length = SALT_LENGTH_ENCODED) +public class Wbb4 implements EncryptionMethod { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(Wbb4.class); + private BCryptHasher bCryptHasher = new BCryptHasher(BCrypt.Version.VERSION_2A, 8); + private SecureRandom random = new SecureRandom(); + + @Override + public HashedPassword computeHash(String password, String name) { + byte[] salt = new byte[BYTES_IN_SALT]; + random.nextBytes(salt); + + String hash = hashInternal(password, salt); + return new HashedPassword(hash); + } + + @Override + public String computeHash(String password, String salt, String name) { + return hashInternal(password, salt.getBytes(UTF_8)); + } + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String name) { + try { + BCrypt.HashData hashData = BCrypt.Version.VERSION_2A.parser.parse(hashedPassword.getHash().getBytes(UTF_8)); + byte[] salt = hashData.rawSalt; + String computedHash = hashInternal(password, salt); + return isEqual(hashedPassword.getHash(), computedHash); + } catch (IllegalBCryptFormatException | IllegalArgumentException e) { + logger.logException("Invalid WBB4 hash:", e); + } + return false; + } + + /** + * Hashes the given password with the provided salt twice: hash(hash(password, salt), salt). + * + * @param password the password to hash + * @param rawSalt the salt to use + * @return WBB4-compatible hash + */ + private String hashInternal(String password, byte[] rawSalt) { + return bCryptHasher.hashWithRawSalt(bCryptHasher.hashWithRawSalt(password, rawSalt), rawSalt); + } + + @Override + public String generateSalt() { + return BCryptHasher.generateSalt(); + } + + @Override + public boolean hasSeparateSalt() { + return false; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Whirlpool.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Whirlpool.java new file mode 100644 index 0000000000..1a450d565d --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Whirlpool.java @@ -0,0 +1,399 @@ +package fr.xephi.authme.security.crypts; + +/** + * The Whirlpool hashing function. + *

+ *

+ * References + *

+ *

+ * The Whirlpool algorithm was developed by Paulo S. L. M. Barreto and Vincent Rijmen. + *

+ * See P.S.L.M. Barreto, V. Rijmen, ``The Whirlpool hashing function,'' First + * NESSIE workshop, 2000 (tweaked version, 2003), + * + * + * @author Paulo S.L.M. Barreto + * @author Vincent Rijmen. + * @version 3.0 (2003.03.12) + *

+ * ==================================================================== + * ========= + *

+ * Differences from version 2.1: + *

+ * - Suboptimal diffusion matrix replaced by cir(1, 1, 4, 1, 8, 5, 2, + * 9). + *

+ * ==================================================================== + * ========= + *

+ * Differences from version 2.0: + *

+ * - Generation of ISO/IEC 10118-3 test vectors. - Bug fix: nonzero + * carry was ignored when tallying the data length (this bug apparently + * only manifested itself when feeding data in pieces rather than in a + * single chunk at once). + *

+ * Differences from version 1.0: + *

+ * - Original S-box replaced by the tweaked, hardware-efficient + * version. + *

+ * ==================================================================== + * ========= + *

+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.Usage; + +import java.util.Arrays; + +@Deprecated +@Recommendation(Usage.DEPRECATED) +public class Whirlpool extends UnsaltedMethod { + + /** + * The message digest size (in bits) + */ + public static final int DIGESTBITS = 512; + + /** + * The message digest size (in bytes) + */ + public static final int DIGESTBYTES = DIGESTBITS >>> 3; + + /** + * The number of rounds of the internal dedicated block cipher. + */ + protected static final int R = 10; + + /** + * The substitution box. + */ + private static final String sbox = "\u1823\uc6E8\u87B8\u014F\u36A6\ud2F5\u796F\u9152" + "\u60Bc\u9B8E\uA30c\u7B35\u1dE0\ud7c2\u2E4B\uFE57" + "\u1577\u37E5\u9FF0\u4AdA\u58c9\u290A\uB1A0\u6B85" + "\uBd5d\u10F4\ucB3E\u0567\uE427\u418B\uA77d\u95d8" + "\uFBEE\u7c66\udd17\u479E\ucA2d\uBF07\uAd5A\u8333" + "\u6302\uAA71\uc819\u49d9\uF2E3\u5B88\u9A26\u32B0" + "\uE90F\ud580\uBEcd\u3448\uFF7A\u905F\u2068\u1AAE" + "\uB454\u9322\u64F1\u7312\u4008\uc3Ec\udBA1\u8d3d" + "\u9700\ucF2B\u7682\ud61B\uB5AF\u6A50\u45F3\u30EF" + "\u3F55\uA2EA\u65BA\u2Fc0\udE1c\uFd4d\u9275\u068A" + "\uB2E6\u0E1F\u62d4\uA896\uF9c5\u2559\u8472\u394c" + "\u5E78\u388c\ud1A5\uE261\uB321\u9c1E\u43c7\uFc04" + "\u5199\u6d0d\uFAdF\u7E24\u3BAB\ucE11\u8F4E\uB7EB" + "\u3c81\u94F7\uB913\u2cd3\uE76E\uc403\u5644\u7FA9" + "\u2ABB\uc153\udc0B\u9d6c\u3174\uF646\uAc89\u14E1" + "\u163A\u6909\u70B6\ud0Ed\ucc42\u98A4\u285c\uF886"; + + private static final long[][] C = new long[8][256]; + private static final long[] rc = new long[R + 1]; + + static { + for (int x = 0; x < 256; x++) { + char c = sbox.charAt(x / 2); + long v1 = ((x & 1) == 0) ? c >>> 8 : c & 0xff; + long v2 = v1 << 1; + if (v2 >= 0x100L) { + v2 ^= 0x11dL; + } + long v4 = v2 << 1; + if (v4 >= 0x100L) { + v4 ^= 0x11dL; + } + long v5 = v4 ^ v1; + long v8 = v4 << 1; + if (v8 >= 0x100L) { + v8 ^= 0x11dL; + } + long v9 = v8 ^ v1; + /* + * build the circulant table C[0][x] = S[x].[1, 1, 4, 1, 8, 5, 2, + * 9]: + */ + C[0][x] = (v1 << 56) | (v1 << 48) | (v4 << 40) | (v1 << 32) | (v8 << 24) | (v5 << 16) | (v2 << 8) | (v9); + /* + * build the remaining circulant tables C[t][x] = C[0][x] rotr t + */ + for (int t = 1; t < 8; t++) { + C[t][x] = (C[t - 1][x] >>> 8) | ((C[t - 1][x] << 56)); + } + } + /* + * build the round constants: + */ + rc[0] = 0L; /* + * not used (assigment kept only to properly initialize all + * variables) + */ + for (int r = 1; r <= R; r++) { + int i = 8 * (r - 1); + rc[r] = (C[0][i] & 0xff00000000000000L) ^ (C[1][i + 1] & 0x00ff000000000000L) ^ (C[2][i + 2] & 0x0000ff0000000000L) ^ (C[3][i + 3] & 0x000000ff00000000L) ^ (C[4][i + 4] & 0x00000000ff000000L) ^ (C[5][i + 5] & 0x0000000000ff0000L) ^ (C[6][i + 6] & 0x000000000000ff00L) ^ (C[7][i + 7] & 0x00000000000000ffL); + } + } + + /** + * Global number of hashed bits (256-bit counter). + */ + protected final byte[] bitLength = new byte[32]; + + /** + * Buffer of data to hash. + */ + protected final byte[] buffer = new byte[64]; + + /** + * Current number of bits on the buffer. + */ + protected int bufferBits = 0; + + /** + * Current (possibly incomplete) byte slot on the buffer. + */ + protected int bufferPos = 0; + + /** + * The hashing state. + */ + protected final long[] hash = new long[8]; + protected final long[] K = new long[8]; + protected final long[] L = new long[8]; + protected final long[] block = new long[8]; + protected final long[] state = new long[8]; + + public Whirlpool() { + } + + protected static String display(byte[] array) { + char[] val = new char[2 * array.length]; + String hex = "0123456789ABCDEF"; + for (int i = 0; i < array.length; i++) { + int b = array[i] & 0xff; + val[2 * i] = hex.charAt(b >>> 4); + val[2 * i + 1] = hex.charAt(b & 15); + } + return String.valueOf(val); + } + + /** + * The core Whirlpool transform. + */ + protected void processBuffer() { + /* + * map the buffer to a block: + */ + for (int i = 0, j = 0; i < 8; i++, j += 8) { + block[i] = (((long) buffer[j]) << 56) ^ (((long) buffer[j + 1] & 0xffL) << 48) ^ (((long) buffer[j + 2] & 0xffL) << 40) ^ (((long) buffer[j + 3] & 0xffL) << 32) ^ (((long) buffer[j + 4] & 0xffL) << 24) ^ (((long) buffer[j + 5] & 0xffL) << 16) ^ (((long) buffer[j + 6] & 0xffL) << 8) ^ (((long) buffer[j + 7] & 0xffL)); + } + /* + * compute and apply K^0 to the cipher state: + */ + for (int i = 0; i < 8; i++) { + state[i] = block[i] ^ (K[i] = hash[i]); + } + /* + * iterate over all rounds: + */ + for (int r = 1; r <= R; r++) { + /* + * compute K^r from K^{r-1}: + */ + for (int i = 0; i < 8; i++) { + L[i] = 0L; + for (int t = 0, s = 56; t < 8; t++, s -= 8) { + L[i] ^= C[t][(int) (K[(i - t) & 7] >>> s) & 0xff]; + } + } + for (int i = 0; i < 8; i++) { + K[i] = L[i]; + } + K[0] ^= rc[r]; + /* + * apply the r-th round transformation: + */ + for (int i = 0; i < 8; i++) { + L[i] = K[i]; + for (int t = 0, s = 56; t < 8; t++, s -= 8) { + L[i] ^= C[t][(int) (state[(i - t) & 7] >>> s) & 0xff]; + } + } + for (int i = 0; i < 8; i++) { + state[i] = L[i]; + } + } + /* + * apply the Miyaguchi-Preneel compression function: + */ + for (int i = 0; i < 8; i++) { + hash[i] ^= state[i] ^ block[i]; + } + } + + /** + * Initialize the hashing state. + */ + public void NESSIEinit() { + Arrays.fill(bitLength, (byte) 0); + bufferBits = bufferPos = 0; + buffer[0] = 0; + Arrays.fill(hash, 0L); + } + + /** + * Delivers input data to the hashing algorithm. + * + * @param source plaintext data to hash. + * @param sourceBits how many bits of plaintext to process. + *

+ * This method maintains the invariant: bufferBits < 512 + *

+ */ + public void NESSIEadd(byte[] source, long sourceBits) { + /* + * sourcePos | +-------+-------+------- ||||||||||||||||||||| source + * +-------+-------+------- + * +-------+-------+-------+-------+-------+------- + * |||||||||||||||||||||| buffer + * +-------+-------+-------+-------+-------+------- | bufferPos + */ + int sourcePos = 0; // index of leftmost source byte containing data (1 + // to 8 bits). + int sourceGap = (8 - ((int) sourceBits & 7)) & 7; // space on + // source[sourcePos]. + int bufferRem = bufferBits & 7; // occupied bits on buffer[bufferPos]. + int b; + // tally the length of the added data: + long value = sourceBits; + for (int i = 31, carry = 0; i >= 0; i--) { + carry += (bitLength[i] & 0xff) + ((int) value & 0xff); + bitLength[i] = (byte) carry; + carry >>>= 8; + value >>>= 8; + } + // process data in chunks of 8 bits: + while (sourceBits > 8) { // at least source[sourcePos] and + // source[sourcePos+1] contain data. + // take a byte from the source: + b = ((source[sourcePos] << sourceGap) & 0xff) | ((source[sourcePos + 1] & 0xff) >>> (8 - sourceGap)); + if (b < 0 || b >= 256) { + throw new RuntimeException("LOGIC ERROR"); + } + // process this byte: + buffer[bufferPos++] |= b >>> bufferRem; + bufferBits += 8 - bufferRem; // bufferBits = 8*bufferPos; + if (bufferBits == 512) { + // process data block: + processBuffer(); + // reset buffer: + bufferBits = bufferPos = 0; + } + buffer[bufferPos] = (byte) ((b << (8 - bufferRem)) & 0xff); + bufferBits += bufferRem; + // proceed to remaining data: + sourceBits -= 8; + sourcePos++; + } + // now 0 <= sourceBits <= 8; + // furthermore, all data (if any is left) is in source[sourcePos]. + if (sourceBits > 0) { + b = (source[sourcePos] << sourceGap) & 0xff; // bits are + // left-justified on b. + // process the remaining bits: + buffer[bufferPos] |= b >>> bufferRem; + } else { + b = 0; + } + if (bufferRem + sourceBits < 8) { + // all remaining data fits on buffer[bufferPos], and there still + // remains some space. + bufferBits += (int) sourceBits; + } else { + // buffer[bufferPos] is full: + bufferPos++; + bufferBits += 8 - bufferRem; // bufferBits = 8*bufferPos; + sourceBits -= 8 - bufferRem; + // now 0 <= sourceBits < 8; furthermore, all data is in + // source[sourcePos]. + if (bufferBits == 512) { + // process data block: + processBuffer(); + // reset buffer: + bufferBits = bufferPos = 0; + } + buffer[bufferPos] = (byte) ((b << (8 - bufferRem)) & 0xff); + bufferBits += (int) sourceBits; + } + } + + /** + *

+ * Get the hash value from the hashing state. + *

+ *

+ * This method uses the invariant: bufferBits < 512 + *

+ * @param digest byte[] + */ + public void NESSIEfinalize(byte[] digest) { + // append a '1'-bit: + buffer[bufferPos] |= 0x80 >>> (bufferBits & 7); + bufferPos++; // all remaining bits on the current byte are set to zero. + // pad with zero bits to complete 512N + 256 bits: + if (bufferPos > 32) { + while (bufferPos < 64) { + buffer[bufferPos++] = 0; + } + // process data block: + processBuffer(); + // reset buffer: + bufferPos = 0; + } + while (bufferPos < 32) { + buffer[bufferPos++] = 0; + } + // append bit length of hashed data: + System.arraycopy(bitLength, 0, buffer, 32, 32); + // process data block: + processBuffer(); + // return the completed message digest: + for (int i = 0, j = 0; i < 8; i++, j += 8) { + long h = hash[i]; + digest[j] = (byte) (h >>> 56); + digest[j + 1] = (byte) (h >>> 48); + digest[j + 2] = (byte) (h >>> 40); + digest[j + 3] = (byte) (h >>> 32); + digest[j + 4] = (byte) (h >>> 24); + digest[j + 5] = (byte) (h >>> 16); + digest[j + 6] = (byte) (h >>> 8); + digest[j + 7] = (byte) (h); + } + } + + /** + * Delivers string input data to the hashing algorithm. + * + * @param source plaintext data to hash (ASCII text string). + * This method maintains the invariant: bufferBits < 512 + */ + public void NESSIEadd(String source) { + if (source.length() > 0) { + byte[] data = new byte[source.length()]; + for (int i = 0; i < source.length(); i++) { + data[i] = (byte) source.charAt(i); + } + NESSIEadd(data, 8 * data.length); + } + } + + @Override + public String computeHash(String password) { + byte[] digest = new byte[DIGESTBYTES]; + NESSIEinit(); + NESSIEadd(password); + NESSIEfinalize(digest); + return display(digest); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Wordpress.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Wordpress.java new file mode 100644 index 0000000000..f70c09496e --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/Wordpress.java @@ -0,0 +1,123 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.HashUtils; +import fr.xephi.authme.security.MessageDigestAlgorithm; +import fr.xephi.authme.security.crypts.description.HasSalt; +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.SaltType; +import fr.xephi.authme.security.crypts.description.Usage; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.SecureRandom; +import java.util.Arrays; + +import static fr.xephi.authme.security.HashUtils.isEqual; + +@Recommendation(Usage.ACCEPTABLE) +@HasSalt(value = SaltType.TEXT, length = 9) +// Note ljacqu 20151228: Wordpress is actually a salted algorithm but salt generation is handled internally +// and isn't exposed to the outside, so we treat it as an unsalted implementation +public class Wordpress extends UnsaltedMethod { + + private static final String itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + private final SecureRandom randomGen = new SecureRandom(); + + private String encode64(byte[] src, int count) { + int i, value; + StringBuilder output = new StringBuilder(); + i = 0; + + if (src.length < count) { + byte[] t = new byte[count]; + System.arraycopy(src, 0, t, 0, src.length); + Arrays.fill(t, src.length, count - 1, (byte) 0); + src = t; + } + + do { + value = src[i] + (src[i] < 0 ? 256 : 0); + ++i; + output.append(itoa64.charAt(value & 63)); + if (i < count) { + value |= (src[i] + (src[i] < 0 ? 256 : 0)) << 8; + } + output.append(itoa64.charAt((value >> 6) & 63)); + if (i++ >= count) { + break; + } + if (i < count) { + value |= (src[i] + (src[i] < 0 ? 256 : 0)) << 16; + } + output.append(itoa64.charAt((value >> 12) & 63)); + if (i++ >= count) { + break; + } + output.append(itoa64.charAt((value >> 18) & 63)); + } while (i < count); + return output.toString(); + } + + private String crypt(String password, String setting) { + String output = "*0"; + if (((setting.length() < 2) ? setting : setting.substring(0, 2)).equalsIgnoreCase(output)) { + output = "*1"; + } + String id = (setting.length() < 3) ? setting : setting.substring(0, 3); + if (!(id.equals("$P$") || id.equals("$H$"))) { + return output; + } + int countLog2 = itoa64.indexOf(setting.charAt(3)); + if (countLog2 < 7 || countLog2 > 30) { + return output; + } + int count = 1 << countLog2; + String salt = setting.substring(4, 4 + 8); + if (salt.length() != 8) { + return output; + } + MessageDigest md = HashUtils.getDigest(MessageDigestAlgorithm.MD5); + byte[] pass = stringToUtf8(password); + byte[] hash = md.digest(stringToUtf8(salt + password)); + do { + byte[] t = new byte[hash.length + pass.length]; + System.arraycopy(hash, 0, t, 0, hash.length); + System.arraycopy(pass, 0, t, hash.length, pass.length); + hash = md.digest(t); + } while (--count > 0); + output = setting.substring(0, 12); + output += encode64(hash, 16); + return output; + } + + private String gensaltPrivate(byte[] input) { + String output = "$P$"; + int iterationCountLog2 = 8; + output += itoa64.charAt(Math.min(iterationCountLog2 + 5, 30)); + output += encode64(input, 6); + return output; + } + + private byte[] stringToUtf8(String string) { + try { + return string.getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new UnsupportedOperationException("This system doesn't support UTF-8!", e); + } + } + + @Override + public String computeHash(String password) { + byte random[] = new byte[6]; + randomGen.nextBytes(random); + return crypt(password, gensaltPrivate(stringToUtf8(new String(random)))); + } + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String name) { + String hash = hashedPassword.getHash(); + String comparedHash = crypt(password, hash); + return isEqual(hash, comparedHash); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/XAuth.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/XAuth.java new file mode 100644 index 0000000000..3cd4ceab01 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/XAuth.java @@ -0,0 +1,45 @@ +package fr.xephi.authme.security.crypts; + +import fr.xephi.authme.security.crypts.description.Recommendation; +import fr.xephi.authme.security.crypts.description.Usage; + +import java.util.Locale; + +import static fr.xephi.authme.security.HashUtils.isEqual; + +@Recommendation(Usage.RECOMMENDED) +public class XAuth extends HexSaltedMethod { + + private static String getWhirlpool(String message) { + Whirlpool w = new Whirlpool(); + byte[] digest = new byte[Whirlpool.DIGESTBYTES]; + w.NESSIEinit(); + w.NESSIEadd(message); + w.NESSIEfinalize(digest); + return Whirlpool.display(digest); + } + + @Override + public String computeHash(String password, String salt, String name) { + String hash = getWhirlpool(salt + password).toLowerCase(Locale.ROOT); + int saltPos = password.length() >= hash.length() ? hash.length() - 1 : password.length(); + return hash.substring(0, saltPos) + salt + hash.substring(saltPos); + } + + @Override + public boolean comparePassword(String password, HashedPassword hashedPassword, String name) { + String hash = hashedPassword.getHash(); + int saltPos = password.length() >= hash.length() ? hash.length() - 1 : password.length(); + if (saltPos + 12 > hash.length()) { + return false; + } + String salt = hash.substring(saltPos, saltPos + 12); + return isEqual(hash, computeHash(password, salt, name)); + } + + @Override + public int getSaltLength() { + return 12; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/XfBCrypt.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/XfBCrypt.java new file mode 100644 index 0000000000..749b5f57fb --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/XfBCrypt.java @@ -0,0 +1,35 @@ +package fr.xephi.authme.security.crypts; + +import at.favre.lib.crypto.bcrypt.BCrypt; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class XfBCrypt extends BCryptBasedHash { + + public static final String SCHEME_CLASS = "XenForo_Authentication_Core12"; + private static final Pattern HASH_PATTERN = Pattern.compile("\"hash\";s.*\"(.*)?\""); + + XfBCrypt() { + super(new BCryptHasher(BCrypt.Version.VERSION_2A, 10)); + } + + /** + * Extracts the password hash from the given BLOB. + * + * @param blob the blob to process + * @return the extracted hash + */ + public static String getHashFromBlob(byte[] blob) { + String line = new String(blob); + Matcher m = HASH_PATTERN.matcher(line); + if (m.find()) { + return m.group(1); + } + return "*"; // what? + } + + public static String serializeHash(String hash) { + return "a:1:{s:4:\"hash\";s:" + hash.length() + ":\""+hash+"\";}"; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/AsciiRestricted.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/AsciiRestricted.java new file mode 100644 index 0000000000..bf179fff28 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/AsciiRestricted.java @@ -0,0 +1,15 @@ +package fr.xephi.authme.security.crypts.description; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Denotes a hashing algorithm that is restricted to the ASCII charset. + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface AsciiRestricted { + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/HasSalt.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/HasSalt.java new file mode 100644 index 0000000000..0723a4ddbb --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/HasSalt.java @@ -0,0 +1,30 @@ +package fr.xephi.authme.security.crypts.description; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Describes the type of salt the encryption algorithm uses. This is purely for documentation + * purposes and is ignored by the code. + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface HasSalt { + + /** + * The type of the salt. + * + * @return The salt type + */ + SaltType value(); + + /** + * For text salts, the length of the salt. + * + * @return The length of the salt the algorithm uses, or 0 if not defined or not applicable. + */ + int length() default 0; + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/Recommendation.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/Recommendation.java new file mode 100644 index 0000000000..4b832a6816 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/Recommendation.java @@ -0,0 +1,24 @@ +package fr.xephi.authme.security.crypts.description; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Annotation to mark a hash algorithm with the usage recommendation. + * + * @see Usage + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface Recommendation { + + /** + * The recommendation for using the hash algorithm. + * + * @return The recommended usage + */ + Usage value(); + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/SaltType.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/SaltType.java new file mode 100644 index 0000000000..40b923fa96 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/SaltType.java @@ -0,0 +1,17 @@ +package fr.xephi.authme.security.crypts.description; + +/** + * The type of salt used by an encryption algorithm. + */ +public enum SaltType { + + /** Random, newly generated text. */ + TEXT, + + /** Salt is based on the username, including variations and repetitions thereof. */ + USERNAME, + + /** No salt. */ + NONE + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/Usage.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/Usage.java new file mode 100644 index 0000000000..9ccc52c4f5 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/crypts/description/Usage.java @@ -0,0 +1,29 @@ +package fr.xephi.authme.security.crypts.description; + +/** + * Usage recommendation that can be provided for a hash algorithm. + *

+ * Use the following rules of thumb: + *

    + *
  • Hashes using MD5 may be {@link #ACCEPTABLE} but never {@link #RECOMMENDED}.
  • + *
  • Hashes using no salt or one based on the username should be {@link #DO_NOT_USE}.
  • + *
+ */ +public enum Usage { + + /** The hash algorithm appears to be cryptographically secure and is one of the algorithms recommended by AuthMe. */ + RECOMMENDED, + + /** There are safer algorithms that can be chosen but using the algorithm is generally OK. */ + ACCEPTABLE, + + /** Hash algorithm is not recommended to be used. Use only if required by another system. */ + DO_NOT_USE, + + /** Algorithm that is or will be no longer supported actively. */ + DEPRECATED, + + /** The algorithm does not work properly; do not use. */ + DOES_NOT_WORK + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/totp/GenerateTotpService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/totp/GenerateTotpService.java new file mode 100644 index 0000000000..8c689dde00 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/totp/GenerateTotpService.java @@ -0,0 +1,70 @@ +package fr.xephi.authme.security.totp; + +import fr.xephi.authme.initialization.HasCleanup; +import fr.xephi.authme.security.totp.TotpAuthenticator.TotpGenerationResult; +import fr.xephi.authme.util.expiring.ExpiringMap; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.Locale; +import java.util.concurrent.TimeUnit; + +/** + * Handles the generation of new TOTP secrets for players. + */ +public class GenerateTotpService implements HasCleanup { + + private static final int NEW_TOTP_KEY_EXPIRATION_MINUTES = 5; + + private final ExpiringMap totpKeys; + + @Inject + private TotpAuthenticator totpAuthenticator; + + GenerateTotpService() { + this.totpKeys = new ExpiringMap<>(NEW_TOTP_KEY_EXPIRATION_MINUTES, TimeUnit.MINUTES); + } + + /** + * Generates a new TOTP key and returns the corresponding QR code. + * + * @param player the player to save the TOTP key for + * @return TOTP generation result + */ + public TotpGenerationResult generateTotpKey(Player player) { + TotpGenerationResult credentials = totpAuthenticator.generateTotpKey(player); + totpKeys.put(player.getName().toLowerCase(Locale.ROOT), credentials); + return credentials; + } + + /** + * Returns the generated TOTP secret of a player, if available and not yet expired. + * + * @param player the player to retrieve the TOTP key for + * @return TOTP generation result + */ + public TotpGenerationResult getGeneratedTotpKey(Player player) { + return totpKeys.get(player.getName().toLowerCase(Locale.ROOT)); + } + + public void removeGenerateTotpKey(Player player) { + totpKeys.remove(player.getName().toLowerCase(Locale.ROOT)); + } + + /** + * Returns whether the given totp code is correct for the generated TOTP key of the player. + * + * @param player the player to verify the code for + * @param totpCode the totp code to verify with the generated secret + * @return true if the input code is correct, false if the code is invalid or no unexpired totp key is available + */ + public boolean isTotpCodeCorrectForGeneratedTotpKey(Player player, String totpCode) { + TotpGenerationResult totpDetails = totpKeys.get(player.getName().toLowerCase(Locale.ROOT)); + return totpDetails != null && totpAuthenticator.checkCode(player.getName(), totpDetails.getTotpKey(), totpCode); + } + + @Override + public void performCleanup() { + totpKeys.removeExpiredEntries(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/totp/TotpAuthenticator.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/totp/TotpAuthenticator.java new file mode 100644 index 0000000000..2c787306cb --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/security/totp/TotpAuthenticator.java @@ -0,0 +1,98 @@ +package fr.xephi.authme.security.totp; + +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Table; +import com.google.common.primitives.Ints; +import com.warrenstrange.googleauth.GoogleAuthenticator; +import com.warrenstrange.googleauth.GoogleAuthenticatorKey; +import com.warrenstrange.googleauth.GoogleAuthenticatorQRGenerator; +import com.warrenstrange.googleauth.IGoogleAuthenticator; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.initialization.HasCleanup; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.PluginSettings; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.Locale; + +import static fr.xephi.authme.util.Utils.MILLIS_PER_MINUTE; + +/** + * Provides TOTP functions (wrapping a third-party TOTP implementation). + */ +public class TotpAuthenticator implements HasCleanup { + + private static final int CODE_RETENTION_MINUTES = 5; + + private final IGoogleAuthenticator authenticator; + private final Settings settings; + private final Table usedCodes = HashBasedTable.create(); + + @Inject + TotpAuthenticator(Settings settings) { + this.authenticator = createGoogleAuthenticator(); + this.settings = settings; + } + + /** + * @return new Google Authenticator instance + */ + protected IGoogleAuthenticator createGoogleAuthenticator() { + return new GoogleAuthenticator(); + } + + public boolean checkCode(PlayerAuth auth, String totpCode) { + return checkCode(auth.getNickname(), auth.getTotpKey(), totpCode); + } + + /** + * Returns whether the given input code matches for the provided TOTP key. + * + * @param playerName the player name + * @param totpKey the key to check with + * @param inputCode the input code to verify + * @return true if code is valid, false otherwise + */ + public boolean checkCode(String playerName, String totpKey, String inputCode) { + String nameLower = playerName.toLowerCase(Locale.ROOT); + Integer totpCode = Ints.tryParse(inputCode); + if (totpCode != null && !usedCodes.contains(nameLower, totpCode) + && authenticator.authorize(totpKey, totpCode)) { + usedCodes.put(nameLower, totpCode, System.currentTimeMillis()); + return true; + } + return false; + } + + public TotpGenerationResult generateTotpKey(Player player) { + GoogleAuthenticatorKey credentials = authenticator.createCredentials(); + String qrCodeUrl = GoogleAuthenticatorQRGenerator.getOtpAuthURL( + settings.getProperty(PluginSettings.SERVER_NAME), player.getName(), credentials); + return new TotpGenerationResult(credentials.getKey(), qrCodeUrl); + } + + @Override + public void performCleanup() { + long threshold = System.currentTimeMillis() - CODE_RETENTION_MINUTES * MILLIS_PER_MINUTE; + usedCodes.values().removeIf(value -> value < threshold); + } + + public static final class TotpGenerationResult { + private final String totpKey; + private final String authenticatorQrCodeUrl; + + public TotpGenerationResult(String totpKey, String authenticatorQrCodeUrl) { + this.totpKey = totpKey; + this.authenticatorQrCodeUrl = authenticatorQrCodeUrl; + } + + public String getTotpKey() { + return totpKey; + } + + public String getAuthenticatorQrCodeUrl() { + return authenticatorQrCodeUrl; + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/AntiBotService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/AntiBotService.java new file mode 100644 index 0000000000..f902a28fab --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/AntiBotService.java @@ -0,0 +1,199 @@ +package fr.xephi.authme.service; + +import com.github.Anon8281.universalScheduler.scheduling.tasks.MyScheduledTask; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.permission.AdminPermission; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.ProtectionSettings; +import fr.xephi.authme.util.AtomicIntervalCounter; + +import javax.inject.Inject; +import java.util.Locale; +import java.util.concurrent.CopyOnWriteArrayList; + +import static fr.xephi.authme.service.BukkitService.TICKS_PER_MINUTE; +import static fr.xephi.authme.service.BukkitService.TICKS_PER_SECOND; + +/** + * The AntiBot Service Management class. + */ +public class AntiBotService implements SettingsDependent { + + // Instances + private final Messages messages; + private final PermissionsManager permissionsManager; + private final BukkitService bukkitService; + private final CopyOnWriteArrayList antibotKicked = new CopyOnWriteArrayList<>(); + // Settings + private int duration; + // Service status + private AntiBotStatus antiBotStatus; + private boolean startup; + private MyScheduledTask disableTask; + private AtomicIntervalCounter flaggedCounter; + + @Inject + AntiBotService(Settings settings, Messages messages, PermissionsManager permissionsManager, + BukkitService bukkitService) { + // Instances + this.messages = messages; + this.permissionsManager = permissionsManager; + this.bukkitService = bukkitService; + // Initial status + disableTask = null; + antiBotStatus = AntiBotStatus.DISABLED; + startup = true; + // Load settings and start if required + reload(settings); + } + + @Override + public void reload(Settings settings) { + // Load settings + duration = settings.getProperty(ProtectionSettings.ANTIBOT_DURATION); + int sensibility = settings.getProperty(ProtectionSettings.ANTIBOT_SENSIBILITY); + int interval = settings.getProperty(ProtectionSettings.ANTIBOT_INTERVAL); + flaggedCounter = new AtomicIntervalCounter(sensibility, interval * 1000); + + // Stop existing protection + stopProtection(); + antiBotStatus = AntiBotStatus.DISABLED; + + // If antibot is disabled, just stop + if (!settings.getProperty(ProtectionSettings.ENABLE_ANTIBOT)) { + return; + } + + // Bot activation task + Runnable enableTask = () -> antiBotStatus = AntiBotStatus.LISTENING; + + // Delay the schedule on first start + if (startup) { + int delay = settings.getProperty(ProtectionSettings.ANTIBOT_DELAY); + bukkitService.scheduleSyncDelayedTask(enableTask, (long) delay * TICKS_PER_SECOND); + startup = false; + } else { + enableTask.run(); + } + } + + /** + * Transitions the anti bot service to an active status. + */ + private void startProtection() { + if (antiBotStatus == AntiBotStatus.ACTIVE) { + return; // Already activating/active + } + if (disableTask != null) { + disableTask.cancel(); + } + // Schedule auto-disable + disableTask = bukkitService.runTaskLater(this::stopProtection, (long) duration * TICKS_PER_MINUTE); + antiBotStatus = AntiBotStatus.ACTIVE; + bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(() -> { + // Inform admins + bukkitService.getOnlinePlayers().stream() + .filter(player -> permissionsManager.hasPermission(player, AdminPermission.ANTIBOT_MESSAGES)) + .forEach(player -> messages.send(player, MessageKey.ANTIBOT_AUTO_ENABLED_MESSAGE)); + }); + } + + /** + * Transitions the anti bot service from active status back to listening. + */ + private void stopProtection() { + if (antiBotStatus != AntiBotStatus.ACTIVE) { + return; + } + + // Change status + antiBotStatus = AntiBotStatus.LISTENING; + flaggedCounter.reset(); + antibotKicked.clear(); + + // Cancel auto-disable task + disableTask.cancel(); + disableTask = null; + + // Inform admins + String durationString = Integer.toString(duration); + bukkitService.getOnlinePlayers().stream() + .filter(player -> permissionsManager.hasPermission(player, AdminPermission.ANTIBOT_MESSAGES)) + .forEach(player -> messages.send(player, MessageKey.ANTIBOT_AUTO_DISABLED_MESSAGE, durationString)); + } + + /** + * Returns the status of the AntiBot service. + * + * @return status of the antibot service + */ + public AntiBotStatus getAntiBotStatus() { + return antiBotStatus; + } + + /** + * Allows to override the status of the protection. + * + * @param started the new protection status + */ + public void overrideAntiBotStatus(boolean started) { + if (antiBotStatus != AntiBotStatus.DISABLED) { + if (started) { + startProtection(); + } else { + stopProtection(); + } + } + } + + /** + * Returns if a player should be kicked due to antibot service. + * + * @return if the player should be kicked + */ + public boolean shouldKick() { + if (antiBotStatus == AntiBotStatus.DISABLED) { + return false; + } else if (antiBotStatus == AntiBotStatus.ACTIVE) { + return true; + } + + if (flaggedCounter.handle()) { + startProtection(); + return true; + } + return false; + } + + /** + * Returns whether the player was kicked because of activated antibot. The list is reset + * when antibot is deactivated. + * + * @param name the name to check + * + * @return true if the given name has been kicked because of Antibot + */ + public boolean wasPlayerKicked(String name) { + return antibotKicked.contains(name.toLowerCase(Locale.ROOT)); + } + + /** + * Adds a name to the list of players kicked by antibot. Should only be used when a player + * is determined to be kicked because of failed antibot verification. + * + * @param name the name to add + */ + public void addPlayerKick(String name) { + antibotKicked.addIfAbsent(name.toLowerCase(Locale.ROOT)); + } + + public enum AntiBotStatus { + LISTENING, + DISABLED, + ACTIVE + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/BackupService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/BackupService.java new file mode 100644 index 0000000000..3e570c3d5f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/BackupService.java @@ -0,0 +1,219 @@ +package fr.xephi.authme.service; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.datasource.DataSourceType; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.mail.EmailService; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.BackupSettings; +import fr.xephi.authme.settings.properties.DatabaseSettings; +import fr.xephi.authme.util.FileUtils; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Locale; + +import static fr.xephi.authme.util.Utils.logAndSendMessage; +import static fr.xephi.authme.util.Utils.logAndSendWarning; + +/** + * Performs a backup of the data source. + */ +public class BackupService { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(EmailService.class); + + private final File dataFolder; + private final File backupFolder; + private final Settings settings; + + + /** + * Constructor. + * + * @param dataFolder the data folder + * @param settings the plugin settings + */ + @Inject + public BackupService(@DataFolder File dataFolder, Settings settings) { + this.dataFolder = dataFolder; + this.backupFolder = new File(dataFolder, "backups"); + this.settings = settings; + } + + /** + * Performs a backup for the given reason. + * + * @param cause backup reason + */ + public void doBackup(BackupCause cause) { + doBackup(cause, null); + } + + /** + * Performs a backup for the given reason. + * + * @param cause backup reason + * @param sender the command sender (nullable) + */ + public void doBackup(BackupCause cause, CommandSender sender) { + if (!settings.getProperty(BackupSettings.ENABLED)) { + // Print a warning if the backup was requested via command or by another plugin + if (cause == BackupCause.COMMAND || cause == BackupCause.OTHER) { + logAndSendWarning(sender, + "Can't perform a backup: disabled in configuration. Cause of the backup: " + cause.name()); + } + return; + } else if (BackupCause.START == cause && !settings.getProperty(BackupSettings.ON_SERVER_START) + || BackupCause.STOP == cause && !settings.getProperty(BackupSettings.ON_SERVER_STOP)) { + // Don't perform backup on start or stop if so configured + return; + } + + // Do backup and check return value! + if (doBackup()) { + logAndSendMessage(sender, + "A backup has been performed successfully. Cause of the backup: " + cause.name()); + } else { + logAndSendWarning(sender, "Error while performing a backup! Cause of the backup: " + cause.name()); + } + } + + private boolean doBackup() { + DataSourceType dataSourceType = settings.getProperty(DatabaseSettings.BACKEND); + switch (dataSourceType) { + case MYSQL: + return performMySqlBackup(); + case SQLITE: + String dbName = settings.getProperty(DatabaseSettings.MYSQL_DATABASE); + return performFileBackup(dbName + ".db"); + case H2: + String h2dbName = settings.getProperty(DatabaseSettings.MYSQL_DATABASE); + return performFileBackup(h2dbName + ".mv.db"); + default: + logger.warning("Unknown data source type '" + dataSourceType + "' for backup"); + } + + return false; + } + + /** + * Performs a backup for the MySQL data source. + * + * @return true if successful, false otherwise + */ + private boolean performMySqlBackup() { + FileUtils.createDirectory(backupFolder); + File sqlBackupFile = constructBackupFile("sql"); + + String backupWindowsPath = settings.getProperty(BackupSettings.MYSQL_WINDOWS_PATH); + boolean isUsingWindows = useWindowsCommand(backupWindowsPath); + String backupCommand = isUsingWindows + ? backupWindowsPath + "\\bin\\mysqldump.exe" + buildMysqlDumpArguments(sqlBackupFile) + : "mysqldump" + buildMysqlDumpArguments(sqlBackupFile); + + try { + Process runtimeProcess = Runtime.getRuntime().exec(backupCommand); + int processComplete = runtimeProcess.waitFor(); + if (processComplete == 0) { + logger.info("Backup created successfully. (Using Windows = " + isUsingWindows + ")"); + return true; + } else { + logger.warning("Could not create the backup! (Using Windows = " + isUsingWindows + ")"); + } + } catch (IOException | InterruptedException e) { + logger.logException("Error during backup (using Windows = " + isUsingWindows + "):", e); + } + return false; + } + + private boolean performFileBackup(String filename) { + FileUtils.createDirectory(backupFolder); + File backupFile = constructBackupFile("db"); + + try { + copy(new File(dataFolder, filename), backupFile); + return true; + } catch (IOException ex) { + logger.logException("Encountered an error during file backup:", ex); + } + return false; + } + + /** + * Check if we are under Windows and correct location of mysqldump.exe + * otherwise return error. + * + * @param windowsPath The path to check + * @return True if the path is correct, false if it is incorrect or the OS is not Windows + */ + private boolean useWindowsCommand(String windowsPath) { + String isWin = System.getProperty("os.name").toLowerCase(Locale.ROOT); + if (isWin.contains("win")) { + if (new File(windowsPath + "\\bin\\mysqldump.exe").exists()) { + return true; + } else { + logger.warning("Mysql Windows Path is incorrect. Please check it"); + return false; + } + } + return false; + } + + /** + * Builds the command line arguments to pass along when running the {@code mysqldump} command. + * + * @param sqlBackupFile the file to back up to + * @return the mysqldump command line arguments + */ + private String buildMysqlDumpArguments(File sqlBackupFile) { + String dbUsername = settings.getProperty(DatabaseSettings.MYSQL_USERNAME); + String dbPassword = settings.getProperty(DatabaseSettings.MYSQL_PASSWORD); + String dbName = settings.getProperty(DatabaseSettings.MYSQL_DATABASE); + String tableName = settings.getProperty(DatabaseSettings.MYSQL_TABLE); + + return " -u " + dbUsername + " -p" + dbPassword + " " + dbName + + " --tables " + tableName + " -r " + sqlBackupFile.getPath() + ".sql"; + } + + /** + * Constructs the file name to back up the data source to. + * + * @param fileExtension the file extension to use (e.g. sql) + * @return the file to back up the data to + */ + private File constructBackupFile(String fileExtension) { + String dateString = FileUtils.createCurrentTimeString(); + return new File(backupFolder, "backup" + dateString + "." + fileExtension); + } + + private static void copy(File src, File dst) throws IOException { + try (InputStream in = new FileInputStream(src); + OutputStream out = new FileOutputStream(dst)) { + // Transfer bytes from in to out + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + } + } + + /** + * Possible backup causes. + */ + public enum BackupCause { + START, + STOP, + COMMAND, + OTHER + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/BukkitService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/BukkitService.java new file mode 100644 index 0000000000..8a89979558 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/BukkitService.java @@ -0,0 +1,440 @@ +package fr.xephi.authme.service; + +import com.github.Anon8281.universalScheduler.UniversalRunnable; +import com.github.Anon8281.universalScheduler.UniversalScheduler; +import com.github.Anon8281.universalScheduler.scheduling.tasks.MyScheduledTask; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.PluginSettings; +import org.bukkit.BanEntry; +import org.bukkit.BanList; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import javax.inject.Inject; +import java.util.Collection; +import java.util.Date; +import java.util.Optional; +import java.util.Set; +import java.util.function.Function; + +import static fr.xephi.authme.AuthMe.getScheduler; + +/** + * Service for operations requiring the Bukkit API, such as for scheduling. + */ +public class BukkitService implements SettingsDependent { + + /** Number of ticks per second in the Bukkit main thread. */ + public static final int TICKS_PER_SECOND = 20; + /** Number of ticks per minute. */ + public static final int TICKS_PER_MINUTE = 60 * TICKS_PER_SECOND; + /** Whether the server is running Folia. */ + private static final boolean isFolia = UniversalScheduler.isFolia; + private final AuthMe authMe; + private boolean useAsyncTasks; + + @Inject + BukkitService(AuthMe authMe, Settings settings) { + this.authMe = authMe; + reload(settings); + } + + /** + * Schedules a once off task to occur as soon as possible. + *

+ * This task will be executed by the main server thread. + * + * @param task Task to be executed + */ + public void scheduleSyncDelayedTask(Runnable task) { + runTask(task); + } + + /** + * Schedules a once off task to occur after a delay. + *

+ * This task will be executed by the main server thread. + * + * @param task Task to be executed + * @param delay Delay in server ticks before executing task + */ + public void scheduleSyncDelayedTask(Runnable task, long delay) { + if (isFolia) { + runTaskLater(task, delay); + } else { + Bukkit.getScheduler().runTaskLater(authMe, task, delay); // We must do this to keep compatibility + } + } + + /** + * Schedules a synchronous task if we are currently on a async thread; if not, it runs the task immediately. + * Use this when {@link #runTaskOptionallyAsync(Runnable) optionally asynchronous tasks} have to + * run something synchronously. + * + * @param task the task to be run + */ + public void scheduleSyncTaskFromOptionallyAsyncTask(Runnable task) { + if (Bukkit.isPrimaryThread()) { + runTask(task); + } else { + scheduleSyncDelayedTask(task); + } + } + + /** + * Returns a task that will run on the next server tick. + * + * @param task the task to be run + * @throws IllegalArgumentException if plugin is null + * @throws IllegalArgumentException if task is null + */ + public void runTask(Runnable task) { + if (isFolia) { + getScheduler().runTask(task); + } else { + Bukkit.getScheduler().runTask(authMe, task); + } + } + + public void runTask(Entity entity, Runnable task) { + if (isFolia) { + getScheduler().runTask(entity, task); + } else { + Bukkit.getScheduler().runTask(authMe, task); + } + } + + public void runTask(Location location, Runnable task) { + getScheduler().runTask(location, task); + } + + /** + * Runs the task synchronously if we are running Folia, else do nothing but run it. + * @param task the task to be run + */ + public void runTaskIfFolia(Runnable task) { + if (isFolia) { + runTask(task); + } else { + task.run(); + } + } + + /** + * Runs the task synchronously if we are running Folia, else do nothing but run it. + * @param task the task to be run + */ + public void runTaskIfFolia(Entity entity, Runnable task) { + if (isFolia) { + runTask(entity, task); + } else { + task.run(); + } + } + + /** + * Runs the task synchronously if we are running Folia, else do nothing but run it. + * @param task the task to be run + */ + public void runTaskIfFolia(Location location, Runnable task) { + if (isFolia) { + runTask(location, task); + } else { + task.run(); + } + } + + /** + * Returns a task that will run after the specified number of server + * ticks. + * + * @param task the task to be run + * @param delay the ticks to wait before running the task + * @return a BukkitTask that contains the id number + * @throws IllegalArgumentException if plugin is null + * @throws IllegalArgumentException if task is null + */ + public MyScheduledTask runTaskLater(Runnable task, long delay) { + return getScheduler().runTaskLater(task, delay); + } + + public MyScheduledTask runTaskLater(Entity entity, Runnable task, long delay) { + return getScheduler().runTaskLater(entity, task, delay); + } + + /** + * Schedules this task to run asynchronously or immediately executes it based on + * AuthMe's configuration. + * + * @param task the task to run + */ + public void runTaskOptionallyAsync(Runnable task) { + if (useAsyncTasks) { + runTaskAsynchronously(task); + } else { + runTask(task); + } + } + + /** + * Asynchronous tasks should never access any API in Bukkit. Great care + * should be taken to assure the thread-safety of asynchronous tasks. + *

+ * Returns a task that will run asynchronously. + * + * @param task the task to be run + * @throws IllegalArgumentException if plugin is null + * @throws IllegalArgumentException if task is null + */ + public void runTaskAsynchronously(Runnable task) { + if (isFolia) { + getScheduler().runTaskAsynchronously(task); + } else { + Bukkit.getScheduler().runTaskAsynchronously(authMe, task); + } + } + + /** + * Asynchronous tasks should never access any API in Bukkit. Great care + * should be taken to assure the thread-safety of asynchronous tasks. + *

+ * Returns a task that will repeatedly run asynchronously until cancelled, + * starting after the specified number of server ticks. + * + * @param task the task to be run + * @param delay the ticks to wait before running the task for the first + * time + * @param period the ticks to wait between runs + * @return a BukkitTask that contains the id number + * @throws IllegalArgumentException if task is null + * @throws IllegalStateException if this was already scheduled + */ + public MyScheduledTask runTaskTimerAsynchronously(UniversalRunnable task, long delay, long period) { + return task.runTaskTimerAsynchronously(authMe, delay, period); + } + + /** + * Schedules the given task to repeatedly run until cancelled, starting after the + * specified number of server ticks. + * + * @param task the task to schedule + * @param delay the ticks to wait before running the task + * @param period the ticks to wait between runs + * @return a BukkitTask that contains the id number + * @throws IllegalArgumentException if plugin is null + * @throws IllegalStateException if this was already scheduled + */ + public MyScheduledTask runTaskTimer(UniversalRunnable task, long delay, long period) { + return task.runTaskTimer(authMe, delay, period); + } + + /** + * Broadcast a message to all players. + * + * @param message the message + * @return the number of players + */ + public int broadcastMessage(String message) { + return Bukkit.broadcastMessage(message); + } + + /** + * Gets the player with the exact given name, case insensitive. + * + * @param name Exact name of the player to retrieve + * @return a player object if one was found, null otherwise + */ + public Player getPlayerExact(String name) { + return authMe.getServer().getPlayerExact(name); + } + + /** + * Gets the player by the given name, regardless if they are offline or + * online. + *

+ * This method may involve a blocking web request to get the UUID for the + * given name. + *

+ * This will return an object even if the player does not exist. To this + * method, all players will exist. + * + * @param name the name the player to retrieve + * @return an offline player + */ + public OfflinePlayer getOfflinePlayer(String name) { + return authMe.getServer().getOfflinePlayer(name); + } + + /** + * Gets a set containing all banned players. + * + * @return a set containing banned players + */ + public Set getBannedPlayers() { + return Bukkit.getBannedPlayers(); + } + + /** + * Gets every player that has ever played on this server. + * + * @return an array containing all previous players + */ + public OfflinePlayer[] getOfflinePlayers() { + return Bukkit.getOfflinePlayers(); + } + + /** + * Gets a view of all currently online players. + * + * @return collection of online players + */ + @SuppressWarnings("unchecked") + public Collection getOnlinePlayers() { + return (Collection) Bukkit.getOnlinePlayers(); + } + + /** + * Calls an event with the given details. + * + * @param event Event details + * @throws IllegalStateException Thrown when an asynchronous event is + * fired from synchronous code. + */ + public void callEvent(Event event) { + Bukkit.getPluginManager().callEvent(event); + } + + /** + * Creates an event with the provided function and emits it. + * + * @param eventSupplier the event supplier: function taking a boolean specifying whether AuthMe is configured + * in async mode or not + * @param the event type + * @return the event that was created and emitted + */ + public E createAndCallEvent(Function eventSupplier) { + E event = eventSupplier.apply(useAsyncTasks); + callEvent(event); + return event; + } + + /** + * Creates a PotionEffect with blindness for the given duration in ticks. + * + * @param timeoutInTicks duration of the effect in ticks + * @return blindness potion effect + */ + public PotionEffect createBlindnessEffect(int timeoutInTicks) { + return new PotionEffect(PotionEffectType.BLINDNESS, timeoutInTicks, 2); + } + + /** + * Gets the world with the given name. + * + * @param name the name of the world to retrieve + * @return a world with the given name, or null if none exists + */ + public World getWorld(String name) { + return Bukkit.getWorld(name); + } + + /** + * Dispatches a command on this server, and executes it if found. + * + * @param sender the apparent sender of the command + * @param commandLine the command + arguments. Example: test abc 123 + * @return returns false if no target is found + */ + public boolean dispatchCommand(CommandSender sender, String commandLine) { + return Bukkit.dispatchCommand(sender, commandLine); + } + + /** + * Dispatches a command to be run as console user on this server, and executes it if found. + * + * @param commandLine the command + arguments. Example: test abc 123 + * @return returns false if no target is found + */ + public boolean dispatchConsoleCommand(String commandLine) { + return Bukkit.dispatchCommand(Bukkit.getConsoleSender(), commandLine); + } + + @Override + public void reload(Settings settings) { + useAsyncTasks = settings.getProperty(PluginSettings.USE_ASYNC_TASKS); + } + + /** + * Send the specified bytes to bungeecord using the specified player connection. + * + * @param player the player + * @param bytes the message + */ + public void sendBungeeMessage(Player player, byte[] bytes) { + player.sendPluginMessage(authMe, "BungeeCord", bytes); + } + + /** + * Send the specified bytes to bungeecord using the specified player connection. + * + * @param player the player + * @param bytes the message + */ + public void sendVelocityMessage(Player player, byte[] bytes) { + if (player != null) { + player.sendPluginMessage(authMe, "authmevelocity:main", bytes); + } else { + Bukkit.getServer().sendPluginMessage(authMe, "authmevelocity:main", bytes); + } + } + + + /** + * Adds a ban to the list. If a previous ban exists, this will + * update the previous entry. + * + * @param ip the ip of the ban + * @param reason reason for the ban, null indicates implementation default + * @param expires date for the ban's expiration (unban), or null to imply + * forever + * @param source source of the ban, null indicates implementation default + * @return the entry for the newly created ban, or the entry for the + * (updated) previous ban + */ + public BanEntry banIp(String ip, String reason, Date expires, String source) { + return Bukkit.getServer().getBanList(BanList.Type.IP).addBan(ip, reason, expires, source); + } + + /** + * Returns an optional with a boolean indicating whether bungeecord is enabled or not if the + * server implementation is Spigot. Otherwise returns an empty optional. + * + * @return Optional with configuration value for Spigot, empty optional otherwise + */ + public Optional isBungeeCordConfiguredForSpigot() { + try { + YamlConfiguration spigotConfig = Bukkit.spigot().getConfig(); + return Optional.of(spigotConfig.getBoolean("settings.bungeecord")); + } catch (NoSuchMethodError e) { + return Optional.empty(); + } + } + + /** + * @return the IP string that this server is bound to, otherwise empty string + */ + public String getIp() { + return Bukkit.getServer().getIp(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/CommonService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/CommonService.java new file mode 100644 index 0000000000..92a49267b1 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/CommonService.java @@ -0,0 +1,84 @@ +package fr.xephi.authme.service; + +import ch.jalu.configme.properties.Property; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.permission.PermissionNode; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.settings.Settings; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.inject.Inject; + +/** + * Service for the most common operations regarding settings, messages and permissions. + */ +public class CommonService { + + @Inject + private Settings settings; + + @Inject + private Messages messages; + + @Inject + private PermissionsManager permissionsManager; + + CommonService() { + } + + /** + * Retrieves a property's value. + * + * @param property the property to retrieve + * @param the property type + * @return the property's value + */ + public T getProperty(Property property) { + return settings.getProperty(property); + } + + /** + * Sends a message to the command sender. + * + * @param sender the command sender + * @param key the message key + */ + public void send(CommandSender sender, MessageKey key) { + messages.send(sender, key); + } + + /** + * Sends a message to the command sender with the given replacements. + * + * @param sender the command sender + * @param key the message key + * @param replacements the replacements to apply to the message + */ + public void send(CommandSender sender, MessageKey key, String... replacements) { + messages.send(sender, key, replacements); + } + + /** + * Retrieves a message in one piece. + * + * @param sender The entity to send the message to + * @param key the key of the message + * @return the message + */ + public String retrieveSingleMessage(CommandSender sender, MessageKey key) { + return messages.retrieveSingle(sender, key); + } + + /** + * Checks whether the player has the given permission. + * + * @param player the player + * @param node the permission node to check + * @return true if player has permission, false otherwise + */ + public boolean hasPermission(Player player, PermissionNode node) { + return permissionsManager.hasPermission(player, node); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/GeoIpService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/GeoIpService.java new file mode 100644 index 0000000000..bf7252ff39 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/GeoIpService.java @@ -0,0 +1,188 @@ +package fr.xephi.authme.service; + +import com.google.common.annotations.VisibleForTesting; +import com.maxmind.db.GeoIp2Provider; +import com.maxmind.db.Reader; +import com.maxmind.db.Reader.FileMode; +import com.maxmind.db.cache.CHMCache; +import com.maxmind.db.model.Country; +import com.maxmind.db.model.CountryResponse; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.util.InternetProtocolUtils; + +import javax.inject.Inject; +import java.io.File; +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Optional; + +public class GeoIpService { + + //private static final String LICENSE = + //"[LICENSE] This product includes GeoLite2 data created by MaxMind, available at https://www.maxmind.com"; + + private static final String DATABASE_NAME = "GeoLite2-Country"; + private static final String DATABASE_FILE = DATABASE_NAME + ".mmdb"; + + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(GeoIpService.class); + private final Path dataFile; + + private GeoIp2Provider databaseReader; + private volatile boolean downloading; + + @Inject + GeoIpService(@DataFolder File dataFolder){ + this.dataFile = dataFolder.toPath().resolve(DATABASE_FILE); + + // Fires download of recent data or the initialization of the look up service + isDataAvailable(); + } + + @VisibleForTesting + GeoIpService(@DataFolder File dataFolder, GeoIp2Provider reader) { + this.dataFile = dataFolder.toPath().resolve(DATABASE_FILE); + + this.databaseReader = reader; + } + + /** + * Download (if absent or old) the GeoIpLite data file and then try to load it. + * + * @return True if the data is available, false otherwise. + */ + private synchronized boolean isDataAvailable() { + if (downloading) { + // we are currently downloading the database + return false; + } + + if (databaseReader != null) { + // everything is initialized + return true; + } + + if (Files.exists(dataFile)) { + try { + startReading(); + return true; + } catch (IOException ioEx) { + logger.logException("Failed to load GeoLiteAPI database", ioEx); + return false; + } + } + + // File is outdated or doesn't exist - let's try to download the data file! + // use bukkit's cached threads + return false; + } + + /** + * + */ + + private void startReading() throws IOException { + databaseReader = new Reader(dataFile.toFile(), FileMode.MEMORY, new CHMCache()); + + // clear downloading flag, because we now have working reader instance + downloading = false; + } + + /** + * Downloads the archive to the destination file if it's newer than the locally version. + * + * @param lastModified modification timestamp of the already present file + * @param destination save file + * @return null if no updates were found, the MD5 hash of the downloaded archive if successful + * @throws IOException if failed during downloading and writing to destination file + */ + + /** + * Downloads the archive to the destination file if it's newer than the locally version. + * + * @param destination save file + * @return null if no updates were found, the MD5 hash of the downloaded archive if successful + * @throws IOException if failed during downloading and writing to destination file + */ + + /** + * Verify if the expected checksum is equal to the checksum of the given file. + * + * @param function the checksum function like MD5, SHA256 used to generate the checksum from the file + * @param file the file we want to calculate the checksum from + * @param expectedChecksum the expected checksum + * @throws IOException on I/O error reading the file or the checksum verification failed + */ + + /** + * Extract the database from gzipped data. Existing outputFile will be replaced if it already exists. + * + * @param inputFile gzipped database input file + * @param outputFile destination file for the database + * @throws IOException on I/O error reading the archive, or writing the output + */ + + /** + * Get the country code of the given IP address. + * + * @param ip textual IP address to lookup. + * @return two-character ISO 3166-1 alpha code for the country, "LOCALHOST" for local addresses + * or "--" if it cannot be fetched. + */ + public String getCountryCode(String ip) { + if (InternetProtocolUtils.isLocalAddress(ip)) { + return "LOCALHOST"; + } + return getCountry(ip).map(Country::getIsoCode).orElse("--"); + } + + /** + * Get the country name of the given IP address. + * + * @param ip textual IP address to lookup. + * @return The name of the country, "LocalHost" for local addresses, or "N/A" if it cannot be fetched. + */ + public String getCountryName(String ip) { + if (InternetProtocolUtils.isLocalAddress(ip)) { + return "LocalHost"; + } + return getCountry(ip).map(Country::getName).orElse("N/A"); + } + + /** + * Get the country of the given IP address + * + * @param ip textual IP address to lookup + * @return the wrapped Country model or {@link Optional#empty()} if + *

    + *
  • Database reader isn't initialized
  • + *
  • MaxMind has no record about this IP address
  • + *
  • IP address is local
  • + *
  • Textual representation is not a valid IP address
  • + *
+ */ + private Optional getCountry(String ip) { + if (ip == null || ip.isEmpty() || !isDataAvailable()) { + return Optional.empty(); + } + + try { + InetAddress address = InetAddress.getByName(ip); + + // Reader.getCountry() can be null for unknown addresses + return Optional.ofNullable(databaseReader.getCountry(address)).map(CountryResponse::getCountry); + } catch (UnknownHostException e) { + // Ignore invalid ip addresses + // Legacy GEO IP Database returned a unknown country object with Country-Code: '--' and Country-Name: 'N/A' + } catch (IOException ioEx) { + logger.logException("Cannot lookup country for " + ip + " at GEO IP database", ioEx); + } + + return Optional.empty(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/HelpTranslationGenerator.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/HelpTranslationGenerator.java new file mode 100644 index 0000000000..e1c8c5ba76 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/HelpTranslationGenerator.java @@ -0,0 +1,126 @@ +package fr.xephi.authme.service; + +import com.google.common.collect.ImmutableMap; +import fr.xephi.authme.command.CommandArgumentDescription; +import fr.xephi.authme.command.CommandDescription; +import fr.xephi.authme.command.CommandInitializer; +import fr.xephi.authme.command.help.HelpMessage; +import fr.xephi.authme.command.help.HelpMessagesService; +import fr.xephi.authme.command.help.HelpSection; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.message.MessagePathHelper; +import fr.xephi.authme.permission.DefaultPermission; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.PluginSettings; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; + +import javax.inject.Inject; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.StandardOpenOption; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Generates the full command structure for the help translation and saves it to the current help file, + * preserving already existing entries. + */ +public class HelpTranslationGenerator { + + @Inject + private CommandInitializer commandInitializer; + + @Inject + private HelpMessagesService helpMessagesService; + + @Inject + private Settings settings; + + @DataFolder + @Inject + private File dataFolder; + + /** + * Updates the help file to contain entries for all commands. + * + * @return the help file that has been updated + * @throws IOException if the help file cannot be written to + */ + public File updateHelpFile() throws IOException { + String languageCode = settings.getProperty(PluginSettings.MESSAGES_LANGUAGE); + File helpFile = new File(dataFolder, MessagePathHelper.createHelpMessageFilePath(languageCode)); + Map helpEntries = generateHelpMessageEntries(); + + String helpEntriesYaml = exportToYaml(helpEntries); + Files.write(helpFile.toPath(), helpEntriesYaml.getBytes(), StandardOpenOption.TRUNCATE_EXISTING); + return helpFile; + } + + private static String exportToYaml(Map helpEntries) { + DumperOptions options = new DumperOptions(); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + options.setAllowUnicode(true); + return new Yaml(options).dump(helpEntries); + } + + /** + * Generates entries for a complete help text file. + * + * @return help text entries to save + */ + private Map generateHelpMessageEntries() { + Map messageEntries = new LinkedHashMap<>(HelpMessage.values().length); + for (HelpMessage message : HelpMessage.values()) { + messageEntries.put(message.getEntryKey(), helpMessagesService.getMessage(message)); + } + + Map defaultPermissions = new LinkedHashMap<>(); + for (DefaultPermission defaultPermission : DefaultPermission.values()) { + defaultPermissions.put(HelpMessagesService.getDefaultPermissionsSubPath(defaultPermission), + helpMessagesService.getMessage(defaultPermission)); + } + messageEntries.put("defaultPermissions", defaultPermissions); + + Map sectionEntries = new LinkedHashMap<>(HelpSection.values().length); + for (HelpSection section : HelpSection.values()) { + sectionEntries.put(section.getEntryKey(), helpMessagesService.getMessage(section)); + } + + Map commandEntries = new LinkedHashMap<>(); + for (CommandDescription command : commandInitializer.getCommands()) { + generateCommandEntries(command, commandEntries); + } + + return ImmutableMap.of( + "common", messageEntries, + "section", sectionEntries, + "commands", commandEntries); + } + + /** + * Adds YAML entries for the provided command its children to the given map. + * + * @param command the command to process (including its children) + * @param commandEntries the map to add the generated entries to + */ + private void generateCommandEntries(CommandDescription command, Map commandEntries) { + CommandDescription translatedCommand = helpMessagesService.buildLocalizedDescription(command); + Map commandData = new LinkedHashMap<>(); + commandData.put("description", translatedCommand.getDescription()); + commandData.put("detailedDescription", translatedCommand.getDetailedDescription()); + + int i = 1; + for (CommandArgumentDescription argument : translatedCommand.getArguments()) { + Map argumentData = new LinkedHashMap<>(2); + argumentData.put("label", argument.getName()); + argumentData.put("description", argument.getDescription()); + commandData.put("arg" + i, argumentData); + ++i; + } + + commandEntries.put(HelpMessagesService.getCommandSubPath(translatedCommand), commandData); + translatedCommand.getChildren().forEach(child -> generateCommandEntries(child, commandEntries)); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/JoinMessageService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/JoinMessageService.java new file mode 100644 index 0000000000..d4c5b4c67a --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/JoinMessageService.java @@ -0,0 +1,45 @@ +package fr.xephi.authme.service; + +import fr.xephi.authme.util.StringUtils; + +import javax.inject.Inject; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * The JoinMessageService class. + */ +public class JoinMessageService { + + private BukkitService bukkitService; + + private Map joinMessages; + + @Inject + JoinMessageService(BukkitService bukkitService) { + this.bukkitService = bukkitService; + joinMessages = new ConcurrentHashMap<>(); + } + + /** + * Store a join message. + * + * @param playerName the player name + * @param string the join message + */ + public void putMessage(String playerName, String string) { + joinMessages.put(playerName, string); + } + + /** + * Broadcast the join message of the specified player. + * + * @param playerName the player name + */ + public void sendMessage(String playerName) { + String joinMessage = joinMessages.remove(playerName); + if (!StringUtils.isBlank(joinMessage)) { + bukkitService.broadcastMessage(joinMessage); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/MigrationService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/MigrationService.java new file mode 100644 index 0000000000..de8d88a78f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/MigrationService.java @@ -0,0 +1,54 @@ +package fr.xephi.authme.service; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.security.HashAlgorithm; +import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.security.crypts.Sha256; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.SecuritySettings; + +import java.util.List; + +/** + * Migrations to perform during the initialization of AuthMe. + */ +public final class MigrationService { + + private static ConsoleLogger logger = ConsoleLoggerFactory.get(MigrationService.class); + + private MigrationService() { + } + + /** + * Hash all passwords to Sha256 and updated the setting if the password hash is set to the deprecated PLAINTEXT. + * + * @param settings The settings instance + * @param dataSource The data source + * @param authmeSha256 Instance to the AuthMe Sha256 encryption method implementation + */ + public static void changePlainTextToSha256(Settings settings, DataSource dataSource, + Sha256 authmeSha256) { + if (HashAlgorithm.PLAINTEXT == settings.getProperty(SecuritySettings.PASSWORD_HASH)) { + logger.warning("Your HashAlgorithm has been detected as plaintext and is now deprecated;" + + " it will be changed and hashed now to the AuthMe default hashing method"); + logger.warning("Don't stop your server; wait for the conversion to have been completed!"); + List allAuths = dataSource.getAllAuths(); + for (PlayerAuth auth : allAuths) { + String hash = auth.getPassword().getHash(); + if (hash.startsWith("$SHA$")) { + logger.warning("Skipping conversion for " + auth.getNickname() + "; detected SHA hash"); + } else { + HashedPassword hashedPassword = authmeSha256.computeHash(hash, auth.getNickname()); + auth.setPassword(hashedPassword); + dataSource.updatePassword(auth); + } + } + settings.setProperty(SecuritySettings.PASSWORD_HASH, HashAlgorithm.SHA256); + settings.save(); + logger.info("Migrated " + allAuths.size() + " accounts from plaintext to SHA256"); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/PasswordRecoveryService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/PasswordRecoveryService.java new file mode 100644 index 0000000000..01f9630045 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/PasswordRecoveryService.java @@ -0,0 +1,187 @@ +package fr.xephi.authme.service; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.initialization.HasCleanup; +import fr.xephi.authme.initialization.Reloadable; +import fr.xephi.authme.mail.EmailService; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.security.PasswordSecurity; +import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.settings.properties.SecuritySettings; +import fr.xephi.authme.util.PlayerUtils; +import fr.xephi.authme.util.RandomStringUtils; +import fr.xephi.authme.util.expiring.Duration; +import fr.xephi.authme.util.expiring.ExpiringMap; +import fr.xephi.authme.util.expiring.ExpiringSet; +import org.bukkit.entity.Player; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.concurrent.TimeUnit; + +import static fr.xephi.authme.settings.properties.EmailSettings.RECOVERY_PASSWORD_LENGTH; + +/** + * Manager for password recovery. + */ +public class PasswordRecoveryService implements Reloadable, HasCleanup { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(PasswordRecoveryService.class); + + @Inject + private CommonService commonService; + + @Inject + private DataSource dataSource; + + @Inject + private EmailService emailService; + + @Inject + private PasswordSecurity passwordSecurity; + + @Inject + private RecoveryCodeService recoveryCodeService; + + @Inject + private Messages messages; + + private ExpiringSet emailCooldown; + private ExpiringMap successfulRecovers; + + @PostConstruct + private void initEmailCooldownSet() { + emailCooldown = new ExpiringSet<>( + commonService.getProperty(SecuritySettings.EMAIL_RECOVERY_COOLDOWN_SECONDS), TimeUnit.SECONDS); + successfulRecovers = new ExpiringMap<>( + commonService.getProperty(SecuritySettings.PASSWORD_CHANGE_TIMEOUT), TimeUnit.MINUTES); + } + + /** + * Create a new recovery code and send it to the player + * via email. + * + * @param player The player getting the code. + * @param email The email to send the code to. + */ + public void createAndSendRecoveryCode(Player player, String email) { + if (!checkEmailCooldown(player)) { + return; + } + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy'年'MM'月'dd'日' HH:mm:ss"); + Date date = new Date(System.currentTimeMillis()); + String recoveryCode = recoveryCodeService.generateCode(player.getName()); + boolean couldSendMail = emailService.sendRecoveryCode(player.getName(), email, recoveryCode, dateFormat.format(date)); + if (couldSendMail) { + commonService.send(player, MessageKey.RECOVERY_CODE_SENT); + emailCooldown.add(player.getName().toLowerCase(Locale.ROOT)); + } else { + commonService.send(player, MessageKey.EMAIL_SEND_FAILURE); + } + } + + /** + * Generate a new password and send it to the player via + * email. This will update the database with the new password. + * + * @param player The player recovering their password. + * @param email The email to send the password to. + */ + public void generateAndSendNewPassword(Player player, String email) { + if (!checkEmailCooldown(player)) { + return; + } + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy'年'MM'月'dd'日' HH:mm:ss"); + Date date = new Date(System.currentTimeMillis()); + + String name = player.getName(); + String thePass = RandomStringUtils.generate(commonService.getProperty(RECOVERY_PASSWORD_LENGTH)); + HashedPassword hashNew = passwordSecurity.computeHash(thePass, name); + + logger.info("Generating new password for '" + name + "'"); + + dataSource.updatePassword(name, hashNew); + boolean couldSendMail = emailService.sendPasswordMail(name, email, thePass, dateFormat.format(date)); + if (couldSendMail) { + commonService.send(player, MessageKey.RECOVERY_EMAIL_SENT_MESSAGE); + emailCooldown.add(player.getName().toLowerCase(Locale.ROOT)); + } else { + commonService.send(player, MessageKey.EMAIL_SEND_FAILURE); + } + } + + /** + * Allows a player to change their password after + * correctly entering a recovery code. + * + * @param player The player recovering their password. + */ + public void addSuccessfulRecovery(Player player) { + String name = player.getName(); + String address = PlayerUtils.getPlayerIp(player); + + successfulRecovers.put(name, address); + commonService.send(player, MessageKey.RECOVERY_CHANGE_PASSWORD); + } + + /** + * Removes a player from the list of successful recovers so that he can + * no longer use the /email setpassword command. + * + * @param player The player to remove. + */ + public void removeFromSuccessfulRecovery(Player player) { + successfulRecovers.remove(player.getName()); + } + + /** + * Check if a player is able to have emails sent. + * + * @param player The player to check. + * @return True if the player is not on cooldown. + */ + private boolean checkEmailCooldown(Player player) { + Duration waitDuration = emailCooldown.getExpiration(player.getName().toLowerCase(Locale.ROOT)); + if (waitDuration.getDuration() > 0) { + String durationText = messages.formatDuration(waitDuration); + messages.send(player, MessageKey.EMAIL_COOLDOWN_ERROR, durationText); + return false; + } + return true; + } + + /** + * Checks if a player can change their password after recovery + * using the /email setpassword command. + * + * @param player The player to check. + * @return True if the player can change their password. + */ + public boolean canChangePassword(Player player) { + String name = player.getName(); + String playerAddress = PlayerUtils.getPlayerIp(player); + String storedAddress = successfulRecovers.get(name); + + return storedAddress != null && playerAddress.equals(storedAddress); + } + + @Override + public void reload() { + emailCooldown.setExpiration( + commonService.getProperty(SecuritySettings.EMAIL_RECOVERY_COOLDOWN_SECONDS), TimeUnit.SECONDS); + successfulRecovers.setExpiration( + commonService.getProperty(SecuritySettings.PASSWORD_CHANGE_TIMEOUT), TimeUnit.MINUTES); + } + + @Override + public void performCleanup() { + emailCooldown.removeExpiredEntries(); + successfulRecovers.removeExpiredEntries(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/PluginHookService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/PluginHookService.java new file mode 100644 index 0000000000..3615aa7361 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/PluginHookService.java @@ -0,0 +1,197 @@ +package fr.xephi.authme.service; + +import ch.jalu.injector.annotations.NoFieldScan; +import com.earth2me.essentials.Essentials; +import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.api.MVWorldManager; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginManager; + +import javax.inject.Inject; +import java.io.File; + +/** + * Hooks into third-party plugins and allows to perform actions on them. + */ +@NoFieldScan +public class PluginHookService { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(PluginHookService.class); + private final PluginManager pluginManager; + private Essentials essentials; + private Plugin cmi; + private MultiverseCore multiverse; + + /** + * Constructor. + * + * @param pluginManager The server's plugin manager + */ + @Inject + public PluginHookService(PluginManager pluginManager) { + this.pluginManager = pluginManager; + tryHookToEssentials(); + tryHookToCmi(); + tryHookToMultiverse(); + } + + /** + * Enable or disable the social spy status of the given user if Essentials is available. + * + * @param player The player to modify + * @param socialSpyStatus The social spy status (enabled/disabled) to set + */ + public void setEssentialsSocialSpyStatus(Player player, boolean socialSpyStatus) { + if (essentials != null) { + essentials.getUser(player).setSocialSpyEnabled(socialSpyStatus); + } + } + + /** + * If Essentials is hooked into, return Essentials' data folder. + * + * @return The Essentials data folder, or null if unavailable + */ + public File getEssentialsDataFolder() { + if (essentials != null) { + return essentials.getDataFolder(); + } + return null; + } + + /** + * If CMI is hooked into, return CMI' data folder. + * + * @return The CMI data folder, or null if unavailable + */ + public File getCmiDataFolder() { + Plugin plugin = pluginManager.getPlugin("CMI"); + if (plugin == null) { + return null; + } + return plugin.getDataFolder(); + } + + /** + * Return the spawn of the given world as defined by Multiverse (if available). + * + * @param world The world to get the Multiverse spawn for + * @return The spawn location from Multiverse, or null if unavailable + */ + public Location getMultiverseSpawn(World world) { + if (multiverse != null) { + MVWorldManager manager = multiverse.getMVWorldManager(); + if (manager.isMVWorld(world)) { + return manager.getMVWorld(world).getSpawnLocation(); + } + } + return null; + } + + // ------ + // "Is plugin available" methods + // ------ + + /** + * @return true if we have a hook to Essentials, false otherwise + */ + public boolean isEssentialsAvailable() { + return essentials != null; + } + + /** + * @return true if we have a hook to CMI, false otherwise + */ + public boolean isCmiAvailable() { + return cmi != null; + } + + /** + * @return true if we have a hook to Multiverse, false otherwise + */ + public boolean isMultiverseAvailable() { + return multiverse != null; + } + + // ------ + // Hook methods + // ------ + + /** + * Attempts to create a hook into Essentials. + */ + public void tryHookToEssentials() { + try { + essentials = getPlugin(pluginManager, "Essentials", Essentials.class); + } catch (Exception | NoClassDefFoundError ignored) { + essentials = null; + } + } + + /** + * Attempts to create a hook into CMI. + */ + public void tryHookToCmi() { + try { + cmi = getPlugin(pluginManager, "CMI", Plugin.class); + } catch (Exception | NoClassDefFoundError ignored) { + cmi = null; + } + } + + /** + * Attempts to create a hook into Multiverse. + */ + public void tryHookToMultiverse() { + try { + multiverse = getPlugin(pluginManager, "Multiverse-Core", MultiverseCore.class); + } catch (Exception | NoClassDefFoundError ignored) { + multiverse = null; + } + } + + // ------ + // Unhook methods + // ------ + + /** + * Unhooks from Essentials. + */ + public void unhookEssentials() { + essentials = null; + } + + /** + * Unhooks from CMI. + */ + public void unhookCmi() { + cmi = null; + } + + /** + * Unhooks from Multiverse. + */ + public void unhookMultiverse() { + multiverse = null; + } + + // ------ + // Helpers + // ------ + + private T getPlugin(PluginManager pluginManager, String name, Class clazz) + throws Exception, NoClassDefFoundError { + if (pluginManager.isPluginEnabled(name)) { + T plugin = clazz.cast(pluginManager.getPlugin(name)); + logger.info("Hooked successfully into " + name); + return plugin; + } + return null; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/RecoveryCodeService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/RecoveryCodeService.java new file mode 100644 index 0000000000..dcccb36de7 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/RecoveryCodeService.java @@ -0,0 +1,111 @@ +package fr.xephi.authme.service; + +import fr.xephi.authme.initialization.HasCleanup; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import fr.xephi.authme.util.RandomStringUtils; +import fr.xephi.authme.util.expiring.ExpiringMap; +import fr.xephi.authme.util.expiring.TimedCounter; + +import javax.inject.Inject; +import java.util.concurrent.TimeUnit; + +/** + * Manager for recovery codes. + */ +public class RecoveryCodeService implements SettingsDependent, HasCleanup { + + private final ExpiringMap recoveryCodes; + private final TimedCounter playerTries; + private int recoveryCodeLength; + private int recoveryCodeExpiration; + private int recoveryCodeMaxTries; + + @Inject + RecoveryCodeService(Settings settings) { + recoveryCodeLength = settings.getProperty(SecuritySettings.RECOVERY_CODE_LENGTH); + recoveryCodeExpiration = settings.getProperty(SecuritySettings.RECOVERY_CODE_HOURS_VALID); + recoveryCodeMaxTries = settings.getProperty(SecuritySettings.RECOVERY_CODE_MAX_TRIES); + recoveryCodes = new ExpiringMap<>(recoveryCodeExpiration, TimeUnit.HOURS); + playerTries = new TimedCounter<>(recoveryCodeExpiration, TimeUnit.HOURS); + } + + /** + * @return whether recovery codes are enabled or not + */ + public boolean isRecoveryCodeNeeded() { + return recoveryCodeLength > 0 && recoveryCodeExpiration > 0; + } + + /** + * Generates the recovery code for the given player. + * + * @param player the player to generate a code for + * @return the generated code + */ + public String generateCode(String player) { + String code = RandomStringUtils.generateHex(recoveryCodeLength); + + playerTries.put(player, recoveryCodeMaxTries); + recoveryCodes.put(player, code); + return code; + } + + /** + * Checks whether the supplied code is valid for the given player. + * + * @param player the player to check for + * @param code the code to check + * @return true if the code matches and has not expired, false otherwise + */ + public boolean isCodeValid(String player, String code) { + String storedCode = recoveryCodes.get(player); + playerTries.decrement(player); + return storedCode != null && storedCode.equals(code); + } + + /** + * Checks whether a player has tries remaining to enter a code. + * + * @param player The player to check for. + * @return True if the player has tries left. + */ + public boolean hasTriesLeft(String player) { + return playerTries.get(player) > 0; + } + + /** + * Get the number of attempts a player has to enter a code. + * + * @param player The player to check for. + * @return The number of tries left. + */ + public int getTriesLeft(String player) { + return playerTries.get(player); + } + + /** + * Removes the player's recovery code if present. + * + * @param player the player + */ + public void removeCode(String player) { + recoveryCodes.remove(player); + playerTries.remove(player); + } + + @Override + public void reload(Settings settings) { + recoveryCodeLength = settings.getProperty(SecuritySettings.RECOVERY_CODE_LENGTH); + recoveryCodeExpiration = settings.getProperty(SecuritySettings.RECOVERY_CODE_HOURS_VALID); + recoveryCodeMaxTries = settings.getProperty(SecuritySettings.RECOVERY_CODE_MAX_TRIES); + recoveryCodes.setExpiration(recoveryCodeExpiration, TimeUnit.HOURS); + } + + @Override + public void performCleanup() { + recoveryCodes.removeExpiredEntries(); + playerTries.removeExpiredEntries(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/SessionService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/SessionService.java new file mode 100644 index 0000000000..b4092b4528 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/SessionService.java @@ -0,0 +1,105 @@ +package fr.xephi.authme.service; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.events.RestoreSessionEvent; +import fr.xephi.authme.initialization.Reloadable; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.settings.properties.PluginSettings; +import fr.xephi.authme.util.PlayerUtils; +import org.bukkit.entity.Player; + +import javax.inject.Inject; + +import static fr.xephi.authme.util.Utils.MILLIS_PER_MINUTE; + +/** + * Handles the user sessions. + */ +public class SessionService implements Reloadable { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(SessionService.class); + private final CommonService service; + private final BukkitService bukkitService; + private final DataSource database; + + private boolean isEnabled; + + @Inject + SessionService(CommonService service, BukkitService bukkitService, DataSource database) { + this.service = service; + this.bukkitService = bukkitService; + this.database = database; + reload(); + } + + /** + * Returns whether the player has a session he can resume. + * + * @param player the player to check + * @return true if there is a current session, false otherwise + */ + public boolean canResumeSession(Player player) { + final String name = player.getName(); + if (isEnabled && database.hasSession(name)) { + database.setUnlogged(name); + database.revokeSession(name); + PlayerAuth auth = database.getAuth(name); + + SessionState state = fetchSessionStatus(auth, player); + if (state.equals(SessionState.VALID)) { + RestoreSessionEvent event = bukkitService.createAndCallEvent( + isAsync -> new RestoreSessionEvent(player, isAsync)); + return !event.isCancelled(); + } else if (state.equals(SessionState.IP_CHANGED)) { + service.send(player, MessageKey.SESSION_EXPIRED); + } + } + return false; + } + + /** + * Checks if the given Player has a current session by comparing its properties + * with the given PlayerAuth's. + * + * @param auth the player auth + * @param player the associated player + * @return SessionState based on the state of the session (VALID, NOT_VALID, OUTDATED, IP_CHANGED) + */ + private SessionState fetchSessionStatus(PlayerAuth auth, Player player) { + if (auth == null) { + logger.warning("No PlayerAuth in database for '" + player.getName() + "' during session check"); + return SessionState.NOT_VALID; + } else if (auth.getLastLogin() == null) { + return SessionState.NOT_VALID; + } + long timeSinceLastLogin = System.currentTimeMillis() - auth.getLastLogin(); + + if (timeSinceLastLogin > 0 + && timeSinceLastLogin < service.getProperty(PluginSettings.SESSIONS_TIMEOUT) * MILLIS_PER_MINUTE) { + if (PlayerUtils.getPlayerIp(player).equals(auth.getLastIp())) { + return SessionState.VALID; + } else { + return SessionState.IP_CHANGED; + } + } + return SessionState.OUTDATED; + } + + public void grantSession(String name) { + if (isEnabled) { + database.grantSession(name); + } + } + + public void revokeSession(String name) { + database.revokeSession(name); + } + + @Override + public void reload() { + this.isEnabled = service.getProperty(PluginSettings.SESSIONS_ENABLED); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/SessionState.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/SessionState.java new file mode 100644 index 0000000000..801f36bc85 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/SessionState.java @@ -0,0 +1,13 @@ +package fr.xephi.authme.service; + +public enum SessionState { + + VALID, + + NOT_VALID, + + OUTDATED, + + IP_CHANGED + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/TeleportationService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/TeleportationService.java new file mode 100644 index 0000000000..c50b01291f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/TeleportationService.java @@ -0,0 +1,200 @@ +package fr.xephi.authme.service; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.auth.PlayerAuth; +import fr.xephi.authme.data.auth.PlayerCache; +import fr.xephi.authme.data.limbo.LimboPlayer; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.events.AbstractTeleportEvent; +import fr.xephi.authme.events.AuthMeTeleportEvent; +import fr.xephi.authme.events.FirstSpawnTeleportEvent; +import fr.xephi.authme.events.SpawnTeleportEvent; +import fr.xephi.authme.initialization.Reloadable; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.SpawnLoader; +import fr.xephi.authme.settings.properties.RestrictionSettings; +import fr.xephi.authme.util.TeleportUtils; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import java.util.HashSet; +import java.util.Set; + +import static fr.xephi.authme.settings.properties.RestrictionSettings.TELEPORT_UNAUTHED_TO_SPAWN; + +/** + * Handles teleportation (placement of player to spawn). + */ +public class TeleportationService implements Reloadable { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(TeleportationService.class); + + @Inject + private Settings settings; + + @Inject + private BukkitService bukkitService; + + @Inject + private SpawnLoader spawnLoader; + + @Inject + private PlayerCache playerCache; + + @Inject + private DataSource dataSource; + + private Set spawnOnLoginWorlds; + + TeleportationService() { + } + + @PostConstruct + @Override + public void reload() { + // Use a Set for better performance with #contains() + spawnOnLoginWorlds = new HashSet<>(settings.getProperty(RestrictionSettings.FORCE_SPAWN_ON_WORLDS)); + } + + /** + * Teleports the player according to the settings when he joins. + * + * @param player the player to process + */ + public void teleportOnJoin(final Player player) { + if (!settings.getProperty(RestrictionSettings.NO_TELEPORT) + && settings.getProperty(TELEPORT_UNAUTHED_TO_SPAWN)) { + logger.debug("Teleport on join for player `{0}`", player.getName()); + teleportToSpawn(player, playerCache.isAuthenticated(player.getName())); + } + } + + /** + * Returns the player's custom on join location. + * + * @param player the player to process + * + * @return the custom spawn location, null if the player should spawn at the original location + */ + public Location prepareOnJoinSpawnLocation(final Player player) { + if (!settings.getProperty(RestrictionSettings.NO_TELEPORT) + && settings.getProperty(TELEPORT_UNAUTHED_TO_SPAWN)) { + final Location location = spawnLoader.getSpawnLocation(player); + + SpawnTeleportEvent event = new SpawnTeleportEvent(player, location, + playerCache.isAuthenticated(player.getName())); + bukkitService.callEvent(event); + if (!isEventValid(event)) { + return null; + } + + logger.debug("Returning custom location for >1.9 join event for player `{0}`", player.getName()); + return location; + } + return null; + } + + /** + * Teleports the player to the first spawn if he is new and the first spawn is configured. + * + * @param player the player to process + */ + public void teleportNewPlayerToFirstSpawn(final Player player) { + if (settings.getProperty(RestrictionSettings.NO_TELEPORT)) { + return; + } + + Location firstSpawn = spawnLoader.getFirstSpawn(); + if (firstSpawn == null) { + return; + } + + if (!player.hasPlayedBefore() || !dataSource.isAuthAvailable(player.getName())) { + logger.debug("Attempting to teleport player `{0}` to first spawn", player.getName()); + performTeleportation(player, new FirstSpawnTeleportEvent(player, firstSpawn)); + } + } + + /** + * Teleports the player according to the settings after having successfully logged in. + * + * @param player the player + * @param auth corresponding PlayerAuth object + * @param limbo corresponding LimboPlayer object + */ + public void teleportOnLogin(final Player player, PlayerAuth auth, LimboPlayer limbo) { + if (settings.getProperty(RestrictionSettings.NO_TELEPORT)) { + return; + } + + // #856: If LimboPlayer comes from a persisted file, the Location might be null + String worldName = (limbo != null && limbo.getLocation() != null) + ? limbo.getLocation().getWorld().getName() + : null; + + // The world in LimboPlayer is from where the player comes, before any teleportation by AuthMe + if (mustForceSpawnAfterLogin(worldName)) { + logger.debug("Teleporting `{0}` to spawn because of 'force-spawn after login'", player.getName()); + teleportToSpawn(player, true); + } else if (settings.getProperty(TELEPORT_UNAUTHED_TO_SPAWN)) { + if (settings.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) { + Location location = buildLocationFromAuth(player, auth); + Location playerLoc = player.getLocation(); + if (location.getX() == playerLoc.getX() && location.getY() == location.getY() && location.getZ() == playerLoc.getZ() + && location.getWorld() == playerLoc.getWorld()) return; + logger.debug("Teleporting `{0}` after login, based on the player auth", player.getName()); + teleportBackFromSpawn(player, location); + } else if (limbo != null && limbo.getLocation() != null) { + logger.debug("Teleporting `{0}` after login, based on the limbo player", player.getName()); + teleportBackFromSpawn(player, limbo.getLocation()); + } + } + } + + private boolean mustForceSpawnAfterLogin(String worldName) { + return worldName != null && settings.getProperty(RestrictionSettings.FORCE_SPAWN_LOCATION_AFTER_LOGIN) + && spawnOnLoginWorlds.contains(worldName); + } + + private Location buildLocationFromAuth(Player player, PlayerAuth auth) { + World world = bukkitService.getWorld(auth.getWorld()); + if (world == null) { + world = player.getWorld(); + } + return new Location(world, auth.getQuitLocX(), auth.getQuitLocY(), auth.getQuitLocZ(), + auth.getYaw(), auth.getPitch()); + } + + private void teleportBackFromSpawn(final Player player, final Location location) { + performTeleportation(player, new AuthMeTeleportEvent(player, location)); + } + + private void teleportToSpawn(final Player player, final boolean isAuthenticated) { + final Location spawnLoc = spawnLoader.getSpawnLocation(player); + performTeleportation(player, new SpawnTeleportEvent(player, spawnLoc, isAuthenticated)); + } + + /** + * Emits the teleportation event and performs teleportation according to it (potentially modified + * by external listeners). Note that no teleportation is performed if the event's location is empty. + * + * @param player the player to teleport + * @param event the event to emit and according to which to teleport + */ + private void performTeleportation(final Player player, final AbstractTeleportEvent event) { + bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(() -> { + bukkitService.callEvent(event); + if (player.isOnline() && isEventValid(event)) { + TeleportUtils.teleport(player, event.getTo()); + } + }); + } + + private static boolean isEventValid(AbstractTeleportEvent event) { + return !event.isCancelled() && event.getTo() != null && event.getTo().getWorld() != null; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/ValidationService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/ValidationService.java new file mode 100644 index 0000000000..fca9eb53ff --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/ValidationService.java @@ -0,0 +1,339 @@ +package fr.xephi.authme.service; + +import ch.jalu.configme.properties.Property; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.initialization.Reloadable; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.permission.PlayerStatePermission; +import fr.xephi.authme.security.HashUtils; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.EmailSettings; +import fr.xephi.authme.settings.properties.ProtectionSettings; +import fr.xephi.authme.settings.properties.RestrictionSettings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import fr.xephi.authme.util.PlayerUtils; +import fr.xephi.authme.util.Utils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import java.io.DataInputStream; +import java.net.HttpURLConnection; +import java.net.InetSocketAddress; +import java.net.URL; +import java.util.Collection; +import java.util.List; +import java.util.Locale; +import java.util.Set; +import java.util.regex.Pattern; + +import static fr.xephi.authme.util.StringUtils.isInsideString; + +/** + * Validation service. + */ +public class ValidationService implements Reloadable { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(ValidationService.class); + + @Inject + private Settings settings; + @Inject + private DataSource dataSource; + @Inject + private PermissionsManager permissionsManager; + @Inject + private GeoIpService geoIpService; + + private Pattern passwordRegex; + private Pattern emailRegex; + private Multimap restrictedNames; + + ValidationService() { + } + + @PostConstruct + @Override + public void reload() { + passwordRegex = Utils.safePatternCompile(settings.getProperty(RestrictionSettings.ALLOWED_PASSWORD_REGEX)); + restrictedNames = settings.getProperty(RestrictionSettings.ENABLE_RESTRICTED_USERS) + ? loadNameRestrictions(settings.getProperty(RestrictionSettings.RESTRICTED_USERS)) + : HashMultimap.create(); + + emailRegex = Utils.safePatternCompile(settings.getProperty(RestrictionSettings.ALLOWED_EMAIL_REGEX)); + } + + /** + * Verifies whether a password is valid according to the plugin settings. + * + * @param password the password to verify + * @param username the username the password is associated with + * @return the validation result + */ + public ValidationResult validatePassword(String password, String username) { + String passLow = password.toLowerCase(Locale.ROOT); + if (!passwordRegex.matcher(passLow).matches()) { + return new ValidationResult(MessageKey.PASSWORD_CHARACTERS_ERROR, passwordRegex.pattern()); + } else if (passLow.equalsIgnoreCase(username)) { + return new ValidationResult(MessageKey.PASSWORD_IS_USERNAME_ERROR); + } else if (password.length() < settings.getProperty(SecuritySettings.MIN_PASSWORD_LENGTH) + || password.length() > settings.getProperty(SecuritySettings.MAX_PASSWORD_LENGTH)) { + return new ValidationResult(MessageKey.INVALID_PASSWORD_LENGTH); + } else if (settings.getProperty(SecuritySettings.UNSAFE_PASSWORDS).contains(passLow)) { + return new ValidationResult(MessageKey.PASSWORD_UNSAFE_ERROR); + } else if (settings.getProperty(SecuritySettings.HAVE_I_BEEN_PWNED_CHECK)) { + HaveIBeenPwnedResults results = validatePasswordHaveIBeenPwned(password); + if (results != null + && results.isPwned() + && results.getPwnCount() > settings.getProperty(SecuritySettings.HAVE_I_BEEN_PWNED_LIMIT)) { + return new ValidationResult(MessageKey.PASSWORD_PWNED_ERROR, String.valueOf(results.getPwnCount())); + } + } + + return new ValidationResult(); + } + + /** + * Verifies whether the email is valid and admitted for use according to the plugin settings. + * + * @param email the email to verify + * @return true if the email is valid, false otherwise + */ + public boolean validateEmail(String email) { + return emailRegex.matcher(email).matches(); + } + + /** + * Queries the database whether the email is still free for registration, i.e. whether the given + * command sender may use the email to register a new account (as defined by settings and permissions). + * + * @param email the email to verify + * @param sender the command sender + * @return true if the email may be used, false otherwise (registration threshold has been exceeded) + */ + public boolean isEmailFreeForRegistration(String email, CommandSender sender) { + return permissionsManager.hasPermission(sender, PlayerStatePermission.ALLOW_MULTIPLE_ACCOUNTS) + || dataSource.countAuthsByEmail(email) < settings.getProperty(EmailSettings.MAX_REG_PER_EMAIL); + } + + /** + * Checks whether the player's country is allowed to join the server, based on the given IP address + * and the configured country whitelist or blacklist. + * + * @param hostAddress the IP address to verify + * @return true if the IP address' country is allowed, false otherwise + */ + public boolean isCountryAdmitted(String hostAddress) { + // Check if we have restrictions on country, if not return true and avoid the country lookup + if (settings.getProperty(ProtectionSettings.COUNTRIES_WHITELIST).isEmpty() + && settings.getProperty(ProtectionSettings.COUNTRIES_BLACKLIST).isEmpty()) { + return true; + } + + String countryCode = geoIpService.getCountryCode(hostAddress); + boolean isCountryAllowed = validateWhitelistAndBlacklist(countryCode, + ProtectionSettings.COUNTRIES_WHITELIST, ProtectionSettings.COUNTRIES_BLACKLIST); + logger.debug("Country code `{0}` for `{1}` is allowed: {2}", countryCode, hostAddress, isCountryAllowed); + return isCountryAllowed; + } + + /** + * Checks if the name is unrestricted according to the configured settings. + * + * @param name the name to verify + * @return true if unrestricted, false otherwise + */ + public boolean isUnrestricted(String name) { + return settings.getProperty(RestrictionSettings.UNRESTRICTED_NAMES).contains(name.toLowerCase(Locale.ROOT)); + } + + /** + * Checks that the player meets any name restriction if present (IP/domain-based). + * + * @param player the player to check + * @return true if the player may join, false if the player does not satisfy the name restrictions + */ + public boolean fulfillsNameRestrictions(Player player) { + Collection restrictions = restrictedNames.get(player.getName().toLowerCase(Locale.ROOT)); + if (Utils.isCollectionEmpty(restrictions)) { + return true; + } + + String ip = PlayerUtils.getPlayerIp(player); + String domain = getHostName(player.getAddress()); + for (String restriction : restrictions) { + if (restriction.startsWith("regex:")) { + restriction = restriction.replace("regex:", ""); + } else { + restriction = restriction.replace("*", "(.*)"); + } + if (ip.matches(restriction)) { + return true; + } + if (domain.matches(restriction)) { + return true; + } + } + return false; + } + + @VisibleForTesting + protected String getHostName(InetSocketAddress inetSocketAddr) { + return inetSocketAddr.getHostName(); + } + + /** + * Verifies whether the given value is allowed according to the given whitelist and blacklist settings. + * Whitelist has precedence over blacklist: if a whitelist is set, the value is rejected if not present + * in the whitelist. + * + * @param value the value to verify + * @param whitelist the whitelist property + * @param blacklist the blacklist property + * @return true if the value is admitted by the lists, false otherwise + */ + private boolean validateWhitelistAndBlacklist(String value, Property> whitelist, + Property> blacklist) { + List whitelistValue = settings.getProperty(whitelist); + if (!Utils.isCollectionEmpty(whitelistValue)) { + return containsIgnoreCase(whitelistValue, value); + } + List blacklistValue = settings.getProperty(blacklist); + return Utils.isCollectionEmpty(blacklistValue) || !containsIgnoreCase(blacklistValue, value); + } + + private static boolean containsIgnoreCase(Collection coll, String needle) { + for (String entry : coll) { + if (entry.equalsIgnoreCase(needle)) { + return true; + } + } + return false; + } + + /** + * Loads the configured name restrictions into a Multimap by player name (all-lowercase). + * + * @param configuredRestrictions the restriction rules to convert to a map + * @return map of allowed IPs/domain names by player name + */ + private Multimap loadNameRestrictions(Set configuredRestrictions) { + Multimap restrictions = HashMultimap.create(); + for (String restriction : configuredRestrictions) { + if (isInsideString(';', restriction)) { + String[] data = restriction.split(";"); + restrictions.put(data[0].toLowerCase(Locale.ROOT), data[1]); + } else { + logger.warning("Restricted user rule must have a ';' separating name from restriction," + + " but found: '" + restriction + "'"); + } + } + return restrictions; + } + /** + * Check haveibeenpwned.com for the given password. + * + * @param password password to check for + * @return Results of the check + */ + public HaveIBeenPwnedResults validatePasswordHaveIBeenPwned(String password) { + String hash = HashUtils.sha1(password); + + String hashPrefix = hash.substring(0, 5); + + try { + String url = String.format("https://api.pwnedpasswords.com/range/%s", hashPrefix); + HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); + connection.setRequestMethod("GET"); + connection.setRequestProperty("User-Agent", "AuthMeReloaded"); + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + connection.setDoInput(true); + StringBuilder outStr = new StringBuilder(); + + try (DataInputStream input = new DataInputStream(connection.getInputStream())) { + for (int c = input.read(); c != -1; c = input.read()) + outStr.append((char) c); + } + + String[] hashes = outStr.toString().split("\n"); + for (String hashSuffix : hashes) { + String[] hashSuffixParts = hashSuffix.trim().split(":"); + if (hashSuffixParts[0].equalsIgnoreCase(hash.substring(5))) { + return new HaveIBeenPwnedResults(true, Integer.parseInt(hashSuffixParts[1])); + } + } + return new HaveIBeenPwnedResults(false, 0); + } catch (java.io.IOException e) { + logger.warning("Error occurred while checking password online, check your connection.\nWhen this error shows, the player's password won't be check"); + return null; + } + } + + + public static final class ValidationResult { + private final MessageKey messageKey; + private final String[] args; + + /** + * Constructor for a successful validation. + */ + public ValidationResult() { + this.messageKey = null; + this.args = null; + } + + /** + * Constructor for a failed validation. + * + * @param messageKey message key of the validation error + * @param args arguments for the message key + */ + public ValidationResult(MessageKey messageKey, String... args) { + this.messageKey = messageKey; + this.args = args; + } + + /** + * Returns whether an error was found during the validation, i.e. whether the validation failed. + * + * @return true if there is an error, false if the validation was successful + */ + public boolean hasError() { + return messageKey != null; + } + + public MessageKey getMessageKey() { + return messageKey; + } + + public String[] getArgs() { + return args; + } + } + + public static final class HaveIBeenPwnedResults { + private final boolean isPwned; + private final int pwnCount; + + public HaveIBeenPwnedResults(boolean isPwned, int pwnCount) { + this.isPwned = isPwned; + this.pwnCount = pwnCount; + } + + public boolean isPwned() { + return isPwned; + } + + public int getPwnCount() { + return pwnCount; + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/bungeecord/BungeeReceiver.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/bungeecord/BungeeReceiver.java new file mode 100644 index 0000000000..05c7c944fe --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/bungeecord/BungeeReceiver.java @@ -0,0 +1,160 @@ +package fr.xephi.authme.service.bungeecord; + +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteStreams; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.ProxySessionManager; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.process.Management; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.HooksSettings; +import org.bukkit.entity.Player; +import org.bukkit.plugin.messaging.Messenger; +import org.bukkit.plugin.messaging.PluginMessageListener; + +import javax.inject.Inject; +import java.util.Optional; + +public class BungeeReceiver implements PluginMessageListener, SettingsDependent { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(BungeeReceiver.class); + + private final AuthMe plugin; + private final BukkitService bukkitService; + private final ProxySessionManager proxySessionManager; + private final Management management; + + private boolean isEnabled; + + @Inject + BungeeReceiver(AuthMe plugin, BukkitService bukkitService, ProxySessionManager proxySessionManager, + Management management, Settings settings) { + this.plugin = plugin; + this.bukkitService = bukkitService; + this.proxySessionManager = proxySessionManager; + this.management = management; + reload(settings); + } + + @Override + public void reload(Settings settings) { + this.isEnabled = settings.getProperty(HooksSettings.BUNGEECORD); + if (this.isEnabled) { + this.isEnabled = bukkitService.isBungeeCordConfiguredForSpigot().orElse(false); + } + if (this.isEnabled) { + final Messenger messenger = plugin.getServer().getMessenger(); + if (!messenger.isIncomingChannelRegistered(plugin, "BungeeCord")) { + messenger.registerIncomingPluginChannel(plugin, "BungeeCord", this); + } + } + } + + /** + * Processes the given data input and attempts to translate it to a message for the "AuthMe.v2.Broadcast" channel. + * + * @param in the input to handle + */ + private void handleBroadcast(ByteArrayDataInput in) { + // Read data byte array + short dataLength = in.readShort(); + byte[] dataBytes = new byte[dataLength]; + in.readFully(dataBytes); + ByteArrayDataInput dataIn = ByteStreams.newDataInput(dataBytes); + + // Parse type + String typeId = dataIn.readUTF(); + Optional type = MessageType.fromId(typeId); + if (!type.isPresent()) { + logger.debug("Received unsupported forwarded bungeecord message type! ({0})", typeId); + return; + } + + // Parse argument + String argument; + try { + argument = dataIn.readUTF(); + } catch (IllegalStateException e) { + logger.warning("Received invalid forwarded plugin message of type " + type.get().name() + + ": argument is missing!"); + return; + } + + // Handle type + switch (type.get()) { + case LOGIN: + case LOGOUT: + // TODO: unused + break; + default: + } + } + + /** + * Processes the given data input and attempts to translate it to a message for the "AuthMe.v2" channel. + * + * @param in the input to handle + */ + private void handle(ByteArrayDataInput in) { + // Parse type + String typeId = in.readUTF(); + Optional type = MessageType.fromId(typeId); + if (!type.isPresent()) { + logger.debug("Received unsupported bungeecord message type! ({0})", typeId); + return; + } + + // Parse argument + String argument; + try { + argument = in.readUTF(); + } catch (IllegalStateException e) { + logger.warning("Received invalid plugin message of type " + type.get().name() + + ": argument is missing!"); + return; + } + + // Handle type + switch (type.get()) { + case PERFORM_LOGIN: + performLogin(argument); + break; + default: + } + } + + @Override + public void onPluginMessageReceived(String channel, Player player, byte[] data) { + if (!isEnabled) { + return; + } + + ByteArrayDataInput in = ByteStreams.newDataInput(data); + + // Check subchannel + String subChannel = in.readUTF(); + if ("AuthMe.v2.Broadcast".equals(subChannel)) { + handleBroadcast(in); + } else if ("AuthMe.v2".equals(subChannel)) { + handle(in); + } + } + + private void performLogin(String name) { + Player player = bukkitService.getPlayerExact(name); + if (player != null && player.isOnline()) { + management.forceLogin(player, true); + logger.info("The user " + player.getName() + " has been automatically logged in, " + + "as requested via plugin messaging."); + } else { + proxySessionManager.processProxySessionMessage(name); + logger.info("The user " + name + " should be automatically logged in, " + + "as requested via plugin messaging but has not been detected, nickname has been" + + " added to autologin queue."); + } + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/bungeecord/BungeeSender.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/bungeecord/BungeeSender.java new file mode 100644 index 0000000000..3d43605bba --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/bungeecord/BungeeSender.java @@ -0,0 +1,113 @@ +package fr.xephi.authme.service.bungeecord; + +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.HooksSettings; +import org.bukkit.entity.Player; +import org.bukkit.plugin.messaging.Messenger; + +import javax.inject.Inject; +import java.util.Locale; + +public class BungeeSender implements SettingsDependent { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(BungeeSender.class); + private final AuthMe plugin; + private final BukkitService bukkitService; + + private boolean isEnabled; + private String destinationServerOnLogin; + + /* + * Constructor. + */ + @Inject + BungeeSender(AuthMe plugin, BukkitService bukkitService, Settings settings) { + this.plugin = plugin; + this.bukkitService = bukkitService; + reload(settings); + } + + @Override + public void reload(Settings settings) { + this.isEnabled = settings.getProperty(HooksSettings.BUNGEECORD); + this.destinationServerOnLogin = settings.getProperty(HooksSettings.BUNGEECORD_SERVER); + + if (this.isEnabled) { + Messenger messenger = plugin.getServer().getMessenger(); + if (!messenger.isOutgoingChannelRegistered(plugin, "BungeeCord")) { + messenger.registerOutgoingPluginChannel(plugin, "BungeeCord"); + } + } + } + + public boolean isEnabled() { + return isEnabled; + } + + private void sendBungeecordMessage(Player player, String... data) { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + for (String element : data) { + out.writeUTF(element); + } + bukkitService.sendBungeeMessage(player, out.toByteArray()); + } + + private void sendForwardedBungeecordMessage(Player player, String subChannel, String... data) { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("Forward"); + out.writeUTF("ONLINE"); + out.writeUTF(subChannel); + ByteArrayDataOutput dataOut = ByteStreams.newDataOutput(); + for (String element : data) { + dataOut.writeUTF(element); + } + byte[] dataBytes = dataOut.toByteArray(); + out.writeShort(dataBytes.length); + out.write(dataBytes); + bukkitService.sendBungeeMessage(player, out.toByteArray()); + } + + /** + * Send a player to a specified server. If no server is configured, this will + * do nothing. + * + * @param player The player to send. + */ + public void connectPlayerOnLogin(Player player) { + if (!isEnabled || destinationServerOnLogin.isEmpty()) { + return; + } + // Add a small delay, just in case... + bukkitService.scheduleSyncDelayedTask(() -> + sendBungeecordMessage(player, "Connect", destinationServerOnLogin), 10L); + } + + /** + * Sends a message to the AuthMe plugin messaging channel, if enabled. + * + * @param player The player related to the message + * @param type The message type, See {@link MessageType} + */ + public void sendAuthMeBungeecordMessage(Player player, MessageType type) { + if (!isEnabled) { + return; + } + if (!plugin.isEnabled()) { + logger.debug("Tried to send a " + type + " bungeecord message but the plugin was disabled!"); + return; + } + if (type.isBroadcast()) { + sendForwardedBungeecordMessage(player, "AuthMe.v2.Broadcast", type.getId(), player.getName().toLowerCase(Locale.ROOT)); + } else { + sendBungeecordMessage(player, "AuthMe.v2", type.getId(), player.getName().toLowerCase(Locale.ROOT)); + } + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/bungeecord/MessageType.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/bungeecord/MessageType.java new file mode 100644 index 0000000000..ac63e41eba --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/bungeecord/MessageType.java @@ -0,0 +1,42 @@ +package fr.xephi.authme.service.bungeecord; + +import java.util.Optional; + +public enum MessageType { + LOGIN("login", true), + LOGOUT("logout", true), + PERFORM_LOGIN("perform.login", false); + + private final String id; + private final boolean broadcast; + + MessageType(String id, boolean broadcast) { + this.id = id; + this.broadcast = broadcast; + } + + public String getId() { + return id; + } + + public boolean isBroadcast() { + return broadcast; + } + + /** + * Returns the MessageType with the given ID. + * + * @param id the message type id. + * + * @return the MessageType with the given id, empty if invalid. + */ + public static Optional fromId(String id) { + for (MessageType current : values()) { + if (current.getId().equals(id)) { + return Optional.of(current); + } + } + return Optional.empty(); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/velocity/VMessageType.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/velocity/VMessageType.java new file mode 100644 index 0000000000..0e65db4297 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/velocity/VMessageType.java @@ -0,0 +1,5 @@ +package fr.xephi.authme.service.velocity; + +public enum VMessageType { + LOGIN, REGISTER, LOGOUT, FORCE_UNREGISTER, UNREGISTER +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/velocity/VelocityReceiver.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/velocity/VelocityReceiver.java new file mode 100644 index 0000000000..caa04e5f11 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/velocity/VelocityReceiver.java @@ -0,0 +1,89 @@ +package fr.xephi.authme.service.velocity; + +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteStreams; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.ProxySessionManager; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.process.Management; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.HooksSettings; +import org.bukkit.entity.Player; +import org.bukkit.plugin.messaging.Messenger; +import org.bukkit.plugin.messaging.PluginMessageListener; + +import javax.inject.Inject; + +public class VelocityReceiver implements PluginMessageListener, SettingsDependent { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(VelocityReceiver.class); + + private final AuthMe plugin; + private final BukkitService bukkitService; + private final ProxySessionManager proxySessionManager; + private final Management management; + + private boolean isEnabled; + + @Inject + VelocityReceiver(AuthMe plugin, BukkitService bukkitService, ProxySessionManager proxySessionManager, + Management management, Settings settings) { + this.plugin = plugin; + this.bukkitService = bukkitService; + this.proxySessionManager = proxySessionManager; + this.management = management; + reload(settings); + } + + @Override + public void reload(Settings settings) { + this.isEnabled = settings.getProperty(HooksSettings.VELOCITY); + if (this.isEnabled) { + final Messenger messenger = plugin.getServer().getMessenger(); + if (!messenger.isIncomingChannelRegistered(plugin, "authmevelocity:main")) { + messenger.registerIncomingPluginChannel(plugin, "authmevelocity:main", this); + } + } + } + + + @Override + public void onPluginMessageReceived(String channel, Player player, byte[] bytes) { + if (!isEnabled) { + return; + } + + if (channel.equals("authmevelocity:main")) { + final ByteArrayDataInput in = ByteStreams.newDataInput(bytes); + + final String data = in.readUTF(); + final String username = in.readUTF(); + processData(username, data); + logger.debug("PluginMessage | AuthMeVelocity identifier processed"); + } + } + + private void processData(String username, String data) { + if (VMessageType.LOGIN.toString().equals(data)) { + performLogin(username); + } + } + + private void performLogin(String name) { + Player player = bukkitService.getPlayerExact(name); + if (player != null && player.isOnline()) { + management.forceLogin(player, true); + logger.info("The user " + player.getName() + " has been automatically logged in, " + + "as requested via plugin messaging."); + } else { + proxySessionManager.processProxySessionMessage(name); + logger.info("The user " + name + " should be automatically logged in, " + + "as requested via plugin messaging but has not been detected, nickname has been" + + " added to autologin queue."); + } + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/velocity/VelocitySender.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/velocity/VelocitySender.java new file mode 100644 index 0000000000..16a0f2cb7f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/velocity/VelocitySender.java @@ -0,0 +1,76 @@ +package fr.xephi.authme.service.velocity; + +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.bungeecord.MessageType; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.HooksSettings; +import org.bukkit.entity.Player; +import org.bukkit.plugin.messaging.Messenger; + +import javax.inject.Inject; + +public class VelocitySender implements SettingsDependent { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(VelocitySender.class); + private final AuthMe plugin; + private final BukkitService bukkitService; + + private boolean isEnabled; + + /* + * Constructor. + */ + @Inject + VelocitySender(AuthMe plugin, BukkitService bukkitService, Settings settings) { + this.plugin = plugin; + this.bukkitService = bukkitService; + reload(settings); + } + + @Override + public void reload(Settings settings) { + this.isEnabled = settings.getProperty(HooksSettings.VELOCITY); + + if (this.isEnabled) { + Messenger messenger = plugin.getServer().getMessenger(); + if (!messenger.isOutgoingChannelRegistered(plugin, "authmevelocity:main")) { + messenger.registerOutgoingPluginChannel(plugin, "authmevelocity:main"); + } + } + } + + public boolean isEnabled() { + return isEnabled; + } + + private void sendForwardedVelocityMessage(Player player, VMessageType type, String playerName) { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF(type.toString()); + out.writeUTF(playerName); + bukkitService.sendVelocityMessage(player, out.toByteArray()); + } + + /** + * Sends a message to the AuthMe plugin messaging channel, if enabled. + * + * @param player The player related to the message + * @param type The message type, See {@link MessageType} + */ + public void sendAuthMeVelocityMessage(Player player, VMessageType type) { + if (!isEnabled) { + return; + } + if (!plugin.isEnabled()) { + logger.debug("Tried to send a " + type + " velocity message but the plugin was disabled!"); + return; + } + sendForwardedVelocityMessage(player, type, player.getName()); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/yaml/YamlFileResourceProvider.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/yaml/YamlFileResourceProvider.java new file mode 100644 index 0000000000..9509d73044 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/yaml/YamlFileResourceProvider.java @@ -0,0 +1,47 @@ +package fr.xephi.authme.service.yaml; + +import ch.jalu.configme.exception.ConfigMeException; +import ch.jalu.configme.resource.PropertyReader; +import ch.jalu.configme.resource.YamlFileResource; + +import java.io.File; + +/** + * Creates {@link YamlFileResource} objects. + */ +public final class YamlFileResourceProvider { + + private YamlFileResourceProvider() { + } + + /** + * Creates a {@link YamlFileResource} instance for the given file. Wraps SnakeYAML's parse exception + * thrown when a reader is created into an AuthMe exception. + * + * @param file the file to load + * @return the generated resource + */ + public static YamlFileResource loadFromFile(File file) { + return new AuthMeYamlFileResource(file); + } + + /** + * Extension of {@link YamlFileResource} which wraps SnakeYAML's parse exception into a custom + * exception when a reader is created. + */ + private static final class AuthMeYamlFileResource extends YamlFileResource { + + AuthMeYamlFileResource(File file) { + super(file); + } + + @Override + public PropertyReader createReader() { + try { + return super.createReader(); + } catch (ConfigMeException e) { + throw new YamlParseException(getFile().getPath(), e); + } + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/yaml/YamlParseException.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/yaml/YamlParseException.java new file mode 100644 index 0000000000..eba631d3e5 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/service/yaml/YamlParseException.java @@ -0,0 +1,28 @@ +package fr.xephi.authme.service.yaml; + +import ch.jalu.configme.exception.ConfigMeException; + +import java.util.Optional; + +/** + * Exception when a YAML file could not be parsed. + */ +public class YamlParseException extends RuntimeException { + + private final String file; + + /** + * Constructor. + * + * @param file the file a parsing exception occurred with + * @param configMeException the caught exception from ConfigMe + */ + public YamlParseException(String file, ConfigMeException configMeException) { + super(Optional.ofNullable(configMeException.getCause()).orElse(configMeException)); + this.file = file; + } + + public String getFile() { + return file; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/EnumSetProperty.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/EnumSetProperty.java new file mode 100644 index 0000000000..583be06278 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/EnumSetProperty.java @@ -0,0 +1,56 @@ +package fr.xephi.authme.settings; + +import ch.jalu.configme.properties.BaseProperty; +import ch.jalu.configme.properties.convertresult.ConvertErrorRecorder; +import ch.jalu.configme.resource.PropertyReader; + +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.stream.Collectors; + +import static com.google.common.collect.Sets.newHashSet; + +/** + * Property whose value is a set of entries of a given enum. + * + * @param the enum type + */ +public class EnumSetProperty> extends BaseProperty> { + + private final Class enumClass; + + @SafeVarargs + public EnumSetProperty(Class enumClass, String path, E... values) { + super(path, newHashSet(values)); + this.enumClass = enumClass; + } + + @Override + protected Set getFromReader(PropertyReader reader, ConvertErrorRecorder errorRecorder) { + Object entry = reader.getObject(getPath()); + if (entry instanceof Collection) { + return ((Collection) entry).stream() + .map(val -> toEnum(String.valueOf(val))) + .filter(e -> e != null) + .collect(Collectors.toCollection(LinkedHashSet::new)); + } + return null; + } + + private E toEnum(String str) { + for (E e : enumClass.getEnumConstants()) { + if (str.equalsIgnoreCase(e.name())) { + return e; + } + } + return null; + } + + @Override + public Object toExportValue(Set value) { + return value.stream() + .map(Enum::name) + .collect(Collectors.toList()); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/Settings.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/Settings.java new file mode 100644 index 0000000000..ad0afa6f46 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/Settings.java @@ -0,0 +1,113 @@ +package fr.xephi.authme.settings; + +import ch.jalu.configme.SettingsManagerImpl; +import ch.jalu.configme.configurationdata.ConfigurationData; +import ch.jalu.configme.migration.MigrationService; +import ch.jalu.configme.resource.PropertyResource; +import com.google.common.io.Files; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import static fr.xephi.authme.util.FileUtils.copyFileFromResource; + +/** + * The AuthMe settings manager. + */ +public class Settings extends SettingsManagerImpl { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(Settings.class); + private final File pluginFolder; + private String passwordEmailMessage; + private String verificationEmailMessage; + private String recoveryCodeEmailMessage; + private String shutdownEmailMessage; + private String newPasswordEmailMessage; + + + /** + * Constructor. + * + * @param pluginFolder the AuthMe plugin folder + * @param resource the property resource to read and write properties to + * @param migrationService migration service to check the settings file with + * @param configurationData configuration data (properties and comments) + */ + public Settings(File pluginFolder, PropertyResource resource, MigrationService migrationService, + ConfigurationData configurationData) { + super(resource, configurationData, migrationService); + this.pluginFolder = pluginFolder; + loadSettingsFromFiles(); + } + + /** + * Return the text to use in email registrations. + * + * @return The email message + */ + public String getPasswordEmailMessage() { + return passwordEmailMessage; + } + + /** + * Return the text for verification emails (before sensitive commands can be used). + * + * @return The email message + */ + public String getVerificationEmailMessage() { + return verificationEmailMessage; + } + + /** + * Return the text to use when someone requests to receive a recovery code. + * + * @return The email message + */ + public String getRecoveryCodeEmailMessage() { + return recoveryCodeEmailMessage; + } + + public String getShutdownEmailMessage() {return shutdownEmailMessage;} + + public String getNewPasswordEmailMessage() { + return newPasswordEmailMessage; + } + + private void loadSettingsFromFiles() { + newPasswordEmailMessage = readFile("new_email.html"); + passwordEmailMessage = readFile("email.html"); + verificationEmailMessage = readFile("verification_code_email.html"); + recoveryCodeEmailMessage = readFile("recovery_code_email.html"); + shutdownEmailMessage = readFile("shutdown.html"); + String country = readFile("GeoLite2-Country.mmdb"); + } + + @Override + public void reload() { + super.reload(); + loadSettingsFromFiles(); + } + + /** + * Reads a file from the plugin folder or copies it from the JAR to the plugin folder. + * + * @param filename the file to read + * @return the file's contents + */ + private String readFile(String filename) { + final File file = new File(pluginFolder, filename); + if (copyFileFromResource(file, filename)) { + try { + return Files.asCharSource(file, StandardCharsets.UTF_8).read(); + } catch (IOException e) { + logger.logException("Failed to read file '" + filename + "':", e); + } + } else { + logger.warning("Failed to copy file '" + filename + "' from JAR"); + } + return ""; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/SettingsMigrationService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/SettingsMigrationService.java new file mode 100644 index 0000000000..fe035a8b20 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/SettingsMigrationService.java @@ -0,0 +1,400 @@ +package fr.xephi.authme.settings; + +import ch.jalu.configme.configurationdata.ConfigurationData; +import ch.jalu.configme.migration.PlainMigrationService; +import ch.jalu.configme.properties.Property; +import ch.jalu.configme.properties.convertresult.PropertyValue; +import ch.jalu.configme.resource.PropertyReader; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.datasource.DataSourceType; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.output.LogLevel; +import fr.xephi.authme.process.register.RegisterSecondaryArgument; +import fr.xephi.authme.process.register.RegistrationType; +import fr.xephi.authme.security.HashAlgorithm; +import fr.xephi.authme.settings.properties.DatabaseSettings; +import fr.xephi.authme.settings.properties.PluginSettings; +import fr.xephi.authme.settings.properties.RegistrationSettings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import fr.xephi.authme.util.StringUtils; + +import javax.inject.Inject; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +import static ch.jalu.configme.properties.PropertyInitializer.newListProperty; +import static ch.jalu.configme.properties.PropertyInitializer.newProperty; +import static fr.xephi.authme.settings.properties.DatabaseSettings.MYSQL_POOL_SIZE; +import static fr.xephi.authme.settings.properties.RegistrationSettings.DELAY_JOIN_MESSAGE; +import static fr.xephi.authme.settings.properties.RegistrationSettings.REMOVE_JOIN_MESSAGE; +import static fr.xephi.authme.settings.properties.RegistrationSettings.REMOVE_LEAVE_MESSAGE; +import static fr.xephi.authme.settings.properties.RestrictionSettings.ALLOWED_NICKNAME_CHARACTERS; +import static fr.xephi.authme.settings.properties.RestrictionSettings.FORCE_SPAWN_LOCATION_AFTER_LOGIN; +import static fr.xephi.authme.settings.properties.RestrictionSettings.FORCE_SPAWN_ON_WORLDS; + +/** + * Service for verifying that the configuration is up-to-date. + */ +public class SettingsMigrationService extends PlainMigrationService { + + private static ConsoleLogger logger = ConsoleLoggerFactory.get(SettingsMigrationService.class); + private final File pluginFolder; + + // Stores old "other accounts command" config if present. + // We need to store it in here for retrieval when we build the CommandConfig. Retrieving it from the config.yml is + // not possible since this migration service may trigger the config.yml to be resaved. As the old command settings + // don't exist in the code anymore, as soon as config.yml is resaved we lose this information. + private String oldOtherAccountsCommand; + private int oldOtherAccountsCommandThreshold; + + @Inject + SettingsMigrationService(@DataFolder File pluginFolder) { + this.pluginFolder = pluginFolder; + } + + @Override + @SuppressWarnings("checkstyle:BooleanExpressionComplexity") + protected boolean performMigrations(PropertyReader reader, ConfigurationData configurationData) { + boolean changes = false; + + if ("[a-zA-Z0-9_?]*".equals(reader.getString(ALLOWED_NICKNAME_CHARACTERS.getPath()))) { + configurationData.setValue(ALLOWED_NICKNAME_CHARACTERS, "[a-zA-Z0-9_]*"); + changes = true; + } + + String driverClass = reader.getString("DataSource.mySQLDriverClassName"); + if ("fr.xephi.authme.libs.org.mariadb.jdbc.Driver".equals(driverClass)) { + configurationData.setValue(DatabaseSettings.BACKEND, DataSourceType.MARIADB); + changes = true; + } + + setOldOtherAccountsCommandFieldsIfSet(reader); + + // Note ljacqu 20160211: Concatenating migration methods with | instead of the usual || + // ensures that all migrations will be performed + return changes + | performMailTextToFileMigration(reader) + | migrateJoinLeaveMessages(reader, configurationData) + | migrateForceSpawnSettings(reader, configurationData) + | migratePoolSizeSetting(reader, configurationData) + | changeBooleanSettingToLogLevelProperty(reader, configurationData) + | hasOldHelpHeaderProperty(reader) + | hasSupportOldPasswordProperty(reader) + | convertToRegistrationType(reader, configurationData) + | mergeAndMovePermissionGroupSettings(reader, configurationData) + | moveDeprecatedHashAlgorithmIntoLegacySection(reader, configurationData) + | moveSaltColumnConfigWithOtherColumnConfigs(reader, configurationData) + || hasDeprecatedProperties(reader); + } + + private static boolean hasDeprecatedProperties(PropertyReader reader) { + String[] deprecatedProperties = { + "Converter.Rakamak.newPasswordHash", "Hooks.chestshop", "Hooks.legacyChestshop", "Hooks.notifications", + "Passpartu", "Performances", "settings.restrictions.enablePasswordVerifier", "Xenoforo.predefinedSalt", + "VeryGames", "settings.restrictions.allowAllCommandsIfRegistrationIsOptional", "DataSource.mySQLWebsite", + "Hooks.customAttributes", "Security.stop.kickPlayersBeforeStopping", + "settings.restrictions.keepCollisionsDisabled", "settings.forceCommands", "settings.forceCommandsAsConsole", + "settings.forceRegisterCommands", "settings.forceRegisterCommandsAsConsole", + "settings.sessions.sessionExpireOnIpChange", "settings.restrictions.otherAccountsCmd", + "settings.restrictions.otherAccountsCmdThreshold, DataSource.mySQLDriverClassName"}; + for (String deprecatedPath : deprecatedProperties) { + if (reader.contains(deprecatedPath)) { + return true; + } + } + return false; + } + + // -------- + // Old other accounts + // -------- + public boolean hasOldOtherAccountsCommand() { + return !StringUtils.isBlank(oldOtherAccountsCommand); + } + + public String getOldOtherAccountsCommand() { + return oldOtherAccountsCommand; + } + + public int getOldOtherAccountsCommandThreshold() { + return oldOtherAccountsCommandThreshold; + } + + // -------- + // Specific migrations + // -------- + + /** + * Check if {@code Email.mailText} is present and move it to the Email.html file if it doesn't exist yet. + * + * @param reader The property reader + * @return True if a migration has been completed, false otherwise + */ + private boolean performMailTextToFileMigration(PropertyReader reader) { + final String oldSettingPath = "Email.mailText"; + final String oldMailText = reader.getString(oldSettingPath); + if (oldMailText == null) { + return false; + } + + final File emailFile = new File(pluginFolder, "email.html"); + final String mailText = oldMailText + .replace("", "").replace("%playername%", "") + .replace("", "").replace("%servername%", "") + .replace("", "").replace("%generatedpass%", "") + .replace("", "").replace("%image%", ""); + if (!emailFile.exists()) { + try (FileWriter fw = new FileWriter(emailFile)) { + fw.write(mailText); + } catch (IOException e) { + logger.logException("Could not create email.html configuration file:", e); + } + } + return true; + } + + /** + * Detect deprecated {@code settings.delayJoinLeaveMessages} and inform user of new "remove join messages" + * and "remove leave messages" settings. + * + * @param reader The property reader + * @param configData Configuration data + * @return True if the configuration has changed, false otherwise + */ + private static boolean migrateJoinLeaveMessages(PropertyReader reader, ConfigurationData configData) { + Property oldDelayJoinProperty = newProperty("settings.delayJoinLeaveMessages", false); + boolean hasMigrated = moveProperty(oldDelayJoinProperty, DELAY_JOIN_MESSAGE, reader, configData); + + if (hasMigrated) { + logger.info(String.format("Note that we now also have the settings %s and %s", + REMOVE_JOIN_MESSAGE.getPath(), REMOVE_LEAVE_MESSAGE.getPath())); + } + return hasMigrated; + } + + /** + * Detects old "force spawn loc on join" and "force spawn on these worlds" settings and moves them + * to the new paths. + * + * @param reader The property reader + * @param configData Configuration data + * @return True if the configuration has changed, false otherwise + */ + private static boolean migrateForceSpawnSettings(PropertyReader reader, ConfigurationData configData) { + Property oldForceLocEnabled = newProperty( + "settings.restrictions.ForceSpawnLocOnJoinEnabled", false); + Property> oldForceWorlds = newListProperty( + "settings.restrictions.ForceSpawnOnTheseWorlds", "world", "world_nether", "world_the_ed"); + + return moveProperty(oldForceLocEnabled, FORCE_SPAWN_LOCATION_AFTER_LOGIN, reader, configData) + | moveProperty(oldForceWorlds, FORCE_SPAWN_ON_WORLDS, reader, configData); + } + + /** + * Detects the old auto poolSize value and replaces it with the default value. + * + * @param reader The property reader + * @param configData Configuration data + * @return True if the configuration has changed, false otherwise + */ + private static boolean migratePoolSizeSetting(PropertyReader reader, ConfigurationData configData) { + Integer oldValue = reader.getInt(MYSQL_POOL_SIZE.getPath()); + if (oldValue == null || oldValue > 0) { + return false; + } + configData.setValue(MYSQL_POOL_SIZE, 10); + return true; + } + + /** + * Changes the old boolean property "hide spam from console" to the new property specifying + * the log level. + * + * @param reader The property reader + * @param configData Configuration data + * @return True if the configuration has changed, false otherwise + */ + private static boolean changeBooleanSettingToLogLevelProperty(PropertyReader reader, + ConfigurationData configData) { + final String oldPath = "Security.console.noConsoleSpam"; + final Property newProperty = PluginSettings.LOG_LEVEL; + if (!newProperty.isValidInResource(reader) && reader.contains(oldPath)) { + logger.info("Moving '" + oldPath + "' to '" + newProperty.getPath() + "'"); + boolean oldValue = Optional.ofNullable(reader.getBoolean(oldPath)).orElse(false); + LogLevel level = oldValue ? LogLevel.INFO : LogLevel.FINE; + configData.setValue(newProperty, level); + return true; + } + return false; + } + + private static boolean hasOldHelpHeaderProperty(PropertyReader reader) { + if (reader.contains("settings.helpHeader")) { + logger.warning("Help header setting is now in messages/help_xx.yml, " + + "please check the file to set it again"); + return true; + } + return false; + } + + private static boolean hasSupportOldPasswordProperty(PropertyReader reader) { + String path = "settings.security.supportOldPasswordHash"; + if (reader.contains(path)) { + logger.warning("Property '" + path + "' is no longer supported. " + + "Use '" + SecuritySettings.LEGACY_HASHES.getPath() + "' instead."); + return true; + } + return false; + } + + /** + * Converts old boolean configurations for registration to the new enum properties, if applicable. + * + * @param reader The property reader + * @param configData Configuration data + * @return True if the configuration has changed, false otherwise + */ + private static boolean convertToRegistrationType(PropertyReader reader, ConfigurationData configData) { + String oldEmailRegisterPath = "settings.registration.enableEmailRegistrationSystem"; + if (RegistrationSettings.REGISTRATION_TYPE.isValidInResource(reader) + || !reader.contains(oldEmailRegisterPath)) { + return false; + } + + boolean useEmail = newProperty(oldEmailRegisterPath, false).determineValue(reader).getValue(); + RegistrationType registrationType = useEmail ? RegistrationType.EMAIL : RegistrationType.PASSWORD; + + String useConfirmationPath = useEmail + ? "settings.registration.doubleEmailCheck" + : "settings.restrictions.enablePasswordConfirmation"; + boolean hasConfirmation = newProperty(useConfirmationPath, false).determineValue(reader).getValue(); + RegisterSecondaryArgument secondaryArgument = hasConfirmation + ? RegisterSecondaryArgument.CONFIRMATION + : RegisterSecondaryArgument.NONE; + + logger.warning("Merging old registration settings into '" + + RegistrationSettings.REGISTRATION_TYPE.getPath() + "'"); + configData.setValue(RegistrationSettings.REGISTRATION_TYPE, registrationType); + configData.setValue(RegistrationSettings.REGISTER_SECOND_ARGUMENT, secondaryArgument); + return true; + } + + /** + * Migrates old permission group settings to the new configurations. + * + * @param reader The property reader + * @param configData Configuration data + * @return True if the configuration has changed, false otherwise + */ + private static boolean mergeAndMovePermissionGroupSettings(PropertyReader reader, ConfigurationData configData) { + boolean performedChanges; + + // We have two old settings replaced by only one: move the first non-empty one + Property oldUnloggedInGroup = newProperty("settings.security.unLoggedinGroup", ""); + Property oldRegisteredGroup = newProperty("GroupOptions.RegisteredPlayerGroup", ""); + if (!oldUnloggedInGroup.determineValue(reader).getValue().isEmpty()) { + performedChanges = moveProperty(oldUnloggedInGroup, PluginSettings.REGISTERED_GROUP, reader, configData); + } else { + performedChanges = moveProperty(oldRegisteredGroup, PluginSettings.REGISTERED_GROUP, reader, configData); + } + + // Move paths of other old options + performedChanges |= moveProperty(newProperty("GroupOptions.UnregisteredPlayerGroup", ""), + PluginSettings.UNREGISTERED_GROUP, reader, configData); + performedChanges |= moveProperty(newProperty("permission.EnablePermissionCheck", false), + PluginSettings.ENABLE_PERMISSION_CHECK, reader, configData); + return performedChanges; + } + + /** + * If a deprecated hash is used, it is added to the legacy hashes option and the active hash + * is changed to SHA256. + * + * @param reader The property reader + * @param configData Configuration data + * @return True if the configuration has changed, false otherwise + */ + private static boolean moveDeprecatedHashAlgorithmIntoLegacySection(PropertyReader reader, + ConfigurationData configData) { + HashAlgorithm currentHash = SecuritySettings.PASSWORD_HASH.determineValue(reader).getValue(); + // Skip CUSTOM (has no class) and PLAINTEXT (is force-migrated later on in the startup process) + if (currentHash != HashAlgorithm.CUSTOM && currentHash != HashAlgorithm.PLAINTEXT) { + Class encryptionClass = currentHash.getClazz(); + if (encryptionClass.isAnnotationPresent(Deprecated.class)) { + configData.setValue(SecuritySettings.PASSWORD_HASH, HashAlgorithm.SHA256); + Set legacyHashes = SecuritySettings.LEGACY_HASHES.determineValue(reader).getValue(); + legacyHashes.add(currentHash); + configData.setValue(SecuritySettings.LEGACY_HASHES, legacyHashes); + logger.warning("The hash algorithm '" + currentHash + + "' is no longer supported for active use. New hashes will be in SHA256."); + return true; + } + } + return false; + } + + /** + * Moves the property for the password salt column name to the same path as all other column name properties. + * + * @param reader The property reader + * @param configData Configuration data + * @return True if the configuration has changed, false otherwise + */ + private static boolean moveSaltColumnConfigWithOtherColumnConfigs(PropertyReader reader, + ConfigurationData configData) { + Property oldProperty = newProperty("ExternalBoardOptions.mySQLColumnSalt", + DatabaseSettings.MYSQL_COL_SALT.getDefaultValue()); + return moveProperty(oldProperty, DatabaseSettings.MYSQL_COL_SALT, reader, configData); + } + + /** + * Retrieves the old config to run a command when alt accounts are detected and sets them to this instance + * for further processing. + * + * @param reader The property reader + */ + private void setOldOtherAccountsCommandFieldsIfSet(PropertyReader reader) { + Property commandProperty = newProperty("settings.restrictions.otherAccountsCmd", ""); + Property commandThresholdProperty = newProperty("settings.restrictions.otherAccountsCmdThreshold", 0); + + PropertyValue commandPropValue = commandProperty.determineValue(reader); + int commandThreshold = commandThresholdProperty.determineValue(reader).getValue(); + if (commandPropValue.isValidInResource() && commandThreshold >= 2) { + oldOtherAccountsCommand = commandPropValue.getValue(); + oldOtherAccountsCommandThreshold = commandThreshold; + } + } + + /** + * Checks for an old property path and moves it to a new path if it is present and the new path is not yet set. + * + * @param oldProperty The old property (create a temporary {@link Property} object with the path) + * @param newProperty The new property to move the value to + * @param reader The property reader + * @param configData Configuration data + * @param The type of the property + * @return True if a migration has been done, false otherwise + */ + protected static boolean moveProperty(Property oldProperty, + Property newProperty, + PropertyReader reader, + ConfigurationData configData) { + PropertyValue oldPropertyValue = oldProperty.determineValue(reader); + if (oldPropertyValue.isValidInResource()) { + if (reader.contains(newProperty.getPath())) { + logger.info("Detected deprecated property " + oldProperty.getPath()); + } else { + logger.info("Renaming " + oldProperty.getPath() + " to " + newProperty.getPath()); + configData.setValue(newProperty, oldPropertyValue.getValue()); + } + return true; + } + return false; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/SettingsWarner.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/SettingsWarner.java new file mode 100644 index 0000000000..c63ffe7182 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/SettingsWarner.java @@ -0,0 +1,90 @@ +package fr.xephi.authme.settings; + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.security.HashAlgorithm; +import fr.xephi.authme.security.crypts.Argon2; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.properties.EmailSettings; +import fr.xephi.authme.settings.properties.HooksSettings; +import fr.xephi.authme.settings.properties.PluginSettings; +import fr.xephi.authme.settings.properties.RestrictionSettings; +import fr.xephi.authme.settings.properties.SecuritySettings; + +import javax.inject.Inject; +import java.util.Optional; + +/** + * Logs warning messages in cases where the configured values suggest a misconfiguration. + *

+ * Note that this class does not modify any settings and it is called after the settings have been fully loaded. + * For actual migrations (= verifications which trigger changes and a resave of the settings), + * see {@link SettingsMigrationService}. + */ +public class SettingsWarner { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(SettingsWarner.class); + + @Inject + private Settings settings; + + @Inject + private AuthMe authMe; + + @Inject + private BukkitService bukkitService; + + SettingsWarner() { + } + + /** + * Logs warning when necessary to notify the user about misconfigurations. + */ + public void logWarningsForMisconfigurations() { + // Force single session disabled + if (!settings.getProperty(RestrictionSettings.FORCE_SINGLE_SESSION)) { + logger.warning("WARNING!!! By disabling ForceSingleSession, your server protection is inadequate!"); + } + + // Use TLS property only affects port 25 + if (!settings.getProperty(EmailSettings.PORT25_USE_TLS) + && settings.getProperty(EmailSettings.SMTP_PORT) != 25) { + logger.warning("Note: You have set Email.useTls to false but this only affects mail over port 25"); + } + + // Output hint if sessions are enabled that the timeout must be positive + if (settings.getProperty(PluginSettings.SESSIONS_ENABLED) + && settings.getProperty(PluginSettings.SESSIONS_TIMEOUT) <= 0) { + logger.warning("Warning: Session timeout needs to be positive in order to work!"); + } + + // Warn if spigot.yml has settings.bungeecord set to true but config.yml has Hooks.bungeecord set to false + if (isTrue(bukkitService.isBungeeCordConfiguredForSpigot()) + && !settings.getProperty(HooksSettings.BUNGEECORD) && !settings.getProperty(HooksSettings.VELOCITY)) { + logger.warning("Note: Hooks.bungeecord is set to false but your server appears to be running in" + + " bungeecord mode (see your spigot.yml). In order to allow the datasource caching and the" + + " AuthMeBungee add-on to work properly you have to enable this option!"); + } + + if (!isTrue(bukkitService.isBungeeCordConfiguredForSpigot()) + && settings.getProperty(HooksSettings.BUNGEECORD)) { + logger.warning("Note: Hooks.bungeecord is set to true but your server appears to be running in" + + " non-bungeecord mode (see your spigot.yml). In order to prevent untrusted payload attack, " + + "BungeeCord hook will be automatically disabled!"); + } + + + // Check if argon2 library is present and can be loaded + if (settings.getProperty(SecuritySettings.PASSWORD_HASH).equals(HashAlgorithm.ARGON2) + && !Argon2.isLibraryLoaded()) { + logger.warning("WARNING!!! You use Argon2 Hash Algorithm method but we can't find the Argon2 " + + "library on your system! See https://github.com/AuthMe/AuthMeReloaded/wiki/Argon2-as-Password-Hash"); + authMe.stopOrUnload(); + } + } + + private static boolean isTrue(Optional value) { + return value.isPresent() && value.get(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/SpawnLoader.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/SpawnLoader.java new file mode 100644 index 0000000000..171a999bc8 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/SpawnLoader.java @@ -0,0 +1,378 @@ +package fr.xephi.authme.settings; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.initialization.Reloadable; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.service.PluginHookService; +import fr.xephi.authme.settings.properties.HooksSettings; +import fr.xephi.authme.settings.properties.RestrictionSettings; +import fr.xephi.authme.util.FileUtils; +import fr.xephi.authme.util.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.io.File; +import java.io.IOException; +import java.util.Locale; + +/** + * Manager for spawn points. It loads spawn definitions from AuthMe and third-party plugins + * and is responsible for returning the correct spawn point as per the settings. + *

+ * The spawn priority setting defines from which sources and in which order the spawn point + * should be taken from. In AuthMe, we can distinguish between the regular spawn and a "first spawn", + * to which players will be teleported who have joined for the first time. + */ +public class SpawnLoader implements Reloadable { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(SpawnLoader.class); + + private final File authMeConfigurationFile; + private final Settings settings; + private final PluginHookService pluginHookService; + private Configuration authMeConfiguration; + private String[] spawnPriority; + private Location essentialsSpawn; + private Location cmiSpawn; + + /** + * Constructor. + * + * @param pluginFolder The AuthMe data folder + * @param settings The setting instance + * @param pluginHookService The plugin hooks instance + */ + @Inject + SpawnLoader(@DataFolder File pluginFolder, Settings settings, PluginHookService pluginHookService) { + File spawnFile = new File(pluginFolder, "spawn.yml"); + FileUtils.copyFileFromResource(spawnFile, "spawn.yml"); + this.authMeConfigurationFile = spawnFile; + this.settings = settings; + this.pluginHookService = pluginHookService; + reload(); + } + + /** + * (Re)loads the spawn file and relevant settings. + */ + @Override + public void reload() { + spawnPriority = settings.getProperty(RestrictionSettings.SPAWN_PRIORITY).split(","); + authMeConfiguration = YamlConfiguration.loadConfiguration(authMeConfigurationFile); + loadEssentialsSpawn(); + } + + /** + * Return the AuthMe spawn location. + * + * @return The location of the regular AuthMe spawn point + */ + public Location getSpawn() { + return getLocationFromConfiguration(authMeConfiguration, "spawn"); + } + + /** + * Set the AuthMe spawn point. + * + * @param location The location to use + * + * @return True upon success, false otherwise + */ + public boolean setSpawn(Location location) { + return setLocation("spawn", location); + } + + /** + * Return the AuthMe first spawn location. + * + * @return The location of the AuthMe spawn point for first timers + */ + public Location getFirstSpawn() { + return getLocationFromConfiguration(authMeConfiguration, "firstspawn"); + } + + /** + * Set the AuthMe first spawn location. + * + * @param location The location to use + * + * @return True upon success, false otherwise + */ + public boolean setFirstSpawn(Location location) { + return setLocation("firstspawn", location); + } + + /** + * Load the spawn point defined in EssentialsSpawn. + */ + public void loadEssentialsSpawn() { + // EssentialsSpawn cannot run without Essentials, so it's fine to get the Essentials data folder + File essentialsFolder = pluginHookService.getEssentialsDataFolder(); + if (essentialsFolder == null) { + return; + } + + File essentialsSpawnFile = new File(essentialsFolder, "spawn.yml"); + if (essentialsSpawnFile.exists()) { + essentialsSpawn = getLocationFromConfiguration( + YamlConfiguration.loadConfiguration(essentialsSpawnFile), "spawns.default"); + } else { + essentialsSpawn = null; + logger.info("Essentials spawn file not found: '" + essentialsSpawnFile.getAbsolutePath() + "'"); + } + } + + /** + * Unset the spawn point defined in EssentialsSpawn. + */ + public void unloadEssentialsSpawn() { + essentialsSpawn = null; + } + + /** + * Load the spawn point defined in CMI. + */ + public void loadCmiSpawn() { + File cmiFolder = pluginHookService.getCmiDataFolder(); + if (cmiFolder == null) { + return; + } + + File cmiConfig = new File(cmiFolder, "config.yml"); + if (cmiConfig.exists()) { + cmiSpawn = getLocationFromCmiConfiguration(YamlConfiguration.loadConfiguration(cmiConfig)); + } else { + cmiSpawn = null; + logger.info("CMI config file not found: '" + cmiConfig.getAbsolutePath() + "'"); + } + } + + /** + * Unset the spawn point defined in CMI. + */ + public void unloadCmiSpawn() { + cmiSpawn = null; + } + + /** + * Return the spawn location for the given player. The source of the spawn location varies + * depending on the spawn priority setting. + * + * @param player The player to retrieve the spawn point for + * + * @return The spawn location, or the default spawn location upon failure + * + * @see RestrictionSettings#SPAWN_PRIORITY + */ + public Location getSpawnLocation(Player player) { + if (player == null || player.getWorld() == null) { + return null; + } + + World world = player.getWorld(); + Location spawnLoc = null; + for (String priority : spawnPriority) { + switch (priority.toLowerCase(Locale.ROOT).trim()) { + case "default": + if (world.getSpawnLocation() != null) { + if (!isValidSpawnPoint(world.getSpawnLocation())) { + for (World spawnWorld : Bukkit.getWorlds()) { + if (isValidSpawnPoint(spawnWorld.getSpawnLocation())) { + world = spawnWorld; + break; + } + } + logger.warning("Seems like AuthMe is unable to find a proper spawn location. " + + "Set a location with the command '/authme setspawn'"); + } + spawnLoc = world.getSpawnLocation(); + } + break; + case "multiverse": + if (settings.getProperty(HooksSettings.MULTIVERSE)) { + spawnLoc = pluginHookService.getMultiverseSpawn(world); + } + break; + case "essentials": + spawnLoc = essentialsSpawn; + break; + case "cmi": + spawnLoc = cmiSpawn; + break; + case "authme": + spawnLoc = getSpawn(); + break; + default: + // ignore + } + if (spawnLoc != null) { + logger.debug("Spawn location determined as `{0}` for world `{1}`", spawnLoc, world.getName()); + return spawnLoc; + } + } + logger.debug("Fall back to default world spawn location. World: `{0}`", world.getName()); + + return world.getSpawnLocation(); // return default location + } + + /** + * Checks if a given location is a valid spawn point [!= (0,0,0)]. + * + * @param location The location to check + * + * @return True upon success, false otherwise + */ + private boolean isValidSpawnPoint(Location location) { + if (location.getX() == 0 && location.getY() == 0 && location.getZ() == 0) { + return false; + } + return true; + } + + /** + * Save the location under the given prefix. + * + * @param prefix The prefix to save the spawn under + * @param location The location to persist + * + * @return True upon success, false otherwise + */ + private boolean setLocation(String prefix, Location location) { + if (location != null && location.getWorld() != null) { + authMeConfiguration.set(prefix + ".world", location.getWorld().getName()); + authMeConfiguration.set(prefix + ".x", location.getX()); + authMeConfiguration.set(prefix + ".y", location.getY()); + authMeConfiguration.set(prefix + ".z", location.getZ()); + authMeConfiguration.set(prefix + ".yaw", location.getYaw()); + authMeConfiguration.set(prefix + ".pitch", location.getPitch()); + return saveAuthMeConfig(); + } + return false; + } + + private boolean saveAuthMeConfig() { + try { + authMeConfiguration.save(authMeConfigurationFile); + return true; + } catch (IOException e) { + logger.logException("Could not save spawn config (" + authMeConfigurationFile + ")", e); + } + return false; + } + + /** + * Return player's location if player is alive, or player's spawn location if dead. + * + * @param player player to retrieve + * + * @return location of the given player if alive, spawn location if dead. + */ + public Location getPlayerLocationOrSpawn(Player player) { + if (player.getHealth() <= 0.0) { + return getSpawnLocation(player); + } + return player.getLocation(); + } + + /** + * Build a {@link Location} object from the given path in the file configuration. + * + * @param configuration The file configuration to read from + * @param pathPrefix The path to get the spawn point from + * + * @return Location corresponding to the values in the path + */ + private static Location getLocationFromConfiguration(FileConfiguration configuration, String pathPrefix) { + if (containsAllSpawnFields(configuration, pathPrefix)) { + String prefix = pathPrefix + "."; + String worldName = configuration.getString(prefix + "world"); + World world = Bukkit.getWorld(worldName); + if (!StringUtils.isBlank(worldName) && world != null) { + return new Location(world, configuration.getDouble(prefix + "x"), + configuration.getDouble(prefix + "y"), configuration.getDouble(prefix + "z"), + getFloat(configuration, prefix + "yaw"), getFloat(configuration, prefix + "pitch")); + } + } + return null; + } + + /** + * Build a {@link Location} object based on the CMI configuration. + * + * @param configuration The CMI file configuration to read from + * + * @return Location corresponding to the values in the path + */ + private static Location getLocationFromCmiConfiguration(FileConfiguration configuration) { + final String pathPrefix = "Spawn.Main"; + if (isLocationCompleteInCmiConfig(configuration, pathPrefix)) { + String prefix = pathPrefix + "."; + String worldName = configuration.getString(prefix + "World"); + World world = Bukkit.getWorld(worldName); + if (!StringUtils.isBlank(worldName) && world != null) { + return new Location(world, configuration.getDouble(prefix + "X"), + configuration.getDouble(prefix + "Y"), configuration.getDouble(prefix + "Z"), + getFloat(configuration, prefix + "Yaw"), getFloat(configuration, prefix + "Pitch")); + } + } + return null; + } + + /** + * Return whether the file configuration contains all fields necessary to define a spawn + * under the given path. + * + * @param configuration The file configuration to use + * @param pathPrefix The path to verify + * + * @return True if all spawn fields are present, false otherwise + */ + private static boolean containsAllSpawnFields(FileConfiguration configuration, String pathPrefix) { + String[] fields = {"world", "x", "y", "z", "yaw", "pitch"}; + for (String field : fields) { + if (!configuration.contains(pathPrefix + "." + field)) { + return false; + } + } + return true; + } + + /** + * Return whether the CMI file configuration contains all spawn fields under the given path. + * + * @param cmiConfiguration The file configuration from CMI + * @param pathPrefix The path to verify + * + * @return True if all spawn fields are present, false otherwise + */ + private static boolean isLocationCompleteInCmiConfig(FileConfiguration cmiConfiguration, String pathPrefix) { + String[] fields = {"World", "X", "Y", "Z", "Yaw", "Pitch"}; + for (String field : fields) { + if (!cmiConfiguration.contains(pathPrefix + "." + field)) { + return false; + } + } + return true; + } + + /** + * Retrieve a property as a float from the given file configuration. + * + * @param configuration The file configuration to use + * @param path The path of the property to retrieve + * + * @return The float + */ + private static float getFloat(FileConfiguration configuration, String path) { + Object value = configuration.get(path); + // This behavior is consistent with FileConfiguration#getDouble + return (value instanceof Number) ? ((Number) value).floatValue() : 0; + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/Command.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/Command.java new file mode 100644 index 0000000000..5ac922b15c --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/Command.java @@ -0,0 +1,67 @@ +package fr.xephi.authme.settings.commandconfig; + +/** + * Command to be run. + */ +public class Command { + + /** The command to execute. */ + private String command; + /** The executor of the command. */ + private Executor executor = Executor.PLAYER; + /** Delay before executing the command (in ticks) */ + private long delay = 0; + + /** + * Default constructor (for bean mapping). + */ + public Command() { + } + + /** + * Creates a copy of this Command object, setting the given command text on the copy. + * + * @param command the command text to use in the copy + * @return copy of the source with the new command + */ + public Command copyWithCommand(String command) { + Command copy = new Command(); + setValuesToCopyWithNewCommand(copy, command); + return copy; + } + + protected void setValuesToCopyWithNewCommand(Command copy, String newCommand) { + copy.command = newCommand; + copy.executor = this.executor; + copy.delay = this.delay; + } + + public String getCommand() { + return command; + } + + public void setCommand(String command) { + this.command = command; + } + + public Executor getExecutor() { + return executor; + } + + public void setExecutor(Executor executor) { + this.executor = executor; + } + + public long getDelay() { + return delay; + } + + public void setDelay(long delay) { + this.delay = delay; + } + + @Override + public String toString() { + return command + " (" + executor + ")"; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/CommandConfig.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/CommandConfig.java new file mode 100644 index 0000000000..29484ccddf --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/CommandConfig.java @@ -0,0 +1,76 @@ +package fr.xephi.authme.settings.commandconfig; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Command configuration. + * + * @see CommandManager + */ +public class CommandConfig { + + private Map onJoin = new LinkedHashMap<>(); + private Map onLogin = new LinkedHashMap<>(); + private Map onSessionLogin = new LinkedHashMap<>(); + private Map onFirstLogin = new LinkedHashMap<>(); + private Map onRegister = new LinkedHashMap<>(); + private Map onUnregister = new LinkedHashMap<>(); + private Map onLogout = new LinkedHashMap<>(); + + public Map getOnJoin() { + return onJoin; + } + + public void setOnJoin(Map onJoin) { + this.onJoin = onJoin; + } + + public Map getOnLogin() { + return onLogin; + } + + public void setOnLogin(Map onLogin) { + this.onLogin = onLogin; + } + + public Map getOnSessionLogin() { + return onSessionLogin; + } + + public void setOnSessionLogin(Map onSessionLogin) { + this.onSessionLogin = onSessionLogin; + } + + public Map getOnFirstLogin() { + return onFirstLogin; + } + + public void setOnFirstLogin(Map onFirstLogin) { + this.onFirstLogin = onFirstLogin; + } + + public Map getOnRegister() { + return onRegister; + } + + public void setOnRegister(Map onRegister) { + this.onRegister = onRegister; + } + + public Map getOnUnregister() { + return onUnregister; + } + + public void setOnUnregister(Map onUnregister) { + this.onUnregister = onUnregister; + } + + public Map getOnLogout() { + return onLogout; + } + + public void setOnLogout(Map onLogout) { + this.onLogout = onLogout; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/CommandManager.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/CommandManager.java new file mode 100644 index 0000000000..86f06aa8e4 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/CommandManager.java @@ -0,0 +1,192 @@ +package fr.xephi.authme.settings.commandconfig; + +import ch.jalu.configme.SettingsManager; +import ch.jalu.configme.SettingsManagerBuilder; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.initialization.Reloadable; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.GeoIpService; +import fr.xephi.authme.service.yaml.YamlFileResourceProvider; +import fr.xephi.authme.util.FileUtils; +import fr.xephi.authme.util.PlayerUtils; +import fr.xephi.authme.util.lazytags.Tag; +import fr.xephi.authme.util.lazytags.WrappedTagReplacer; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.io.File; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.function.Predicate; + +import static fr.xephi.authme.util.lazytags.TagBuilder.createTag; + +/** + * Manages configurable commands to be run when various events occur. + */ +public class CommandManager implements Reloadable { + + private final File dataFolder; + private final BukkitService bukkitService; + private final GeoIpService geoIpService; + private final CommandMigrationService commandMigrationService; + private final List> availableTags = buildAvailableTags(); + + private WrappedTagReplacer onJoinCommands; + private WrappedTagReplacer onLoginCommands; + private WrappedTagReplacer onSessionLoginCommands; + private WrappedTagReplacer onFirstLoginCommands; + private WrappedTagReplacer onRegisterCommands; + private WrappedTagReplacer onUnregisterCommands; + private WrappedTagReplacer onLogoutCommands; + + @Inject + CommandManager(@DataFolder File dataFolder, BukkitService bukkitService, GeoIpService geoIpService, + CommandMigrationService commandMigrationService) { + this.dataFolder = dataFolder; + this.bukkitService = bukkitService; + this.geoIpService = geoIpService; + this.commandMigrationService = commandMigrationService; + reload(); + } + + /** + * Runs the configured commands for when a player has joined. + * + * @param player the joining player + */ + public void runCommandsOnJoin(Player player) { + executeCommands(player, onJoinCommands.getAdaptedItems(player)); + } + + /** + * Runs the configured commands for when a player has successfully registered. + * + * @param player the player who has registered + */ + public void runCommandsOnRegister(Player player) { + executeCommands(player, onRegisterCommands.getAdaptedItems(player)); + } + + /** + * Runs the configured commands for when a player has logged in successfully. + * + * @param player the player that logged in + * @param otherAccounts account names whose IP is the same as the player's + */ + public void runCommandsOnLogin(Player player, List otherAccounts) { + final int numberOfOtherAccounts = otherAccounts.size(); + executeCommands(player, onLoginCommands.getAdaptedItems(player), + cmd -> shouldCommandBeRun(cmd, numberOfOtherAccounts)); + } + + /** + * Runs the configured commands for when a player has logged in successfully due to session. + * + * @param player the player that logged in + */ + public void runCommandsOnSessionLogin(Player player) { + executeCommands(player, onSessionLoginCommands.getAdaptedItems(player)); + } + + /** + * Runs the configured commands for when a player logs in the first time. + * + * @param player the player that has logged in for the first time + * @param otherAccounts account names whose IP is the same as the player's + */ + public void runCommandsOnFirstLogin(Player player, List otherAccounts) { + final int numberOfOtherAccounts = otherAccounts.size(); + executeCommands(player, onFirstLoginCommands.getAdaptedItems(player), + cmd -> shouldCommandBeRun(cmd, numberOfOtherAccounts)); + } + + /** + * Runs the configured commands for when a player has been unregistered. + * + * @param player the player that has been unregistered + */ + public void runCommandsOnUnregister(Player player) { + executeCommands(player, onUnregisterCommands.getAdaptedItems(player)); + } + + /** + * Runs the configured commands for when a player logs out (by command or by quitting the server). + * + * @param player the player that is no longer logged in + */ + public void runCommandsOnLogout(Player player) { + executeCommands(player, onLogoutCommands.getAdaptedItems(player)); + } + + private void executeCommands(Player player, List commands) { + executeCommands(player, commands, c -> true); + } + + private void executeCommands(Player player, List commands, Predicate predicate) { + for (T cmd : commands) { + if (predicate.test(cmd)) { + long delay = cmd.getDelay(); + if (delay > 0) { + bukkitService.runTaskLater(player, () -> dispatchCommand(player, cmd), delay); + } else { + bukkitService.runTaskIfFolia(player, () -> dispatchCommand(player, cmd)); + } + } + } + } + + private void dispatchCommand(Player player, Command command) { + if (Executor.CONSOLE.equals(command.getExecutor())) { + bukkitService.dispatchConsoleCommand(command.getCommand()); + } else { + bukkitService.dispatchCommand(player, command.getCommand()); + } + } + + private static boolean shouldCommandBeRun(OnLoginCommand command, int numberOfOtherAccounts) { + return (!command.getIfNumberOfAccountsAtLeast().isPresent() + || command.getIfNumberOfAccountsAtLeast().get() <= numberOfOtherAccounts) + && (!command.getIfNumberOfAccountsLessThan().isPresent() + || command.getIfNumberOfAccountsLessThan().get() > numberOfOtherAccounts); + } + + @Override + public void reload() { + File file = new File(dataFolder, "commands.yml"); + FileUtils.copyFileFromResource(file, "commands.yml"); + + SettingsManager settingsManager = SettingsManagerBuilder + .withResource(YamlFileResourceProvider.loadFromFile(file)) + .configurationData(CommandSettingsHolder.class) + .migrationService(commandMigrationService) + .create(); + CommandConfig commandConfig = settingsManager.getProperty(CommandSettingsHolder.COMMANDS); + onJoinCommands = newReplacer(commandConfig.getOnJoin()); + onLoginCommands = newOnLoginCmdReplacer(commandConfig.getOnLogin()); + onFirstLoginCommands = newOnLoginCmdReplacer(commandConfig.getOnFirstLogin()); + onSessionLoginCommands = newReplacer(commandConfig.getOnSessionLogin()); + onRegisterCommands = newReplacer(commandConfig.getOnRegister()); + onUnregisterCommands = newReplacer(commandConfig.getOnUnregister()); + onLogoutCommands = newReplacer(commandConfig.getOnLogout()); + } + + private WrappedTagReplacer newReplacer(Map commands) { + return new WrappedTagReplacer<>(availableTags, commands.values(), Command::getCommand, + Command::copyWithCommand); + } + + private WrappedTagReplacer newOnLoginCmdReplacer(Map commands) { + return new WrappedTagReplacer<>(availableTags, commands.values(), Command::getCommand, + OnLoginCommand::copyWithCommand); + } + + private List> buildAvailableTags() { + return Arrays.asList( + createTag("%p", Player::getName), + createTag("%nick", Player::getDisplayName), + createTag("%ip", PlayerUtils::getPlayerIp), + createTag("%country", pl -> geoIpService.getCountryName(PlayerUtils.getPlayerIp(pl)))); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/CommandMigrationService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/CommandMigrationService.java new file mode 100644 index 0000000000..0822616d3a --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/CommandMigrationService.java @@ -0,0 +1,66 @@ +package fr.xephi.authme.settings.commandconfig; + +import ch.jalu.configme.configurationdata.ConfigurationData; +import ch.jalu.configme.migration.MigrationService; +import ch.jalu.configme.resource.PropertyReader; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableList; +import fr.xephi.authme.settings.SettingsMigrationService; +import fr.xephi.authme.util.RandomStringUtils; + +import javax.inject.Inject; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * Migrates the commands from their old location, in config.yml, to the dedicated commands configuration file. + */ +class CommandMigrationService implements MigrationService { + + /** List of all properties in {@link CommandConfig}. */ + @VisibleForTesting + static final List COMMAND_CONFIG_PROPERTIES = ImmutableList.of( + "onJoin", "onLogin", "onSessionLogin", "onFirstLogin", "onRegister", "onUnregister", "onLogout"); + + @Inject + private SettingsMigrationService settingsMigrationService; + + CommandMigrationService() { + } + + @Override + public boolean checkAndMigrate(PropertyReader reader, ConfigurationData configurationData) { + final CommandConfig commandConfig = CommandSettingsHolder.COMMANDS.determineValue(reader).getValue(); + if (moveOtherAccountsConfig(commandConfig) || isAnyCommandMissing(reader)) { + configurationData.setValue(CommandSettingsHolder.COMMANDS, commandConfig); + return true; + } + return false; + } + + private boolean moveOtherAccountsConfig(CommandConfig commandConfig) { + if (settingsMigrationService.hasOldOtherAccountsCommand()) { + OnLoginCommand command = new OnLoginCommand(); + command.setCommand(replaceOldPlaceholdersWithNew(settingsMigrationService.getOldOtherAccountsCommand())); + command.setExecutor(Executor.CONSOLE); + command.setIfNumberOfAccountsAtLeast( + Optional.of(settingsMigrationService.getOldOtherAccountsCommandThreshold())); + + Map onLoginCommands = commandConfig.getOnLogin(); + onLoginCommands.put(RandomStringUtils.generate(10), command); + return true; + } + return false; + } + + private static String replaceOldPlaceholdersWithNew(String oldOtherAccountsCommand) { + return oldOtherAccountsCommand + .replace("%playername%", "%p") + .replace("%playerip%", "%ip"); + } + + private static boolean isAnyCommandMissing(PropertyReader reader) { + return COMMAND_CONFIG_PROPERTIES.stream().anyMatch(property -> reader.getObject(property) == null); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/CommandSettingsHolder.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/CommandSettingsHolder.java new file mode 100644 index 0000000000..ab8e984993 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/CommandSettingsHolder.java @@ -0,0 +1,77 @@ +package fr.xephi.authme.settings.commandconfig; + +import ch.jalu.configme.SettingsHolder; +import ch.jalu.configme.configurationdata.CommentsConfiguration; +import ch.jalu.configme.properties.BeanProperty; +import ch.jalu.configme.properties.Property; + +/** + * Settings holder class for the commands.yml settings. + */ +public final class CommandSettingsHolder implements SettingsHolder { + + public static final Property COMMANDS = + new BeanProperty<>(CommandConfig.class, "", new CommandConfig()); + + private CommandSettingsHolder() { + } + + @Override + public void registerComments(CommentsConfiguration conf) { + String[] rootComments = { + "This configuration file allows you to execute commands on various events.", + "Supported placeholders in commands:", + " %p is replaced with the player name.", + " %nick is replaced with the player's nick name", + " %ip is replaced with the player's IP address", + " %country is replaced with the player's country", + "", + "For example, if you want to send a welcome message to a player who just registered:", + "onRegister:", + " welcome:", + " command: 'msg %p Welcome to the server!'", + " executor: CONSOLE", + "", + "This will make the console execute the msg command to the player.", + "Each command under an event has a name you can choose freely (e.g. 'welcome' as above),", + "after which a mandatory 'command' field defines the command to run,", + "and 'executor' defines who will run the command (either PLAYER or CONSOLE). Longer example:", + "onLogin:", + " welcome:", + " command: 'msg %p Welcome back!'", + " executor: PLAYER", + " broadcast:", + " command: 'broadcast %p has joined, welcome back!'", + " executor: CONSOLE", + "", + "You can also add delay to command. It will run after the specified ticks. Example:", + "onLogin:", + " rules:", + " command: 'rules'", + " executor: PLAYER", + " delay: 200", + "", + "Supported command events: onLogin, onSessionLogin, onFirstLogin, onJoin, onLogout, onRegister, " + + "onUnregister", + "", + "For onLogin and onFirstLogin, you can use 'ifNumberOfAccountsLessThan' and 'ifNumberOfAccountsAtLeast'", + "to specify limits to how many accounts a player can have (matched by IP) for a command to be run:", + "onLogin:", + " warnOnManyAccounts:", + " command: 'say Uh oh! %p has many alt accounts!'", + " executor: CONSOLE", + " ifNumberOfAccountsAtLeast: 5" + }; + + conf.setComment("", rootComments); + conf.setComment("onFirstLogin", + "Commands to run for players logging in whose 'last login date' was empty"); + conf.setComment("onUnregister", + "Commands to run whenever a player is unregistered (by himself, or by an admin)"); + conf.setComment("onLogout", + "These commands are called whenever a logged in player uses /logout or quits.", + "The commands are not run if a player that was not logged in quits the server.", + "Note: if your server crashes, these commands won't be run, so don't rely on them to undo", + "'onLogin' commands that would be dangerous for non-logged in players to have!"); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/Executor.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/Executor.java new file mode 100644 index 0000000000..c7043de2da --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/Executor.java @@ -0,0 +1,14 @@ +package fr.xephi.authme.settings.commandconfig; + +/** + * The executor of the command. + */ +public enum Executor { + + /** The player of the event. */ + PLAYER, + + /** The console user. */ + CONSOLE + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/OnLoginCommand.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/OnLoginCommand.java new file mode 100644 index 0000000000..13cc30fca8 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/commandconfig/OnLoginCommand.java @@ -0,0 +1,49 @@ +package fr.xephi.authme.settings.commandconfig; + +import java.util.Optional; + +/** + * Configurable command for when a player logs in. + */ +public class OnLoginCommand extends Command { + + private Optional ifNumberOfAccountsAtLeast = Optional.empty(); + private Optional ifNumberOfAccountsLessThan = Optional.empty(); + + /** + * Default constructor (for bean mapping). + */ + public OnLoginCommand() { + } + + /** + * Creates a copy of this object, using the given command as new {@link Command#command command}. + * + * @param command the command text to use in the copy + * @return copy of the source with the new command + */ + @Override + public OnLoginCommand copyWithCommand(String command) { + OnLoginCommand copy = new OnLoginCommand(); + setValuesToCopyWithNewCommand(copy, command); + copy.ifNumberOfAccountsAtLeast = this.ifNumberOfAccountsAtLeast; + copy.ifNumberOfAccountsLessThan = this.ifNumberOfAccountsLessThan; + return copy; + } + + public Optional getIfNumberOfAccountsAtLeast() { + return ifNumberOfAccountsAtLeast; + } + + public void setIfNumberOfAccountsAtLeast(Optional ifNumberOfAccountsAtLeast) { + this.ifNumberOfAccountsAtLeast = ifNumberOfAccountsAtLeast; + } + + public Optional getIfNumberOfAccountsLessThan() { + return ifNumberOfAccountsLessThan; + } + + public void setIfNumberOfAccountsLessThan(Optional ifNumberOfAccountsLessThan) { + this.ifNumberOfAccountsLessThan = ifNumberOfAccountsLessThan; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/AuthMeSettingsRetriever.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/AuthMeSettingsRetriever.java new file mode 100644 index 0000000000..c3793485c0 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/AuthMeSettingsRetriever.java @@ -0,0 +1,28 @@ +package fr.xephi.authme.settings.properties; + +import ch.jalu.configme.SettingsHolder; +import ch.jalu.configme.configurationdata.ConfigurationData; +import ch.jalu.configme.configurationdata.ConfigurationDataBuilder; +import ch.jalu.configme.properties.Property; + +/** + * Utility class responsible for retrieving all {@link Property} fields from {@link SettingsHolder} classes. + */ +public final class AuthMeSettingsRetriever { + + private AuthMeSettingsRetriever() { + } + + /** + * Builds the configuration data for all property fields in AuthMe {@link SettingsHolder} classes. + * + * @return configuration data + */ + public static ConfigurationData buildConfigurationData() { + return ConfigurationDataBuilder.createConfiguration( + DatabaseSettings.class, PluginSettings.class, RestrictionSettings.class, + EmailSettings.class, HooksSettings.class, ProtectionSettings.class, + PurgeSettings.class, SecuritySettings.class, RegistrationSettings.class, + LimboSettings.class, BackupSettings.class, ConverterSettings.class); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/BackupSettings.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/BackupSettings.java new file mode 100644 index 0000000000..190c5b7dab --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/BackupSettings.java @@ -0,0 +1,29 @@ +package fr.xephi.authme.settings.properties; + +import ch.jalu.configme.Comment; +import ch.jalu.configme.SettingsHolder; +import ch.jalu.configme.properties.Property; + +import static ch.jalu.configme.properties.PropertyInitializer.newProperty; + +public final class BackupSettings implements SettingsHolder { + + @Comment("General configuration for backups: if false, no backups are possible") + public static final Property ENABLED = + newProperty("BackupSystem.ActivateBackup", false); + + @Comment("Create backup at every start of server") + public static final Property ON_SERVER_START = + newProperty("BackupSystem.OnServerStart", false); + + @Comment("Create backup at every stop of server") + public static final Property ON_SERVER_STOP = + newProperty("BackupSystem.OnServerStop", true); + + @Comment("Windows only: MySQL installation path") + public static final Property MYSQL_WINDOWS_PATH = + newProperty("BackupSystem.MysqlWindowsPath", "C:\\Program Files\\MySQL\\MySQL Server 5.1\\"); + + private BackupSettings() { + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/ConverterSettings.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/ConverterSettings.java new file mode 100644 index 0000000000..2f67782765 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/ConverterSettings.java @@ -0,0 +1,43 @@ +package fr.xephi.authme.settings.properties; + +import ch.jalu.configme.Comment; +import ch.jalu.configme.SettingsHolder; +import ch.jalu.configme.configurationdata.CommentsConfiguration; +import ch.jalu.configme.properties.Property; + +import static ch.jalu.configme.properties.PropertyInitializer.newProperty; + +public final class ConverterSettings implements SettingsHolder { + @Comment("CrazyLogin database file name") + public static final Property CRAZYLOGIN_FILE_NAME = + newProperty("Converter.CrazyLogin.fileName", "accounts.db"); + + @Comment("LoginSecurity: convert from SQLite; if false we use MySQL") + public static final Property LOGINSECURITY_USE_SQLITE = + newProperty("Converter.loginSecurity.useSqlite", true); + + @Comment("LoginSecurity MySQL: database host") + public static final Property LOGINSECURITY_MYSQL_HOST = + newProperty("Converter.loginSecurity.mySql.host", ""); + + @Comment("LoginSecurity MySQL: database name") + public static final Property LOGINSECURITY_MYSQL_DATABASE = + newProperty("Converter.loginSecurity.mySql.database", ""); + + @Comment("LoginSecurity MySQL: database user") + public static final Property LOGINSECURITY_MYSQL_USER = + newProperty("Converter.loginSecurity.mySql.user", ""); + + @Comment("LoginSecurity MySQL: password for database user") + public static final Property LOGINSECURITY_MYSQL_PASSWORD = + newProperty("Converter.loginSecurity.mySql.password", ""); + + private ConverterSettings() { + } + + @Override + public void registerComments(CommentsConfiguration conf) { + conf.setComment("Converter", + "Converter settings: see https://github.com/AuthMe/AuthMeReloaded/wiki/Converters"); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/DatabaseSettings.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/DatabaseSettings.java new file mode 100644 index 0000000000..6103183d4b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/DatabaseSettings.java @@ -0,0 +1,172 @@ +package fr.xephi.authme.settings.properties; + +import ch.jalu.configme.Comment; +import ch.jalu.configme.SettingsHolder; +import ch.jalu.configme.properties.Property; +import fr.xephi.authme.datasource.DataSourceType; + +import static ch.jalu.configme.properties.PropertyInitializer.newProperty; + +public final class DatabaseSettings implements SettingsHolder { + + @Comment({"What type of database do you want to use?", + "Valid values: H2, SQLITE, MARIADB, MYSQL, POSTGRESQL"}) + public static final Property BACKEND = + newProperty(DataSourceType.class, "DataSource.backend", DataSourceType.SQLITE); + + @Comment({"Enable the database caching system, should be disabled on bungeecord environments", + "or when a website integration is being used."}) + public static final Property USE_CACHING = + newProperty("DataSource.caching", true); + + @Comment("Should we try to use VirtualThreads(Java 21+) for database cache loader?") + public static final Property USE_VIRTUAL_THREADS = + newProperty("DataSource.useVirtualThreadsCache", false); + + @Comment("Database host address") + public static final Property MYSQL_HOST = + newProperty("DataSource.mySQLHost", "127.0.0.1"); + + @Comment("Database port") + public static final Property MYSQL_PORT = + newProperty("DataSource.mySQLPort", "3306"); + + @Comment({"Replacement of Mysql's useSsl (for MariaDB only).", + "- disable: No SSL", + "- trust: Trust blindly (no validation)", + "- verify_ca: Encryption, certificates validation, BUT no hostname verification", + "- verify_full: Encryption, certificate validation and hostname validation", + "Read more: https://bit.ly/mariadb-sslmode"}) + public static final Property MARIADB_SSL_MODE = + newProperty("DataSource.MariaDbSslMode", "disabled"); + + @Comment({"Connect to MySQL database over SSL", + "If you're using MariaDB, use sslMode instead"}) + public static final Property MYSQL_USE_SSL = + newProperty("DataSource.mySQLUseSSL", true); + + @Comment({"Verification of server's certificate.", + "We would not recommend to set this option to false.", + "Set this option to false at your own risk if and only if you know what you're doing"}) + public static final Property MYSQL_CHECK_SERVER_CERTIFICATE = + newProperty( "DataSource.mySQLCheckServerCertificate", true); + + @Comment({"Authorize client to retrieve RSA server public key.", + "Advanced option, ignore if you don't know what it means.", + "If you are using MariaDB, use MariaDbSslMode instead."}) + public static final Property MYSQL_ALLOW_PUBLIC_KEY_RETRIEVAL = + newProperty( "DataSource.mySQLAllowPublicKeyRetrieval", true); + + @Comment("Username to connect to the MySQL database") + public static final Property MYSQL_USERNAME = + newProperty("DataSource.mySQLUsername", "authme"); + + @Comment("Password to connect to the MySQL database") + public static final Property MYSQL_PASSWORD = + newProperty("DataSource.mySQLPassword", "12345"); + + @Comment("Database Name, use with converters or as SQLITE database name") + public static final Property MYSQL_DATABASE = + newProperty("DataSource.mySQLDatabase", "authme"); + + @Comment("Table of the database") + public static final Property MYSQL_TABLE = + newProperty("DataSource.mySQLTablename", "authme"); + + @Comment("Column of IDs to sort data") + public static final Property MYSQL_COL_ID = + newProperty("DataSource.mySQLColumnId", "id"); + + @Comment("Column for storing or checking players nickname") + public static final Property MYSQL_COL_NAME = + newProperty("DataSource.mySQLColumnName", "username"); + + @Comment("Column for storing or checking players RealName") + public static final Property MYSQL_COL_REALNAME = + newProperty("DataSource.mySQLRealName", "realname"); + + @Comment("Column for storing players passwords") + public static final Property MYSQL_COL_PASSWORD = + newProperty("DataSource.mySQLColumnPassword", "password"); + + @Comment("Column for storing players passwords salts") + public static final Property MYSQL_COL_SALT = + newProperty("DataSource.mySQLColumnSalt", ""); + + @Comment("Column for storing players emails") + public static final Property MYSQL_COL_EMAIL = + newProperty("DataSource.mySQLColumnEmail", "email"); + + @Comment("Column for storing if a player is logged in or not") + public static final Property MYSQL_COL_ISLOGGED = + newProperty("DataSource.mySQLColumnLogged", "isLogged"); + + @Comment("Column for storing if a player has a valid session or not") + public static final Property MYSQL_COL_HASSESSION = + newProperty("DataSource.mySQLColumnHasSession", "hasSession"); + + @Comment("Column for storing a player's TOTP key (for two-factor authentication)") + public static final Property MYSQL_COL_TOTP_KEY = + newProperty("DataSource.mySQLtotpKey", "totp"); + + @Comment("Column for storing the player's last IP") + public static final Property MYSQL_COL_LAST_IP = + newProperty("DataSource.mySQLColumnIp", "ip"); + + @Comment("Column for storing players lastlogins") + public static final Property MYSQL_COL_LASTLOGIN = + newProperty("DataSource.mySQLColumnLastLogin", "lastlogin"); + + @Comment("Column storing the registration date") + public static final Property MYSQL_COL_REGISTER_DATE = + newProperty("DataSource.mySQLColumnRegisterDate", "regdate"); + + @Comment("Column for storing the IP address at the time of registration") + public static final Property MYSQL_COL_REGISTER_IP = + newProperty("DataSource.mySQLColumnRegisterIp", "regip"); + + @Comment("Column for storing player LastLocation - X") + public static final Property MYSQL_COL_LASTLOC_X = + newProperty("DataSource.mySQLlastlocX", "x"); + + @Comment("Column for storing player LastLocation - Y") + public static final Property MYSQL_COL_LASTLOC_Y = + newProperty("DataSource.mySQLlastlocY", "y"); + + @Comment("Column for storing player LastLocation - Z") + public static final Property MYSQL_COL_LASTLOC_Z = + newProperty("DataSource.mySQLlastlocZ", "z"); + + @Comment("Column for storing player LastLocation - World Name") + public static final Property MYSQL_COL_LASTLOC_WORLD = + newProperty("DataSource.mySQLlastlocWorld", "world"); + + @Comment("Column for storing player LastLocation - Yaw") + public static final Property MYSQL_COL_LASTLOC_YAW = + newProperty("DataSource.mySQLlastlocYaw", "yaw"); + + @Comment("Column for storing player LastLocation - Pitch") + public static final Property MYSQL_COL_LASTLOC_PITCH = + newProperty("DataSource.mySQLlastlocPitch", "pitch"); + + @Comment("Column for storing players uuids (optional)") + public static final Property MYSQL_COL_PLAYER_UUID = + newProperty( "DataSource.mySQLPlayerUUID", "" ); + + @Comment("Column for storing players groups") + public static final Property MYSQL_COL_GROUP = + newProperty("ExternalBoardOptions.mySQLColumnGroup", ""); + + @Comment("Overrides the size of the DB Connection Pool, default = 10") + public static final Property MYSQL_POOL_SIZE = + newProperty("DataSource.poolSize", 10); + + @Comment({"The maximum lifetime of a connection in the pool, default = 1800 seconds", + "You should set this at least 30 seconds less than mysql server wait_timeout"}) + public static final Property MYSQL_CONNECTION_MAX_LIFETIME = + newProperty("DataSource.maxLifetime", 1800); + + private DatabaseSettings() { + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/EmailSettings.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/EmailSettings.java new file mode 100644 index 0000000000..a0cc03e23e --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/EmailSettings.java @@ -0,0 +1,76 @@ +package fr.xephi.authme.settings.properties; + +import ch.jalu.configme.Comment; +import ch.jalu.configme.SettingsHolder; +import ch.jalu.configme.properties.Property; + +import static ch.jalu.configme.properties.PropertyInitializer.newProperty; + +public final class EmailSettings implements SettingsHolder { + + @Comment("Email SMTP server host") + public static final Property SMTP_HOST = + newProperty("Email.mailSMTP", "smtp.163.com"); + + @Comment("Email SMTP server port") + public static final Property SMTP_PORT = + newProperty("Email.mailPort", 465); + + @Comment("Only affects port 25: enable TLS/STARTTLS?") + public static final Property PORT25_USE_TLS = + newProperty("Email.useTls", true); + + @Comment("Email account which sends the mails") + public static final Property MAIL_ACCOUNT = + newProperty("Email.mailAccount", ""); + + @Comment("Email account password") + public static final Property MAIL_PASSWORD = + newProperty("Email.mailPassword", ""); + + @Comment("Email address, fill when mailAccount is not the email address of the account") + public static final Property MAIL_ADDRESS = + newProperty("Email.mailAddress", ""); + + @Comment("Custom sender name, replacing the mailAccount name in the email") + public static final Property MAIL_SENDER_NAME = + newProperty("Email.mailSenderName", ""); + + @Comment("Recovery password length") + public static final Property RECOVERY_PASSWORD_LENGTH = + newProperty("Email.RecoveryPasswordLength", 12); + + @Comment("Mail Subject") + public static final Property RECOVERY_MAIL_SUBJECT = + newProperty("Email.mailSubject", "Your new AuthMe password"); + + @Comment("Like maxRegPerIP but with email") + public static final Property MAX_REG_PER_EMAIL = + newProperty("Email.maxRegPerEmail", 1); + + @Comment("Recall players to add an email?") + public static final Property RECALL_PLAYERS = + newProperty("Email.recallPlayers", false); + + @Comment("Delay in minute for the recall scheduler") + public static final Property DELAY_RECALL = + newProperty("Email.delayRecall", 5); + + @Comment("Send the new password drawn in an image?") + public static final Property PASSWORD_AS_IMAGE = + newProperty("Email.generateImage", false); + + @Comment("The OAuth2 token") + public static final Property OAUTH2_TOKEN = + newProperty("Email.emailOauth2Token", ""); + @Comment("Email notifications when the server shuts down") + public static final Property SHUTDOWN_MAIL = + newProperty("Email.shutDownEmail", false); + @Comment("Email notification address when the server is shut down") + public static final Property SHUTDOWN_MAIL_ADDRESS = + newProperty("Email.shutDownEmailAddress", "your@mail.com"); + + private EmailSettings() { + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/HooksSettings.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/HooksSettings.java new file mode 100644 index 0000000000..08c91c6a13 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/HooksSettings.java @@ -0,0 +1,101 @@ +package fr.xephi.authme.settings.properties; + +import ch.jalu.configme.Comment; +import ch.jalu.configme.SettingsHolder; +import ch.jalu.configme.properties.Property; + +import java.util.List; + +import static ch.jalu.configme.properties.PropertyInitializer.newListProperty; +import static ch.jalu.configme.properties.PropertyInitializer.newProperty; + +public final class HooksSettings implements SettingsHolder { + + @Comment("Do we need to hook with multiverse for spawn checking?") + public static final Property MULTIVERSE = + newProperty("Hooks.multiverse", true); + + @Comment("Do we need to hook with BungeeCord?") + public static final Property BUNGEECORD = + newProperty("Hooks.bungeecord", false); + @Comment("Do we need to hook with Velocity?") + public static final Property VELOCITY = + newProperty("Hooks.velocity", false); + + @Comment({"How many ticks should we wait before sending login info to proxy?", + "Change this to higher if your player has high ping.", + "See: https://www.spigotmc.org/wiki/bukkit-bungee-plugin-messaging-channel/"}) + public static final Property PROXY_SEND_DELAY = + newProperty("Hooks.proxySendDelay", 10L); + + @Comment({"Hook into floodgate.", + "This must be true if you want to use other bedrock features." + }) + public static final Property HOOK_FLOODGATE_PLAYER = + newProperty("Hooks.floodgate", false); + + @Comment("Allow bedrock players join without check isValidName?") + public static final Property IGNORE_BEDROCK_NAME_CHECK = + newProperty("Hooks.ignoreBedrockNameCheck", true); + + + @Comment("Send player to this BungeeCord server after register/login") + public static final Property BUNGEECORD_SERVER = + newProperty("Hooks.sendPlayerTo", ""); + + @Comment("Do we need to disable Essentials SocialSpy on join?") + public static final Property DISABLE_SOCIAL_SPY = + newProperty("Hooks.disableSocialSpy", false); + + @Comment("Do we need to force /motd Essentials command on join?") + public static final Property USE_ESSENTIALS_MOTD = + newProperty("Hooks.useEssentialsMotd", false); + + @Comment({ + "-1 means disabled. If you want that only activated players", + "can log into your server, you can set here the group number", + "of unactivated users, needed for some forum/CMS support"}) + public static final Property NON_ACTIVATED_USERS_GROUP = + newProperty("ExternalBoardOptions.nonActivedUserGroup", -1); + + @Comment("Other MySQL columns where we need to put the username (case-sensitive)") + public static final Property> MYSQL_OTHER_USERNAME_COLS = + newListProperty("ExternalBoardOptions.mySQLOtherUsernameColumns"); + + @Comment("How much log2 rounds needed in BCrypt (do not change if you do not know what it does)") + public static final Property BCRYPT_LOG2_ROUND = + newProperty("ExternalBoardOptions.bCryptLog2Round", 12); + + @Comment("phpBB table prefix defined during the phpBB installation process") + public static final Property PHPBB_TABLE_PREFIX = + newProperty("ExternalBoardOptions.phpbbTablePrefix", "phpbb_"); + + @Comment("phpBB activated group ID; 2 is the default registered group defined by phpBB") + public static final Property PHPBB_ACTIVATED_GROUP_ID = + newProperty("ExternalBoardOptions.phpbbActivatedGroupId", 2); + + @Comment("IP Board table prefix defined during the IP Board installation process") + public static final Property IPB_TABLE_PREFIX = + newProperty("ExternalBoardOptions.IPBTablePrefix", "ipb_"); + + @Comment("IP Board default group ID; 3 is the default registered group defined by IP Board") + public static final Property IPB_ACTIVATED_GROUP_ID = + newProperty("ExternalBoardOptions.IPBActivatedGroupId", 3); + + @Comment("Xenforo table prefix defined during the Xenforo installation process") + public static final Property XF_TABLE_PREFIX = + newProperty("ExternalBoardOptions.XFTablePrefix", "xf_"); + + @Comment("XenForo default group ID; 2 is the default registered group defined by Xenforo") + public static final Property XF_ACTIVATED_GROUP_ID = + newProperty("ExternalBoardOptions.XFActivatedGroupId", 2); + + @Comment("Wordpress prefix defined during WordPress installation") + public static final Property WORDPRESS_TABLE_PREFIX = + newProperty("ExternalBoardOptions.wordpressTablePrefix", "wp_"); + + + private HooksSettings() { + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/LimboSettings.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/LimboSettings.java new file mode 100644 index 0000000000..309b692313 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/LimboSettings.java @@ -0,0 +1,83 @@ +package fr.xephi.authme.settings.properties; + +import ch.jalu.configme.Comment; +import ch.jalu.configme.SettingsHolder; +import ch.jalu.configme.configurationdata.CommentsConfiguration; +import ch.jalu.configme.properties.Property; +import fr.xephi.authme.data.limbo.AllowFlightRestoreType; +import fr.xephi.authme.data.limbo.WalkFlySpeedRestoreType; +import fr.xephi.authme.data.limbo.persistence.LimboPersistenceType; +import fr.xephi.authme.data.limbo.persistence.SegmentSize; + +import static ch.jalu.configme.properties.PropertyInitializer.newProperty; + +/** + * Settings for the LimboPlayer feature. + */ +public final class LimboSettings implements SettingsHolder { + + @Comment({ + "Besides storing the data in memory, you can define if/how the data should be persisted", + "on disk. This is useful in case of a server crash, so next time the server starts we can", + "properly restore things like OP status, ability to fly, and walk/fly speed.", + "DISABLED: no disk storage,", + "INDIVIDUAL_FILES: each player data in its own file,", + "DISTRIBUTED_FILES: distributes players into different files based on their UUID, see below" + }) + public static final Property LIMBO_PERSISTENCE_TYPE = + newProperty(LimboPersistenceType.class, "limbo.persistence.type", LimboPersistenceType.INDIVIDUAL_FILES); + + @Comment({ + "This setting only affects DISTRIBUTED_FILES persistence. The distributed file", + "persistence attempts to reduce the number of files by distributing players into various", + "buckets based on their UUID. This setting defines into how many files the players should", + "be distributed. Possible values: ONE, FOUR, EIGHT, SIXTEEN, THIRTY_TWO, SIXTY_FOUR,", + "ONE_TWENTY for 128, TWO_FIFTY for 256.", + "For example, if you expect 100 non-logged in players, setting to SIXTEEN will average", + "6.25 players per file (100 / 16).", + "Note: if you change this setting all data will be migrated. If you have a lot of data,", + "change this setting only on server restart, not with /authme reload." + }) + public static final Property DISTRIBUTION_SIZE = + newProperty(SegmentSize.class, "limbo.persistence.distributionSize", SegmentSize.SIXTEEN); + + @Comment({ + "Whether the player is allowed to fly: RESTORE, ENABLE, DISABLE, NOTHING.", + "RESTORE sets back the old property from the player. NOTHING will prevent AuthMe", + "from modifying the 'allow flight' property on the player." + }) + public static final Property RESTORE_ALLOW_FLIGHT = + newProperty(AllowFlightRestoreType.class, "limbo.restoreAllowFlight", AllowFlightRestoreType.RESTORE); + + @Comment({ + "Restore fly speed: RESTORE, DEFAULT, MAX_RESTORE, RESTORE_NO_ZERO.", + "RESTORE: restore the speed the player had;", + "DEFAULT: always set to default speed;", + "MAX_RESTORE: take the maximum of the player's current speed and the previous one", + "RESTORE_NO_ZERO: Like 'restore' but sets speed to default if the player's speed was 0" + }) + public static final Property RESTORE_FLY_SPEED = + newProperty(WalkFlySpeedRestoreType.class, "limbo.restoreFlySpeed", WalkFlySpeedRestoreType.RESTORE_NO_ZERO); + + @Comment({ + "Restore walk speed: RESTORE, DEFAULT, MAX_RESTORE, RESTORE_NO_ZERO.", + "See above for a description of the values." + }) + public static final Property RESTORE_WALK_SPEED = + newProperty(WalkFlySpeedRestoreType.class, "limbo.restoreWalkSpeed", WalkFlySpeedRestoreType.RESTORE_NO_ZERO); + + private LimboSettings() { + } + + @Override + public void registerComments(CommentsConfiguration conf) { + String[] limboExplanation = { + "Before a user logs in, various properties are temporarily removed from the player,", + "such as OP status, ability to fly, and walk/fly speed.", + "Once the user is logged in, we add back the properties we previously saved.", + "In this section, you may define how these properties should be handled.", + "Read more at https://github.com/AuthMe/AuthMeReloaded/wiki/Limbo-players" + }; + conf.setComment("limbo", limboExplanation); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/PluginSettings.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/PluginSettings.java new file mode 100644 index 0000000000..221496b354 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/PluginSettings.java @@ -0,0 +1,122 @@ +package fr.xephi.authme.settings.properties; + +import ch.jalu.configme.Comment; +import ch.jalu.configme.SettingsHolder; +import ch.jalu.configme.properties.Property; +import fr.xephi.authme.output.LogLevel; + +import java.util.Set; + +import static ch.jalu.configme.properties.PropertyInitializer.newLowercaseStringSetProperty; +import static ch.jalu.configme.properties.PropertyInitializer.newProperty; + +public final class PluginSettings implements SettingsHolder { + @Comment({ + "Should we execute /help command when unregistered players press Shift+F?", + "This keeps compatibility with some menu plugins", + "If you are using TrMenu, don't enable this because TrMenu already implemented this." + }) + public static final Property MENU_UNREGISTER_COMPATIBILITY = + newProperty("3rdPartyFeature.compatibility.menuPlugins", false); + + @Comment({ + "Send i18n messages to player based on their client settings, this option will override `settings.messagesLanguage`", + "(Requires Protocollib or Packetevents)", + "This will not affect language of AuthMe help command." + }) + public static final Property I18N_MESSAGES = + newProperty("3rdPartyFeature.features.i18nMessages.enabled", false); + + @Comment({"Redirect locale code to certain AuthMe language code as you want", + "Minecraft locale list: https://minecraft.wiki/w/Language", + "AuthMe language code: https://github.com/HaHaWTH/AuthMeReReloaded/blob/master/docs/translations.md", + "For example, if you want to show Russian messages to player using language Tatar(tt_ru),", + "and show Chinese Simplified messages to player using language Classical Chinese(lzh), then:", + "locale-code-redirect:", + "- 'tt_ru:ru'", + "- 'lzh:zhcn'"}) + public static final Property> I18N_CODE_REDIRECT = + newLowercaseStringSetProperty("3rdPartyFeature.features.i18nMessages.locale-code-redirect", + "tt_ru:ru", "lzh:zhcn"); + + @Comment({ + "Do you want to enable the session feature?", + "If enabled, when a player authenticates successfully,", + "his IP and his nickname is saved.", + "The next time the player joins the server, if his IP", + "is the same as last time and the timeout hasn't", + "expired, he will not need to authenticate." + }) + public static final Property SESSIONS_ENABLED = + newProperty("settings.sessions.enabled", true); + + @Comment({ + "After how many minutes should a session expire?", + "A player's session ends after the timeout or if his IP has changed" + }) + public static final Property SESSIONS_TIMEOUT = + newProperty("settings.sessions.timeout", 43200); + + @Comment({ + "Message language, available languages:", + "https://github.com/AuthMe/AuthMeReloaded/blob/master/docs/translations.md", + "Example: zhcn, en" + }) + public static final Property MESSAGES_LANGUAGE = + newProperty("settings.messagesLanguage", "en"); + + @Comment({ + "Enables switching a player to defined permission groups before they log in.", + "See below for a detailed explanation." + }) + public static final Property ENABLE_PERMISSION_CHECK = + newProperty("GroupOptions.enablePermissionCheck", false); + + @Comment({ + "This is a very important option: if a registered player joins the server", + "AuthMe will switch him to unLoggedInGroup. This should prevent all major exploits.", + "You can set up your permission plugin with this special group to have no permissions,", + "or only permission to chat (or permission to send private messages etc.).", + "The better way is to set up this group with few permissions, so if a player", + "tries to exploit an account they can do only what you've defined for the group.", + "After login, the player will be moved to his correct permissions group!", + "Please note that the group name is case-sensitive, so 'admin' is different from 'Admin'", + "Otherwise your group will be wiped and the player will join in the default group []!", + "Example: registeredPlayerGroup: 'NotLogged'" + }) + public static final Property REGISTERED_GROUP = + newProperty("GroupOptions.registeredPlayerGroup", ""); + + @Comment({ + "Similar to above, unregistered players can be set to the following", + "permissions group" + }) + public static final Property UNREGISTERED_GROUP = + newProperty("GroupOptions.unregisteredPlayerGroup", ""); + + @Comment("Forces authme to hook into Vault instead of a specific permission handler system.") + public static final Property FORCE_VAULT_HOOK = + newProperty("settings.forceVaultHook", false); + + @Comment({ + "Log level: INFO, FINE, DEBUG. Use INFO for general messages,", + "FINE for some additional detailed ones (like password failed),", + "and DEBUG for debugging" + }) + public static final Property LOG_LEVEL = + newProperty(LogLevel.class, "settings.logLevel", LogLevel.FINE); + + @Comment({ + "By default we schedule async tasks when talking to the database. If you want", + "typical communication with the database to happen synchronously, set this to false" + }) + public static final Property USE_ASYNC_TASKS = + newProperty("settings.useAsyncTasks", true); + + @Comment("The name of the server, used in some placeholders.") + public static final Property SERVER_NAME = newProperty("settings.serverName", "Your Minecraft Server"); + + private PluginSettings() { + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/ProtectionSettings.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/ProtectionSettings.java new file mode 100644 index 0000000000..7becd39038 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/ProtectionSettings.java @@ -0,0 +1,66 @@ +package fr.xephi.authme.settings.properties; + +import ch.jalu.configme.Comment; +import ch.jalu.configme.SettingsHolder; +import ch.jalu.configme.properties.Property; + +import java.util.List; + +import static ch.jalu.configme.properties.PropertyInitializer.newListProperty; +import static ch.jalu.configme.properties.PropertyInitializer.newProperty; + + +public final class ProtectionSettings implements SettingsHolder { + + @Comment("Enable some servers protection (country based login, antibot)") + public static final Property ENABLE_PROTECTION = + newProperty("Protection.enableProtection", false); + + @Comment("Apply the protection also to registered usernames") + public static final Property ENABLE_PROTECTION_REGISTERED = + newProperty("Protection.enableProtectionRegistered", false); + + @Comment({ + "Countries allowed to join the server and register. For country codes, see", + "https://dev.maxmind.com/geoip/legacy/codes/iso3166/", + "Use \"LOCALHOST\" for local addresses.", + "PLEASE USE QUOTES!"}) + public static final Property> COUNTRIES_WHITELIST = + newListProperty("Protection.countries", "LOCALHOST"); + + @Comment({ + "Countries not allowed to join the server and register", + "PLEASE USE QUOTES!"}) + public static final Property> COUNTRIES_BLACKLIST = + newListProperty("Protection.countriesBlacklist", "A1"); + + @Comment("Do we need to enable automatic antibot system?") + public static final Property ENABLE_ANTIBOT = + newProperty("Protection.enableAntiBot", true); + + @Comment("The interval in seconds") + public static final Property ANTIBOT_INTERVAL = + newProperty("Protection.antiBotInterval", 5); + + @Comment({ + "Max number of players allowed to login in the interval", + "before the AntiBot system is enabled automatically"}) + public static final Property ANTIBOT_SENSIBILITY = + newProperty("Protection.antiBotSensibility", 10); + + @Comment("Duration in minutes of the antibot automatic system") + public static final Property ANTIBOT_DURATION = + newProperty("Protection.antiBotDuration", 10); + + @Comment("Delay in seconds before the antibot activation") + public static final Property ANTIBOT_DELAY = + newProperty("Protection.antiBotDelay", 60); + + @Comment("Kicks the player that issued a command before the defined time after the join process") + public static final Property QUICK_COMMANDS_DENIED_BEFORE_MILLISECONDS = + newProperty("Protection.quickCommands.denyCommandsBeforeMilliseconds", 1000); + + private ProtectionSettings() { + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/PurgeSettings.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/PurgeSettings.java new file mode 100644 index 0000000000..0064fd40f3 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/PurgeSettings.java @@ -0,0 +1,46 @@ +package fr.xephi.authme.settings.properties; + +import ch.jalu.configme.Comment; +import ch.jalu.configme.SettingsHolder; +import ch.jalu.configme.properties.Property; + +import static ch.jalu.configme.properties.PropertyInitializer.newProperty; + +public final class PurgeSettings implements SettingsHolder { + + @Comment("If enabled, AuthMe automatically purges old, unused accounts") + public static final Property USE_AUTO_PURGE = + newProperty("Purge.useAutoPurge", false); + + @Comment("Number of days after which an account should be purged") + public static final Property DAYS_BEFORE_REMOVE_PLAYER = + newProperty("Purge.daysBeforeRemovePlayer", 60); + + @Comment("Do we need to remove the player.dat file during purge process?") + public static final Property REMOVE_PLAYER_DAT = + newProperty("Purge.removePlayerDat", false); + + @Comment("Do we need to remove the Essentials/userdata/player.yml file during purge process?") + public static final Property REMOVE_ESSENTIALS_FILES = + newProperty("Purge.removeEssentialsFile", false); + + @Comment("World in which the players.dat are stored") + public static final Property DEFAULT_WORLD = + newProperty("Purge.defaultWorld", "world"); + + @Comment("Remove LimitedCreative/inventories/player.yml, player_creative.yml files during purge?") + public static final Property REMOVE_LIMITED_CREATIVE_INVENTORIES = + newProperty("Purge.removeLimitedCreativesInventories", false); + + @Comment("Do we need to remove the AntiXRayData/PlayerData/player file during purge process?") + public static final Property REMOVE_ANTI_XRAY_FILE = + newProperty("Purge.removeAntiXRayFile", false); + + @Comment("Do we need to remove permissions?") + public static final Property REMOVE_PERMISSIONS = + newProperty("Purge.removePermissions", false); + + private PurgeSettings() { + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/RegistrationSettings.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/RegistrationSettings.java new file mode 100644 index 0000000000..b15132d5b8 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/RegistrationSettings.java @@ -0,0 +1,108 @@ +package fr.xephi.authme.settings.properties; + +import ch.jalu.configme.Comment; +import ch.jalu.configme.SettingsHolder; +import ch.jalu.configme.properties.Property; +import fr.xephi.authme.process.register.RegisterSecondaryArgument; +import fr.xephi.authme.process.register.RegistrationType; + +import static ch.jalu.configme.properties.PropertyInitializer.newProperty; + +public final class RegistrationSettings implements SettingsHolder { + + @Comment("Enable registration on the server?") + public static final Property IS_ENABLED = + newProperty("settings.registration.enabled", true); + + @Comment({ + "Send every X seconds a message to a player to", + "remind him that he has to login/register"}) + public static final Property MESSAGE_INTERVAL = + newProperty("settings.registration.messageInterval", 5); + + @Comment({ + "Only registered and logged in players can play.", + "See restrictions for exceptions"}) + public static final Property FORCE = + newProperty("settings.registration.force", true); + + @Comment({ + "Type of registration: PASSWORD or EMAIL", + "PASSWORD = account is registered with a password supplied by the user;", + "EMAIL = password is generated and sent to the email provided by the user.", + "More info at https://github.com/AuthMe/AuthMeReloaded/wiki/Registration" + }) + public static final Property REGISTRATION_TYPE = + newProperty(RegistrationType.class, "settings.registration.type", RegistrationType.PASSWORD); + + @Comment({ + "Second argument the /register command should take: ", + "NONE = no 2nd argument", + "CONFIRMATION = must repeat first argument (pass or email)", + "EMAIL_OPTIONAL = for password register: 2nd argument can be empty or have email address", + "EMAIL_MANDATORY = for password register: 2nd argument MUST be an email address" + }) + public static final Property REGISTER_SECOND_ARGUMENT = + newProperty(RegisterSecondaryArgument.class, "settings.registration.secondArg", + RegisterSecondaryArgument.CONFIRMATION); + + @Comment({ + "Should we unregister the player when he didn't verify the email?", + "This only works if you enabled email registration."}) + public static final Property UNREGISTER_ON_EMAIL_VERIFICATION_FAILURE = + newProperty("settings.registration.email.unregisterOnEmailVerificationFailure", false); + + @Comment({"How many minutes should we wait before unregister the player", + "when he didn't verify the email?"}) + public static final Property UNREGISTER_AFTER_MINUTES = + newProperty("settings.registration.email.unregisterAfterMinutes", 10L); + @Comment({ + "Do we force kick a player after a successful registration?", + "Do not use with login feature below"}) + public static final Property FORCE_KICK_AFTER_REGISTER = + newProperty("settings.registration.forceKickAfterRegister", false); + + @Comment("Does AuthMe need to enforce a /login after a successful registration?") + public static final Property FORCE_LOGIN_AFTER_REGISTER = + newProperty("settings.registration.forceLoginAfterRegister", false); + @Comment("Should we delay the join message and display it once the player has logged in?") + public static final Property DELAY_JOIN_MESSAGE = + newProperty("settings.delayJoinMessage", true); + + @Comment({ + "The custom join message that will be sent after a successful login,", + "keep empty to use the original one.", + "Available variables:", + "{PLAYERNAME}: the player name (no colors)", + "{DISPLAYNAME}: the player display name (with colors)", + "{DISPLAYNAMENOCOLOR}: the player display name (without colors)"}) + public static final Property CUSTOM_JOIN_MESSAGE = + newProperty("settings.customJoinMessage", ""); + + @Comment("Should we remove the leave messages of unlogged users?") + public static final Property REMOVE_UNLOGGED_LEAVE_MESSAGE = + newProperty("settings.removeUnloggedLeaveMessage", true); + + @Comment("Should we remove join messages altogether?") + public static final Property REMOVE_JOIN_MESSAGE = + newProperty("settings.removeJoinMessage", true); + + @Comment("Should we remove leave messages altogether?") + public static final Property REMOVE_LEAVE_MESSAGE = + newProperty("settings.removeLeaveMessage", true); + + @Comment("Do we need to add potion effect Blinding before login/register?") + public static final Property APPLY_BLIND_EFFECT = + newProperty("settings.applyBlindEffect", false); + + @Comment({ + "Do we need to prevent people to login with another case?", + "If Xephi is registered, then Xephi can login, but not XEPHI/xephi/XePhI"}) + public static final Property PREVENT_OTHER_CASE = + newProperty("settings.preventOtherCase", true); + + + private RegistrationSettings() { + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/RestrictionSettings.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/RestrictionSettings.java new file mode 100644 index 0000000000..1fc8341fcb --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/RestrictionSettings.java @@ -0,0 +1,217 @@ +package fr.xephi.authme.settings.properties; + +import ch.jalu.configme.Comment; +import ch.jalu.configme.SettingsHolder; +import ch.jalu.configme.properties.Property; + +import java.util.List; +import java.util.Set; + +import static ch.jalu.configme.properties.PropertyInitializer.newListProperty; +import static ch.jalu.configme.properties.PropertyInitializer.newLowercaseStringSetProperty; +import static ch.jalu.configme.properties.PropertyInitializer.newProperty; + +public final class RestrictionSettings implements SettingsHolder { + + @Comment({ + "Can not authenticated players chat?", + "Keep in mind that this feature also blocks all commands not", + "listed in the list below."}) + public static final Property ALLOW_CHAT = + newProperty("settings.restrictions.allowChat", false); + + @Comment("Hide the chat log from players who are not authenticated?") + public static final Property HIDE_CHAT = + newProperty("settings.restrictions.hideChat", false); + + @Comment("Allowed commands for unauthenticated players") + public static final Property> ALLOW_COMMANDS = + newLowercaseStringSetProperty("settings.restrictions.allowCommands", + "/login", "/log", "/l", "/register", "/reg", "/email", "/captcha", "/2fa", "/totp"); + + @Comment({ + "Max number of allowed registrations per IP", + "The value 0 means an unlimited number of registrations!"}) + public static final Property MAX_REGISTRATION_PER_IP = + newProperty("settings.restrictions.maxRegPerIp", 3); + + @Comment("Minimum allowed username length") + public static final Property MIN_NICKNAME_LENGTH = + newProperty("settings.restrictions.minNicknameLength", 3); + + @Comment("Maximum allowed username length") + public static final Property MAX_NICKNAME_LENGTH = + newProperty("settings.restrictions.maxNicknameLength", 16); + + @Comment({ + "When this setting is enabled, online players can't be kicked out", + "due to \"Logged in from another Location\"", + "This setting will prevent potential security exploits."}) + public static final Property FORCE_SINGLE_SESSION = + newProperty("settings.restrictions.ForceSingleSession", true); + + @Comment({ + "If enabled, every player that spawn in one of the world listed in", + "\"ForceSpawnLocOnJoin.worlds\" will be teleported to the spawnpoint after successful", + "authentication. The quit location of the player will be overwritten.", + "This is different from \"teleportUnAuthedToSpawn\" that teleport player", + "to the spawnpoint on join."}) + public static final Property FORCE_SPAWN_LOCATION_AFTER_LOGIN = + newProperty("settings.restrictions.ForceSpawnLocOnJoin.enabled", false); + + @Comment({ + "WorldNames where we need to force the spawn location", + "Case-sensitive!"}) + public static final Property> FORCE_SPAWN_ON_WORLDS = + newListProperty("settings.restrictions.ForceSpawnLocOnJoin.worlds", + "world", "world_nether", "world_the_end"); + + @Comment("This option will save the quit location of the players.") + public static final Property SAVE_QUIT_LOCATION = + newProperty("settings.restrictions.SaveQuitLocation", false); + + @Comment({ + "To activate the restricted user feature you need", + "to enable this option and configure the AllowedRestrictedUser field."}) + public static final Property ENABLE_RESTRICTED_USERS = + newProperty("settings.restrictions.AllowRestrictedUser", true); + + @Comment({ + "The restricted user feature will kick players listed below", + "if they don't match the defined IP address. Names are case-insensitive.", + "You can use * as wildcard (127.0.0.*), or regex with a \"regex:\" prefix regex:127\\.0\\.0\\..*", + "Example:", + " AllowedRestrictedUser:", + " - playername;127.0.0.1", + " - playername;regex:127\\.0\\.0\\..*"}) + public static final Property> RESTRICTED_USERS = + newLowercaseStringSetProperty("settings.restrictions.AllowedRestrictedUser", + "server_land;127.0.0.1","server;127.0.0.1","bukkit;127.0.0.1","purpur;127.0.0.1", + "system;127.0.0.1","admin;127.0.0.1","md_5;127.0.0.1","administrator;127.0.0.1","notch;127.0.0.1", + "spigot;127.0.0.1","bukkit;127.0.0.1","bukkitcraft;127.0.0.1","paperclip;127.0.0.1","papermc;127.0.0.1", + "spigotmc;127.0.0.1","root;127.0.0.1","console;127.0.0.1","purpur;127.0.0.1","authme;127.0.0.1", + "owner;127.0.0.1"); + + @Comment("Ban unknown IPs trying to log in with a restricted username?") + public static final Property BAN_UNKNOWN_IP = + newProperty("settings.restrictions.banUnsafedIP", false); + + @Comment("Should unregistered players be kicked immediately?") + public static final Property KICK_NON_REGISTERED = + newProperty("settings.restrictions.kickNonRegistered", false); + + @Comment("Should players be kicked on wrong password?") + public static final Property KICK_ON_WRONG_PASSWORD = + newProperty("settings.restrictions.kickOnWrongPassword", false); + + @Comment({ + "Should not logged in players be teleported to the spawn?", + "After the authentication they will be teleported back to", + "their normal position."}) + public static final Property TELEPORT_UNAUTHED_TO_SPAWN = + newProperty("settings.restrictions.teleportUnAuthedToSpawn", false); + + @Comment("Can unregistered players walk around?") + public static final Property ALLOW_UNAUTHED_MOVEMENT = + newProperty("settings.restrictions.allowMovement", false); + + @Comment({ + "After how many seconds should players who fail to login or register", + "be kicked? Set to 0 to disable."}) + public static final Property TIMEOUT = + newProperty("settings.restrictions.timeout", 120); + + @Comment("Regex pattern of allowed characters in the player name.") + public static final Property ALLOWED_NICKNAME_CHARACTERS = + newProperty("settings.restrictions.allowedNicknameCharacters", "[a-zA-Z0-9_]*"); + + + @Comment({ + "How far can unregistered players walk?", + "Set to 0 for unlimited radius" + }) + public static final Property ALLOWED_MOVEMENT_RADIUS = + newProperty("settings.restrictions.allowedMovementRadius", 0); + + @Comment("Should we protect the player inventory before logging in? Requires ProtocolLib.") + public static final Property PROTECT_INVENTORY_BEFORE_LOGIN = + newProperty("settings.restrictions.ProtectInventoryBeforeLogIn", false); + + @Comment("Should we deny the tabcomplete feature before logging in? Requires ProtocolLib.") + public static final Property DENY_TABCOMPLETE_BEFORE_LOGIN = + newProperty("settings.restrictions.DenyTabCompleteBeforeLogin", false); + + @Comment({ + "Should we display all other accounts from a player when he joins?", + "permission: /authme.admin.accounts"}) + public static final Property DISPLAY_OTHER_ACCOUNTS = + newProperty("settings.restrictions.displayOtherAccounts", false); + + @Comment("Spawn priority; values: authme, essentials, cmi, multiverse, default") + public static final Property SPAWN_PRIORITY = + newProperty("settings.restrictions.spawnPriority", "authme,essentials,cmi,multiverse,default"); + + @Comment("Maximum Login authorized by IP") + public static final Property MAX_LOGIN_PER_IP = + newProperty("settings.restrictions.maxLoginPerIp", 3); + + @Comment("Maximum Join authorized by IP") + public static final Property MAX_JOIN_PER_IP = + newProperty("settings.restrictions.maxJoinPerIp", 3); + + @Comment("AuthMe will NEVER teleport players if set to true!") + public static final Property NO_TELEPORT = + newProperty("settings.restrictions.noTeleport", false); + + @Comment({ + "Regex syntax for allowed chars in passwords. The default [!-~] allows all visible ASCII", + "characters, which is what we recommend. See also http://asciitable.com", + "You can test your regex with https://regex101.com" + }) + public static final Property ALLOWED_PASSWORD_REGEX = + newProperty("settings.restrictions.allowedPasswordCharacters", "[!-~]*"); + + @Comment("Regex syntax for allowed chars in email.") + public static final Property ALLOWED_EMAIL_REGEX = + newProperty("settings.restrictions.allowedEmailCharacters", "^[A-Za-z0-9_.]{3,20}@(qq|outlook|163|gmail|icloud)\\.com$"); + + + @Comment("Force survival gamemode when player joins?") + public static final Property FORCE_SURVIVAL_MODE = + newProperty("settings.GameMode.ForceSurvivalMode", false); + + @Comment({ + "Below you can list all account names that AuthMe will ignore", + "for registration or login. Configure it at your own risk!!", + "This option adds compatibility with BuildCraft and some other mods.", + "It is case-insensitive! Example:", + "UnrestrictedName:", + "- 'npcPlayer'", + "- 'npcPlayer2'" + }) + public static final Property> UNRESTRICTED_NAMES = + newLowercaseStringSetProperty("settings.unrestrictions.UnrestrictedName"); + + + @Comment({ + "Below you can list all inventories names that AuthMe will ignore", + "for registration or login. Configure it at your own risk!!", + "This option adds compatibility with some mods.", + "It is case-insensitive! Example:", + "UnrestrictedInventories:", + "- 'myCustomInventory1'", + "- 'myCustomInventory2'" + }) + public static final Property> UNRESTRICTED_INVENTORIES = + newLowercaseStringSetProperty("settings.unrestrictions.UnrestrictedInventories"); + + @Comment("Should we check unrestricted inventories strictly? (Original behavior)") + public static final Property STRICT_UNRESTRICTED_INVENTORIES_CHECK = + newProperty("settings.unrestrictions.StrictUnrestrictedInventoriesCheck", true); + + + private RestrictionSettings() { + + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/SecuritySettings.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/SecuritySettings.java new file mode 100644 index 0000000000..b1d7c4aea2 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/settings/properties/SecuritySettings.java @@ -0,0 +1,203 @@ +package fr.xephi.authme.settings.properties; + +import ch.jalu.configme.Comment; +import ch.jalu.configme.SettingsHolder; +import ch.jalu.configme.properties.Property; +import fr.xephi.authme.security.HashAlgorithm; +import fr.xephi.authme.settings.EnumSetProperty; + +import java.util.Set; + +import static ch.jalu.configme.properties.PropertyInitializer.newLowercaseStringSetProperty; +import static ch.jalu.configme.properties.PropertyInitializer.newProperty; + +public final class SecuritySettings implements SettingsHolder { + + @Comment({"Stop the server if we can't contact the sql database", + "Take care with this, if you set this to false,", + "AuthMe will automatically disable and the server won't be protected!"}) + public static final Property STOP_SERVER_ON_PROBLEM = + newProperty("Security.SQLProblem.stopServer", false); + + @Comment({"Should we let Bedrock players login automatically?", + "(Requires hookFloodgate to be true & floodgate loaded)", + "(**THIS IS SAFE DO NOT WORRY**)"}) + public static final Property FORCE_LOGIN_BEDROCK = + newProperty("3rdPartyFeature.features.bedrockAutoLogin", false); + + @Comment("Should we purge data on non-registered players quit?") + public static final Property PURGE_DATA_ON_QUIT = + newProperty("3rdPartyFeature.features.purgeData.purgeOnQuit", false); + + @Comment("Which world's player data should be deleted?(Enter the world *FOLDER* name where your players first logged in)") + public static final Property DELETE_PLAYER_DATA_WORLD = + newProperty("3rdPartyFeature.features.purgeData.purgeWorldFolderName", "world"); + @Comment("Enable the new feature to prevent ghost players?") + public static final Property ANTI_GHOST_PLAYERS = + newProperty("3rdPartyFeature.fixes.antiGhostPlayer", false); + + @Comment({"(MC1.13- only)", + "Should we fix the shulker crash bug with advanced method?"}) + public static final Property ADVANCED_SHULKER_FIX = + newProperty("3rdPartyFeature.fixes.advancedShulkerFix", false); + + @Comment("Should we fix the location when players logged in the portal?") + public static final Property LOGIN_LOC_FIX_SUB_PORTAL = + newProperty("3rdPartyFeature.fixes.loginLocationFix.fixPortalStuck", false); + + @Comment("Should we fix the location when players logged underground?") + public static final Property LOGIN_LOC_FIX_SUB_UNDERGROUND = + newProperty("3rdPartyFeature.fixes.loginLocationFix.fixGroundStuck", false); + + @Comment("Copy AuthMe log output in a separate file as well?") + public static final Property USE_LOGGING = + newProperty("Security.console.logConsole", true); + + @Comment({"Query haveibeenpwned.com with a hashed version of the password.", + "This is used to check whether it is safe."}) + public static final Property HAVE_I_BEEN_PWNED_CHECK = + newProperty("Security.account.haveIBeenPwned.check", false); + + @Comment({"If the password is used more than this number of times, it is considered unsafe."}) + public static final Property HAVE_I_BEEN_PWNED_LIMIT = + newProperty("Security.account.haveIBeenPwned.limit", 0); + + @Comment("Enable captcha when a player uses wrong password too many times") + public static final Property ENABLE_LOGIN_FAILURE_CAPTCHA = + newProperty("Security.captcha.useCaptcha", false); + + @Comment("Check for updates on enabled from GitHub?") + public static final Property CHECK_FOR_UPDATES = + newProperty("Plugin.updates.checkForUpdates", true); + + @Comment("Should we show the AuthMe banner on startup?") + public static final Property SHOW_STARTUP_BANNER = + newProperty("Plugin.banners.showBanners", true); + + @Comment("Max allowed tries before a captcha is required") + public static final Property MAX_LOGIN_TRIES_BEFORE_CAPTCHA = + newProperty("Security.captcha.maxLoginTry", 8); + + @Comment("Captcha length") + public static final Property CAPTCHA_LENGTH = + newProperty("Security.captcha.captchaLength", 6); + + @Comment("Minutes after which login attempts count is reset for a player") + public static final Property CAPTCHA_COUNT_MINUTES_BEFORE_RESET = + newProperty("Security.captcha.captchaCountReset", 120); + + @Comment("Require captcha before a player may register?") + public static final Property ENABLE_CAPTCHA_FOR_REGISTRATION = + newProperty("Security.captcha.requireForRegistration", false); + + @Comment("Minimum length of password") + public static final Property MIN_PASSWORD_LENGTH = + newProperty("settings.security.minPasswordLength", 8); + + @Comment("Maximum length of password") + public static final Property MAX_PASSWORD_LENGTH = + newProperty("settings.security.passwordMaxLength", 26); + + @Comment({ + "Possible values: SHA256, BCRYPT, BCRYPT2Y, PBKDF2, SALTEDSHA512,", + "MYBB, IPB3, PHPBB, PHPFUSION, SMF, XENFORO, XAUTH, JOOMLA, WBB3, WBB4, MD5VB,", + "PBKDF2DJANGO, WORDPRESS, ROYALAUTH, ARGON2, NOCRYPT, CUSTOM (for developers only). See full list at", + "https://github.com/AuthMe/AuthMeReloaded/blob/master/docs/hash_algorithms.md", + "If you use ARGON2, check that you have the argon2 c library on your system" + }) + public static final Property PASSWORD_HASH = + newProperty(HashAlgorithm.class, "settings.security.passwordHash", HashAlgorithm.SHA256); + + @Comment({ + "If a password check fails, AuthMe will also try to check with the following hash methods.", + "Use this setting when you change from one hash method to another.", + "AuthMe will update the password to the new hash. Example:", + "legacyHashes:", + "- 'SHA1'" + }) + public static final Property> LEGACY_HASHES = + new EnumSetProperty<>(HashAlgorithm.class, "settings.security.legacyHashes"); + + @Comment("Salt length for the SALTED2MD5 MD5(MD5(password)+salt)") + public static final Property DOUBLE_MD5_SALT_LENGTH = + newProperty("settings.security.doubleMD5SaltLength", 8); + + @Comment("Number of rounds to use if passwordHash is set to PBKDF2. Default is 10000") + public static final Property PBKDF2_NUMBER_OF_ROUNDS = + newProperty("settings.security.pbkdf2Rounds", 10000); + + @Comment({"Prevent unsafe passwords from being used; put them in lowercase!", + "You should always set 'help' as unsafePassword due to possible conflicts.", + "unsafePasswords:", + "- '123456'", + "- 'password'", + "- 'help'"}) + public static final Property> UNSAFE_PASSWORDS = + newLowercaseStringSetProperty("settings.security.unsafePasswords", + "12345678", "password", "qwertyui", "123456789", "87654321", "1234567890", "asdfghjkl","zxcvbnm,","asdfghjk","12312312","123123123","32132132","321321321"); + + @Comment("Tempban a user's IP address if they enter the wrong password too many times") + public static final Property TEMPBAN_ON_MAX_LOGINS = + newProperty("Security.tempban.enableTempban", false); + + @Comment("How many times a user can attempt to login before their IP being tempbanned") + public static final Property MAX_LOGIN_TEMPBAN = + newProperty("Security.tempban.maxLoginTries", 8); + + @Comment({"The length of time a IP address will be tempbanned in minutes", + "Default: 480 minutes, or 8 hours"}) + public static final Property TEMPBAN_LENGTH = + newProperty("Security.tempban.tempbanLength", 480); + + @Comment({"How many minutes before resetting the count for failed logins by IP and username", + "Default: 480 minutes (8 hours)"}) + public static final Property TEMPBAN_MINUTES_BEFORE_RESET = + newProperty("Security.tempban.minutesBeforeCounterReset", 480); + + @Comment({"The command to execute instead of using the internal ban system, empty if disabled.", + "Available placeholders: %player%, %ip%"}) + public static final Property TEMPBAN_CUSTOM_COMMAND = + newProperty("Security.tempban.customCommand", ""); + + @Comment("Number of characters a recovery code should have (0 to disable)") + public static final Property RECOVERY_CODE_LENGTH = + newProperty("Security.recoveryCode.length", 8); + + @Comment("How many hours is a recovery code valid for?") + public static final Property RECOVERY_CODE_HOURS_VALID = + newProperty("Security.recoveryCode.validForHours", 6); + + @Comment("Max number of tries to enter recovery code") + public static final Property RECOVERY_CODE_MAX_TRIES = + newProperty("Security.recoveryCode.maxTries", 4); + + @Comment({"How long a player has after password recovery to change their password", + "without logging in. This is in minutes.", + "Default: 2 minutes"}) + public static final Property PASSWORD_CHANGE_TIMEOUT = + newProperty("Security.recoveryCode.passwordChangeTimeout", 5); + + @Comment({ + "Seconds a user has to wait for before a password recovery mail may be sent again", + "This prevents an attacker from abusing AuthMe's email feature." + }) + public static final Property EMAIL_RECOVERY_COOLDOWN_SECONDS = + newProperty("Security.emailRecovery.cooldown", 60); + + @Comment({ + "The mail shown using /email show will be partially hidden", + "E.g. (if enabled)", + " original email: my.email@example.com", + " hidden email: my.***@***mple.com" + }) + public static final Property USE_EMAIL_MASKING = + newProperty("Security.privacy.enableEmailMasking", false); + + @Comment("Minutes after which a verification code will expire") + public static final Property VERIFICATION_CODE_EXPIRATION_MINUTES = + newProperty("Security.privacy.verificationCodeExpiration", 10); + + private SecuritySettings() { + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/CleanupTask.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/CleanupTask.java new file mode 100644 index 0000000000..4f40ddb26f --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/CleanupTask.java @@ -0,0 +1,25 @@ +package fr.xephi.authme.task; + +import ch.jalu.injector.factory.SingletonStore; +import com.github.Anon8281.universalScheduler.UniversalRunnable; +import fr.xephi.authme.initialization.HasCleanup; + +import javax.inject.Inject; + +/** + * Task run periodically to invoke the cleanup task on services. + */ +public class CleanupTask extends UniversalRunnable { + + @Inject + private SingletonStore hasCleanupStore; + + CleanupTask() { + } + + @Override + public void run() { + hasCleanupStore.retrieveAllOfType() + .forEach(HasCleanup::performCleanup); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/MessageTask.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/MessageTask.java new file mode 100644 index 0000000000..dd11e8efeb --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/MessageTask.java @@ -0,0 +1,34 @@ +package fr.xephi.authme.task; + +import com.github.Anon8281.universalScheduler.UniversalRunnable; +import org.bukkit.entity.Player; + +/** + * Message shown to a player in a regular interval as long as he is not logged in. + */ +public class MessageTask extends UniversalRunnable { + + private final Player player; + private final String[] message; + private boolean isMuted; + + /* + * Constructor. + */ + public MessageTask(Player player, String[] lines) { + this.player = player; + this.message = lines; + isMuted = false; + } + + public void setMuted(boolean isMuted) { + this.isMuted = isMuted; + } + + @Override + public void run() { + if (!isMuted) { + player.sendMessage(message); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/TimeoutTask.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/TimeoutTask.java new file mode 100644 index 0000000000..60aac74143 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/TimeoutTask.java @@ -0,0 +1,34 @@ +package fr.xephi.authme.task; + +import fr.xephi.authme.data.auth.PlayerCache; +import org.bukkit.entity.Player; + +/** + * Kicks a player if he hasn't logged in (scheduled to run after a configured delay). + */ +public class TimeoutTask implements Runnable { + + private final Player player; + private final String message; + private final PlayerCache playerCache; + + /** + * Constructor for TimeoutTask. + * + * @param player the player to check + * @param message the kick message + * @param playerCache player cache instance + */ + public TimeoutTask(Player player, String message, PlayerCache playerCache) { + this.message = message; + this.player = player; + this.playerCache = playerCache; + } + + @Override + public void run() { + if (!playerCache.isAuthenticated(player.getName())) { + player.kickPlayer(message); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/Updater.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/Updater.java new file mode 100644 index 0000000000..5616d88a8a --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/Updater.java @@ -0,0 +1,67 @@ +package fr.xephi.authme.task; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URI; +import java.net.URL; +import java.util.Scanner; + +public class Updater { + private final String currentVersion; + private String latestVersion; + private static boolean isUpdateAvailable = false; + private static final String owner = "HaHaWTH"; + private static final String repo = "AuthMeReReloaded"; + private static final String UPDATE_URL = "https://api.github.com/repos/" + owner + "/" + repo + "/releases/latest"; + + public Updater(String currentVersion) { + this.currentVersion = currentVersion; + } + + + /** + * Check if there is an update available + * Note: This method will perform a network request! + * + * @return true if there is an update available, false otherwise + */ + public boolean isUpdateAvailable() { + URI uri = URI.create(UPDATE_URL); + try { + URL url = uri.toURL(); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setConnectTimeout(10000); + conn.setReadTimeout(10000); + Scanner scanner = new Scanner(conn.getInputStream()); + String response = scanner.useDelimiter("\\Z").next(); + scanner.close(); + String latestVersion = response.substring(response.indexOf("tag_name") + 11); + latestVersion = latestVersion.substring(0, latestVersion.indexOf("\"")); + this.latestVersion = latestVersion; + isUpdateAvailable = !currentVersion.equals(latestVersion); + return isUpdateAvailable; + } catch (IOException ignored) { + this.latestVersion = null; + isUpdateAvailable = false; + return false; + } + } + + public String getLatestVersion() { + return latestVersion; + } + + public String getCurrentVersion() { + return currentVersion; + } + + /** + * Returns true if there is an update available, false otherwise + * Must be called after {@link Updater#isUpdateAvailable()} + * + * @return A boolean indicating whether there is an update available + */ + public static boolean hasUpdate() { + return isUpdateAvailable; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/purge/PurgeExecutor.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/purge/PurgeExecutor.java new file mode 100644 index 0000000000..ea0096042b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/purge/PurgeExecutor.java @@ -0,0 +1,227 @@ +package fr.xephi.authme.task.purge; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.PluginHookService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.PurgeSettings; +import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; + +import javax.inject.Inject; +import java.io.File; +import java.util.Collection; +import java.util.Locale; + +import static fr.xephi.authme.util.FileUtils.makePath; + +/** + * Executes the purge operations. + */ +public class PurgeExecutor { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(PurgeExecutor.class); + + @Inject + private Settings settings; + + @Inject + private DataSource dataSource; + + @Inject + private PermissionsManager permissionsManager; + + @Inject + private PluginHookService pluginHookService; + + @Inject + private BukkitService bukkitService; + + @Inject + private Server server; + + PurgeExecutor() { + } + + /** + * Performs the purge operations, i.e. deletes data and removes the files associated with the given + * players and names. + * + * @param players the players to purge + * @param names names to purge + */ + public void executePurge(Collection players, Collection names) { + // Purge other data + purgeFromAuthMe(names); + purgeEssentials(players); + purgeDat(players); + purgeLimitedCreative(names); + purgeAntiXray(names); + purgePermissions(players); + } + + /** + * Purges data from the AntiXray plugin. + * + * @param cleared the players whose data should be cleared + */ + synchronized void purgeAntiXray(Collection cleared) { + if (!settings.getProperty(PurgeSettings.REMOVE_ANTI_XRAY_FILE)) { + return; + } + + int i = 0; + File dataFolder = new File(makePath(".", "plugins", "AntiXRayData", "PlayerData")); + if (!dataFolder.exists() || !dataFolder.isDirectory()) { + return; + } + + for (String file : dataFolder.list()) { + if (cleared.contains(file.toLowerCase(Locale.ROOT))) { + File playerFile = new File(dataFolder, file); + if (playerFile.exists() && playerFile.delete()) { + i++; + } + } + } + + logger.info("AutoPurge: Removed " + i + " AntiXRayData Files"); + } + + /** + * Deletes the given accounts from AuthMe. + * + * @param names the name of the accounts to delete + */ + synchronized void purgeFromAuthMe(Collection names) { + dataSource.purgeRecords(names); + //TODO ljacqu 20160717: We shouldn't output namedBanned.size() but the actual total that was deleted + logger.info(ChatColor.GOLD + "Deleted " + names.size() + " user accounts"); + } + + /** + * Purges data from the LimitedCreative plugin. + * + * @param cleared the players whose data should be cleared + */ + synchronized void purgeLimitedCreative(Collection cleared) { + if (!settings.getProperty(PurgeSettings.REMOVE_LIMITED_CREATIVE_INVENTORIES)) { + return; + } + + int i = 0; + File dataFolder = new File(makePath(".", "plugins", "LimitedCreative", "inventories")); + if (!dataFolder.exists() || !dataFolder.isDirectory()) { + return; + } + for (String file : dataFolder.list()) { + String name = file; + int idx; + idx = file.lastIndexOf("_creative.yml"); + if (idx != -1) { + name = name.substring(0, idx); + } else { + idx = file.lastIndexOf("_adventure.yml"); + if (idx != -1) { + name = name.substring(0, idx); + } else { + idx = file.lastIndexOf(".yml"); + if (idx != -1) { + name = name.substring(0, idx); + } + } + } + if (name.equals(file)) { + continue; + } + if (cleared.contains(name.toLowerCase(Locale.ROOT))) { + File dataFile = new File(dataFolder, file); + if (dataFile.exists() && dataFile.delete()) { + i++; + } + } + } + logger.info("AutoPurge: Removed " + i + " LimitedCreative Survival, Creative and Adventure files"); + } + + /** + * Removes the .dat file of the given players. + * + * @param cleared list of players to clear + */ + synchronized void purgeDat(Collection cleared) { + if (!settings.getProperty(PurgeSettings.REMOVE_PLAYER_DAT)) { + return; + } + + int i = 0; + File dataFolder = new File(server.getWorldContainer(), + makePath(settings.getProperty(PurgeSettings.DEFAULT_WORLD), "players")); + + for (OfflinePlayer offlinePlayer : cleared) { + File playerFile = new File(dataFolder, offlinePlayer.getUniqueId() + ".dat"); + if (playerFile.delete()) { + i++; + } + } + + logger.info("AutoPurge: Removed " + i + " .dat Files"); + } + + /** + * Removes the Essentials userdata file of each given player. + * + * @param cleared list of players to clear + */ + synchronized void purgeEssentials(Collection cleared) { + if (!settings.getProperty(PurgeSettings.REMOVE_ESSENTIALS_FILES)) { + return; + } + + File essentialsDataFolder = pluginHookService.getEssentialsDataFolder(); + if (essentialsDataFolder == null) { + logger.info("Cannot purge Essentials: plugin is not loaded"); + return; + } + + final File userDataFolder = new File(essentialsDataFolder, "userdata"); + if (!userDataFolder.exists() || !userDataFolder.isDirectory()) { + return; + } + + int deletedFiles = 0; + for (OfflinePlayer offlinePlayer : cleared) { + File playerFile = new File(userDataFolder, offlinePlayer.getUniqueId() + ".yml"); + if (playerFile.exists() && playerFile.delete()) { + deletedFiles++; + } + } + + logger.info("AutoPurge: Removed " + deletedFiles + " EssentialsFiles"); + } + + /** + * Removes permission data (groups a user belongs to) for the given players. + * + * @param cleared the players to remove data for + */ + synchronized void purgePermissions(Collection cleared) { + if (!settings.getProperty(PurgeSettings.REMOVE_PERMISSIONS)) { + return; + } + + for (OfflinePlayer offlinePlayer : cleared) { + if (!permissionsManager.loadUserData(offlinePlayer)) { + logger.warning("Unable to purge the permissions of user " + offlinePlayer + "!"); + continue; + } + permissionsManager.removeAllGroups(offlinePlayer); + } + + logger.info("AutoPurge: Removed permissions from " + cleared.size() + " player(s)."); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/purge/PurgeService.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/purge/PurgeService.java new file mode 100644 index 0000000000..880d51185a --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/purge/PurgeService.java @@ -0,0 +1,123 @@ +package fr.xephi.authme.task.purge; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.PurgeSettings; +import fr.xephi.authme.util.Utils; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.Calendar; +import java.util.Collection; +import java.util.Set; + +import static fr.xephi.authme.util.Utils.logAndSendMessage; + +/** + * Initiates purge tasks. + */ +public class PurgeService { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(PurgeService.class); + + @Inject + private BukkitService bukkitService; + + @Inject + private DataSource dataSource; + + @Inject + private Settings settings; + + @Inject + private PermissionsManager permissionsManager; + + @Inject + private PurgeExecutor purgeExecutor; + + /** Keeps track of whether a purge task is currently running. */ + private boolean isPurging = false; + + PurgeService() { + } + + /** + * Purges players from the database. Runs on startup if enabled. + */ + public void runAutoPurge() { + int daysBeforePurge = settings.getProperty(PurgeSettings.DAYS_BEFORE_REMOVE_PLAYER); + if (!settings.getProperty(PurgeSettings.USE_AUTO_PURGE)) { + return; + } else if (daysBeforePurge <= 0) { + logger.warning("Did not run auto purge: configured days before purging must be positive"); + return; + } + + logger.info("Automatically purging the database..."); + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DATE, -daysBeforePurge); + long until = calendar.getTimeInMillis(); + + runPurge(null, until); + } + + /** + * Runs a purge with a specified last login threshold. Players who haven't logged in since the threshold + * will be purged. + * + * @param sender Sender running the command + * @param until The last login threshold in milliseconds + */ + public void runPurge(CommandSender sender, long until) { + //todo: note this should may run async because it may executes a SQL-Query + Set toPurge = dataSource.getRecordsToPurge(until); + if (Utils.isCollectionEmpty(toPurge)) { + logAndSendMessage(sender, "No players to purge"); + return; + } + + purgePlayers(sender, toPurge, bukkitService.getOfflinePlayers()); + } + + /** + * Purges the given list of player names. + * + * @param sender Sender running the command + * @param names The names to remove + * @param players Collection of OfflinePlayers (including those with the given names) + */ + public void purgePlayers(CommandSender sender, Set names, OfflinePlayer[] players) { + if (isPurging) { + logAndSendMessage(sender, "Purge is already in progress! Aborting purge request"); + return; + } + + isPurging = true; + PurgeTask purgeTask = new PurgeTask(this, permissionsManager, sender, names, players); + bukkitService.runTaskTimerAsynchronously(purgeTask, 0, 1); + } + + /** + * Set if a purge is currently in progress. + * + * @param purging True if purging. + */ + void setPurging(boolean purging) { + this.isPurging = purging; + } + + /** + * Perform purge operations for the given players and names. + * + * @param players the players (associated with the names) + * @param names the lowercase names + */ + void executePurge(Collection players, Collection names) { + purgeExecutor.executePurge(players, names); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java new file mode 100644 index 0000000000..15ab6552cf --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java @@ -0,0 +1,130 @@ +package fr.xephi.authme.task.purge; + +import com.github.Anon8281.universalScheduler.UniversalRunnable; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.permission.PlayerStatePermission; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.HashSet; +import java.util.Locale; +import java.util.Set; +import java.util.UUID; + +class PurgeTask extends UniversalRunnable { + + //how many players we should check for each tick + private static final int INTERVAL_CHECK = 5; + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(PurgeTask.class); + private final PurgeService purgeService; + private final PermissionsManager permissionsManager; + private final UUID sender; + private final Set toPurge; + + private final OfflinePlayer[] offlinePlayers; + private final int totalPurgeCount; + + private int currentPage = 0; + + /** + * Constructor. + * + * @param service the purge service + * @param permissionsManager the permissions manager + * @param sender the sender who initiated the purge, or null + * @param toPurge lowercase names to purge + * @param offlinePlayers offline players to map to the names + */ + PurgeTask(PurgeService service, PermissionsManager permissionsManager, CommandSender sender, + Set toPurge, OfflinePlayer[] offlinePlayers) { + this.purgeService = service; + this.permissionsManager = permissionsManager; + + if (sender instanceof Player) { + this.sender = ((Player) sender).getUniqueId(); + } else { + this.sender = null; + } + + this.toPurge = toPurge; + this.totalPurgeCount = toPurge.size(); + this.offlinePlayers = offlinePlayers; + } + + @Override + public void run() { + if (toPurge.isEmpty()) { + //everything was removed + finish(); + return; + } + + Set playerPortion = new HashSet<>(INTERVAL_CHECK); + Set namePortion = new HashSet<>(INTERVAL_CHECK); + for (int i = 0; i < INTERVAL_CHECK; i++) { + int nextPosition = (currentPage * INTERVAL_CHECK) + i; + if (offlinePlayers.length <= nextPosition) { + //no more offline players on this page + break; + } + + OfflinePlayer offlinePlayer = offlinePlayers[nextPosition]; + if (offlinePlayer.getName() != null && toPurge.remove(offlinePlayer.getName().toLowerCase(Locale.ROOT))) { + if (!permissionsManager.loadUserData(offlinePlayer)) { + logger.warning("Unable to check if the user " + offlinePlayer.getName() + " can be purged!"); + continue; + } + if (!permissionsManager.hasPermissionOffline(offlinePlayer, PlayerStatePermission.BYPASS_PURGE)) { + playerPortion.add(offlinePlayer); + namePortion.add(offlinePlayer.getName()); + } + } + } + + if (!toPurge.isEmpty() && playerPortion.isEmpty()) { + logger.info("Finished lookup of offlinePlayers. Begin looking purging player names only"); + + //we went through all offlineplayers but there are still names remaining + for (String name : toPurge) { + if (!permissionsManager.hasPermissionOffline(name, PlayerStatePermission.BYPASS_PURGE)) { + namePortion.add(name); + } + } + toPurge.clear(); + } + + currentPage++; + purgeService.executePurge(playerPortion, namePortion); + if (currentPage % 20 == 0) { + int completed = totalPurgeCount - toPurge.size(); + sendMessage("[AuthMe] Purge progress " + completed + '/' + totalPurgeCount); + } + } + + private void finish() { + cancel(); + + // Show a status message + sendMessage(ChatColor.GREEN + "[AuthMe] Database has been purged successfully"); + + logger.info("Purge finished!"); + purgeService.setPurging(false); + } + + private void sendMessage(String message) { + if (sender == null) { + Bukkit.getConsoleSender().sendMessage(message); + } else { + Player player = Bukkit.getPlayer(sender); + if (player != null) { + player.sendMessage(message); + } + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/AtomicIntervalCounter.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/AtomicIntervalCounter.java new file mode 100644 index 0000000000..2a50e660a2 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/AtomicIntervalCounter.java @@ -0,0 +1,53 @@ +package fr.xephi.authme.util; + +/** + * A thread-safe interval counter, allows to detect if an event happens more than 'threshold' times + * in the given 'interval'. + */ +public class AtomicIntervalCounter { + private final int threshold; + private final int interval; + private int count; + private long lastInsert; + + /** + * Constructs a new counter. + * + * @param threshold the threshold value of the counter. + * @param interval the counter interval in milliseconds. + */ + public AtomicIntervalCounter(int threshold, int interval) { + this.threshold = threshold; + this.interval = interval; + reset(); + } + + /** + * Resets the counter count. + */ + public synchronized void reset() { + count = 0; + lastInsert = 0; + } + + /** + * Increments the counter and returns true if the current count has reached the threshold value + * in the given interval, this will also reset the count value. + * + * @return true if the count has reached the threshold value. + */ + public synchronized boolean handle() { + long now = System.currentTimeMillis(); + if (now - lastInsert > interval) { + count = 1; + } else { + count++; + } + if (count > threshold) { + reset(); + return true; + } + lastInsert = now; + return false; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/ExceptionUtils.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/ExceptionUtils.java new file mode 100644 index 0000000000..fd5ae88529 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/ExceptionUtils.java @@ -0,0 +1,46 @@ +package fr.xephi.authme.util; + +import com.google.common.collect.Sets; + +import java.util.Set; + +/** + * Utilities for exceptions. + */ +public final class ExceptionUtils { + + private ExceptionUtils() { + } + + /** + * Returns the first throwable of the given {@code wantedThrowableType} by visiting the provided + * throwable and its causes recursively. + * + * @param wantedThrowableType the throwable type to find + * @param throwable the throwable to start with + * @param the desired throwable subtype + * @return the first throwable found of the given type, or null if none found + */ + public static T findThrowableInCause(Class wantedThrowableType, Throwable throwable) { + Set visitedObjects = Sets.newIdentityHashSet(); + Throwable currentThrowable = throwable; + while (currentThrowable != null && !visitedObjects.contains(currentThrowable)) { + if (wantedThrowableType.isInstance(currentThrowable)) { + return wantedThrowableType.cast(currentThrowable); + } + visitedObjects.add(currentThrowable); + currentThrowable = currentThrowable.getCause(); + } + return null; + } + + /** + * Format the information from a Throwable as string, retaining the type and its message. + * + * @param th the throwable to process + * @return string with the type of the Throwable and its message, e.g. "[IOException]: Could not open stream" + */ + public static String formatException(Throwable th) { + return "[" + th.getClass().getSimpleName() + "]: " + th.getMessage(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/FileUtils.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/FileUtils.java new file mode 100644 index 0000000000..7f7ee4aaa3 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/FileUtils.java @@ -0,0 +1,173 @@ +package fr.xephi.authme.util; + +import com.google.common.io.Files; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import static java.lang.String.format; + +/** + * File utilities. + */ +public final class FileUtils { + + private static final DateTimeFormatter CURRENT_DATE_STRING_FORMATTER = + DateTimeFormatter.ofPattern("yyyyMMdd_HHmm"); + + private static ConsoleLogger logger = ConsoleLoggerFactory.get(FileUtils.class); + + // Utility class + private FileUtils() { + } + + /** + * Copy a resource file (from the JAR) to the given file if it doesn't exist. + * + * @param destinationFile The file to check and copy to (outside of JAR) + * @param resourcePath Local path to the resource file (path to file within JAR) + * + * @return False if the file does not exist and could not be copied, true otherwise + */ + public static boolean copyFileFromResource(File destinationFile, String resourcePath) { + if (destinationFile.exists()) { + return true; + } else if (!createDirectory(destinationFile.getParentFile())) { + logger.warning("Cannot create parent directories for '" + destinationFile + "'"); + return false; + } + + try (InputStream is = getResourceFromJar(resourcePath)) { + if (is == null) { + logger.warning(format("Cannot copy resource '%s' to file '%s': cannot load resource", + resourcePath, destinationFile.getPath())); + } else { + java.nio.file.Files.copy(is, destinationFile.toPath()); + return true; + } + } catch (IOException e) { + logger.logException(format("Cannot copy resource '%s' to file '%s':", + resourcePath, destinationFile.getPath()), e); + } + return false; + } + + /** + * Creates the given directory. + * + * @param dir the directory to create + * @return true upon success, false otherwise + */ + public static boolean createDirectory(File dir) { + if (!dir.exists() && !dir.mkdirs()) { + logger.warning("Could not create directory '" + dir + "'"); + return false; + } + return dir.isDirectory(); + } + + /** + * Returns a JAR file as stream. Returns null if it doesn't exist. + * + * @param path the local path (starting from resources project, e.g. "config.yml" for 'resources/config.yml') + * @return the stream if the file exists, or false otherwise + */ + public static InputStream getResourceFromJar(String path) { + // ClassLoader#getResourceAsStream does not deal with the '\' path separator: replace to '/' + final String normalizedPath = path.replace("\\", "/"); + return AuthMe.class.getClassLoader().getResourceAsStream(normalizedPath); + } + + /** + * Delete a given directory and all its content. + * + * @param directory The directory to remove + */ + public static void purgeDirectory(File directory) { + if (!directory.isDirectory()) { + return; + } + File[] files = directory.listFiles(); + if (files == null) { + return; + } + for (File target : files) { + if (target.isDirectory()) { + purgeDirectory(target); + } + delete(target); + } + } + + /** + * Delete the given file or directory and log a message if it was unsuccessful. + * Method is null safe and does nothing when null is passed. + * + * @param file the file to delete + */ + public static void delete(File file) { + if (file != null) { + boolean result = file.delete(); + if (!result) { + logger.warning("Could not delete file '" + file + "'"); + } + } + } + + /** + * Creates the given file or throws an exception. + * + * @param file the file to create + */ + public static void create(File file) { + try { + boolean result = file.createNewFile(); + if (!result) { + throw new IllegalStateException("Could not create file '" + file + "'"); + } + } catch (IOException e) { + throw new IllegalStateException("Error while creating file '" + file + "'", e); + } + } + + /** + * Construct a file path from the given elements, i.e. separate the given elements by the file separator. + * + * @param elements The elements to create a path with + * + * @return The created path + */ + public static String makePath(String... elements) { + return String.join(File.separator, elements); + } + + /** + * Creates a textual representation of the current time (including minutes), e.g. useful for + * automatically generated backup files. + * + * @return string of the current time for use in file names + */ + public static String createCurrentTimeString() { + return LocalDateTime.now().format(CURRENT_DATE_STRING_FORMATTER); + } + + /** + * Returns a path to a new file (which doesn't exist yet) with a timestamp in the name in the same + * folder as the given file and containing the given file's filename. + * + * @param file the file based on which a new file path should be created + * @return path to a file suitably named for storing a backup + */ + public static String createBackupFilePath(File file) { + String filename = "backup_" + Files.getNameWithoutExtension(file.getName()) + + "_" + createCurrentTimeString() + + "." + Files.getFileExtension(file.getName()); + return makePath(file.getParent(), filename); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/InternetProtocolUtils.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/InternetProtocolUtils.java new file mode 100644 index 0000000000..039421548b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/InternetProtocolUtils.java @@ -0,0 +1,72 @@ +package fr.xephi.authme.util; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * Utility class about the InternetProtocol + */ +public final class InternetProtocolUtils { + + // Utility class + private InternetProtocolUtils() { + } + + /** + * Checks if the specified address is a private or loopback address + * + * @param address address to check + * @return true if the address is a local (site and link) or loopback address, false otherwise + */ + public static boolean isLocalAddress(String address) { + try { + InetAddress inetAddress = InetAddress.getByName(address); + + // Examples: 127.0.0.1, localhost or [::1] + return isLoopbackAddress(address) + // Example: 10.0.0.0, 172.16.0.0, 192.168.0.0, fec0::/10 (deprecated) + // Ref: https://en.wikipedia.org/wiki/IP_address#Private_addresses + || inetAddress.isSiteLocalAddress() + // Example: 169.254.0.0/16, fe80::/10 + // Ref: https://en.wikipedia.org/wiki/IP_address#Address_autoconfiguration + || inetAddress.isLinkLocalAddress() + // non deprecated unique site-local that java doesn't check yet -> fc00::/7 + || isIPv6UniqueSiteLocal(inetAddress); + } catch (UnknownHostException e) { + return false; + } + } + + /** + * Checks if the specified address is a loopback address. This can be one of the following: + *

    + *
  • 127.0.0.1
  • + *
  • localhost
  • + *
  • [::1]
  • + *
+ * + * @param address address to check + * @return true if the address is a loopback one + */ + public static boolean isLoopbackAddress(String address) { + try { + InetAddress inetAddress = InetAddress.getByName(address); + return inetAddress.isLoopbackAddress(); + } catch (UnknownHostException e) { + return false; + } + } + + private static boolean isLoopbackAddress(InetAddress address) { + return address.isLoopbackAddress(); + } + + private static boolean isIPv6UniqueSiteLocal(InetAddress address) { + // ref: https://en.wikipedia.org/wiki/Unique_local_address + + // currently undefined but could be used in the near future fc00::/8 + return (address.getAddress()[0] & 0xFF) == 0xFC + // in use for unique site-local fd00::/8 + || (address.getAddress()[0] & 0xFF) == 0xFD; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/PlayerUtils.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/PlayerUtils.java new file mode 100644 index 0000000000..3c9b6f4fe1 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/PlayerUtils.java @@ -0,0 +1,39 @@ +package fr.xephi.authme.util; + +import org.bukkit.entity.Player; + +/** + * Player utilities. + */ +public final class PlayerUtils { + + // Utility class + private PlayerUtils() { + } + private static final boolean isLeavesServer = Utils.isClassLoaded("top.leavesmc.leaves.LeavesConfig") || Utils.isClassLoaded("org.leavesmc.leaves.LeavesConfig"); + + /** + * Returns the IP of the given player. + * + * @param player The player to return the IP address for + * @return The player's IP address + */ + public static String getPlayerIp(Player player) { + return player.getAddress().getAddress().getHostAddress(); + } + + /** + * Returns if the player is an NPC or not. + * + * @param player The player to check + * @return True if the player is an NPC, false otherwise + */ + public static boolean isNpc(Player player) { + if (isLeavesServer) { + return player.hasMetadata("NPC") || player.getAddress() == null; + } else { + return player.hasMetadata("NPC"); + } + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/RandomStringUtils.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/RandomStringUtils.java new file mode 100644 index 0000000000..58018477c1 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/RandomStringUtils.java @@ -0,0 +1,75 @@ +package fr.xephi.authme.util; + +import java.security.SecureRandom; +import java.util.Random; + +/** + * Utility for generating random strings. + */ +public final class RandomStringUtils { + + private static final char[] CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); + private static final Random RANDOM = new SecureRandom(); + private static final int NUM_INDEX = 10; + private static final int LOWER_ALPHANUMERIC_INDEX = 36; + private static final int HEX_MAX_INDEX = 16; + + // Utility class + private RandomStringUtils() { + } + + /** + * Generate a string of the given length consisting of random characters within the range [0-9a-z]. + * + * @param length The length of the random string to generate + * @return The random string + */ + public static String generate(int length) { + return generateString(length, LOWER_ALPHANUMERIC_INDEX); + } + + /** + * Generate a random hexadecimal string of the given length. In other words, the generated string + * contains characters only within the range [0-9a-f]. + * + * @param length The length of the random string to generate + * @return The random hexadecimal string + */ + public static String generateHex(int length) { + return generateString(length, HEX_MAX_INDEX); + } + + /** + * Generate a random numbers string of the given length. In other words, the generated string + * contains characters only within the range [0-9]. + * + * @param length The length of the random string to generate + * @return The random numbers string + */ + public static String generateNum(int length) { + return generateString(length, NUM_INDEX); + } + + /** + * Generate a random string with digits and lowercase and uppercase letters. The result of this + * method matches the pattern [0-9a-zA-Z]. + * + * @param length The length of the random string to generate + * @return The random string + */ + public static String generateLowerUpper(int length) { + return generateString(length, CHARS.length); + } + + private static String generateString(int length, int maxIndex) { + if (length < 0) { + throw new IllegalArgumentException("Length must be positive but was " + length); + } + StringBuilder sb = new StringBuilder(length); + for (int i = 0; i < length; ++i) { + sb.append(CHARS[RANDOM.nextInt(maxIndex)]); + } + return sb.toString(); + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/StringUtils.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/StringUtils.java new file mode 100644 index 0000000000..8a86367863 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/StringUtils.java @@ -0,0 +1,80 @@ +package fr.xephi.authme.util; + +import net.ricecode.similarity.LevenshteinDistanceStrategy; +import net.ricecode.similarity.StringSimilarityService; +import net.ricecode.similarity.StringSimilarityServiceImpl; + +/** + * Utility class for String operations. + */ +public final class StringUtils { + + // Utility class + private StringUtils() { + } + + /** + * Calculates the difference of two strings. + * + * @param first first string + * @param second second string + * @return the difference value + */ + public static double getDifference(String first, String second) { + // Make sure the strings are valid. + if (first == null || second == null) { + return 1.0; + } + + // Create a string similarity service instance, to allow comparison + StringSimilarityService service = new StringSimilarityServiceImpl(new LevenshteinDistanceStrategy()); + + // Determine the difference value, return the result + return Math.abs(service.score(first, second) - 1.0); + } + + /** + * Returns whether the given string contains any of the provided elements. + * + * @param str the string to analyze + * @param pieces the items to check the string for + * @return true if the string contains at least one of the items + */ + public static boolean containsAny(String str, Iterable pieces) { + if (str == null) { + return false; + } + for (String piece : pieces) { + if (piece != null && str.contains(piece)) { + return true; + } + } + return false; + } + + /** + * Null-safe method for checking whether a string is empty. Note that the string + * is trimmed, so this method also considers a string with whitespace as empty. + * + * @param str the string to verify + * @return true if the string is empty, false otherwise + */ + public static boolean isBlank(String str) { + return str == null || str.trim().isEmpty(); + } + + /** + * Checks that the given needle is in the middle of the haystack, i.e. that the haystack + * contains the needle and that it is not at the very start or end. + * + * @param needle the needle to search for + * @param haystack the haystack to search in + * @return true if the needle is in the middle of the word, false otherwise + */ + // Note ljacqu 20170314: `needle` is restricted to char type intentionally because something like + // isInsideString("11", "2211") would unexpectedly return true... + public static boolean isInsideString(char needle, String haystack) { + int index = haystack.indexOf(needle); + return index > 0 && index < haystack.length() - 1; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/TeleportUtils.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/TeleportUtils.java new file mode 100644 index 0000000000..4a043b1774 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/TeleportUtils.java @@ -0,0 +1,44 @@ +package fr.xephi.authme.util; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.concurrent.CompletableFuture; + +/** + * This class is a utility class for handling async teleportation of players in game. + */ +public class TeleportUtils { + private static MethodHandle teleportAsyncMethodHandle; + + static { + try { + MethodHandles.Lookup lookup = MethodHandles.lookup(); + teleportAsyncMethodHandle = lookup.findVirtual(Player.class, "teleportAsync", MethodType.methodType(CompletableFuture.class, Location.class)); + } catch (NoSuchMethodException | IllegalAccessException e) { + teleportAsyncMethodHandle = null; + // if not, set method handle to null + } + } + + /** + * Teleport a player to a specified location. + * + * @param player The player to be teleported + * @param location Where should the player be teleported + */ + public static void teleport(Player player, Location location) { + if (teleportAsyncMethodHandle != null) { + try { + teleportAsyncMethodHandle.invoke(player, location); + } catch (Throwable throwable) { + player.teleport(location); + } + } else { + player.teleport(location); + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/Utils.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/Utils.java new file mode 100644 index 0000000000..324a8eed02 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/Utils.java @@ -0,0 +1,119 @@ +package fr.xephi.authme.util; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; + +import java.util.Collection; +import java.util.regex.Pattern; + +/** + * Utility class for various operations used in the codebase. + */ +public final class Utils { + + /** Number of milliseconds in a minute. */ + public static final long MILLIS_PER_MINUTE = 60_000L; + + private static ConsoleLogger logger = ConsoleLoggerFactory.get(Utils.class); + + // Utility class + private Utils() { + } + + /** + * Compile Pattern sneaky without throwing Exception. + * + * @param pattern pattern string to compile + * + * @return the given regex compiled into Pattern object. + */ + public static Pattern safePatternCompile(String pattern) { + try { + return Pattern.compile(pattern); + } catch (Exception e) { + logger.warning("Failed to compile pattern '" + pattern + "' - defaulting to allowing everything"); + return Pattern.compile(".*?"); + } + } + + /** + * Returns whether the class exists in the current class loader. + * + * @param className the class name to check + * + * @return true if the class is loaded, false otherwise + */ + public static boolean isClassLoaded(String className) { + try { + Class.forName(className); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } + + /** + * Sends a message to the given sender (null safe), and logs the message to the console. + * This method is aware that the command sender might be the console sender and avoids + * displaying the message twice in this case. + * + * @param sender the sender to inform + * @param message the message to log and send + */ + public static void logAndSendMessage(CommandSender sender, String message) { + logger.info(message); + // Make sure sender is not console user, which will see the message from ConsoleLogger already + if (sender != null && !(sender instanceof ConsoleCommandSender)) { + sender.sendMessage(message); + } + } + + /** + * Sends a warning to the given sender (null safe), and logs the warning to the console. + * This method is aware that the command sender might be the console sender and avoids + * displaying the message twice in this case. + * + * @param sender the sender to inform + * @param message the warning to log and send + */ + public static void logAndSendWarning(CommandSender sender, String message) { + logger.warning(message); + // Make sure sender is not console user, which will see the message from ConsoleLogger already + if (sender != null && !(sender instanceof ConsoleCommandSender)) { + sender.sendMessage(ChatColor.RED + message); + } + } + + /** + * Null-safe way to check whether a collection is empty or not. + * + * @param coll The collection to verify + * @return True if the collection is null or empty, false otherwise + */ + public static boolean isCollectionEmpty(Collection coll) { + return coll == null || coll.isEmpty(); + } + + /** + * Returns whether the given email is empty or equal to the standard "undefined" email address. + * + * @param email the email to check + * + * @return true if the email is empty + */ + public static boolean isEmailEmpty(String email) { + return StringUtils.isBlank(email) || "your@email.com".equalsIgnoreCase(email); + } + + private final static String[] serverVersion = Bukkit.getServer().getBukkitVersion() + .substring(0, Bukkit.getServer().getBukkitVersion().indexOf("-")) + .split("\\."); + + private final static int FIRST_VERSION = Integer.parseInt(serverVersion[0]); + public final static int MAJOR_VERSION = Integer.parseInt(serverVersion[1]); + public final static int MINOR_VERSION = serverVersion.length == 3 ? Integer.parseInt(serverVersion[2]) : 0; +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/UuidUtils.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/UuidUtils.java new file mode 100644 index 0000000000..be35a93510 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/UuidUtils.java @@ -0,0 +1,27 @@ +package fr.xephi.authme.util; + +import java.util.UUID; + +/** + * Utility class for various operations on UUID. + */ +public final class UuidUtils { + + // Utility class + private UuidUtils() { + } + + /** + * Returns the given string as an UUID or null. + * + * @param string the uuid to parse + * @return parsed UUID if succeeded or null + */ + public static UUID parseUuidSafely(String string) { + try { + return string == null ? null : UUID.fromString(string); + } catch (IllegalArgumentException ex) { + return null; + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/expiring/Duration.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/expiring/Duration.java new file mode 100644 index 0000000000..ecc86299e5 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/expiring/Duration.java @@ -0,0 +1,72 @@ +package fr.xephi.authme.util.expiring; + +import java.util.concurrent.TimeUnit; + +/** + * Represents a duration in time, defined by a time unit and a duration. + */ +public class Duration { + + private final long duration; + private final TimeUnit unit; + + /** + * Constructor. + * + * @param duration the duration + * @param unit the time unit in which {@code duration} is expressed + */ + public Duration(long duration, TimeUnit unit) { + this.duration = duration; + this.unit = unit; + } + + /** + * Creates a Duration object for the given duration and unit in the most suitable time unit. + * For example, {@code createWithSuitableUnit(120, TimeUnit.SECONDS)} will return a Duration + * object of 2 minutes. + *

+ * This method only considers the time units days, hours, minutes, and seconds for the objects + * it creates. Conversion is done with {@link TimeUnit#convert} and so always rounds the + * results down. + *

+ * Further examples: + * createWithSuitableUnit(299, TimeUnit.MINUTES); // 4 hours + * createWithSuitableUnit(700, TimeUnit.MILLISECONDS); // 0 seconds + * + * @param sourceDuration the duration + * @param sourceUnit the time unit the duration is expressed in + * @return Duration object using the most suitable time unit + */ + public static Duration createWithSuitableUnit(long sourceDuration, TimeUnit sourceUnit) { + long durationMillis = Math.abs(TimeUnit.MILLISECONDS.convert(sourceDuration, sourceUnit)); + + TimeUnit targetUnit; + if (durationMillis > 1000L * 60L * 60L * 24L) { + targetUnit = TimeUnit.DAYS; + } else if (durationMillis > 1000L * 60L * 60L) { + targetUnit = TimeUnit.HOURS; + } else if (durationMillis > 1000L * 60L) { + targetUnit = TimeUnit.MINUTES; + } else { + targetUnit = TimeUnit.SECONDS; + } + + long durationInTargetUnit = targetUnit.convert(sourceDuration, sourceUnit); + return new Duration(durationInTargetUnit, targetUnit); + } + + /** + * @return the duration + */ + public long getDuration() { + return duration; + } + + /** + * @return the time unit in which the duration is expressed + */ + public TimeUnit getTimeUnit() { + return unit; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/expiring/ExpiringMap.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/expiring/ExpiringMap.java new file mode 100644 index 0000000000..3bf19351bc --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/expiring/ExpiringMap.java @@ -0,0 +1,138 @@ +package fr.xephi.authme.util.expiring; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +/** + * Map with expiring entries. Following a configured amount of time after + * an entry has been inserted, the map will act as if the entry does not + * exist. + *

+ * Time starts counting directly after insertion. Inserting a new entry with + * a key that already has a value will "reset" the expiration. Although the + * expiration can be redefined later on, only entries which are inserted + * afterwards will use the new expiration. + *

+ * An expiration of {@code <= 0} will make the map expire all entries + * immediately after insertion. Note that the map does not remove expired + * entries automatically; this is only done when calling + * {@link #removeExpiredEntries()}. + * + * @param the key type + * @param the value type + */ +public class ExpiringMap { + + private final Map> entries = new ConcurrentHashMap<>(); + private long expirationMillis; + + /** + * Constructor. + * + * @param duration the duration of time after which entries expire + * @param unit the time unit in which {@code duration} is expressed + */ + public ExpiringMap(long duration, TimeUnit unit) { + setExpiration(duration, unit); + } + + /** + * Returns the value associated with the given key, + * if available and not expired. + * + * @param key the key to look up + * @return the associated value, or {@code null} if not available + */ + public V get(K key) { + ExpiringEntry value = entries.get(key); + if (value == null) { + return null; + } else if (System.currentTimeMillis() > value.getExpiration()) { + entries.remove(key); + return null; + } + return value.getValue(); + } + + /** + * Inserts a value for the given key. Overwrites a previous value + * for the key if it exists. + * + * @param key the key to insert a value for + * @param value the value to insert + */ + public void put(K key, V value) { + long expiration = System.currentTimeMillis() + expirationMillis; + entries.put(key, new ExpiringEntry<>(value, expiration)); + } + + /** + * Removes the value for the given key, if available. + * + * @param key the key to remove the value for + */ + public void remove(K key) { + entries.remove(key); + } + + /** + * Removes all entries which have expired from the internal structure. + */ + public void removeExpiredEntries() { + entries.entrySet().removeIf(entry -> System.currentTimeMillis() > entry.getValue().getExpiration()); + } + + /** + * Sets a new expiration duration. Note that already present entries + * will still make use of the old expiration. + * + * @param duration the duration of time after which entries expire + * @param unit the time unit in which {@code duration} is expressed + */ + public void setExpiration(long duration, TimeUnit unit) { + this.expirationMillis = unit.toMillis(duration); + } + + /** + * Returns whether this map is empty. This reflects the state of the + * internal map, which may contain expired entries only. The result + * may change after running {@link #removeExpiredEntries()}. + * + * @return true if map is really empty, false otherwise + */ + public boolean isEmpty() { + return entries.isEmpty(); + } + + /** + * @return the internal map + */ + protected Map> getEntries() { + return entries; + } + + /** + * Class holding a value paired with an expiration timestamp. + * + * @param the value type + */ + protected static final class ExpiringEntry { + + private final V value; + private final long expiration; + + ExpiringEntry(V value, long expiration) { + this.value = value; + this.expiration = expiration; + } + + V getValue() { + return value; + } + + long getExpiration() { + return expiration; + } + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/expiring/ExpiringSet.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/expiring/ExpiringSet.java new file mode 100644 index 0000000000..fea8fb3131 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/expiring/ExpiringSet.java @@ -0,0 +1,125 @@ +package fr.xephi.authme.util.expiring; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +/** + * Set whose entries expire after a configurable amount of time. Once an entry + * has expired, the set will act as if the entry no longer exists. Time starts + * counting after the entry has been inserted. + *

+ * Internally, expired entries are not guaranteed to be cleared automatically. + * A cleanup of all expired entries may be triggered with + * {@link #removeExpiredEntries()}. Adding an entry that is already present + * effectively resets its expiration. + * + * @param the type of the entries + */ +public class ExpiringSet { + + private Map entries = new ConcurrentHashMap<>(); + private long expirationMillis; + + /** + * Constructor. + * + * @param duration the duration of time after which entries expire + * @param unit the time unit in which {@code duration} is expressed + */ + public ExpiringSet(long duration, TimeUnit unit) { + setExpiration(duration, unit); + } + + /** + * Adds an entry to the set. + * + * @param entry the entry to add + */ + public void add(E entry) { + entries.put(entry, System.currentTimeMillis() + expirationMillis); + } + + /** + * Returns whether this set contains the given entry, if it hasn't expired. + * + * @param entry the entry to check + * @return true if the entry is present and not expired, false otherwise + */ + public boolean contains(E entry) { + Long expiration = entries.get(entry); + if (expiration == null) { + return false; + } else if (expiration > System.currentTimeMillis()) { + return true; + } else { + entries.remove(entry); + return false; + } + } + + /** + * Removes the given entry from the set (if present). + * + * @param entry the entry to remove + */ + public void remove(E entry) { + entries.remove(entry); + } + + /** + * Removes all entries from the set. + */ + public void clear() { + entries.clear(); + } + + /** + * Removes all entries which have expired from the internal structure. + */ + public void removeExpiredEntries() { + entries.entrySet().removeIf(entry -> System.currentTimeMillis() > entry.getValue()); + } + + /** + * Returns the duration of the entry until it expires (provided it is not removed or re-added). + * If the entry does not exist, a duration of -1 seconds is returned. + * + * @param entry the entry whose duration before it expires should be returned + * @return duration the entry will remain in the set (if there are not modifications) + */ + public Duration getExpiration(E entry) { + Long expiration = entries.get(entry); + if (expiration == null) { + return new Duration(-1, TimeUnit.SECONDS); + } + long stillPresentMillis = expiration - System.currentTimeMillis(); + if (stillPresentMillis < 0) { + entries.remove(entry); + return new Duration(-1, TimeUnit.SECONDS); + } + return Duration.createWithSuitableUnit(stillPresentMillis, TimeUnit.MILLISECONDS); + } + + /** + * Sets a new expiration duration. Note that already present entries + * will still make use of the old expiration. + * + * @param duration the duration of time after which entries expire + * @param unit the time unit in which {@code duration} is expressed + */ + public void setExpiration(long duration, TimeUnit unit) { + this.expirationMillis = unit.toMillis(duration); + } + + /** + * Returns whether this map is empty. This reflects the state of the + * internal map, which may contain expired entries only. The result + * may change after running {@link #removeExpiredEntries()}. + * + * @return true if map is really empty, false otherwise + */ + public boolean isEmpty() { + return entries.isEmpty(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/expiring/TimedCounter.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/expiring/TimedCounter.java new file mode 100644 index 0000000000..d6d8bba1d7 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/expiring/TimedCounter.java @@ -0,0 +1,70 @@ +package fr.xephi.authme.util.expiring; + +import java.util.concurrent.TimeUnit; + +/** + * Keeps a count per key which expires after a configurable amount of time. + *

+ * Once the expiration of an entry has been reached, the counter resets + * to 0. The counter returns 0 rather than {@code null} for any given key. + * + * @param the type of the key + */ +public class TimedCounter extends ExpiringMap { + + /** + * Constructor. + * + * @param duration the duration of time after which entries expire + * @param unit the time unit in which {@code duration} is expressed + */ + public TimedCounter(long duration, TimeUnit unit) { + super(duration, unit); + } + + @Override + public Integer get(K key) { + Integer value = super.get(key); + return value == null ? 0 : value; + } + + /** + * Increments the value stored for the provided key. + * + * @param key the key to increment the counter for + */ + public void increment(K key) { + put(key, get(key) + 1); + } + + /** + * Decrements the value stored for the provided key. + * This method will NOT update the expiration. + * + * @param key the key to increment the counter for + */ + public void decrement(K key) { + ExpiringEntry e = getEntries().get(key); + + if (e != null) { + if (e.getValue() <= 0) { + remove(key); + } else { + getEntries().put(key, new ExpiringEntry<>(e.getValue() - 1, e.getExpiration())); + } + } + } + + /** + * Calculates the total of all non-expired entries in this counter. + * + * @return the total of all valid entries + */ + public int total() { + long currentTime = System.currentTimeMillis(); + return getEntries().values().stream() + .filter(entry -> currentTime <= entry.getExpiration()) + .map(ExpiringEntry::getValue) + .reduce(0, Integer::sum); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/DependentTag.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/DependentTag.java new file mode 100644 index 0000000000..5fb0cd3d3a --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/DependentTag.java @@ -0,0 +1,35 @@ +package fr.xephi.authme.util.lazytags; + +import java.util.function.Function; + +/** + * Replaceable tag whose value depends on an argument. + * + * @param the argument type + */ +public class DependentTag implements Tag { + + private final String name; + private final Function replacementFunction; + + /** + * Constructor. + * + * @param name the tag (placeholder) that will be replaced + * @param replacementFunction the function producing the replacement + */ + public DependentTag(String name, Function replacementFunction) { + this.name = name; + this.replacementFunction = replacementFunction; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getValue(A argument) { + return replacementFunction.apply(argument); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/SimpleTag.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/SimpleTag.java new file mode 100644 index 0000000000..a5bb58a26b --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/SimpleTag.java @@ -0,0 +1,29 @@ +package fr.xephi.authme.util.lazytags; + +import java.util.function.Supplier; + +/** + * Tag to be replaced that does not depend on an argument. + * + * @param type of the argument (not used in this implementation) + */ +public class SimpleTag implements Tag { + + private final String name; + private final Supplier replacementFunction; + + public SimpleTag(String name, Supplier replacementFunction) { + this.name = name; + this.replacementFunction = replacementFunction; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getValue(A argument) { + return replacementFunction.get(); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/Tag.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/Tag.java new file mode 100644 index 0000000000..2c7c6ba53d --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/Tag.java @@ -0,0 +1,22 @@ +package fr.xephi.authme.util.lazytags; + +/** + * Represents a tag in a text to be replaced with a value (which may depend on some argument). + * + * @param argument type the replacement may depend on + */ +public interface Tag { + + /** + * @return the tag to replace + */ + String getName(); + + /** + * Returns the value to replace the tag with for the given argument. + * + * @param argument the argument to evaluate the replacement for + * @return the replacement + */ + String getValue(A argument); +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/TagBuilder.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/TagBuilder.java new file mode 100644 index 0000000000..677b30e2fc --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/TagBuilder.java @@ -0,0 +1,21 @@ +package fr.xephi.authme.util.lazytags; + +import java.util.function.Function; +import java.util.function.Supplier; + +/** + * Utility class for creating tags. + */ +public final class TagBuilder { + + private TagBuilder() { + } + + public static Tag createTag(String name, Function replacementFunction) { + return new DependentTag<>(name, replacementFunction); + } + + public static Tag createTag(String name, Supplier replacementFunction) { + return new SimpleTag<>(name, replacementFunction); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/TagReplacer.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/TagReplacer.java new file mode 100644 index 0000000000..a9d1931991 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/TagReplacer.java @@ -0,0 +1,102 @@ +package fr.xephi.authme.util.lazytags; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Replaces tags lazily by first determining which tags are being used + * and only applying those replacements afterwards. + * + * @param the argument type + */ +public final class TagReplacer { + + private final List> tags; + private final Collection messages; + + /** + * Private constructor. Use {@link #newReplacer(Collection, Collection)}. + * + * @param tags the tags that are being used in the messages + * @param messages the messages + */ + private TagReplacer(List> tags, Collection messages) { + this.tags = tags; + this.messages = messages; + } + + /** + * Creates a new instance of this class, which will provide the given + * messages adapted with the provided tags. + * + * @param allTags all available tags + * @param messages the messages to use + * @param the argument type + * @return new tag replacer instance + */ + public static TagReplacer newReplacer(Collection> allTags, Collection messages) { + List> usedTags = determineUsedTags(allTags, messages); + return new TagReplacer<>(usedTags, messages); + } + + /** + * Returns the messages with the tags applied for the given argument. + * + * @param argument the argument to get the messages for + * @return the adapted messages + */ + public List getAdaptedMessages(A argument) { + // Note ljacqu 20170121: Using a Map might seem more natural here but we avoid doing so for performance + // Although the performance gain here is probably minimal... + List tagValues = new LinkedList<>(); + for (Tag tag : tags) { + tagValues.add(new TagValue(tag.getName(), tag.getValue(argument))); + } + + List adaptedMessages = new LinkedList<>(); + for (String line : messages) { + String adaptedLine = line; + for (TagValue tagValue : tagValues) { + adaptedLine = adaptedLine.replace(tagValue.tag, tagValue.value); + } + adaptedMessages.add(adaptedLine); + } + return adaptedMessages; + } + + /** + * Determines which tags are used somewhere in the given list of messages. + * + * @param allTags all available tags + * @param messages the messages + * @param argument type + * @return tags used at least once + */ + private static List> determineUsedTags(Collection> allTags, Collection messages) { + return allTags.stream() + .filter(tag -> messages.stream().anyMatch(msg -> msg.contains(tag.getName()))) + .collect(Collectors.toList()); + } + + /** (Tag, value) pair. */ + private static final class TagValue { + + /** The tag to replace. */ + private final String tag; + /** The value to replace with. */ + private final String value; + + TagValue(String tag, String value) { + this.tag = tag; + this.value = value; + } + + @Override + public String toString() { + return "TagValue[tag='" + tag + "', value='" + value + "']"; + } + } + +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/WrappedTagReplacer.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/WrappedTagReplacer.java new file mode 100644 index 0000000000..ce9487e210 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/lazytags/WrappedTagReplacer.java @@ -0,0 +1,61 @@ +package fr.xephi.authme.util.lazytags; + +import java.util.Collection; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * Applies tags lazily to the String property of an item. This class wraps + * a {@link TagReplacer} with the extraction of the String property and + * the creation of new items with the adapted string property. + * + * @param the item type + * @param the argument type to evaluate the replacements + */ +public class WrappedTagReplacer { + + private final Collection items; + private final BiFunction itemCreator; + private final TagReplacer tagReplacer; + + /** + * Constructor. + * + * @param allTags all available tags + * @param items the items to apply the replacements on + * @param stringGetter getter of the String property to adapt on the items + * @param itemCreator a function taking (T, String): the original item and the adapted String, returning a new item + */ + public WrappedTagReplacer(Collection> allTags, + Collection items, + Function stringGetter, + BiFunction itemCreator) { + this.items = items; + this.itemCreator = itemCreator; + + List stringItems = items.stream().map(stringGetter).collect(Collectors.toList()); + tagReplacer = TagReplacer.newReplacer(allTags, stringItems); + } + + /** + * Creates adapted items for the given argument. + * + * @param argument the argument to adapt the items for + * @return the adapted items + */ + public List getAdaptedItems(A argument) { + List adaptedStrings = tagReplacer.getAdaptedMessages(argument); + List adaptedItems = new LinkedList<>(); + + Iterator originalItemsIter = items.iterator(); + Iterator newStringsIter = adaptedStrings.iterator(); + while (originalItemsIter.hasNext() && newStringsIter.hasNext()) { + adaptedItems.add(itemCreator.apply(originalItemsIter.next(), newStringsIter.next())); + } + return adaptedItems; + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/message/I18NUtils.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/message/I18NUtils.java new file mode 100644 index 0000000000..da1d6769bc --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/message/I18NUtils.java @@ -0,0 +1,102 @@ +package fr.xephi.authme.util.message; + +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.PluginSettings; +import fr.xephi.authme.util.Utils; +import org.bukkit.entity.Player; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public class I18NUtils { + + private static Map PLAYER_LOCALE = new ConcurrentHashMap<>(); + private static final Map LOCALE_MAP = new HashMap<>(); + private static final List LOCALE_LIST = Arrays.asList( + "en", "bg", "de", "eo", "es", "et", "eu", "fi", "fr", "gl", "hu", "id", "it", "ja", "ko", "lt", "nl", "pl", + "pt", "ro", "ru", "sk", "sr", "tr", "uk" + ); + + static { + LOCALE_MAP.put("pt_br", "br"); + LOCALE_MAP.put("cs_cz", "cz"); + LOCALE_MAP.put("nds_de", "de"); + LOCALE_MAP.put("sxu", "de"); + LOCALE_MAP.put("swg", "de"); + LOCALE_MAP.put("rpr", "ru"); + LOCALE_MAP.put("sl_si", "si"); + LOCALE_MAP.put("vi_vn", "vn"); + LOCALE_MAP.put("lzh", "zhcn"); + LOCALE_MAP.put("zh_cn", "zhcn"); + LOCALE_MAP.put("zh_hk", "zhhk"); + LOCALE_MAP.put("zh_tw", "zhtw"); + //LOCALE_MAP.put("zhmc", "zhmc"); + } + + /** + * Returns the locale that player uses. + * + * @param player The player + */ + public static String getLocale(Player player) { + if (Utils.MAJOR_VERSION > 15) { + return player.getLocale().toLowerCase(); + } else if (PLAYER_LOCALE.containsKey(player.getUniqueId())) { + return PLAYER_LOCALE.get(player.getUniqueId()); + } + + return null; + } + + public static void addLocale(UUID uuid, String locale) { + if (PLAYER_LOCALE == null) { + PLAYER_LOCALE = new ConcurrentHashMap<>(); + } + + PLAYER_LOCALE.put(uuid, locale); + } + + public static void removeLocale(UUID uuid) { + PLAYER_LOCALE.remove(uuid); + } + + /** + * Returns the AuthMe messages file language code, by given locale and settings. + * Dreeam - Hard mapping, based on mc1.20.6, 5/29/2024 + * + * @param locale The locale that player client setting uses. + * @param settings The AuthMe settings, for default/fallback language usage. + */ + public static String localeToCode(String locale, Settings settings) { + // Certain locale code to AuthMe language code redirect + if (!settings.getProperty(PluginSettings.I18N_CODE_REDIRECT).isEmpty()) { + for (String raw : settings.getProperty(PluginSettings.I18N_CODE_REDIRECT)) { + String[] split = raw.split(":"); + + if (split.length == 2 && locale.equalsIgnoreCase(split[0])) { + return split[1]; + } + } + } + + // Match certain locale code + if (LOCALE_MAP.containsKey(locale)) { + return LOCALE_MAP.get(locale); + } + + if (locale.contains("_")) { + locale = locale.substring(0, locale.indexOf("_")); + } + + // Match locale code with "_" + if (LOCALE_LIST.contains(locale)) { + return locale; + } + + return settings.getProperty(PluginSettings.MESSAGES_LANGUAGE); + } +} diff --git a/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java new file mode 100644 index 0000000000..36756c6207 --- /dev/null +++ b/plugin/platform-bukkit/src/main/java/fr/xephi/authme/util/message/MiniMessageUtils.java @@ -0,0 +1,22 @@ +package fr.xephi.authme.util.message; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; + +public class MiniMessageUtils { + private static final MiniMessage miniMessage = MiniMessage.miniMessage(); + + /** + * Parse a MiniMessage string into a legacy string. + * + * @param message The message to parse. + * @return The parsed message. + */ + public static String parseMiniMessageToLegacy(String message) { + Component component = miniMessage.deserialize(message); + return LegacyComponentSerializer.legacyAmpersand().serialize(component); + } + private MiniMessageUtils() { + } +} diff --git a/plugin/platform-bukkit/src/main/resources/GeoLite2-Country.mmdb b/plugin/platform-bukkit/src/main/resources/GeoLite2-Country.mmdb new file mode 100644 index 0000000000000000000000000000000000000000..9f580bdf8df9cdb746b5ce38183a64c2aa9b1e1c GIT binary patch literal 6452215 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

hFpeQhhQV{l!A>*=w- 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

xQ*VJju$~An(oX^q}YxW$C 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%0AoGIBHIn|Lh%XXfLgr;-^; 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

GkP#=ymCZV``Mbo{~1vENYnzkSF8MtO zyGh7McM?56|54KR z|JJS(rKc*+$+E=u|9RQd=v_|lbb1%jJA>YNzSZxYN$)IrXZx1h?zwvB&^yb;xZJq3NQ zj5qlQ>D@225BSZ9UEY2E2>`u^y|F`YKT7X$F&`7ha-WddPs)BvK1J_ode3+f-JVF# zbM!u>_dLC~=)FMi6jFdb-dA-WIL90Q5xr07eVo@KG|ivV`^*IB>HNn#(daMfFHi3)`jgZ9n%IF1ozLEP^uG5ReQ4SHKen~-vln`{A{hQGw7Hg#liyVP@9t#JwIv|u|3!Zy zdVkX&pZ-|%$8oVf!m(Z0oZy^sh2s^;36z}B+h{V@Fa3$dnM63LGriPgPMCT9Dd^8Z ze-!;$=ub(1S}~`hZ~OoI=-d9^TOmEu(VtPw=_NBm!JoRP3)t z{|@@A(?5*<8uXj=*QCE0{k7(jT*zj#cfHfSY)@A8y`?@F^4^I>C-l=?tPmcdzZdF-Q`8~WSRwF=ccs5O{oTCDb`5RVLpJQGCRnMx=^sLWANu>tjD6Lv z{fY)2K>r|d4s`EXtG!VNdqwgU{X=Dvx#Dp8=g~ic{z>$Yq<~E;6H4|$@EX7ui)>EI<>Isboyu0KSRcxN&l>&ZKl)xVEcc? zoc_7FL+GDR|7!Xd(7%-ah4k~jyNLe9^mX{-@@ic{(7%kn?f=d4E9hUPigW~|=9n=3 zYv|uZ|62Ojd0CgdUSc=UztIhluOxXheP0V)%nRO1U-94R+nwnn;Z6oN)Q$L!{$2E6 zrhhm6$LZfg{{fY{m%cYj4ZPn8?}!KKKSKW@(GRPNod0NU0DZ-Ox9th~&(eRAzU}BN z`4s)9UB<3_Y`C`Pr0041FVTNN{q^E7Hy3l?zC!;C`mfUefc|Ur-=Y6H{Wn$c4L4vI z+}@)9c1{x^navZ1b-hk9{jyhLvOpsfBJUU;GItYcLp=l|AWEU^#5c4 z{lDn{?RMs)eK3|2D(mutaTrX_U|a?hGZ>G-_%3M&yn_iCOyrse6S}a$rTu^=$2b`hIXlc8LYx! zRR*gKJKa5LcLd(c4Ax|DI)k+s3>d7m{aI6zP7mj0aGK1q)#Jb=l1}88$(QC1~^6Ct|ji=Y&>PDW zt>9T^xwm>H;mSm-5v@X`H-GewuFJT<>K+4~Sd(Z2qP2+pZ6BhwiPmu$oxF*ocY&hy zy;0Vu(S}5u5^Y4}!QVrQy$u!FCjd1+v57V#8cno0(H5@3UYxVb?mMC_iMBGLII%Iw zGST)#6`}!Am8eZrBWe=WiTv=#i`!*KWKlrW^5e4Ht9ED;b%=UIAyL=smGk9r^IN~L z)4C%giiuL9#9L&3He>7^Fgps1Mu@f{+S*OZPqd06M0*hJM6@f> z&P4v^zt1(hEYe215$*0y7=4ysw(dlG678jLi!3g!Vjorz?L&0BRP9T&AJK6{`x6~b zbO6zzLhdxI%?P=@3Lcvj#X^;8j1eT z>vh|XCpwwPEw|d!Djm3!WC3=F$=OEGjM2`|ZK=d%tgGBcJ z&th(dUGBO^eDGLb+uMWDW0HT|vyACw_5Nq{6wz};=E-M?>~_GLEX>{eyvyg`+C(oB zzen^Eu{Ffs|0jAy_$slD%-4u5QoT-WGwuzd?}^?d`iAH&q7R7PCVHRf9UCV^?-IS| zYV*0~(@^`{=tH7UjVAht=wl+i`RNnt7uo+A(U(N#a6kN)g+398z9RBBKZn{(-VOU! z_?-_+tH?P&5dBE>C(%ztzY+aR^sB~zsj`){ILY_X@;lKVK3ayV{vyr;zTW?geF-oF zh{rC>FnV0#If=(39z{Gp@x&6CfLOubg?%mXzKbUzp49uunUfJuK|Fb$4~S3{M5w$%`fpZKCP@F@pN9V(XL?zVn6L6o>8b(z=m!-3-Rp4vl7pyk*Sr%hJg)< zSg!!tEQseKUVwOR>70kyANvx|>toexncs~W(hEB6%!Pyt6EBi;yfdj-hXP~wo--u%hw9@D@TaGh}e zw#3&GZ%2F(@%F^K6YoI0EAfuRyAbb0yt9|e_2i}8nBAm7Z}Y}`5bs00rz`ZVy@Y$a z@ow$D#QPOl`)lbm8G9CBI6VI$KA8Ai;zNi}CO(w-7~;c-k0L&t_(Da2--TVxCWY0r4fo7ZP7A&P6U}UJ?@j+ZUJk zQer##AIF!N{HJo_D~PXF)|JAma=z$myzHj$5nm^T*9-NowKH$DEOBlowh(#?@m)&Z zO00cUd^_=-8d`T4-y>e^GjSNJw<9?-@*|hw&4{&l5jM{0#9^#82ldl#dqo_Ory#$@#t*$>%S~R1dB4 zv-P9mf2{Z)Tl{~E*y8`2#1{YG@Nk;PZJ#f8SuJl9`**=MfQj|;f4-)~?~{xo{(xj$ z;tz@at$yNvx&ves;lWFC_F+%w6% z|9B>u-{+%wCRvbV36h0K7A3Loe;4^5&m?AszwwxFU3|18OUj<542Pp7Sw@^?h0Bqw zOtL)5N+c_gtoZ-)%qk?S7M@Y?A9`jD(j!UMBsDYEA~}v^ZIZ)D)*(qr)+O1JWId9N zRnht+8<1Gnm`NMvzLiO4@FpailWb~ZgJd%wAw&IJkc{@ES#BZG`(i7S7DAoR8t8Pcj&CEVg@}#+D?} z{(q=5BiV;!gk(pOtx2{c*+w$kdO^Evig}UkNqqlbSh5qz9wa-H?5f;d3bEZtc6Tu| zU}(dh64;Am@BiiROLCyH_9NL}!~rglm-QMCA~~4kP-PwBe7FCwoDlN};gQa9`J+gV zF6d)OjwLA`{#t;tAekIb@*s)!ImrnmSCO1Zaz4pPBxjJEOmZ5@DI}-nE7WjpN=_dp zy`#@0IfvvdlCwS6Kj-)37m{;H&hv4rrA_^Q0m)?~7m{2;auLbJ-tU%cBiTpAzez3~ za?DE>W0T8C{LG)^ilGu;G%a~G$*m;UkX)~dt|hTY0DAJ`rEVa(ndC;2n_TnoE=(u? z$t{Kbw~^dUayyC5wL3`ebp1B<>~fQ=3i}E`Q9Zeb3R1fTuzQdi>9`)OOu+Vv>G-6Rl1@N6G3kV)6XkJCXj?=Rp2SPJp2ds{ z{cRl5QBG^$NIDhiY@}0@PER@wsow>7u8U3Qv=cLs&P+NZsqOrWdm^`C7SdTIul3hC zvy;w8ItS_8q;rzaHAb5iB%OzJ-lC1a_#J3EKj}iG3y?0TJ-{5kH^_HE<^-F|=^~_y zk}gNOn38&)n=T<*@jqRPbQvjM+HJFSB=z|3bRG@T58N+(v?UzAzhhteNye* z(p5>Dj;8~)(ISK1sYnyjZAeqn5%DvhgVu0w-PTUn zj7zsA-A?iC8PD}z^Y~A?BdN~+Z4a65Ou8HCE~L9E;5U5+nFnmlyW}3E`-spIknSaV z@1oWFk{&|3AF2Q5C#f$1YTALM2WkA+=sj3>Nj3{?X!$~*9zRTYxNr8-BV54iI*QD? z_-Ha4_Q#MuMtUsi8KjnVyabN(;_jS(k)A?&0_lmqH}F=RM0&EoQfY(>$rozdTHO3F%d& zHr_5Ly_EDag%meKZNGx_$}wiBfmf4WM|utEwPVbXyRIj-2=>gFib!uFy^Hi_(mP0R zA-$dSR#H3p*DuprpIR&IGQ-?mz6y|P!Ez7WO?p4+J<7V5^uB!Uc44~_P9Gq(vGgG6 zL(Z|O>M_uI=MhqS_-nm0o{xE3VbjM+e;|E=^lj27Nnas-iu482r%9h9H5WbWC%t~p zc$VsVJ|8MJ%Sc}o=OxmYJroqylD;bbYou?IzE1jv7x#&2_ntqJz9p0L8T}6FhZ265 z)Qs^ne^NjH*Wk2s&ihC|BK?x|W75w^KOyxKp?u`4r))%h;k_m=sZYNm{g(7=(r>(% zhkP3e-;sXrn$1odAs*#^BpZ+PC$h0geJA}n`{BHdC2Bda$Yygf=o8Q_lV61>qHB5*@F2l zoorzlwg}m>WQ&q5PUi7n&H06F39_ZhmLyxstH?)@&C1Lk{@S8{gO8%jkATQL_SSw>ZAi8z**auvk*)2mu(Ec!bJitWpUe+` zoMZDM^Z4(VMcQm5vdzdgCfk&36R*xTTY)dj7{(E~zyKlYTt;i~5C9<-H zsJ-54vuQCht4<$(c^A01$r_Sxl5Iy8koC!0WTAxHWF2`x!tUNKSx*k}V-2zaSwt(4AGmF(0+p`g}ZO9b--LXHax^45xPPV<0JCN;0wjMI8_$33D)U{ZB)B0JiflZQBqY1y%=NZ~F!j?7m9 zZ*0CcWhaoGM|L9F8DuAsol15x*(pBKtnczWqwF-Y(|u&-z3jbkCYkO0twYZ$dhi@F zJ^XdA`e_W=`DB-pT|jm**@a{m`7p5NdqA@;xP;7x#LycWqL-0fp;>Ub*Y3T4rTcc+ z?^m<+a%9)A^|WNyGGc14V`L?=>&d<+yMgQ}vKz_nCA*324ziocd?-IFKDY-&GDcE1@<_JHIc6lw{OPO?YDd6evN>t(XXyszz~ zB71_&-u$1#a`Tpw*&um~%;w{(WY3bB&gVSW?es?gWPSvsw!ft0%Ve)O$0m_>bY!oQ zy-D`EGhO}-C(Pzy?%QOalD$Lr5!t(B?~}bZrd?zokbUUk!e*`&u_@^qbOe-rQndFo zvMM zSF+#8ejj6!8}By!Dg0|_!^l`((Flx;!^qgV%&>^_$75ttM#g7k5=JJF&?^h=2dZ$mCwjh=R67?2#!MS&WgX7@3!msTrAzk!cv2gOO<&nNgC{F)}?P zGZfl}F_4k}N7Z#eF;Q$$FQQ`4iiO^bpn`%05d_4FD1ul(1jK^wZZ>6;O?Ed03wFgW zcEv6#Aa;CM$JS5KNFzsHMH8Sr^ z-Mzp(9OjX1_z^JmBLJAP`KLG5${Ypr7??-vW8#B`*$w8gwTCWs(>^>7<_$1=z#Im% zC(MB`>Hp1MF#Eym4YM!IKCA}s|4S?6EtPp9%#$geq%)MQgLw+fQyI(sKfMIZ(_x+o zv%d^`m~#HZu9NlD902ny4N7ty(h@5l0m!pBn>ZNeP?+bylorMNe|=<9^pIMKEEnbl zwLG=G7s9N-91b%La|BEW=17<(%!^=N0&^5Ae6c#8S}P=p9{a$&Y=>4{4)co0fKe9f zW=knBdH%z7ilZnMRUT#rW*KG{W&qQL>BG#y^kC*SpJ+as1(?MhYpzk6X9%+taczhg zYlld0RM`(>U|z#6y%OeCFt1kMtIm_}hRm@ruY;+Z|44_)%|C5m-U#zPm^ZN%H^aOO z<}J)q+AGg}9L(EvEU_Bu)66?y^2dK9x5yi7_3nmw56tl}@6}So18C{Gs=~aV3<~o>9z?=p1NtiFedq{BBQpSM+ymJf3-%w;g&g}DgkJeUh$^7CJ* ziFA}KxaPvzuHJkPrp)xkFqgo5Uvtpney2l8%+0L%PcVPhzLi*Q$S=fS z^=Yz=Fn@!&73M!Mu$|_PQmo+R(BskzWCpZK`!JtRrA`fYk|BM_7mGv#8~HD6GRGt|Q;-ER~0Kcuk20 zztu&jnAH^)&;PBXG**78Rep}uItF$dSlwWyU>ytVB#DC69oBKMPJpGK+Q8}w>v-)h zDO8K-MVsER`skCA=PRDy>I+LR|Erl~uBlFjH5}F{u+D;YDy%bMod)X+rtPPr#X6lR z_kUz3EEAcd%Nn3Wa*%0a4TL3E{V#H(*s@je({9U(?pQi=Y3h<<+pRgLO?*2UufaU8|h40M_-e z#=*J)*3GbPgr&}38(wSsEwG|tFLO<&8?4)4-3d#wy+dmvUQ4H>JhHnqp_02{-J@K7 zwpaUPJggUB-A8^u@c~#9U_A(n{@5V60 zJymNahZC%4IO$~1Ed9(6j;)EXWEJ4Sk{4q_}qI&fns?V12Az7p*wf3RvI3`jm}b32POs&tQGQ;OA;q>qh?m zv%F8VzGBqZ8b#j@Yc;IRu)d|fhPama9jqT=eGh9rtaWOv?_8t~Kfv0cN50Wnw47*J z8`;cFnx{?~aeY6*-UHUpumTZWYoW4KsT=%PiHrezC)m*bm#&sr`E0_b|F`SH-bFt|5bt5{3cDU`-T$-eE`Tjx z1kgiu&C1>rHhsR$pMbOX*2dcV)cVs-z&;4J0lU6F0-NVQ;#KVZVMpix`@)v{Kl0R~ zOd7zJ)1Kd9HzdlZ06)NPtOlBGQ`pU6H`75S&rAB>ZUMU$?3T5+elpVR)_PJWBU$a~ z{OxwIkA&Tx%E1X)BkT^a#j+#pLqrsXQF;Xk_F=F)sX~#;;Y`Ah0BrpT7l*ehm z8(mky9t-^6c4)$$Y z|ESJ7=I?-gmriZ_PC7T4bW>s9t+P*ayBGFDu*buG0QP;bW%IB3Y|jDqgPN80-ovmT z(H_vO9@VV02}@y5KvIUy<4DTDdjd%rnNKq3r(nMbTN1ti`x!OX;+`cw2YX_yJg-EC z{jpClY7*?%VNWKXLVQULG_6!ymjm)wV82T8TBN8Wvfn^*XV`DTei!yM*t2Lbo%j}! zZvkvx0o4p=Q;c_F_S>-Efjw75eUy=Bw&%hA1@?T{U&3Ah`$O0ZVN0tQNiV^EkGPom zyiZ)B$)jC_y$m*Q{>w1aks~!+4*L_>GB9NS&ySu3)tjw={i%9Fj!D=nVe9!1?8x~` z!Y?#Rl~u6U!2SyMYS>@H{zi+FOo*`6|LaT3S_}Jo;jq6`*Q8_}?2WM3lSiIy1No1F zwM^7(6YR~@e^OnRLYsd9pi#fV{ulNZ*nh+RjW%0}x)Xr?2k}oqrur-HhksOwDye4r z768eekOY!-7$uW}emGf|QM(}70m)sF+z-j!klY8!dPwexT9? zAIZT;o`K{bB+o=rDlkA}#YSW0@Sh`7D|U9xm1*hcAbCDBJQqnF)!M^akotclxf~=f zKyoyL!-!l0lDY&SIReR%LdY*7jzaQcl1pM;O1UiJiJ3AUbO}I``~Rd#ZV_!_Qjo+U zrjSg>N(RZS@|n^2%po}i$vl!bA?YDmqG?_YvpHrW$P(}-$uuIb0IB{Kl6wA+O-{v$b?$oH+uw}tCV zyKye7_bzdsAjy0r7sPxa6)piuE&<8KNWM>TNo=zeNqGwprTsvObf9LwoTv*llCla! z<7x$xUm^J^l3yUX5=r?j(DTKBHlIiRK+a!;ORmz1taFO{f6eC`#;(>Rs;`059m%yw z%BQh14ZlND7XsR>Lz4bKN&lau|4*v_M{;9qvx&jYNUHxw^5zl-XD2uZzyX}S;nab%o7U6W8IJmY@?GHU z8gbg!gR_TDF=uyeyDXHN$)4)yoW0b^%jU}22hM(Q*q=@UjzJ%;7iKgcwXaXyUxS*} zfpFTxIS5V*I1S)5p~(He(+G~9|HK6~h0~m6HDg&^YqZ3caN5FY1*Z+1)><*{?lhG) zhlfA4vJQrGB%BU#I>YG*=P)>jhz;v=s1~I5o#M=;QHR4hA}+m)8fg8ysuFDjoTI25 zP1IEYPPb^4*J^0+I5>~N=>g|N27AIe9?l7Hdco;k+uJyOYQs$Sx=vp$y_WVQI5wP< z;amad6gcwv?4@u{g~R>7(~lXR4o6OYI_Y?G&VVxr&Y5szp_IxG5CbL|sHFD9&xUg@ zoWXF;QBj6BS5;;uZ@Qzd7y?JW1>7l4egT|e%;!Sla6yt0a7M=bA~>Tc@+$yZ&r9G$ zW^x@UBBSA4POhIzvP2V(`v15el5nzc95^Yht!9#jlhIgqh*nj*)FtNNEeQ7Kny9rV#(1?OsJehqOf@mj4w z^d7;v9?l(bbpOw&8{ynUaxO(@G$WaIFG7QtJ?%Pi{U&D=Q+kc0q03L(&VSqhEEgD zGmPT*zcisVc_N&76rYFl0?CVT-heX+&PxnVX75cA&RR`{^D3N|;k?4S$sCM4$!l=v z{MAf-CY(3n%!V@!&I~xy;nb##=A$j031?P3RmC|=P3FLP2hQ7(fiw!vTsY$VYbS&p z5A!uvGhYB_A&EGD-a>TV(FR>S!c&R1|&MIL}P{~C^Zem%mHmz+X4-@;i7haUk% zM=s8HaK5KU5-0hCp1nBh;cSK@&D;oQ1DqeDw0bh54cw#|%1is|Cpf>t`5BIS{@VGK zytR>c1djeL5N)(;FH>k z*IKq9RR^hEk=hxlx_TKyPNGtBLe+y;EP5cd8&dkuUr5zc{}!EAMGrc)CsKQ9>8ZW7 zEP079O6{BI*+^bUC5Q%bKVp5P_7_5a08$6W{2(d~kZMR088nV#n;_McdNX2kVv9Jo zB~q=Zw2qZF47L?C8sCl-&wo+}BY!ng9gsg8sg6jUh}0oSb!X+(|08u6u@h2!3Mt+H zBXtB({XbG&1xfTR08&RGrOu!H7^J$9=u)fiG}S01D#c=(^v{XbHD zh$je=^i?7^i&7^ssGEP1Q;<3pZY!itL#8QG{gC<$sne0V4XOS}jX~-Rq%KD4Or!=S z+Fpg!0Hn?$87P<-vVi<-7~2CyqdB zB*{flEK;MC4Ba28OOQ%2>QbaGBN-jrT+ZMXNSU!>QL%|hqN7nmTO*Z5sz4<}%t|Ye za*@iZfwm%#l&5^icd=4L%8z+~RESiCmL;Uh+bxl*MmDVNm9f2KD8u6xq^@C-v9W$F zQrE@&dPd!V)Qu!J#rn-r9gw;;R>mpO3d``DgVY^JJ%-esNIitqT}*p7@gAfeB)OM3 z9;y3C?iVC^AbNHhtUbhsk$NPKeKZy)AoU7Tk0bR0Qcp19lf&LPCBYi;34`kFq z8q|UsBHfCl5z>tr)r8no4Yb0^*Socstuk}gPhB{?!yj$-g=4Gwt|>265(Li$*W-D8{M80>*` zPm<$Rua(l93I}TX1l6^keUUyf<|iqs8J~jmsWdnZ=>a7DkUkyhGs*iSeTEuG_O&Eu zA$<i?1EqL4m2vO#)qlr5vqjZz_fKGIdBhajCqdMMJPkf#4n4~tV>Nc-VPk02RI zyhvjsZ;-wi>C2G5L=`Rc(nu#Cjr8RtSH!U<(iRmvQsPV;q*F-ekxnC>r9mb!sY{&7 zrIL${y;v_GU1XF`3}QWGu!M9uRw}iHEIkJ4zmdKY=}AaSZEr{VYNT&O`WmFKXR5JC zU(2CL|NsBdbwf1LkiIDi>~`I*KBH zR(Z{GBJH22{z9Z9{bC$D8R_?to`Upzq+de%Eu^Q?@@1r_A^i%{(PViQY5M>4>x_+- zfbFgL4(aJp&gx6k^#AFZw46npO`L=DT#~nuekbzPv{(O+^gO{xM0x>r_5VmOBEF}w z8eAOPEJ6AsDocsWh#w&Rp%C)rvE|1|ucPt_(kqbu2I)^3T#59TB%cvKNBRpPajI1m zzaoCE`v0R=BmFJ)HAt_GbfmR6kp5nSv_yJ6(!U`61JauqwE^ka|ED)bHq`YRZ zxQigkuEgCmD5ER0d#vw)4E=v*FB;JQXZ9gi=Z{Q+Xb9G7o~ch|e`F3q<^a{z?7;tf ziA)1z8pe7f#x_Pq{lC7ns?Cs{0 zk?9a~E&&-`0+2aWnnu!z*qL}ZGN&MO1TwuC?1D^JWR4|25}BifkROfAF(lno+3qDW z-6_O~_OyvKyEGoT`=@au4km(!q6OlP7<|iwuRqs?}WdDCYGX0P_OLSyTN2WiC z`hR53B|0xba=4_I|$efGJIgtUC^OVz`!6C>DCAok&OrtdO3y~QfappV{ z8I$@JeHiI*UAsSxtZh@+9Y9GNRrjJE61mM>!=W78n1QCfyf!Z2>Fe~n>46tZ$aj6WNxK6PDRcCHsbBb+(B|D@h(AqX{vjWc^sL0k$H$w zx&$C|AMt+T1ITc+)Vk|o5ve~ye3bYYae|=aNzNr8^CU7)si=8AP2@U~c{VbmG7*{Q zk$IQ=1!P`C<_%;fA@eFSlPOLizC@f#d|8m>mAE+d|5S7dV7uOom1)$cBl8x?3}j{_ zGc%5z73VMqnRk$RJJOlM+#UElWR@Z`KTainV4-ki=>IeCkuN5`Ph29XuUc;`L*|1> zLFPjmEJx-el8e9chMx-U6D0N zb|cn9c6X9Jh>_y}fkllxTUt|+etnQ7o`ytx_+4_vypLhVWO-K$z_MpfT*#=Y^ zBHJid8Y|Hpnj+hpv9bg-k7HXP+cM^@YFp)On^5?9q%m23d9N$aX{aSd#9<;{-{1AlozIwMUTc z6_Y;5_C@vtjg5BE*%O)Mr0w>|o`URI6i-F=v`9y`AC=RI{fTD~&m;~IWWNn$aF7PI zhG!E8BTN6U%DKqK{$JipW``jA0kT7posaAV$li+VFk~ypUWn}F$PPz#6tW}Y+(sgM zQN(NGJWKzdy@aJ)itJ??D+4<_T3e^&3S{%hn#g95wP(NDULz*T9PY?QU6>`ehqPK)F^WL|LpbT zHz0eX5b~RdHzRwCDv{sFjze}fvbQ1oI;!|DU}V z+40+RVATD{K0u=WA6Z=>^riKG1lh-trSs1|7U{@N*rB#hAp0a!Jr&13jqEc~a_Y|^ zJB4H-vd@#eKzvbHIBhC_EqNx6#XmcYzDIb=BCdL)=+2i8is( zp3~ixI{m*}4=(+`tNuT-gu55q1a0<)yAR2}+hZ9t;O-YGaO=aR|91~y)PY3$|F}@N z4dFJT-k7M%1W8l4&0^jhZVQSnBSjnNwnqLWxNYEm2DdHTtKqhTdpOP76LkrI+kw~- z?ja47g{; z_5)~t7LiMUI|!~i|Je8(xE9=V;hq;O=ffQdcSxMWP`DQ``7q*zu|AwZE&(#q+>00- zMZ6g9<#6fz-Ak!lCP*?`Nv(lbP%-164Yv$82{#YdVN{BkCT0XlvT$7zE&>0~&4U~J zf44{jAFeuo@{m~4V6F5Dl`7mZBv)#bcD16|z`X|UJh)?H{aU!!!JP{Cdbp3ny#elc zxUv6tZ(`b;;obuGcJf<^hR${1^4Ogv2dTI_#AN}+({%{0^AqizPN+s zWaXN}6u9dDqbRs9!<_;56}als;c^LZbqRp`I`IwSo5X2wrwfT18xgoO*_>H4n609w zokM&ZuKIttb7TG8?P=l8hr0kS9lpB|?jp4rqCODrVz|rUz7O{UxJ%-+OW`h~%>vqd z80j*v;eJHrW8x=~4tE8EpTb=kDY|O7pCgxn`vr2B!Tl2MpKw>fT?h9oxZl$LYvMP= z)zL5`Uqf6={Eqm&pc?2fTTkT&xEo05|J{vne}%hA&9qUQi9Zp4hWksTM@7KhLOp8! zR=B@2s0*CFw1~fuI}YyO$cg9t2RUiWzqHwg+}_CTgxns;L6uw`;?Bs?+vn;cw~J#|-H@w?-0n4{Chm#cUOOtZ+y}XRNfH{RnHxl10+6e(qWJ0@{eSL24XS<+u>o=o zW2F(5#>6HnYN}?)9gJLaiY<_98SAZ-Xg;lpZHR4&?T~9PByLCt zTrcF#MXon;rz6(~xs#DQfvNfuPb8ki9CX+)cna}US{rp%Tg4|Fl>ihN1BR7(G5pttQE+$?g z7@5V!qp4p`yaG8o`J9QIrIwnHO-yQVQWxY>v7S~Uvo)7R{y5}ZZdmWYQ ziE{q`CW$(K68ZdBl~^Aa>$f3yyNWgYJCT!Vco%Z7BX>7)bmqBxn8UrujgM2^hur-! z*ChbCXbwK4qRxUxkei6yqsTpt++(rj1mqs4@e{G~ByvwhJRYmhAV>e7dv3dq-1Er2 zg4_#COaHGWPC{-nl_|(gCE*fK8}l#68NM2m*JAPpa-Se4-TO9j)0l9&APLut+zjMq z#>y<@W+OL8gUneFxp$CTjNDx0<}=m1$j#esfSe45g;5YW_5aAdw?pjvaW$48x0JEV zkXugj0dgO1x1{nBav!Tw>(v#=eTCeok%HVx+I)uG=dtnyl`n~M{u4cvuaWy6xo;@0 zjxE1sa1C;F{yCj8vHd#aeqro-GA{es|>eP(=;)L|&Hw@kIk?%#)JGPN}o)B^5`yzkhc3r<+FhZ9E-M+%Z$L>xuDn0N{CQsgfaLe6gl=k+T9s_-(W+#W>UBHDVBFuLKHcUYMe z@@eFyt24-FHHjpYFX`l6y-=r$hkPOCMJhh>L9B$xmttOKYz2A#9aw%0gI8)S zGuO*?+Qw^;UxoZwDnZKTj-2WG|8#R^O70lmE@fPIAk?4IbZHu-} zZh;EwR{)T|gUGJ{}r z*Fnjr5?|Kfz;BR$75Vwdzs6cgpS;cvc?0=3^?Ijv&NSqw$6OxPjF`_vo>xHCW;QML z`)}8tUz9`gX*10O~UVg2sZZRWcz}LMVS9IZ4d8Wz z*H9JdB2Rw;8eU^!6Jk?hGh%aM3wSMskhdbXChG71z-tSy9SMK`O_hV;br3~gwHoSI z0N@=8?=W~-c%9%4hu0b2KzO|W>GA%j*F}AW*Ok>i65a{$j)Hd_yrbdq+NXC+)DU>b z!t1X2M?*z!!+Jg7^@7(Eo?iacFUsk66TXDk8(tqBOB~fQo#FL`*AL!_@J@ku61;GGWdOnCj_ox$&MH_@!*+o0Y6cxUPLUAd4f<4u0e z(i;R%ocSDhXTzia_w*|O@Xpl?l}PF5lMIO!{R)^=58klIL&DP~fc-E6-bL{E{VzIC zc%$G+_g)O|a(I`(8x8MLcy#{EUx!(5t}@;gQU1(FoWJBR&R;MI&tZvD$rQW{YnzV7 zXN2%vcold#cs{(m7{l|T+~5@$ENW1n6u6E`d9T8IEy@$#>&);Cb&^`vG$xr2PX_$&k&O;Wjhd-J9gwq8=m1a1TzGFY zN}WGrH3__T;msqNPh3D;h{Eph7QtH&?>%^*!CMS(IlTAbErYiN-cm8si6bw~&lOMkwrsLVXnW zMj?U1J}A)nZ?A2^KtUhD4!P}*!a*n;fWm?Q)f=GD@V`o96k4Is1cl}(G)1A=e`8yq z(DJ`ZYZTg{&<2IJ|JB>0aPWVXjuJ%S5M3P#hia6(#51ed35Cui^#29*{|t5^atSCL zNq!UxN0S^QNYagXEDGIYg7r0L9fkffUr;zhXN{6GQ5Zm?KcRraK;j_c*(h8(*?RA2yaw#g0pl}&V-=i=Z zg?muA90h6k6)5D{8`AR@iA_vua_t!hg%n9TRx&7LskpI{i*{%fbqPSBfI<<45CxyX zKrN$PTp{-Vg)#~i#;Wrt8H0j4e{%Z&!qq6y`4`4gRR52{b;RohNpuN7;YJkH|D$ko ztly$UzIsy_NBy=~zn#H5P*DF*eiu>R0?@@3?nQ7D3gc0D8HM{$cnXF4QFs)E2NFFj z6dpw3VH6$`uCLy%yikz+znkdWABD$Ic!FjVP83>{tLj>pceNcagqkLpeYQ#M4YPPpwGx(L6Ah@RrnqXuc0VU{B;zy$tb*m z!kZ|{$ee~^3lyfKupWiCP*{n=3=|f!+A~p@rKM{VW)o#>zfJNEaW3&);ygi;`6w(< zzNBufEJEQuMlB}3Ph3J=ih|T?8Tkjq4~feKqa0B9n93)rXiZiSKiwh!&rtXrh3}|; zLHv@q3Wcvoz9xP{TuuCzxJHmY+pQC#i@@*h#yhQdY^{zgIm z0xU|q8HJx1`!n$u6lBW(O1?$1Md3HiT*+2J$rgn_82hIn$zMv;;2#wJ6)rYW=^9(y z2}Ph-XGa~yx+o?Xy9;qw6n7)3N8DXYDee*FgW{ej?nPzqSlNfceFe4LqJiQ8Ot>Gh zK8pJbktjv2!+|tAh`a%@A+ZsPviTPS+58L2=0CD;hN5i#<0n{biQ-8pwnDK3imi>k zZ<7~_ZBT5BVtev-S}_$5j$#wb&q1*xik&DPLOhgsm>Ov7I-}T~%HhN#Q0zj|m3Soa zDB{tAB*zfD5s!^aJdVL0f+Rhe`SB?BQUfihH;R2oP9XLro+zj%EwH)$56bJco&Ly3rQ?&$KbsvK9Ayf6eps1ABvANtNV%ad>=&d zVe*FrHI+_>M~IK2_!!9qjbbc{PedHWCsBNgu}>49AwEm2^@HYC%kTx!V?GJR#VAfj zQQY_xqcOc-@g)?eGVRO6SBS3?UlSyGo%n{Jq(V{r|H8zA87NLi@hueJK~eZ@6lbD1 z%V@mCXj0c`Qr~DIlXnh^ZyQaHFq-r>nhY?S$S|9W;(Qd}MRA_dBxy7$8BK07n%s}# z0`g}CQCx)Ldy&qpWJJ;b7nh*;0g6jeT*lla+u@i271GtNJng3sL+8etQ&G zptu#qPZJA1M{y;J8&Ler*!vL_CHOsxU!eFEgI^L?8BJa%`I;zCR@%E-xY0z?ev9H7 zlC^?~1=k41QR|dww(E&ML{TXIm{{PUxDmx)P~3##&nRv-ntW?Ck>F2i)8rSUX&s}f zf#R`e%{KheF0>5d*nd%Do&EZQANN$D1!js^) zqAQyWzcu_ei3LL1!f$6Zz1C=Yx6$+oqv=%m2g5%Teh2t{5(}j*9pN7WzYF|B;dh3A z82nB~(>X@dWk%DljHa959}fQrqv^j!v%QUGO_-!B{O<6NgntbDqu?KHG&{s-*4=1! zn$hfh_}$^Zn~mlV!aqZzjONeNU;zAc;hzP6P-5B~_yZF&-bgHytj>l%II--U#N2a?=F{N| zE;5?Sb370JQ25e>A&D8k7|quuW+E|T4Sac0!xAgAi5Z_HrY+O0oj)A@DEK4bkF5DF z|Dwc##Wla-Ukv{;T~Pc>;9r_puwGv>KAUfaKN|k!@ExOt46rK_3m$`S!nceT2f&vW zC50F*+88am8ZD$NQt)%|)9_vR8Br)^jTQsR#b%_u;OCh{>vi$+%kV4kuY_NPKgMX0GFnuP7UKlrUj=_G{Hx(#W3+h0XferXG1F+V z1pc+~uQOV#GFoghT5K~~?hF40`0`|LgntYCn~avt;omH1wCqeSU35GAaqw?5TJ|zp z4lr7dFj`7;q)+ZNT2_sgex|2+K1;Xi4#lIA>N zv>Io$dIbJc@SlbMH2i0bR+F@zt!5gnmcV}w{zNI-Xtl~{waI9;4gL$#M))tnpDgW# zKgnpluhF_W{3+V})}1NJB$^5TW%$yWufTuJXx$6`t48YqMr#=u>imt?N%gD#oA9R_ zt)=IuX-!(+1ph7gGmO^v8?B!;TEA|zo(F#x{5dq9EgePjHvD%qla^9L-Tza37ydkw z`5M(~75PH=U%+1ke+B&a;C~2zF?^X>@55h`*tp1O{c&RMbBWKS{>$KhV6)TbM&CW)HMHKZE$Y`@4{7;2YSqc9$_@7g68K?ac{y*?n!Cw#mEBI@T zHiyIi+Guk;d>MGFNxl^%S))XDHU4)-n==v%2gCm!{yHH>n_&$8z=^N{{vYsvg#Q!# zjiOMLXR$fr%;9H>zYu>VZi!;y|Hj}};_p%-$)Ci(;Qwv3v5Yo>(dGuD&3M-KU-;V) z)IqQl0x(vh0`1jcXYJuO+${vVAUGSrt_T_+*bTw{23{_s(pg8*$1of2+d@wQlbp!_pN1#VQ2o6%6KW2!aA%as7 zG(vC`g2o6sBWQv^@@$$|@CSlsQbSf%-vStIUPaIn!C?qmF}5{P{J$)MV%%1{F3|ly zg7ydwCh0)zC`fV$f*!f|C)PWVHRsXt$Ho;4B0K6La=raFC$UP7lx!3`TGTf^!gzLU1mE zVF=DcFa*K*QkE7cdyHTx0$E$@Xt3R(x-$tbL@)xuaJ5+|b(40DL~xO8JZh=hUVz|Y z;Rr54FdD(72rlEMMY`fcqp6g5x#lMAZSpMw{rm-il^8e%fh{OUTjUOPp8o`C1UDea zAgCh9A_x%h#3RTdC?d$~_9>8x6{LDv2ibUN>Avn)7ko}0s;*)QL0OlEprT9F!g{*S z20Z)^uB5?L2(Fg*q58%uxCX(sI(>q%vZ>HLd~lukSao8-_2OMgZj^dz=GuyzQR;-? z7KG0rxE0}%2*x4!2Z3a@3c>CAS$}W`g7-=8L~s`Z`R3Gv2<}Fpmw(9R2xvTl3ADM7 zs8@gxJb)m+^$|RTK(7o@e}wobkyn5;!^aUkkKl>e=1Iot6(9sMR-Yl^{hy$A{|CWD zHP*De{}br_9|V(BR5BUC6cWAsgJ3H0WkG#us#mGJMwChYHpv?Z-c$okG7Z7>n7@T! zM$GjJ5Q166*$C#S9^H}(-k~^G6}5R6f!_Z?px1#&77+Co5Q0Sr^!^Wm#e({hn_a;Y zD!l&_EF=E_!H2c09f5xN7r{r7J%W!Bd=f{kps`*7La-9SXR*!aRCxaT{ZvjcRA)QRP zw<>Zd9qx-Tp2|&2t_VZzc`y)IE;Q|I90FS^H>7j#A|%KT;I7LD*J52|a6<#PmJ&*OtQe z2s2NXr6&40rnd1Y=~aYB zBTOPZhJDzLcr39y!odiSLwG8}9tclB*b`xIgvTT7CGUvEy@;z(zZ&*Y_oZhk3lR22 zcoM=B>7xegzAii&;VH6Tl04v0>j+O*Z`O1U!ZQ$_sV73R0g&8e zZ3@pqI0)fDb!+YRRhKBoapBqeZbCNU;W-E|LU=C1p$O$Mov+ncupZ$MEnQCMH1i7( z4o5f);f1o>*9uFN)?oy~k+LjmP?bLrjzV}j!iy1JhVT-EviV;u+kROoA{&IGwVsV1 zKzId03!y2xu6NCw2tjB|=~_u0kPgBW!Y2`?*~1xx_aV$8ya}O;u!1m$uz)a+&`b2$ zTjrPI@CAYhiwJ!UDi4Su!jdYtN=wUv6srhtKsW~BRS2)tSb4RRXK^*c>k(d)nAZ#8 zSXy37yiN_6R_CTZ_ZyjHXU5))@J@ucAiNEsjGu9g@?`om_I8AKNQNp7pOzRt4&hx0 z??rew!h33YYSdbUhB<&yWJk)JcJ7n&X0^~un^%Q4KBY@Uz*k8$R6SQ2$$@T zb{R^$A^d=a%K!hm2$vH-LiiKHj}fjz_z6N8gewrPLij1dFA=V!jr;|$*nduxAAfce zi;{{Y2){!3wbAZ8qupgjyL@6%3E^sl@*KZKxW;IAjT$dX8tv{x_#Hy|=P%c2H^FE( zMMQ+_C5Z3`gc}iVK=`B4PJRtl43--0B->30HyiCX8G8>;oF)!OEPqC6CxpKs{2Sq~ z2>(L31>v6v<^R7Vb}LbS{9m~I9Y9pWo0KfNNnS>~e-Qq|*nbgjQ>Fc0^3qsIQUXeK zP^yd4&QV&UeG`;+L1|YB8tpq8?YkNK9D!0jl$xU?e*q>*_8{&_+>5w3aUY`mt~)=a zDkV@dsO(3qPuw4+1}Gh1v_Bc80|iMAl9rM*M5zf$BVuF0II1a?W^u3uN*z#YiBemX zS~2I=#5RKRILPJyzofS9i3bZxbI2n+g#1wAVS;gobVg}DN{6F#1xnKJVJLM$=}45i zsvnjCEc2yw6iOG69F5X3DD_84{l9v!5|@Bdca)Ap>0~NBh&_qNqtuI}H?a@#1VNI% zD4j@hk}Bd|HN#U-I*mj=0(e9nW~m=ar$=5|PuqB`jnWw?ovEob3Exnc&O&KmtPDcw zY(@&4%gm@|O zGU90B<${T3b;(VXqHM+9W?G&blpK^Q45m;@3n9-Cvnc8QpFD?>p8unyJAaf4v0h}* zM~UxeOS=C@sf1Elh;*IyUM+_zqsE}b{eS7ISic%2zKV=NE< zOAnAgNaW$aHs@gmwIL`y8okpYpFrei2c;)adQyT^oG?lO6N%3g zdH%2BiwsUeX)?(aL4C=mW~HeSN9kphUO{O#4PHg*HI$~4zmC!yvCW%QrU~lKL34f! zr5PkM1xaQp;YWce%|YpHih2Y@G8d(HN%Z_Do(l_5T8`2}l+@v)w21hgPF@YZkCHh2 zB`7VGpo%s91C&0Dc&vPc(q|}rjMAqleS*@89qpMFZvknZpQH30N?)L)_d^)PD?sX4 zzLMNf`kMF+aWzWcY7wfhL1}Ho)rqk_D6K{68X5KPS6g7RK!GxPRD zvu_x?4{={&0_E*F?1yrFiu)4}ARZ`4auCW5V%`wtMid(po1okZ<)-A#h|P&Dh%E*6 zCAHOhwnn)PN!v(AxgE;wBQ7>5cR<-gxg*NwpnQnb8RbJ!J_hB(n5q-Xowe=qFDm83 zQSO5B5!$ZiS87*iW4jWMMENL`k50^7t2xgapiigV4dt^@J{INf`qZ>C$0b@y4m|`( zdZK)M%zL5Sn_?f7`;nYL?2Gb=BqtG179^1;b!yB{OY~bw@$^{f&)^v-pBXCyP(F*| zz*rfiL=wulDi2n!5Aj?E&qMhFlJij>67?0zL*srJhH?hw3u!PMWe4REZ0|^vFGu+z zlqH{0C|{gtIbZsX*&^lrKYhw2l+$5P4|_UV*ZWvWc>#y{E%QV&y3$X>hyd zpq-f_rqw`tzU7`MXHj-phaCGh&+&E^l>*8)pj>1UALZ*&4p6=pu zPug;XS5Y2=^3^C`$zHlD@$GoMF)LL%PoCp7D38^fx94?JQG4tpUh?rMPh_h57`z|l z2T*>5^?wlMhfsc4Q^{ZxlzM7DkD~k-$pn<2LHTi%pJea}ZETAXC_jbr(`r9MKG_*9 zBFfKdl#=IESMof{lTm&FiOhVpkPf1q{KJU>KvImt)F zkBKr?zad#c{FJy7<3?8=I* zLwUXQFv>rmBKiicn^yQo;zpD=q5M0_n^FE1<)7l%pBej0;=A!ATVnk;l(#DX#> zORHVko#Gy-?5WRA=aj_mt$8ZhhpBc#C81?iB)40b=YFWvN2MVu`=fGz4ls@xR1VaB zs~kk*2D-v(uo06qM&)KynxJwrDos)8hDtM3jzFb3DlK&QY5pxy=|s|sb!&}E8&ulL zs55pMW3;~zm3FAKN2LS#!HM}@jP@of9Z@+9l|vH!Uqa^oDudNnAL2QQdD1!R|Mm5q^uzh64AEtj zrL$2NpmGr^!%!K{;Dwr2CSzp;DkC-LS#=Zho?_G}RHT%PQMp9xBjw6`oc9zem!UFR z%~+^9kjfRPNQ>kVlu@xzaZr&CPik&!K2$RuekoK6sHC+f{hvf7gGv^aJSwgzsN^D@ z+}qAsjUp;ODuIadKv4;e_P3%^Qk%8IX)nuxjF~EN3{m`l)Z15~ay4zPQKkQrOddfud-N_PwMwf{9|Deg{G#-VZtJNY&umoPEV*%WpDU8vlR z%01dwI@<3=WxQq^xxvbP%<6s?@c=3hqViB;T|-W~ht*880xFMU%ulF1hH3*;CZO^> zDvw7+pz;LMO4rFFc$Nd;Y2q`w0M$BK{XZ%b<0LPjLeH>ngA1zKzOC zRNg`5UE0jmmg-oYhspvLDjN*0!tr#4oi1+Wb|hd=>MrsmOC&P4X>q4RI~; zJL31mb;R|=9|TD@C|M?T-iQkQd}R|Vo3&OtJbuzXmvy%C3l-^*Us2h@$M+kmQkku& z?uyFqsP2r4egy!PKZ)`8zbb#D!mpcE{#75P2HO;?Jo>8w)jE+Lou#9yt_)Rv3qZc~ zQH{Ur0d9{$IPXdT4EIOD9)5q1qYM!*yws&aWP! zQF9JX%=;15uBaZxoR8FbBs)flk_}Sz7*x+iwHvAfQ9Tw_>9Ovpo`LFdsGhDPx!MEO zo~WLP>hUbD7qK_75Ag&+lDwREMK_392Jdy%^PziH|#?dJ(FlglH*(=l9i@Hd(U0?Em_jcTv3@)jXq^6swrluS_#!{L6Rghl;@rzNfR@~EYU?ZC!|)2mhMSz%&>rJQMtqlN<*{`A*x@Z zT0->=RLiJ7j%o$f@u*f&y^hTsgDT(IX_K!)^=eedQorVZRGkI*6vZ3I{n+jO>~1N$ zgAh?LQ4|$LF|g}zVAt<%>tb*3cJIz^>_Pz*>=qjg5HSf`OiYab`@VY%_&oP~pYMF< zop)wuc4ua1XZN&bUi^X1KuMdIEUHYW&fe*)7>0CKjo2iovqooP!8)C>5czd<9Y<%w z#AX^aeubcsE9tx{Ma1Bj~LqgUxVYbLwJnNDRe$gr?l@AX7i+=k*DZ<+KBf5bUthNoT1JCJ6|xaRUu8F zsAd!Be3{O-=zPV3uNuB)_`0BxHw@pTbE1(+sh$<-Z93nf^Ia9SWhbY^EZ>u=qjPF% zPv`q|PBZ-j!w(HVN@FeUCv?uD^HVxyD3p#!`hT4((m6Bju?6Y;jLt9Ul>T2|Thq%* z#V_?b)r;|KI)9||8#=$I^IJN}q!*xg(_Y1nUB-p>(fvf{&pKFi&LM9LDV@Jq z?lJ`YCb`i0JNbp_{DaPa>HL$(Z?$sbLA2lD%q z-;sP@@;j05O@3$cy~yuEzNe;oYCrv13#OcWA0gy-O?C3Sk>8ViKk|E!-#xXljQW!w zklLhv$nQmdU-EmCx6WTq74uA9ybWwyiX!v#`~l<#i$Z>o;eqDxpv=#~Bu8 zZT{c(b69F%#zV;;N&bj=ZpjZLf0Uk|mW8=JhWv@-k0pNs`Qeu8xYVBf@oiUPJmD|$ zCz<`pfS49}lQUXJ1{@*~Kftz)!`=V%isIhXt;)^_I^o^M%S zV0a<%2m)&j^+uJrt+8hXAGY;l$(Oo{(15*Wc)?)awCxH6U^-8j&3^}d6oQocF3=he_hTB z<8P3EQ;2aJ0`il{zm+L(oBj@Y8v?W%CzGF&#!3^ApGy7%JHhl8fc!MgT2B>S|1sqw z@*k6zsk?}ukpGnY=j5l8*HIwLWv1ma%TR6sR44xh`LE(C!lIyod zZpw`m7NxLQN4Gt5J#N>LOO+)kEJtBU3d`!;val3|r70|v`%yN256$&EL`1cmv?GP( zDXh@Z?NHrm&@amMoJOI8!s--Oq_7Hwl_;#7+ik5}ufK9*|H*aTio&WCR?GDtuYWu} z=?2M^!WtCTp&+@etpzTum3wrt+}&U8O0kPhm?68&K#*VM7X= zP}qpV#<@Pzb=OwUFZBkb(1k+RT<>KhFHOEnCxz}5Hlxsk!lqhmDWv@Lpf;zlMXt;J zQfB@2-HU=0PmXA73focGhJyU_~s&^y=dnjh28bBQDF}X2T|ys zn<&bF_71edp1K3Au$ST96!tN)ui<`zMg~&Y-^c-(GRT4lYVh!>6b4f`(hl}u3fgKE z4mBJiXyh;ohi7~!g(Fff^-p0Kh2gn_UZ-%Bp)|xX6pqauwN-A|98q%nyhhR}WT?`eX`u3a3!GoWiO4T(5ANWhza1hL%vv^FOPNGbx-;;VcSL8)xS} zxI=yv&dJT#!^pXra$ZL_*OUt=TteYO3KvOGL<$$DHpVZ_>@QO?L#nqk-JGL4^a_RC zCW}*$y1kZytCvi{qi~fqs81oFP^BR6{|={6q9EHog_Ls-4;NxQ?C2(M^`<uLg6|J*HgGbjd#9{ zg6#j4T^V~(xQW8eLX6*%8zBGADdMdJQUEb~k;3g}Z|{EYX zO+HX2Hp#^j@0$_sM?5IXR&s%#gDTD&N3!0 ziL(^W(waof4qizz#aUK^ZN5CtZf3axP7Y@^;~j=8;;f{W>U?FxRSZ|1Uq8<3IBVc+ zfwLygCOB*1tcSBU&bnr~j-c*n9lN<8&iXhTnlAJIUG-XaHo}qhpIy~JP=*hu3r-K5 zt~lK^m$94Ubk`{P>2Ym}vzhYtAzLavqAhWD!r2OE2b`^Ow!_&5XIr(jN=`lCY_ADr zXRouPDzYgH)spm6qRDs1*~5tJoV4<2nfJs= z8)Yw?y)AYhoU?KEHNGFtaGZfShv4jwa}dq}ID@pJ#HUu&feY}#I0tLcVsQ?|8HO_i zXDH5LIMVsIQ<>)@aE?r!WcEkl9D{T8JTshQ7vRU?oQiWi&Pg~Yh>mmOyjTmKYLe;!xw6OT9x8l zjB^>zB{-LAtTcVQ^=1G6=4r*^)Fi7^EfZzyr2e}^^0kaI1?=R^1OsNui|`y^BT^(IIrVOw1avB z=S@x0uCz%wZ=3#>in4E3w#z#2D8Fq2&SacvI8$(@n$3GzVcu5*`DuH7fb$W~hw9LL zn)q>M`6cL;BJreE3Wo zm&aWbcLm&4aC5jT;&!wRG|5W1^5?(S!?Yc)io3db(~&}p=dO_w6W79B7k6z{G`ai* zaGLdcxEtcGkGnzJo79-5-AMB?&yoap6WlIFy5eqyD{J_6MZ4W`d*E)4yQ#(65MalJ zyM-xRrk3qyax(o z4>UXocQEd7+=FqCz&!-_Fx*3Nhva@&1N|AnJsfvvJ1Be6-6L_2#vO)xl#1zr|9&9u zF>0^mSS4zC9PWv@$ERs=PskjegnNovp4@h;sZPZ`4fpgkZRR081JA^DaL*EB+_P~n z&@0zH2X_SSdB)FGKPsM|60^Jz_cGjza4*5VSYq2zYG$K=lFM=PX56U;(m%U}l$hw^ zUWM!7)^L5?BCd7*cGS2f+z_{nTT#zxJ?Lp!#f{pEiMVy#h8W<+xHdYpJv4E(&&O@e z^MHG0%5ks8y#@Cg+#7MP#l0@g0{41c9sM;pKhvAc&&`?5NZea9ejDzcxVPh4=bt4p z`@1rmdvM2yPuzQP?^EZ>@5ddLj*qwx;69k~(V9x;A?{e*$IS8}+=q=klBFGI!ST3{ zrb>40JZ`$2w@+r4Pbtw#cm`iC%xCeQ#(fU&DBS1q2IIbfw+ZfxxIbDGzl1vhcLwgu zxbNb=g8L@!tGKV5=hw1~-bjhH=|tSOaVO!vrFmI*s;JFv{lAjQxF6z9!F?b1J>04D z&9o|};mX?b{Is|q;eLYqaq7pi{uFome^brG{SJ2)?$@}V;eMXR;(meqWyZf+z{5AV zvvI$jr?hj_;(d?%Lz*N@_!I8Wcq`z}!CMGd`v1AOzvBLGh0*?BX9(^exPPX-P}Udy zh5HZg->E@n_HUbb;4O)_Fy3N#i{LHVPMdo37ROtnoiOd$yruA#!&@3}S-fR5$}Hz0 z-tsBO%i*nw*MYYh-immuXz@H98S!-fuNkSbYCA{etK+S)KyWQQoB4Zdo8>y0=k@S5 z#9Lo2HPr@b61fVVT=j(Az;->#)y@Ot6(RAW=J^7O&m6Hh$%$LovNPh#kxo<0^W(K zVji^f$Fs@5l2h?cGv#zc8?Zd>|Me&L4&GUK4ZO4Qw788D3dS zs3bJAs`iauWLU$C@#<;M+3q&IM1x1&hu1WF?fmhsz`GmoO1zu!uEM(>?`phj&B-A4gq-9 z|7-9WyjSp^HSsykRAZkvlp(+-|Ej!%H^Ic0)y9T1yjSri;=P9V2A&QC+I;DR)_YTf zdj3qpdk60=JiQChGPDie#rq3yvWR$7@V>x%4{ti&RJ;!@;rn>g@T~t&C#&l1BfL-W zK2|65#ZNPzGw^0v+L>wY#y`XRTn)?~?@PQncwgathxaw!w|L*AQK=2y?5yP9!q!O!9Si@y~9Limf~ zgTDy=!fKqJ>PGMv!(T#Aa)0qO3V+GAL3%CtOXDwtza0Lu|JAks$6p~8@jLL>#$OSC zHT;$E+dV)2D)_6mGqrs2SI1uye}VqrUu&Lc{B`g*#9tR*yM6ri=B35oAS>ZU_?zHw z+>X*>bWsm&|K0Ep!|#s2JAM!RKKPsB?}Wb@{x*^Xe{=jTjI`(f_*+?UYjr5qD;J%= zt)9vLc81#C0F*aLrm{QmfR zT8=gZXx4kFfu`Eqa@@yoUwnBrMv6303m`wWJOKYtBZKg5^6wvH2?u8$4z{3d0ktc| zAEKmPONZlE@Q30L!#~2zj?`HBX)Z_MpK0RJ=KmP{WARVJAC7+#{&Dyx;M@E^opx$z zZ3xg(os54fe!KsdXd8S-~Z!>>2z6`%pbo|TzYg54YO?S+Ri|?sH+ouf#ei6TnU(y20Z+>iu z{}_H1e++(P$!msn{E_%E{?+($uD0wD8u(2;-u5Bejevh8{#B`x>DS=jjDIb@6!kj% z>ov#uscyu-X+eA8__w4s__yNUhkqNs&hzna$G-z#*Nf(PF#T@Bd#tGUW@+y?aTNZ8 zMjmLV(u%eDzml=|59x(q^?+};0RAKRHu?9*o5T6@fBeS@dg4EU{|Ww++F$uk;ZMSU z8vhmiXYgOde-{6_^xPA~f8Owg>}-4q|7H9M^9(ZmRs1*bU(=wb%7y^tZ{kl(bt}(X z_>=M9HnVp!`*-ya)OZU12l(&dzi-A<)u0_UE#>$hTGU7QAE!~7!KVbv;ZMi^1%C$q zH~2I0zr>$~|2h6=QjPl4di!D?x4Qib|7&$3KW(OO@xM1R8~;1CZ0kSZ|BU}5zODSs zx1XanZO^|FNFV+i{$KdNF73^z&ihS>_!Az5Nu4) zgJ2VaZf4oV3f49CM$kPa7PYD2W(1q3YkFBOTM}$fuob~J1Y0j)zb(ObsZD0N1HsM& zI}+^FHfxte`~OrS=tVG8f&{$@`Vj0*AiTe2-IriDg53$M^H2MnU=K}b>)2*9z;I8) zy;RqF*oR;+!M+6hTW~+afr6IN0R#sU4AS6yKRN`M*}(*d5*(5mn=*vpa3hDc#kS=U z1eX&WNpK3mFoNL(M_HpEO>iv1G3l77m=2D?aReurL3;=wIMIS95uDsUPsFpHJf{+z zLvR|wSp=sOh;qgPesqY@pIV-s5D+Ymvm!^Dia87 zBc*ct3xMEN0{wKG#lBAPM#kSHm`E^5ztbYIh6Hb$**k{%fh;4F38pAdE%h*`>b4m@ z_GuK4CXny{i1;Bz>Br>z4|@@OOz?@epzK}AuO;NgT+jSHC+itt!LKM;FD=wTVx}k;Qq7)a)l*K77k?|#So2{MkrOk2~ipv^V z&T#oGb_EOOD0UcG(Qu_KcIDI$#Z@UDMsYQYy(z9vaeInuP~3>3ZYZL-7R7aptgX$o z$DI`Q3udOQXShB^`wIXy-Y~P-n4*5nhvFs_yHM=f(d`)vb~Eg5*uzl2|3h&z!S;Dl z+``JaW%~6Yic%F@Ypj}WLs35gL{UHfuRkr%4itM)+|g3)L~$32JL@q@tX5-B2ElI;+{tK%JjV{?xVc#38vfE7>Wap?{6rt zfXOE~} zbnT;xXK1HX{2#?L^-X!%4<=WcbU4Mc?TF5ySf@CGVnFd+ikDM7&vgCxzmW?JFQjPS z|1Vyg>6e&(so`Z=jdft4;dvHpQa$FwqJ+KLUsreTZX6-G45$W?|{8(u^4+DyOBlL}iBc!%Mgf=2FABD=YY(kL%eyw}?9KI!GG38ZyKQ5;9{0g4Y% zd{DO$$_BRLXo_PpJ~sF3>n1*|O{}r9|K}Ye<0;B#-=w>EG&faRFirb7#V06Ep!j5_ zJVo(ovwtR2o~5Y9CO%K`1tTwJ%1c5zy3NdTd4=Nl6knw{#mf8|#n&mmBfI!0zCrQL z+);9IO{DlX#Ywug@7sjpTPcw!GkaG=Ba<_O_b9$kajKlFG7{;SSe!=j13iro{(<6$ zxnV0({K)WQ!%qx9HJolZ!*C|WuPDwEZo$tees1K8O!=~-+s_&Q+M>QO{MK-`;diMG zMalZdT<^1WJSzS~@n=1eqC625LrJ>Xf7L^2p$P?(z!Ta7t@YTAR|P zl-8ki9Hn(B?MG=nO50LeU+0IV4JdUnvLU7R^Iu9EQ`$ryDay=H9yOM_nt^TsqST$z z7L-1ia(jFS?=zTY(0fu{0 z+Dk=M_NKItk$qKZ=tDqC11TM(&0X4`(g8*WQ94kFZZ8xwjT%hpC`tz#Kg7_UftH4- znHn5scsQk@MvgE%QqagSo!_e2(Ugv*Wb=QCYC9jEk>kzg1j7?4onys2iPFiG&Y*OP znrVSgrF5E+(^DmP(=!&7s54WA(pi+wR({ld7B#}~+${DyO6Qw$f#HReE;e$J8R(p! z(j~c}DY=Z2&8|zATfsUF^OOpdT9h10Atjem(R9zyHw?5L^{7jRWy6Y~{$x$8R5c}{ zlu)V}ucxt;Vr?BwYxDn7Gu8D-Rn#q@l&&C((RN|&pQ97G*ZyWt(0{BuRm)StAsn}DU|M}G?vmmW_)i)cey+z`F)h+ z0!%%OGUWlo2Puut^f9^~(zbbslJ@_U9-;IorE!@qTY&B}{V~JGDLtW4)e-u;Z3?BQ ztZAfOp0{?%*~`-%$ECH~AdlDN_1Qcn5O5{E++L ze4S#Iex&r1k)J93LTQfh+>r+;YV5BmrzHLVpOpU43YTF*bDXPVS?MpGgO&cK^p8%f zBvy_>y4LbSs+Z9Xx8;Qm7ttX`gNqt2X1F-zC4_Wz?{2}RsGLE0X(~f0FGFQN%F9yO zg7R{d*Py&S<&`O~K)EB=a~kDbZoex!7F(P0ij-H%^;uSa=(${QKqz;Hu7g*0koK_i<`?xNgu zQ*1@3+?{d{%2H-s|1o_tLwQK23nrAe%=E3=>n-JNDEFtlE#*Fxw=?7IDeIaK%1u8}{j2@SlwD$1Q&+}EP`;4zxs+w+e_H1ADPJ(pz+CAg0LmAq z$ptNVso`amZSh|XI@45?3zP$kbqsYCh_WsLQP$@IR`Md{3gwapRku~3b~}cYt0qR2 zYeKYO7G+{gIWf|pe5H{l<(82v1ohYUbCro#3)+!hOZijE*HONo^7WMOq%8T4G@Ba@ zZ!)}@@-0I2r!{JQ`F1n7LzVV*aaR_5H|2XQ_TEgnFDu3<%9ANSK=}pA4^n=T zvNXY?l*dqhgz{KR^$_K3=jZ$*9Yp|NBP;* zCX0POBQH{(MENDkZ&02<`Bh8uGUZnmaP^vr^6trk{^b@x>S|)<=Pk8Yfx?@^_Sfq5M7NpD6#3S^lV`eV+VGc}}Wl%CD4V{{MSw zL-~(+v6SZur~H@U->FXdA0={Jm4&FRP6aBqpliC4EGlBXWnUdYD_c?7no1uk+fdnw%C=N?pt2p6?K`?}+tGbD!$DMbG;)+6m7S^d zG_s3{yHV*yrFTd7Gb|{nE~T<7mHt%vQt4-w;^&Oqz5$ipsqA59gF3p)PrMDFvKN&- zv$P?Vy{YVz#+qmgGBS==22vSJWq)0DsT`mqdqrRV(wn}@fm99>($U>MDPK8Q#&J8k zL#XKd-}n$JI{7z#xDsijf#awgLFGs)#~B|+MgIIzMEUba!D9^N{~v|R|38lF=zg>D z<8?IeCo_Z-3{RwTl97`Q zPHZ$Ne*rIe9+mS=`Ne`4Qpr=f$P|gan93zoE~6s<|E{TWgJq&}xmn8pzqb_&7O3b8 zgH&89B`O{jX$wC$>^gnjZ`gHIin)J-G)SdvN`*>Omsl&(B2|f{5*gOiQiF9WamEuW z4dwg1ra0`gj^*TZx`N78RO~^3)V93aRk=F1&;3;F`=6C-sa#Lxy4;ZdBIXV`P_h4b zDmUuPt#XsK@6A+h(e))Q`AAW;4wc_VwHuY&sXRsH4l3gFPF zH&MR-pV~aBM7~^9d75e$D$h`r3-(zmFHw1pioE%?tUdx5d^wdDsJtl0lIy*b9nl0T zuUKu{UBH0vsJu#b11hf(N~6C{xCxavsQgUjO)Br{BbdrWDwC+ZWBe^DZwqPfF|NF8 z;$&6Sa!MLSWh#}=sJu_*Bh#lDeqi`vn%4NoR6e0HgUY8CoGzGoo@vS~RZOJvIhEN| zzM%58MSW@bmBwm6^Nj_+)d9L~|D7q{Q~8m~4=Tz}o>NzTN)0S_4wZkY{6ghVD!-;S zRDQFl->LkODydH@bE*85+5AoAALZ$8?QkJN``CC0;lhMV5iX)m!bJ%eCtPd+%Owbx zoL9)Uw{U5~Wiq~OYD~C1;o5{N5UwH$VUDnaaK$WEl$BGSDXS8$LAaU*)qeGPv4m?9 zuC+jL9l{L=*Uc=~BV0e_+2L$RxREG?8>?NMLb$~|ZU$QsZk;NG+YoO1-`MR5cOdLZxMOCslcn03a2Hjqo=xdR*qg8~VV}&> zHrs1ycO%@Lu-|{}_eg_;0|@scw2eUFURm0`g%IvTXzM@iBOOS1CgJ{sM-v`Eco^Xz z!b1oTBpgg=TR`RhT@xOxevIp>6&`9hBozq{Cp?1CHh;G5k0d;baF`nWC*d)KClelP z$%hl3KzJPC@omp$Nq8dRN&i(&Av~S%R7-W5MzwP}Bjtp4Eoi~cB0N`eBs|;j9KsRp zGRU+W8-r7#6;_ZZY65i1^n_uR; z32iYgyoc~!jkPGk`w2&7ejX5!P&Wc)${0fFX2%jfMfecmBWCb$mUbNBV}#=gA8i+) z?elTMCkdZW(P}31_B7#3gwGH@PxvgME&gOSgf9@j_+LL02wx$5d0u%e_g4*H%gXSE zBq4lL6DpZVIEnDB_BGf(H{K!qnebi0>4cLBt%nb%5WZ(greUEms@K{%7}Yr?Y9saL|zZvTPzYyByA9=S$`CO`!?_X3GCH$Kz zmi!;Wf74v3E~KPhQoXt`Rqg-VhgMyT>atW9r@EBIETle5z|3u9KB*Jqen!emj>v zr&HZfR^)U+Z%--q##A@a#V(lu3(DlG+EwQsvKm(HPIX7BJ*e(LbyKSP@qb+{tZq(q zOR8Iljeem*7Qw1pQQcZ+!ZK5;ZlkjinOs%3rMex}?K@VToGMD>(UsclM75tK+?nbw zRC`hFscUpHE7N>?Q|+VYl}y;wcvq@@HA?wzxzWRwYdLqRv>W``$!SA^T8$k?Ouwuco>m)nlm+q-u>`-Jj|K()xM=R0kRAa}cTrQ5|gLV8cTM z+bgcsA*LKg^=Ko98xA!*g6fe%j1QxFlvcQ{)0%ROM#+s*)fWFXm*c1&Z&9`psCpvR zJk^t^o=f#)s%KI?h3e^4Po=7h|609*vU#R@237mJBD)1MpJ!3EX9rb#1fVt}Qe*Rf z9@UGfN)=s5RoDMBKNqDBDfE)5UPAS9s+UrgKmXcXb@{1o{lA>ITHpfJDpiMSK-Hz{ zsf~G~>dPIXm83|uLbXJ-tb>%q%IT+R!v%OmwL!H;HKtluT@KA$QME0FYTu+P=T(d9 z742N+=XF))^BSsSsa{L<9;*5Z7}e{k-b&S$aWr@%)tgMW=RVb2G%wXhDoK~ntGAhQ zyWt&F?=*6k8mQ&ndLAli_y1IFM5x|RbyQ|!LqPRGtFF;h$EYs-Pus&oRJHS``Uut3 z)i|o-v)D(eK9=#v(^OQS%oKeDK-Jd&t8xqQEY;^tv0b2T|1YE`2Gy6S%7e}cRNtri zGSx{`Uom6r{HxmeQ+?g=4M8Js8cx)^{W!fIGO5{On;B+RORg^n?`je z)ep?iLFs&EsA4BG)mc<$Q`P;SR6jTTLSr@frQugpzs{6zsM`F$ z-EiNT!S`A04^)55_)k=S&iEW9dfoj>w3KkFHUw0Er}_sGRCOb$>2nRG|M@#p{xRiW zqJ>hWeaO+mM0PQXw`ftdi54T0ry=GiT7qcFwtafxL`xGblf^Deqz@U1md}(Gh;kY4 zAX-s*dW_M^L|bcL7p+1h>;K(}RwJ^JFtxcrw`4Z{-zeMXAu4lNu zpq$J^8(MH9qAo-mtEiTnD3O_DB%c6Em2RnGu{{hoCECo0y&j^ewy@xqhW7rKireU# ziHsnETJr6Pw%3O*(GKl<+h|9korDwZoGH5y^~`uLqTU(rL$s?|_BGrs)B9O)cm0Bv z`sq(Jj7a+bAw<&u@2wB8qP-+{i`|DvKmMcVK(wE(8$<(%4kFs0=s?|u7ac$}NWVeU zJyDdAQ7s1(9ZGbtJ`|fclIRe9J|$cXG|6E^Lx~R8EaWF+VswNKXVH;bLRo^4=Wda% z|CpFQ;ty!a5<4J{#e!Jj#`nZKvX1>qDocVPUPlx93oE! ziF~3U*E=s|%Z;*ijHpBu5|xQ6S|L)UlXkQuRia2A^U0yzE5y{6NY+)z5f#^n} zM~H4BN*hQX0ZTKNU~%k$qw>dRk*`#|Y80%FPwg^F%M`(^75s7pd(|^b$3>{3lS8-sWYZUx;2Inojg8(R)O% z5xqn7I?*JeH|zp=lW3yWbJqhD^{jr&^tb1UMDLn1*>H;KVky-%mFQ!l_lZ6rn%36M z57CE2A7z%}^Ak(^sVZ{$Xm)aK&LEme^bOH0qAyJO%$JT7~XKhhxOHf;knw{iQ19ptmmQ>5sxUDQhZ3Sw}Qd^$d za%z^rHJ7YP*=eB{j)? zTT8pO;Wn9v?WpZYZF^0qIqr~o*vZUn|7ZJH+WSAL^~%!rF`Hct`x@?+MfJ=4>_P1$ zYBK-d*ZdElCg0+djP^3zTg^1MkCOI5?MH1OwIitQPwil8dh$~nWM&6aJ1DiJHaNAn zSl$1Ld=jBHl-dw#hh;Xl|1%h9Fg zWr|NN$as-j$qdS>bn_Ku43e8i`D9kuHPmh}@mj;{s9FCnP9EBs+KtpkQoG5bZl-pNCX}xu4){)= zp44prXU(?G-gCZ2$xr&y+MU$yqo!L{sNF65!KmFsO?rO&15Nqs%v;x`cE81rqBd5i z6SW7dh99Ihn%bC-?hohoel+*sYl<5C5VeP8Ya+ErsEy10bV^6}7jom|Wmr)jrS>?r z$8?B4VsXp;2`z?9666WR2j^3JirUlEPoVY;^$m1Hs69*VIqK4xJWuUYYA;ZGo7#&O z^-?-IP_vziwU-W|%(Ha8?>i?K2C0PVEb7-%yh| zkBy17uPou$8dT5Un%Qh>-&6Z8wK4q%YCj4|&CKR!>e4ySq4t*re=+=(+HXeW72wpr zYypx&$`CL&RZ=I^{x-M&Q2V!SSzkyk>rh`fQx-`_f9i`_RJQ-KZu>v$OPaWp;nJF9 z>WkEurM@clm!xgFP{!im8Q(r}SdUR^J8uit)*fq>%P3mi9%G#!^ zW4Ny2dWP%g-m~4L^$n@_p}vuc8yjw7*u}6b^&O0Kqu!nRR@8e?--7z4)HkQTS?(|S zoPr*&&PimO`qa~?Z>dD)QT45f36pOm5{j`$Ov6tNm;{ZR$Ik^PLQLHr&Oq zr=XEu)O#zpnHBY2sqaI*Zx*|o+4Q5Xi$B!&Fzio#FX{uR@2O>*dS`Cx)mE^*JG#HE z`D)GYOZ`yl`8Rr z52b!YrXNXt81-Y#_$b4psUM@UZ(m};;fBW<9JL#rh5Dst zcB-LN_36~lHGT&5{~0;c@GL7=V$r_)GsvgBEyRfwQTy+nz_uB z%c|d`fM|&6J>P=o$KkfuPpE#+D4r)GI2g5*k)DnD#vNnkjX| zn0jJF_J4|TQ&4|DO{9K>De@p*^s5Z7rhdJVYYeY7yiU;UZ&0GfH&VYT^;;UFhxcI@p&J0E12?8>A{+A^Z)v2<723|=l@op z4^y8&{SoRm=dX{WKHkh8HGItQalRJC^f1UapnZ2}idRDjl|BmjTQhz&(eaDi&OMSADDVhEr^{FYB zQ=0lTi~S&rO)vA0s9XPE|HNWHHJq+C?E{%f{X6QjvQ(d$!ROS!Fp~BE^{=RF=TH3` zL+k(RvxR4Vz9*I*^#|gGssBj*PwGEutR|5mV2+Vr41YD${@=*&)c;7i^$&AR{LAp~ zRHy!r1^-oy7cwO6my9n$yeRQf#EVJL6deMHmoU`+Ut2$3n%MgGcp1}|HC)bcdEyn+ ztjqn{Q)$``;uTYccqLP;(~ehB@wHuvS4(5thaay&ye9E3#A})H+QeOn*GX-N*Ck$$ zcq8KVEp`Lq4W)_O9;WJPL%gx!CdAtRx9>FLZmA7%cj6wzI}mS5ytP?wM!dQ9>hTs9 z+%mJ=s(tRo+YoP0EW3B4X||KP6(aVE(htWwS}N=RI?n}HMv3CAu(2rRAf8%=)_b1-R_yEH_iTBE4WeBiyFWy%bJ7lvNXsAN~@d3nx zh_&;VfsFVd69=bNq2pS72=S4`hY}yI3t6##0-E?RS%fjmp}MXTAEC22nY_t9WL>cl zw?`4j#77gKkQ?|C@iD~55+6rATo*uOsYI4;V*USLeT*XOIq``)jf_tsmdW|a#Ag$q zLVO1Csl=!0W)E41k>@q>>H45V)Bcb6EMlAg%NmQ!qO|~Z;&X`4Cmum8bAAb)D{gha z%7gN~?k|Zi(Cox=j~9q9A}$hNOne#fCB(M*XL6kRxtv&D{u-_?f@#7$ae>$)c8J~F z&SP_Zo!owh<@S|h_lbktYm4eqk2sh0fw)9mB`yf z<&jCROu6Gk&}y$qb1HF*=EB5R(C9;aCCR76SCMoQUri##yM{y#;aZY2iLWEJ$-llE zCDnKX@r}gN3O5nolItdSJvR%=A|CNb;`>awmH4*Yoaw~3Th@0N-bpNVYxDp3ZY|85 z>55vmd*|_v?*9;vB7TSX0phoaA2fr}#E%n?A%2W_Eb+s{x-KEcnTJP+_2pmU@x+g+ zKIextHbvqmh+igtl6V5~Q^e1U0rAts&seHw4Rtj`e;W0IDKDl9@k=76QKr8_{F;$h zQ<3;};)%qz{u94B&(drrrD=)ZmcnG^d6&d)kmJe3Q%LqDevhOp@l+CN_xFi^BA!P4 z8Sw|iw$u|#&+rlP$GToB>mgF-dc4wbGl-|FTTyykNj#HymKH$G6p244{+9R);;)Fm zR5Lpk;;)InNnL63ce@eKCjOrIyEJJ2r7C{RZSlRjlAkvB&m;>G&msPk_!r{eiGL;j zO|!Eib@W({_z!JRQFa_cJeOG7^e^JSrFfRLEapf#|4n^LUL=q#Lb9;t+heRLi%P7K z#Z;6dO_m_Zkt|7KulgoSnYgqTDOn~xD3aw&T;6a6!S<0R9VBa#tVpu5MXi+iT!mzH zl2u7ov+BxfHCaOq()vu+BH4gsZIbm!)*)F}-Oj7qWc@U2bGsqQCL|k?Z2X^EO}ePJ zcWntM=|-{#Nq3UoBt1xWBH5H=8pw|fl73c)yJdB_yB=VAwyTr==4yc9 zo`!po>`k(dnsvJ%t4aO$0gD|-vVY1YiewPUaFPQ_4kkG$vl*PFvh|OAC4nAp5#=L6H=YzM3R#-elp1^ z!ZV+zk?7)&l~(r0rYD=cE0>b9NMuScC+FED=jia1jL>&ilXFSVC(*^9jvj04@T5@} zw1YAR$uo=OVvEhATu=;)xa?X*{$evRR^ zhS#ZqW_NvNb0f*4BsZz9HFGn`EhG<;j3l{@MJa8yS`B|34ueJ-T)D*pXy3$rv5kca`&hEXgAz50N~qL%d8a zWQ>#j#>qI6@wvVK)S+uKK~_olSI1liN+_T_9Smf zDiRq21m7`y*Ko4o6vOvYV@vox$uuMS{MU#+0w(#$P#*#7i=r|qk{M1iokS+#(iSsF zX6gc0GK=I3650G?TbdKu|6}i5CpwiP`HEyV$=4+E@i#Tlg}dZiB^vu3$xkHTYm^3m zu-G5dSmQq%&LR0_0r58)(x?4SL;AEoXh;|Lrq|^Z!MxoYFJM90gZ)CNrQ`~x*n#QEly(z8k^8qlExY|mZH%?W9cmIGBjlJpC(+6#`2a#=KqpV zZV*(@{KzeUh%3>M$$x4u^M6rRr6KeGR9QVUUX#Xp7Av;^VzV|4ng6FY>nf4vXvq9O zRW>l24GlLkv@M{TQ0D)sO;^*qrT+EmX!I~;QyQD;X)LqB#^#1w7|JIgM3KL1`Gv;T zhOz}nxcm!@;C3{&H?o7_j)L}+BscH)!;w zF_^|~H1;#Iel&Kcu@8+sw9J~YKMm{r8`k+Z_R?!gOTM>YM~?wC_Elv_cbz#m25Qfy zsrILFfRRChMh-MQDBWd5<6s&`(>R32ku(maaX5`3G!D}OOChDG>TM_uoBWG^DYI6^ zFr9)n9r#542_13~?bf1gH)Mr>l)utFm=QdI-ZF*2+f)+I@% zCo~!~uBOqb_yd7T+tPveGpHZ*RcahK^g8{R@=q!I1^ zY1j^d#_h)M5HzB%0N7F7O=CO_Y2wi|?#*KL6A(1+HylMn_y5y)P-EvG#TXj4`M>dy z#oGS=hVK8Tp_~6xV;Yarc!|biG@h|2dvxB=R{&_}{(l-z(ReyFw&1hMRez4g^BI>L zLs4GTpw|3^On;fiD;8z{|I*0*|E2MIR&{UE_?gB;JK-nM_=d(?H011ko5nl(&rt0v z{aqT9X?(1kLmE>I-=kq4e^W(r)Q`W>_(0IehcrG)xo(}(s848oYGit<)0knwnKWh@ z`7F~vx8N7LS3whgMdNF|%H-OV!pK(+^qT$FaJJ!hG_?Px@q?jk{!Fi8+5fp_$6DfH zj_JQ-`mYxJ%}|DbKQjGK8gn!L7Y&^i(D+B67Re;4@vmZ2UI7+FMTu=LLUR|Ii_*-| zT#V)t(xuQ`Twg+wZl}2<%@t@aMRQqgf~F1uG-drqzVuR~xg5>q^@!3QLta-ABHwRm zcF^3G=87~oq$zo=PIG0Nt7zZ2`=2ydrD=;l@|Rv#AvD*ZxfabeSCXnRT(_lKnqchs|y@Wh0OzkVC9G_C))8zPzmX~s17r{5JlpUbnj=)V0-JIk&GU_1V0aQckY3@@kIsW#?{W`U+l)6v;%I$v#iG<|Igd9vILRF{RXW|3yeNZGKG>7fOyG$SK5 z!+IL4>ugOq%y(!uXg)`?N%MM|Et*%+yn^PHY9=i!C6N)fc{R=JXkJ6}+T1AVigh$s z)TSRn^9GtvnAwdqZ!&T-%`v+4)Vzh}NSZRW5PmC7dHyRz_B#pQA!tNC0VF}WrUdU+ z@pYM?3cr`;eHv6QyS4;J(R{#&Z2nC3(Mn$bjOJL=AIkKHX+C1gxJ(&O^HEbC%aq5n zjGmE1J~pOT?&d_Ala$M~qnF8BH0Aqm@`~btigv}BKAGken(qm3 zpATyMK3DBVa~fA1PxAv>2hseHRyUfu|A*$sv^Jvo2`%X!Kc%%OO&wEc&Y<}N&6)ad zP|aC1zcL~<_PPEol!{*%>i*A6`I_c8CVrbKvuS>paoYl_34f$HhvrXa`Ewd8rKR}` z&3{c4o8M^uW&C%;KWP4$TGE`W#4@G%x5fUWig;)()V66sYvGJ9qD1Uvo1gURt;K0= zNNWjNE74k#)^fC#qO~lorS-nAWu1SQMdSu5H*OsrELzLcTA|$)w{oU*&|0yhhh0!} zm&*;fnAXa))~2-ztyQ%-q*hz2(OQGn>baiNbdK6{8m%>Ht(EK7P1j@PH|0xO>(E+P zZ+S)!r?sB`1!rr0TGsQ+StLI>o#aH4wrFiks|&47^af2n0Hvksszs8s=p#9V?)qR? zI_FjoTAR|^nwGr+AcI0{bE}puXvzA&)Q_DNGTbZQMn|jGw%S*>wxhK>t?g;;L~93& z-7(j7S6L#~O_eQK|Jjw+E{3xHBV0EB$byfM-iCc>r9s*Mlak#`@2BUXn(aYrUt0ZX z?L}(F6<1mWetR@6xe`G|hgr4xlxV*8UwmMtAghCb!)k z9X%$}8bs^BjvgO(^qAezt8{T3#QqX==Xvw*KyYfxbgm=)olhy;Y?xJ-ct-ER6OY5Gtz1gVcrq|QD zpVp|9r?Ipi6hdos=4z}3AENcNk%wtLLhEr_w*KE5pQU=#Vjr8o=Gl6J){|N6Q%bZ3 zbp78fpEZ2W#OGwV+X3_nQI()v(WmD{<<5b#OHKQ*FJv}VwnX=GLw z`9Xs7#>~Gkb34Ufh&wb(V|EgEVdm~o`IX8Z;%~&?G4l_Sy@DivMot|?vJX+Q$Nh*N zf|-9ux~#{{e*{Sm5dTHAT1AN>(&^feABt#o4T#o2v^L3Mh}I-IoOlGHN0QVMjC5$P zi^d;Ctb^z=h}K249-&2f5j_vlZit?XXm>=< z(Qg6EgXMEF`WAv{4@7%bwQU+XuT5m%VEOPdqP-Bk2+`h%UWn-VI*LUv(3xbkkG3Ir zDrtaRZFm^bixKUsX9U4zUU}9%+8I*PvCVd=opYhav+=(R8!B6=O7ixHiGXdKb&5xoo1 ziHP2Ys8r7DtI-=}%7N%j@}CQxdnmt!c&jGm#95Ww5!L^HA_!oUbNrg{C z^jSooV!+eHXDYcePl*1XfFt@Gv!)~ZJjo2=3&fekDA6FA#F(HiJDMSyKs1GDQcnig z$;@*QqG_GY&R&VAg{Y0_JVZ0vH?)&vi4LMJqD69#m?P$i1wnn*B3eRpHllu*EHif& zqFPlb&Y?IrP!N3yQMmQLv#tEe<8XQ(Vr2O>p#-N<>C+DTM}K4=n6!?qWCVN?;-jLqH_Hw$dz5O3eok< zT}@m=T#M*BjT!kdlN%8I5YZ3FHxf7fC-);Nn~549WFfkR%BO*X=x0oRj_B4<`2x`| zm2)l3-G=DbVeU7GejD=dnEO3Ze%C*e{1oKsSGl9xsr*9R5$K5SWO5gAH=@6i>cs3NZiqkfp%ATp`}#iL=I0HYC% z<6ty~aSV(mF!ZvIe&k*JM=LoNMl;vOM82!oRjenwF45P0Q@_vy`<4Fb(2g0}%#vm9&VGM>bB*@j^P2*u) z5)ehLXBdp(|5N5a%vOzraVv~bx=Y2-jL|U0M6Oss&g(zM6)^Pr4-8&hGOi-O8paJU z#=*D_hF<)kC_{i=6bg%n*ME%bVN6v0D?d33oy@w zF%yOfBMO7Jgk;2&-Y)+dGh#41z=*3)8VQ(nU?gGeg(1JqcVVPq%!gsYD8sOITsAT= z3NW%Taxfe!F3}T|rK)XbCi5XF!YKVm_d|UajMMw=*yg*^h zD=-$rcooK*Ouhz#9|$ns2!ex17z8=+AjK_AehTAr7@q~AAjPd=Jzv7u0plwe-&5ZP*d6FFeig#p-J42q!rb=26sZ2TG{d zg?S3h2+R{;R>3?5W<7@0CpLiD7-mD5jbI*qu;4)gvk6SO`Wo&W^VqOq%~&n4+^*@k6r<%(Hc#EI()QAG0gWZZLbo>@Hpk^Bm&2 zFndH=kJOVUUPe%x)!<$*XTt0a^Cp<*!yFFt0?pEbePCWla#5&U%w%6;KbU&^n0x?n zAaM{(z5feSZ~l@DC0;_jlsHUoCy|VRIZp15!MqISNSIf^90hZ9@E-ff{LL`O$ODrw zFOMu78yVak=2)0l!Msw>GGviwDdke3d9`GbjE6Y^W*}ZmuUZoteZE(oB{I|n9p;U-U{{U)m-OTWo5 zAA$K4%tv890rN4Kk4Lu8*8dbsuDpBAd=log%25k$0GUt2lr4G&=ChH#y&?-w)56ba~(U?YM5(C)@n~1w3K{3%x_6H5cvrhb0bXs{tL_x1xfT1 zFfcb0KPG-c+yYZR0U%kQ5kDtxC4NEtQjp{;;x?FHlYA5Ck-_a@eg{)}@AoiwGfN(q zk_vw${si-9lI?;dzYur8+)1)4&?5_^WBeL$n0sLU#@yeDe-QT)|0MoJl$YnriuMcY zvhYZl|4=y)C@}xkWULxuAUTAncXF%Roax?h$kb~I?(mF#M&U%m3mvm+L4?}Y#+oR zb{dnXBX$N!2cmxeh2$*6I)=OxmCnR2h{+J3F>(n7v2KX;7;rAJMf+FT{E?S9be_h+RP5M<((X4zY=dO%Ra**GD$Ai7cFk*bRu?gxHO$%a>O4xZI4` zEs;TWgAcEW!uZ<|yPZV;REyZ1M7{z-lXoLFNfcdrjzDY*Vg_ROAoc`e{P;`kKE~fq zd;qaW5PJ}@ht%j|QzPBBM0T%1Om4Go(f{ps+k)7mh{>BDq;EeaC}Fy2%#*=d5R;bc z_g@fuTED{*dxrR|9uZB7{v644;`5kvK$GkhwV_RAl}?fuxAo$B2~>d!3EEivDqP?gV@}Vzl7M!A)klX{E)wb*sCFzAwYYPEQq~<*qb3=fY?HcZxI)T`eMZ1 zM(kb0mV^pTJGP8r?+}+G#w(cv)T@VUzqWV8#e+!cQ6B)FXM9p7Gyc*&_yf)&8go+LU zh*w8kJ%{`-#A}iq9x6v5UMu8BMz-*`89xf~MhvTic|&4 z$Y9MPZ%k~0c+*fhhKl;X`a@jJAMxW6Z;5#GFoymgKN0a3s`Q>1>a7r``NvOYsn(%> z3gT_3v<;PZm17r|RrEvrG{nzg!0AK|0r3uqtN$Z@R#>VdlbsOnOwxr|@qfg-BHk^G z>|U89$JPHC)&udLAwQ2wFT{J3oKK|x$JPH4*YAIkT!grqKjM8=S$Gq9f8qe*K%)9T z$zb9T#D|hxLcCOvWEkSZNk)XqWr(X|>oT}G;-e7{4(=GlFGu_a#IFb=#|lAQhXBN{ zLj3AbABXsOiaG?4T#LBQ{}G=MD%T^@K(&p`YI#>^x}HEYT1?Nn*q};t9kZ z#FI>>1WD3F3vrtyL(B^5!fubaOVL9-7wCxRsT2?|l9Y&km|JFY7UC}kO61cB;&Tvx zkNRBVONhUW_*;n2V{$(66=LZB@z)R!w&e}#ZwituKwSO5s%5>3LB$s#zL;5W6PE~* zEF~^OT+N?+IdKKz@2V1zU9P}zX^2UIo^HxWM! zaw9{e$mW0}{xP#YA#Ndliuh+?t_}f+Z$^bag;_TbO=D=P$a4c@krF5au~5D5{HuJ9iH!s!3!9KPL9#9qO_8`BiDQuHi^Q==oR35^ zB-%0HI3$kOcwJp{;t5EcNYVm{mYNm(;u5WpIEnhn#MZ=9G(gL?L87gYsvXaibIK)5HA%Z8HU7g zk`ctqh$96f!?f=qF`76=6-{1F)FA+gvBWEpxQgUz;y6K)@kr<%K;qg^xsJ&Rk%j8X zNK8axCK5LwF$swq!;vK|0iFXn277X?nlarB{g2WR@+@rb{ zycdc4LViCL9RiSe5Q(WI4~4l8Bk>3lk0bFY^~b2I1OKP~Cz&-3iKj@OW{lMK43p0i zCHY*aPeu6c@&9_NEk>IkT9vlknoU*lP5G%+nGcnMUp03L|c#~L(C%K zkf`}bJ`H+Wj!Iq?S+;COqKL#hNR*Ix2?-yG7m+A4W|jsFQ9ndtHgOITa}Umwg&^@V z60adK4~hA5F@Z6!An~delqt6;eFjr}9f>!PSc=4(NGxQ*1wlPXyoJP~kS|uE)xM3y zl0al~nO4X;kywtzY9v;$+INvyiNt$Iysx>kx=I^XRpRCPMq&*T>ycO+W~~bdi*F!) z5E&92@l8nVK;lCrKBN8-QTETrNNgehL@@jrekz}NrT94#GNs>N?ppz`J{Yu^sVLB-@jmCP=~|AbAFP2jZDXo<*YmPtpm=&LQtYQ9nnh?1b&BrieoQi{XE+~G`)KvMl*mj!AXNRA?M2uO}0 zzZ^-Le{!sbY0Q;Ks{fPor3xyJN6JF-8l+^OUyI}_B(FmAaA~_Ms8%S;p zYq$x?n~}Vm;w?z3|C8TFl>MXrPktxyuE^j@n~|JEWipaeki3ul9^$?KiMbz1nt$>^ z$ztx*|KvW5BlWZVp?&nBu4fz*He#zjkLS4WS=0({%|Y)K}sz808(Q6{|330%Rwn1bx0*XbtqERwP30S@i1ad;^9ag ziPRBD)sm!E8|F7b;%UUwkvapZj!1Q2@=QUJvy=q)JyV^ibVjNR3C&*{)0N3?6+cg@|08uSv4cLrR z>RO~|@~P{XJArsTabjc;{UmiGQgM}9%Deo|ARRyQcof^ zEsS}J0UQES&mi?|s0TGar^!KoBK17OW)NQpV`efLMT+L1qWPy{VQ!qc31X6%BBlko zy*5&>A(cVOM=HxKhv*VLVveZ(k5oaBq)04jvhw3CBQ-0`eUZ7dk(v`KbCG(9;>)2D z9J2XHy@J%Mm23XI@{iQ(NXwCW18M1{Zz5d_sRc-Vi_}7-)*^LqpD#jcF;Z(-?b}E# zLFzs7rNm`Oy+g8GkYok%-LS#$hx$tDtB9+$C4Brq!jM`Q#;iwb15#fg^#Q{+B1MN! zZ9?ipD)j$U#s69M6Y5)tpAtV4B>9}UHEap}KlN3ZyA3H0J*jV03GPIszC-F)q`nVh zen9F+R`L_^XQB=PNc}?GLEK5)B}lS6vSS>{9;6RJ>NlkRX7YEWX#OcRe=5@7{vz2& z+#l${1$Lxl2sjWZNd1d+HH}H55;JNY(uY#1UWrN9KwABuVojtE5BU+n)=@ta>Dov~ z$d5w04oO{&Tr4khkUFc7?u2wb>h+Osk8}g1PiC?q(nlkGEYj-#NH-=n5hQ6!Jf^a@ z)6I}>K}ClEr0M_Z=18A_^ogSAP5-L<=M!cAe<4X9jiD1Vc`>ms(gTq0N8Vopb`4k5bqypA3isO(q_0AH zDAKYAE@77XKhnd9vaur~Lz_nyERFOYEegev#8F6(M*0e*#~^*Vo|%ec3_4cN?9yYA zzEbZ>OUtF7_Zf`z)kxof^f;uiW7+XYUlZ1LZDh#rA)kQs^$eJ(iuiD4x7lJNUQ(rqCGJ5|MX0xqYN;JCQM?jfBMj&z<_AQp)wK@uP7GSYL&XAxgSdUlvQC;T<3|1(#I0Ho(3Jztf| zfqNC{&yju&>2=I~9cl6Z_sQQRE+8&MTKymCMS>)YiEksl1nGB>R`aK_Oo=>WmR^qZ zyHr-FQd!-5AyM;Z?keJH;u<}*Pp{Q1CF_;wN;eQcKzd`SY(n}&iXRa-6FD@b>Hq01 zVdSUG`Yc@UR-|`O`GUwHApI5jHl)8M`G)u{@jF53AxM9Z^bbh?jP#G%VO04^iOgQo z+nM|&NLHq8>76XT3+dfjgKovINbe!}EmZVph4ddt??rk)x%6%Ne|n$B@Jb_fc{^gT z|3m*z{|l=cEVXo4ARaq^iCtlJgVkO2p#HbE!#X#ziz9{A16EI1y9);L%n0(Q<=o6y--LAwtUF-c%G}#v-L5w`H}uh%#X(=alUa9BSxG*LI2qOySP#Iu z2iASC?$rRfZzvN3c{Iqn|37{BLH(iWRzJjoe07rbh{o$ad=%DWu%6IC!Qw&T4INld z2KO%*^Az!ESkI6=E6+f}lCn`)&%v4jYdS3X_|80ig`oT!y0z@s7huig6QuIC!wFOj zSYqiWtTe2ch_K?s1Op_Qgp~@oRwbq6t&)}vYZk1GR0}H$tH>e_(S_v&k+5=9@~{e8 zP!{>igH@vF2MVlmpzHrzwdUE}mN~HACYcLM{U261|F`BbsY3v)SBS5|dQAxV>#*Jk zIsM;SKz$)B^&fH_0$?rH{}?J+0_%5JOJRKnYZ^Vb;R|0#244Cn5wlA)`yYVjbLqx{INQ+TDs^*`tiQi*C=XZ zKIXbUA#Q>7DamKV&xu=MeNFNO@k`=Y#BK5@7s)roZv{i;dshAfte;7Kg!Pk<$}M|K zY+*O7UtsMBe%FlI32T?e{4eZR>U&^S{9lU0`U7^b8}~BzPvT#&_QCpxd_OEbS=5MR{Ypz|L$RWViFxWMN87Ax_4q06bcCABd-3a?geAEbb zZLIhb_EDJM5q2HS8UVX4asy#U;IxNbg^UHe9_$^k>%+c;wKag<5OycnN5ei2b|Z?7 zVK*ab0=p>*&EHn@*Ja4Nx=Xb&$HVSO(j4{)uv?SU|LqpATf#nxN~_9PV4o~WU4k1N z_9@J51G{aY!){0ARM_o9d8+Czh%8~LTMldy+{rPTjn2RrsM@{zDd!KOLeqp6G`UQWCM_E^~0 zkY5S=D%kSme|s6fV2^`6UI)9uQz8pZ31G~%u&;wXA&j{m_Qe0jz?P15A0u@XfPFLZ z7TCAK=7?tB2K#o{cZ48OJ+BWPA>@w^ubq96>dkO6KC`t>L!Cp?T{x7Btdj;%wxjAp}WV0@8 zo?O@~VXuL`3ifIl5%lh}ECaT|UJHAjp3lnNx8Q*&djssPus?vk8TLllAF}>UT7Pif zZGWU(W&-xdus?3~zM;cG=m5X`hwns2JY*L#9boT9MojWo zWNO3SgG?>hzaeutZ27qzfc*#TzhLi${ipUHsZAC+_p$fE-XAEi{}vJUKS37xzsMY_ zVVP<~jvyHw0xCr^)sd-zOig4CJ17QOT0C=viox)mk!j=#iboOaXqLus{-24ES8*-% zkg2bg=z1F<(=gx+Xhdv`3~fKtq_R&k#~^bGGRNw^$~0rlaYUW`lQc)>1QMEmrUiLR zVk_cF#ESnTqa%g%d1Trs(RQ{)M$Mo6RAPIg&i|3&5Rf@T53VLd|IeJoWJhE=2_f%H zRR3pdyCO3XnQq9anIqF3nRAfoMXvsjOb=vwYOwP2l;}39|A+hnWa#;sKEd8#!qLgoQv1|xGFGDDEL5}Bb4To?qm4Qavb`3JusuGOanF+|; zh|KkD$wbvP<_4W3DY=PwGcuErxrKYg70H(bLM6=*Xf|(~R&0GS7wjbYz|n`3z)U2>bs`{tBW*gJ=?C$i#){QmHv9 z1ep{ut)f_Z#zr=cOa|GbkjWzRJu(h5FCyb2Q%1&Pa4xc9FG(I5Z7q2bnG%VwO69oB zQr@JB`fTDHWZpw&E;8~y=Dvx{ zGGrF$!PSnv5Sh1vNMsfvvpD2$Gj|CxOI2Yom3N5Ci7SYl`)SSZBg6T2W+hj&intn? zHOOoxUrSs^T#w8Kk`IU*1xYp`^I^z8lKMmbF*2VpU`wcc%H(Ird>$%WseD2FQbpas zZOD8})sR)^ z*WBPmu6`S(<;g3fX4J)`BNTk1Xvy+ZWlZCx3#vZrv3ZNi${3PH9VvNZo} zdnVQVN$CICGmz!{Kdb(ateU?ry3$U_cB9xC*)FX4>>wA}uHkO%j%_y1-MfPHO zQ-o#-$}1zX{q*G(N(LZ1nrj(I97G(9>=2Tn#7l^m5{D6o6Gsp)BaS4F5{%5-rl^}d zhIl#g3S_0J_9`Ld+JSkD#xtoW2qYW=^w>>6mVTbS9@&Y=-Vo_U2hQFYM&5+% z%^|-9*;|ploi*I1q8>*M0Tq51viBi-cbGMak&}_-AgFEDApqHX!|rrHvXXoN*{6|x zkXgan>Hpb>wH}Rs1ldPJ{ur|A|J0u#K8Y;-Un6yl(BF>oXNb>+N%enZrxVrxk)1(& zfjCo;B#Nv-ViIG-I58nel0;U`Ul%#U%38=SM%G5Qh-?N~moZsn9SsPkWLfop>N#Zd zBn7o25p^HZ|Fi1<$d-|P9obpPzKraP8ld8AWaor@F0wBLoMq>Q`g~+{{*Uad#Mde@ za*-|jMi}!ZvJ05IFjVCC!vFvB%^t|UjqI1mE6a1*bNgBZcd-%ZGDRKmr9$T{v?6ryiWD|HRb)e`6ZLIa(Arjlxom;WYVQj5gyK zI5dCdI=zH*92}kh!)Y!^qC)_j6NxS0v?OT-=On#f$(Vq^X$|L;K!MYSVe0>Kx(!GD zUl-|h&S`LW!#N%9a5!hc`5I0KICsH06V609XTiAyPDeNcSVJdbXEi;BT;am&nN;u=-Tt(&TAckef2OQ2dN-9OJ zW7q^ZI#CRCI5#l_xrzK{IJZQWH4Q)MLVl z!BO)+_-loeWLOGL5sps&;aEf)j+#8244f>91IImBP!x(eqVyKd|AV2*q5nJbgPjAX z%z#;8{EKjAE9bK-%$iHoApp+HaOnSmx2W<89QA)55gh{HyiU|10FHKV9kZN;OuhwY z8JtDri-~U&mk5%`69^M^PUXC#igtkIa5(vQIQduQJvi^{p;x|=xC+kdP+0?KEyZ=j z_1ewo+pJ%Q05}`rY=ZL@99{@=KBBl;*QmK46F*_M-vZ}TIG@A$Om}Q$@5#eI%Hezg z=gUA0v$km^+OTin0?xN^SzH)r&tGAe-YJ0{2|F zhr&GvZgsdP!>s|gDcr;0Hh^0bZf%)Y!#$jM1l(G1kJM|7GTA1=Jqm6;xOL!07*jXM zf?M^UnEJ|D1a3pPjfKNK8g8S5x?H=1+eEM6EqVj)F>qVLJr?fqaGU8hO!qk6g5*rV zmBs}kxVhxQ z75_gI?ip}9NMkDXXsgcR-s=dr3me%9ZfD&IvTEt=?%8nF_ThH@kJ!D!>4$K8z`Yo5 zPq=;HhW_vNg4rY85xq>(r?v+BS+B%V? z8Ms%&wc(C~doSGaaB1eQo&vzV7VdQ<6NuLnClYTU-Y8h@Jw(-)K6Ro?lQP8+y!twxGyuF{_pY>z?Gw13=5Xv z`dXD%BG3N|&Vu_Q$?Q;{19vW!msF8okcQ2J`zqY|to#+NZK-Y=+}GgJ^WE1g=O8Z4 zzmiM;ci+-@4dxKw>Lnn!Z^KU5kbDOBE0WKN zTj72|@}*!fg2UYgcRSp#;nL^bZ{U8bx!P0?0rECfp5b1h_v7C;5fq4&qJ~ zHJ;;_l3(EshPwxz*w=6Hn!^>V`4cY9-`%V69O>Zx1y3A%AH2G7_rn9+zu{Gb`%f_M zf_nh&zd^7fOGy^IL*N}+iSepasR8e>P^k&;aEeESN-ZXjB-Vy^6iFS;mHCxc7$H{4 zD&W;4*4NyionAwD&EOpkuQ9wvDh4gl;3n{zvg|QIJUqPxK;<~%@&AjLo#UOL`^q~J zUJD&Dy_WD!){f-0f_IW0AYDf2PWI%30zxFK4ZJhpwPnF}#8cs&rV}}@z0S~-oUT`! z<%)6eD6iK6-kI<&gm)IaKJYriQ@e)ONnaf2b%xi4$+L-F1xdQW>mKrR;GIjc2eD_U zp9im(@?c&nfBEswX9F$>R;^jOTP_OYFNUY)FAKbW@cQd-)06A}f&<~v`45il-Vk_i z!5a$iet4I_yAR%_@a~2;4BoBqhQk{VPbwb+?=pC!;EfDw<{H)i^))h;bzKhc3V2t- z8~dM_tAxY58s50d#rewKlbw7Myldf2gh&7PCa_NRe_iCRv?u$G<}Vk5Z`_tgL4aa{0zfT!k9 z2k!uj@4XGcETqBak#3n&5D?EnEv3jhf8|0c1k0TyWY%UmSJ_WfGk?Vw9 z3*_3dNK53jKaih<+{q-ZL**3Y+Jsz(fS{?!or;{c8M)Jlr-w0TFxdgQGehMpDjmau zokP6~^|O)d8YebSPT&8DoPPfc zxjTt>5$_hPeEmnWCL=ecs(PKs74iixN#2XxBgox{+*IW5NA3X)mX?f{L;0YrE=VFL zT}!_IrR$Zdkb4xl$B}zXlk({St>+0PvdA~fa?_B@Aomn<269g$_Z)K1ASeIVllq^n z)F}mR>5$WrdjUBqGDEA9&6j0>Y}ZWWqW@F0eiOMQD~}-;M=l{@8Zhrvu04gEja(Wz zOBGfUWXZN5mqo6OoP%6WvXFDRd*%KAS{%7NawX&n$QAXwPWFibA}8&?WC3z} zkW>Fh?k(aX;$q~)oZm){ZlBX30J){eEhAC$Cs|&(j*)veRNh05=CAQ9ky{n&Is_oM z2D!DNvM#vJhTI0^=)k!TklTpdSB%_*+=s}iy(6bX0CJm&9}_^UwW&+|S5`{-66P*g8gX2*~jiAh!d#ofK*Qx!qx% zoQBE2NOCm)oSHww=UXUmy9_ z$TvW~ImssD-L5Rg9|`7@9|o4Fl`XCklWPu`K( ziKs&W@?8Y={372~i7NE}e0TD5kXQdF?}5DfKlypc_af;{JfC<0u@CV=L6VCqBTl|A z^23qmV3F@1=BocAKM?srB!h`Vh(n2?|K~47p8g*^BbS%MeGl@NAwL=Uk;vbI{3ync zM*arm#~^>XUM`b!qCCw%KURBD{z|>Rl)p-!AyjfT^5a52o{H=T`SX`#T}PZiyq-8w zP?oBu-ywe^@;7sJH_1!q^aM>dR!)NQw<3Qh_1loY9eKU-uUWjRK>aS_-N;W;T^8-P zQv$-Qdy#(&`TLN61o``spGxro;)9jibdNnm<>AWJjQpd>mymyq;^V|8h)*Iv9rJqELKViJZ&ipGE#TDwS@gdT;?G|2*(RKb$;v>%oc=BbgcNX$5 zBL5QkY~mc`=W4LLD_c;T^fL1ELOx%K?(J8Rf1SCng~}UY%$vwBVAjGwVf-TG-$i~g z^|y&M|NK(qS1`E@`FDbN zk*E3VdiPNIjVPDjo0IHCX)N-8qHr$qf1z+F^82Xo7bN)`d78i0aDWPjfI>Cp1)y+9 z5UKB)E>uV1L=a8Su(}C>({t@hH?mLA@G!`HqI<6g#hxf8Q8*99DinI5@Gc6y zQJ93n`6%3k!UZUdL7@){gHZ_mzi<%?UQFzZLO-og*Qi4P3Ik9WNTU9)3%wMDAtY znkDx{3fG|^=Ks4U`Byj;CNkg#;*F}yBLCCTt+<(Z3-MOsZ7AF>g!~Q^?hN@|RPGL2 zI2nZ!3R6&clKMTwdx`fE??-{=Uw9CON2yFD(*FzmjTasXUL$}4{lD-y1JwU@k-L+H zX(*&ocnXCXC_EkLC_ID0vy2QH`CO<^r}(^@ux^@~KgmoKq9Hd>p!pYKp%Q0I0)=F# zq{2gKg^Gf0#HBEE>i>@ac;3iN-? zeF=q^8KC};!hGT@VdSepofJ716y6|z6NLpN>i;OnuA|i#7BRUPg|~$Sw?(KdMPV69 z#s6iKQCOidvS=@Q4~4xbypO^+D6C}UDil5^SxsDn!djAbC~PL7{}(ope}KY9A>^Bg z9}+*R^h|B!$0&S4af=|yrzm_D@UWY0rTzu+OX623g#KUnS|8G=l>HWk??V1PBY!}F z=CAAe35B0gP-917I|{#$>@ zOHmvqL>IaLTO2`Aj`E!-jzsY$6i1;LG<7tJV}eK&FGukTMvg_1ZeP5T$*Y3xA|FQ_ zA3Vc=;L^#9@=m9AdA3&p7@-W|qI zV%TI9r-aHqDBer)KH~kM{s5B?R&K}^)%>YEjN&6CIy8_xhT`J^*PmhWNfc*NpN8U7 zVa(GgK11XG3B{K~ zK999K{vX-$ii^itmxXAH<-zlF3!X)#1@x%j7!ZdO;H1SQI}%abu{c|Fg{> zF>5o5pQHFOx%xlJ7UHMG&s3BXs3Oh3Nb@g#iQ;$6{R+ix8lY?Wn)nUzTNQ%|Pw{&c zf1voIiW>P7ia&>ZJBq(h+z~1}!+yRSB{9!mQT&?$dx#tYiW~xpIs~A&m-r`&e+ePq zhvNQ#SEe7ue^5MtQcV=q|23vm4JD8qLOhgMU67;(@vzD!ln!U|2x2Wkk|R;lVTJrC zVjW^#lp-Wmg1X2RgHnBz2BFjdrBhI9$lRk*Iv%A)K@3WbQEEcHsrD=BRHb8x#}b^2terslujgRL2OBEMLbE6g#KS@tx0W38I*K@&I0mK5LtTde>6|ECiSitju7Y0+rK|P4rZf(vJWAtHnu*di zC`l#PqBIqy>rlEKr3onAz}l`yX`+1bO6$>5H&VO_rCU+D86|aoeRVDWtA)~SL0II3 z4k+Eh$UBL5sjlt38>LAklZjJ^_Ym(zNzGs9?IrbplxY5?2Ln-2MY)qGl|M{;g!m}& zG2-JWJt2hrNtC9MJVksu)SqGUSxw5dpwe?FJ&)3KtzVR-t+|;qi24Z_t~82Lio`(4 zL@6nzhf)lsI7$gMz~HZH!TUF~k!h4NC|P>#LOzIAvXw|xtqwye%X%D?TwS9E^ZUQ0 zoF;V-7f{-TQW2%OD3!Q3e3Z&TOBg>3r5ClST6Q*z%!!=ojx#Mg+g6W>7T1C-uGiN;=1|3_&dN^%GmqqInp6+0@a|LY>p+Le}~vR7G3(dbo^OqWy4`actD1CvFzWIU4uOjO& z(T~K+KbYkJhFf3)Jr@3KH`3q`0^iB{z2&g#eXX?el<<{ARZDK ztZzh-jt9Rw{2K6U>Kc7^GbQwYU;SSi#;hYzz7l?I_zmIH{QWxA>uQV^iNII?hhHyL z>cekPc`>!Tt=c~teslPZ!raCT<`CdFg?|i_$HG63q?v|QR?SC%wB{4wcY=Q+{IeL- z0)9*Qr^9arzYYA8;J1da=C6zV#QanK!`s4d55FCJHUEmG%jn>rR*9j>!{-p-cYv?{ ze=rh$$FMP-;rD>wCCG(;HvF#eyGs&&H~nuoOTp(5;GY{DK|Q#BPx$Add?@^0@Lz)8 z8~$YY=ffWhUmyN~-v|B>_!q(-0RJNR{or2=zpuWIQeVhcLr;9P!Tm#`<_~`meEBhkq&jVfrczc|o7VNDY-rBy2SNk?=?H?LZ%Du5Q8@_?N34Rl=^& zb3@^pB}ZTU{}%XH!=C_u9OQe2y1Mc3uhFnd4c95*y5L_A|3>%|;pm`6a1T% z%ZpDdk+;IX6aH=RZx7l7{|;tt6@-761jD}@{v_QMETZqx^{2p(!l(cH_riZ1{(bNt zfqy^zhu}W||G`Sbw34aex*k@MZ?uE|DC>Vrvx2v<`cJ@@jeQdS)9|Okf9l}gU>lx+ z|LnmHq4FI38LVVFe0lqj{4q!O82lID%Rhg)TPljd-DtwM;m6>o;Kx}o0Y9k)5B4`L zo@SP%4bx->ehGdSeh$6^-&LKJ!}s*nzVh}(KM%hMzo1nGxzcm=0QvA=gkOd~i`#On zZo9nM&z}unCjTF5-;h69`*VX*@Lz_%68=2+@4=`4`>()X0RPo6;5GQK!+(>NzftL0 zm3A(K|F(p|7pqwWUtaz%UG89aS^|GL{H5@hX;s`;@ZSl^3i$8-r}47Y?^pJTZpAA2 zU%_9^eYghxX83F2Z-Ory{sH{;QV{+I-6v8ldm8+W!CK%;dp=UG&-m%if&Ve%KY{-_ z{4MZ5;|}?>Qe5_r?vSnUztDK?X$o*e}w-- zup&iSwEaKB-wS^`{5|l0fxlC9_&c-)CA;A7)<{WeRlf#0vwkD~PW&U>G%4~A{J-Gu z(^7gg_rw2NOGzWS6W|{}`4IU3qFha5q}nnxfNKm8Ga$~950kMiNV zy7Cby*G0J&%11G&zh9JVhqcvFQmHwDay_o1Dp-41e*=`8q1+JV#wZ`n`Wqc=0Lo2J zK8B^5N|x%{0O_B45K%r3bBfxLP(BgmmLx4y75r0Ud;(d?w0gg=IUUtTX@0>NL0u$~{m% z8|CgOcSX5dC6{}HwVlJ7&lO~{CzI!CSY@TXQSOVfo**#b0wPZV$~*-qUxYH}|CRRl zLwN+s{ZSsu$N?x1L|Lc(C=b%L$X(R(5J~DUx>6@k0m_#$W*BjJun8z%hVmGcb^edC zPX0;swr|KUM_DKTD34X8vK3dM{1nPpqdX1eaVYDD-BBKo@->yaC*^BVzK&w}{rB?q zm0K<48&IB#@{K6pfpYl$_p&|$gz_yY>+?V4x1r4M{|5gXE%W)GGN1n`^Z6f*pTx+? zC{H1|hj_0b$$co_A98&P2;~O_t4^sx`JqsM80AM$ejMdT8Nla%Drc6likhkzECJ$9Euh9 z;uPmU&&{Uvcg~)B?%d~@$t0WHnPijf_2jN5ce6IgHNtDjr5kOGCD?|#j+{%oQTzrI z-F-5-n~bDCB;{@)_c*y*$vr^sHgflpyPe#fZ~kQ*TP9Jwd5 zx=)g``9Ha*$c-oWbgG*J=bj<=Z112;FB9d=|LtR|_98h=`*ZdPSgMnIncOQGf0f*8 z8Be`Mqkt{zE%NRFf1A8BiizZYacShhEu=Z?oO$$e!Z8v*B$t9(Q5Tk{z=5@|3Z_Z_(($$d{w z{_kGX|hDXA-^M~gUOGgI3szt;x~}rnf$Kgcd-O*dGfod*6!pl5ZQzL|Hz*} z-hIV~OVJRJw;_Q1K7CJ*B|n<{z9Rbx_ZJ=@JkX)YLF5n4_#sjbC4X3|*rN^ZDT(|M z)a=Z_XYhWv3N$J$-%I#VglD~%hMSb-K`HTDBa^KD+9u*Nd6D<2=e1W`AzL+T`>1Cn(KVK2AT7q7FNIoEM{x7{ItP3My>@dsB z{6C+N*E@gm?cPl_`7U{9x%U1a@=sXzj66wx9Ql{XKc!;!{BM4|iqDYO!@v3GRJ7-R z$-f}9m;X58ko*KGFAMb&(fq3xvgFr>n#x35|yJ%K>1I|>;0cr>$9|3@?Y2nv5H@kw;_Q1*TQcy{af;rrFpAqAO# zVT8n$DXb;33WZf25nqi$@A?mgHKeR*A@{3LVeKqO{$E&E(e)^p`HOFmj@RNFQ851( z--JSM{!d{u3NrsfHvcbZ{$JRtH&R=-x1k{OFW6{qANS^pg84s%k-{BQox&&zJ4xAD zX#P(@lmCMGzlyt4*n`486#hqHFDdRMYj76TDS(O;Ml0&B0$G&8{uGX&aDe!M6b_+a z7xO6`oE{nuDI98tL*XzAhxhq5Y}qG$by(p@3P)Md5{`D*=euqkOW_O($Els;DVX6? zIDx{6mZ|v-ZVC@dxrf5N6z->R zpDS9jL(6<1EmC-h!dO*#IE_+}{}<%{=^ej?$1P+_$x+CsJgZ)mUZPMI@hCJYR4CLb zR4IfMe9N~TFX;U;Sg57M(DaBxEYe67wbP=|rjVp{rF4Wg|4&5-|67}%N%>spE&-+0zsfQ-1Qgsx z`&J2)h4TM`JBWUw@B@V(?RszTvc^mlex~q?&5qo%Qqh(&g~D%Ho4-@|gQ7F@KQrYo zHLD?@@DGK5DPl)oaXLHt(mofbw@I3~LNifZlH$x1`>k$q7K*cGnX^fmo#Gr6=QJ_B zf4(>u#km!lC(G6tt~DJ-@nDL> z6&gWtTZ$`F+=${T6xXJ>D#bMvT8(1Q|9dCz#Wg9~Fp(A4p}0Q9b<>t9t~X7{ZGjC_ z-6d1pnBo=`H*pF@^M8t)QQSOjCu>dSU))O3ttoEPi)wKcx1+cl#qBAMQi6tn;z)`+ zy5iJKiaSxRp*QoPJsn0f`Qc!kogq|NqDKMwsLh)9S+bG^e@pkb$vYb1O)P_^MJ5%nVcyG%4o^w0W{aVTc!UrjqDcby> zqM1L%u?|Hv1QZ{o_*kac5I`|UF)vcc^rDI-E2ft(ik_4T#j1#JA*&lu3{##Rm34{{ z#WyL&?tIElsfzB?%y^4pLh)IO?M&$?rz;!~J|TQkI8OK!#ivEaI}~}wZtu6opA$YW ze1YN{A}>;WNo0cXWrrfK2w$c6TBf|7wqr&2Hp}8$6u+kUHpP!A%Kyz+-l1szul0S8 z;`km5(_^uR=SN?81aqS-sePi=Bo{7m?{@C)IW4lP+OMDZJnlPQ}2 z_boD=D$4(h-Z{GXIj9zY+!s7Z5HeT!_-bj)*Tp$^2h@FeMEE>FlMnIHlo~mdK(@ zDrYH5OJ~YZDa#0#6)q=Sp3(}Ah_6V=1_<$C={G`Ygo-N*R}rr2P-Hbq=Kqv59F%PG zPs#kB(%Qmx9Ez+fT#wTFA{z)Z|99tQrHv`=C~*_vrj#~wM0|7M7L?@wrL9!lI*V?j z;9ZTuBOh2B|2}+RpmvlN%I$6poS&sa_becr-e@bUivK=^`$xt%?r*w|+T;X{Z zHSv5(7l@eui(DkUn3DNFrAssYG8HeUWack^C8ev3YraJ38cJR1*9y~|G2+)zx?bc4 zO7~H^k2Zf5IZEdL_DS8oRHRf=s7xtx-zg=JQbkHt z=v%Ti5>N_7YMD|uVpU@4jZAOi-fG*cl_=B}c1*PV0TrL1^f{#`DZNZ-oP}&DPYIu< zG+yKx;j_Z$gwG3K5WeV8I}Yn0xi^tzNcEXOwWo3=@Nb>CKK zBBggk-p%y)C~5XyGXJMEN%&zJP48);^f9GRviwh#VE!-iMW%nL;#b12DSeaa-%^^K z@$V>ouY@0jKMH@!qCaO})~{4&rZk1};go)(yb`6~DbKEC4FRP;DgBkz`dj)xl>RkR zp01~tp*(%YXP`V|#%EI6%#>%zlvydyX55{RSPOGdo>yc}%5!Bob4!^=*hjhF^oeg~ z(fKIPPkAxQgOspMdRr&nB`%V_oh6Y@^+N%n{pq@D^p&D@`mE83Re@ZE?k51nj&jC z6j__H`9Ecue|bG|`G0wXG{=2qls8H_<&7zClJQL`Z>D^ie|Zb>ErnYN&HpKHBiz=Z zJ#%eJ=Ktj#R2)fpM~hlW{$G~=mv@%3i*Q%U^8fPgS>_&;|EJKNLivCCj6-=J$_Gds zE!i&eaY@}-$_8Rg3*USW#*1r6AItdTQgW2@B85yZQa1mWSQdJeDP~N|__lB&W%+;kU00Oy9_9B%KFE|wDt<`Wde}G7 z(xiMs`BRb4gr8^n7k&DlR?1&d{!^i^DW|>qR>jG}?}XnA?YpD=qeGFOgg*;^5&lYf zipX!m--UlTO#fw1#lI;3E%J}>Un(Q;ro%fP54@#J^rpv~0Z)eP&4@P>-kf+dD>Mt9 z**@N^4sE#fW>;|zEB2JR@aDyv8?O&WYuc<%n65su@{mnrk(4f?-13*s%LoQ3fQ zi!35sG)==>3~vc3LxhWGZ7yjEy*@0Bw=$mjKi)EUD~K$Mx17lGmZnSxaY$!qj7Z9z5!;H{0f4&J)cwjfX1Kebnm;2nr} zB;G-IhvFTqWb=RfxZm!*!%~iSxI#x{?Hq-7jFh7-!P+@C%RH|4RJ(Tq6}KOrh*!ls z3GY_ClkqOYI|c7Nyi@Vc!8;A_OguAxwRT3<+F5vKPuovL&&`&8KHf!m7f3Y!pPGqx zG2SJ3GJkC=_3d)JtMTOjwz;lU#jCQ`uEDzr?^?X;@m%yeyfOBON?N_QcKQo2t9xU* zIJ}#Um~u;|+=ll6-tBmI6!m~_u=*YU;TU#uYmUu-s5-=<2`~m zHf=mbyhm02v8=V6>9(MJmQYl&gy)Hv|68(sL6xkQkM}lSfHw{=#B1Tz@M7iHg;AO* z-VipYQ4+j1-T+<)&&p`t7c_Q8qc<($4Z@+sa|TFPg5pW}TowIbe^DaZR7?_0cYtf*%3CgXjNXZ}BR zDURU%i1#<%Pk6uM{fsvS&uy+>|4Y-(hUac89pOYg^MAZQRrjx{X?XuoK_NE;O!uE& znclej3Mw;9T`rZGsLV`d0V=alnTyJ-mgAbO%tmE)Dszf!2+%@pS(Uk|%uB`mpGu#w z-=TdhYW`1Uekz&yr@gH#NM$IMg{Uk+Wnn7v|BC#-V$Xl2El^pEip;;VxGCC6s4S^A zZ3q)t+DNb2WvDDmWd$no|H|^Ft2HVsQZe&auZB?>o>s{!u1w`aDyvYrn#!tF4x_Rf zm2Ii4PGtisYfxE7%UV;o7L~Po3r%0gQL#~g%6e4H{L>JX4XJEOWg~?)PIW4qWJ}zP z%2o<(PDTE2n`_IouJo;i+hqCMQ87QKvOSd@sO&^#B$ZK8c68WV9rxT>#r$8o`wN(( zM0TUHKb767$nYzBNc^9r*+TcCvM-grsf?DcBhkJ7x)Zx2x z-Ek2pUNXb zGk=lCj93dfD)RYCo=SmAiApieQM8<?;(-4)A%6KX@D(2)=>Qo{sO>vC~ zl}5HkEh=s4NmjR$5{U!Gt%WD3JW1s#@p0K6`*a#rub!de_UdP;yh`OcDlbyW%)esu z|7>wDQJFx+JfF(TQ}rzR8kN@-dShyc%3D(2rt+@HL@Mu06Mc`$2UOmlMww*1wx@U6INs!cT>tS%Qh5Q_&D$-29)4jSg9VzM=9hmEWjLrt%{d^M5MeTY`}vvb3L6 z{5jLzUSvZ6l_{y>(y07SWbpCQ#JFaIw#d3ROh0)7}dF{&PR0~s(p42KI%8B{YKow2-SJ}zB|Zq zs`FDFWY3!zUx4a@8DEI%!u`XB_QelUT}07EsSfTRwp#zNP22?pYbX8P*1h+&x;WJ( zs18*JGz3&_2%swecfUebmvO&HQeBqna=jlktIJbeVd~G6N?wWT`c#LB4;PLQu1s}p zs;f|4UBy*}t2wl%2&-$TxF*%L(!V3`n|P9iZ0Q;os`CHpdRhJk3fcUh>P99$`J?zI zR8Ob6Db-O_H#6N5HWzL|b<0fIO3Kz$x1qY7__n=2k*{vA;tpA+&Ht(H*gtGX5x05w zrfU9Abr<2T!rdH->@Jl5SIz&a?n!m8H0u70o~oHY)zMT>q`EKFBdP9}Myc*k)%;%x z2U0yqJcf|-gT73qqFESDjrMqI1%~3E&7CPU8Zi~lc}DfoKv&9 zr`b&=mV5@)FQ}fG>1R81GUwW^-3?-=pxs9rB}gF}%Usoo@F{!jImOxF-l zwIP7&?Y%p7tMdQqT~yzodN);fT--zTKIPnNS1;`dx}WL;b_1%rS2i8rs}E5fp!zV? z64kNRlzZJoRYO4aQK~Y3Tgu~VCnwBPEjS`xG-6fCR3oZhrdJfLQuRfGOb@Bnq|{C6 zZ3;7gi4CeY9Ei85CK+#2?MSqN!#?gdTIxX+i%eB5^MEE;Y(B}*hO+vUKYM0e3j~Jnf|&F`zqg5v-1Dy+gZyKslL;@@2mPQ z)%P;}eIP|f_m`WMx|CH^Cn`TNuLGJQ<+ zr^lZmRcycVXTqNce`bX;|MzFbpDn93JN_Js&MBNrIJd*}m{qY4zaM`|{CQnb%6$0q z8y_+w{vhE3!Ugdc5?NTdh;UKiVBum8MTX!np7AA&e0n4PQuwRjFP$xADE>12!$#vT zi$4s1Is6szm&aeh?qGCBM0zK@zfziS--|ySe`Wj;reybf*bd{bimy??w@3SXKiT_h zWMnNmx8tu(<0SlbsDF*WF10!F*CTXw*C)IIe*^sO@y-9;2Y(~{jq$e--vobCk<9=7 z&3kUf_{XGd>XfFcy&F+o=82&!^X4?2}OYVz*5We|8{{F%PtU)Utn9eKk56%<~0sf)* z=KuJIr@Bpm{UhH6ty2tfq^8N{`dt#=alr7~H>6!ogr&)rV zvG`};Uxa@q{yF$(Dd+68uA=ASUm)>36>SK}8oV&&_!r|}fqx19W%!p`bn1D5f4SwP zrx^Z~_*YF+{Tlqc@UO+c8Q-m}`^LxMUpGzN>r-cTRq)-udXv?4AKMzY;Jf`t=I@*N zXI;7@&B3=Jz=`;G<3EId5B~l5_c{^(zNz^tK7jwADZTuMC5}xM{6|!LG+Two@ju7U z;XjL?$Bz^(;1}_$_$3v~_%eT6x|x60Hy=O5@A<#_X8x}#8Uido#vj0M;J5MZ;t#$% z9Ay6KCN-s#)#_#~KY_37Kel$`@W(puur;ZMYW9{)A`7w}(JA6~?N zNo2y*iukXjweVj}Mf}$@!T$*VUHlL5&HwSu{IlLp%3Am^ zQ$EK3Olk6e-~8V~T4nq%@c&TM4FO-_|9~&^_rJlPj4%K1WqzkL&HsDKkNCgfoB!jR z`P;{ODD(HH;G6kN>G^-Q&_D72A^>0h@0?i2?zx6PfpI~8vK?DmD zEYMp}+N)rptmQ>axBe`eDT@&dB^W}mr1Zsw?vJ``CMmA@f8d_~9iief1S=3Mn?;wC zxV#mu4=ZN64FLqb`+vk;bY+5d2v#9jlVDYes}ZcBimRvXXG>X2(X}1+bZc#0g7r*E zuPB_#tIFjIG0!NM~IGVt0 zpWqmWy$gE5anpRKClH)S&~tvvv7Vnoa5llI1ZNP){H=x4E$XhT1ZNsC<*ZCOhv0lE z=L*gLMJ})e_px4GL~t#^#ROL|}NJ^$spbWNH=;FO!C zk0H2@;0E#Q)2R531UK2w_q{&cLU0>_`G2O^{Xc1uK=c3LE`l<_-2{&i+(Ymn!Mz0c z6WljV<^xtmjSxKK2*JYyV^bw-`B8#`LXQzVPLL#ONCwPtEZGzWbh~N#i_9nqwy;{As zm`Lz0!8<0ZH3IYhjDJAzk>doDgqi;bAFKFDnkN1k!IvVR6MQj^{uRNu1m^#Wev|cc zGQkf7-w|Zy-|NqhsynZee;H!|AMUh|shO_qi8P2ZI9E9@{&Ph0rigOXpZOQJF zo{ENjg#A`b*CMn*!F>qlCmb}5z98WqgbNXFMz}EHGKA*;go_d`ML3vHZXYg2I3#T$ zYj6pr*@&R-Ev@3vv?#tT;RuoC2$v^ZiExG96e!dXU@J9D3B#wUwKCyGgsTv)MYt;A z8cJAAxcW3{YZ`a|H5sl==qCK@5U!hctcSJ=?i64HLigs+|5>v8IJXJS{|Pq{Zfat0 z`)n>{3&N3vTM}+ZxRsQx3AZKG#sBm>>g8{*=zsoCxFg{%grlVIB;46y)_%|b33nsh z-Sq!L|0CR!@KnOR2#+A#n{a=^ebOAl(S-XF%KWnq5FS8yDB*#G2NNDNO;d;TT6S(6 z%KXE_O-U!u;gN*L5gwJbe6%Bk#}L{;koEI;i6;=AM0ld<=?{XIc`~8R|Fg`~2rnW$ zo$x%uGYHQn%=|x;|GWQCwp!;9n)zq7G#rE%m}1cjGyP)1D+w==cq!rKgqNi`S%QrY zjuT!*c&*ap|KT-Rf@^I|#;+s1KIK`h8&%~dLZ9$v!dv=wuq{J)E8&BLw-MgnH`JC$ zcn6_bI^ms!cM;wzemCJgj@ZXtwFvJ^IpO`OV(9+UIef_8!(ilL!m)&9!bb>mgpU$F zPWYI85j(plE04DMN%u9vJYlha*ja=HhkXO?a4y;L+ZbzCJ4269FaNa8RMRD9Uu8fT z62^oz!pMaP>vl%Du>IwqiVa~iEjlDj2!AJR6Uy7e4q;b0?jU+nH74Z_bP zzA3a(fbea?i6Z9zgzpl5C}KkZ;rqf5gp(ZFRf15%K`8$ZKT+sYyRFN0!=cssoKXJX z%m0e-8|n56IFWA&e-N20{7(3N`Ut%EkA$`}i~mgci}B{dhPGj+5cd4PZ-_f8ZD>&D zpTfTg&Hu&!5&mmfn~oYH(+g*CC^DmPCTcT_XdtM~DsHC$)Xe`y<}l*!X|K&i{ZMLi zQwwo7YSwP0)<Tx*-VBDF23ZBK1WC2u9%I;*=4wQV!Loe_7Pwr2iMZ6vi_M0TWR z{x7Z}pyuZPO189JsqL0UZ3v*YhZRSDL``p4s_jMX5NdlXw2yE!wF5-<71}63ZGVTo zQNDH{HTl2k2b=ER*;qT&h$)9rlgrhPpeDDk9VuNyKsqSYj*+4v;N`8T9ZyZ}T024d ziPTP_c0RR}shvs9{GZyX4n+C|J`w6UOuYjX= zgYZUbH;LTrP~;XPw*7CTmZx^R8o7hoy&`uC@1l0M$UP42WBcBH)b6*P)B5lLHMb`` zDE?5IL+xQ|V;%1wmiGM7On;2p;~CExX^f>-$dn?rlG-m@?RDvI zWXGV)zxH;PKT*+lsJ$!lUZ%fK?E~ZKM95a^Lu&H>+Q-WLMEI%jGt0D`&xKzId(VGS z`&z|ssLxLATWWt%n@sH&YG(clxeaB5g7}ZZpQ!zuDp|KR|F2C^)a_=!i~J${(=z|- z=ik)+p`LpCztpF*sOwu@LqL6c>N8Bur#@2_otgS98K0H9`G1;5eGcmLQJ*u5&gBU8 zxrOrx`>6MenE%^HouNKI^+D3*|5j^3>N0=h3sYZYn&iRM*QdUi@`q4gmHOh;m#4mj zMKfIDa#qA;&9;z;mX2Q9A_%PYU*CiJXzJ!6()XmkSH}0I zZvJnd)MV=WQs0mI!PL$CsUILbFwLQU(9|v5do{7;97erM{c!3xQa^(F1=NqEem-?G zf9gjIj}aa#JkFuW@k053{Y3GTsGm&zOzQIgy7@nKnScFsahboXZrl7UDKh{1IgYD% zu24fjdQiCaaxdzsUr7BT>eo`gnEKV!FQI;!GA~V6TwFsyT}E2JQp!~}Tkf@dO}2?# zmt2Ems9)Est4*i;8!WlEC2yjBGxf))-;%X(EA`u`KTQ30>SprP@1QR8uir)e?*Gmo z-ORs!FZBnMlYXuDr_)_24^n?9ZPWdVCuOX=-+=lf{lnZM9(AbVQ7sm>Eo$CL;ZQ`&zj;U-u36wb*KJ<5?(a@iFd>&Q2&Vf%i^z4f3@#v z^91Uz311h!;ZWpF;ak+-&XkGNtsUta0_yLHzb~{QfchlrA39>c4E8cL1k^vF{%NLs zM%~QceW-sy{Y#OrOi4$&`Zq)Y^>2xsvrQ(NM+x5vzo-5K(Oly0OZ>_9AKNBBQ~!ks z>c3{n6zRWF|6Sw{;h$ObFY141+zkQ$_INa%4acs*X!=Zz(UQs^LbN#15}H1_{{_(Z7%fFK)ZIr!l1B2v?m)rWV%jH?esI+q_+=5=Kn-y{=LIC+LGvG zqOFMbAllk=OW1~JTM;vVqV0)xB-)|xvE|%{Xr#mbVPnNd33n3iOtg#0t`0?ZBig-x zSm3xrBDaFa675NJ1kqkZ2NUg0bRf|_MEenq&X&G!`l1gldVeDGf7=0ieLE;E5^0Eu z4prJ=S@iHUljz7y(GU1x7*~2JfZ?oiKu9eyN~6UZS8bh5s?Oq zs7fUBcNN{oHcm+VD^ZQuC#n-KO%xHkBQz$Sg{VR74#_6bc%l}O%-@ctHqnzrX8uH7 zq5<0i$xlRP{~d>R;S-;9uhDiKioW3C;lTvShbo#4`}jXnbO9t2XW=$BAdQ|5)#gBA%6a zUgFt^=Omt;cn-^S$E;gN5n_!~@!YDVQ7rBw?nNceN4%KG{KSKZ7bRYR*gT(jLE?oR z`R^Ey7wLP!EQNTm>Ag^@EG~Ts6Q7zwyrgg`E2gKJ@lfJri0>j^miThw<%rKDUY>Xx zVhsV-?25!I5pPUvlYcchoOlHBI>Z_XVwt~Xu1dTb@tVXo|5xT3w*QZlfy8S`S-Y>P z;UHdDMVtH+uP@xdp~!~B@_$$CC2vB!X%^j#*!-V(3*nZ+t+MFWy?IV7|BtsLK7x3A z;=PG?Al{XDB=JtfI}(qwD(--Kd3Uw2Gx08c6UL_xC-x6tk9ap?_g(K!yhrc)p*t?# zaZT+>yjR~#r>0Bnd&hlu`w$;QJeqia;(dwt>mR;N|M36yh2!miH{t_`543;mbwjW_ z7MgDR987!|@gc-+1mD0!*OSR(hz~d7wwT*X<0FYrAwG)uMB<}~k0U;Y_}KoTOIj7z z6L%#fKA!l5-YBWPi#XjCPj>C}4?nDbq30YSwyqMNMtnN4nScNAQ+v;N#+sQstBKDh zKF4+{xsmv$Ou5-e`VxuwRz+`f?*}7x_kTLPL&}|&W5v6Pi^TUxyw`eV zOT3Txevt==AI04`9gih`i1=Zv<>vqH&~|@s=Z241e*xfJE`E$SPy9G>&b~XhpSWlF z)7SdNh2Bk=af!G}EdRHqcv^&A0pRAHOL6 zl5m3XWrz0Be3JN8iLVJ?C${-N@tZ>Pf8w`=6NT?M6nR(p9`XB`@`2l#C4Oj%?Oh*b zU&<%MlZijgGCx!Fb0vR4{3Y=>#9wKT`r5vIcW!Qb*SD6R-aQ+Cr{wR6eA-W{zhYY;@@e^Nc;zl=_LM1><+qr#Q(Nh*42NFxR1LK*C6FIrgwzK z3|36{uEtDKW~MQV$gDILr7;_gd1=gUUqoXL;he&`gmXI-nTJMS#`}#}kj2P?-04v`@=%>Tu02%xbf4KsflOK18}8p~u{*MAzz^$xVg z3N%)uu_BF?EMeU$4fB5*!-dvQk(Ftf|I=92l=ORPtWINh8f(zlipH9Xu0=zJ-*C5p zu49?KO}8G6O=zr7V*^vhxrJ`1{EcXA+}Hi6ueo{O1UFUCj@{Ul#%46Oq_H`TEvBBi zq)i#R-|`w;tNJ!HwxzKnjqPY`-+QNeV~4)Y%*tqt?CahsGK$77%HN5`&ekjU(Mbo5 zU8V14%4QeP*n`GsDX#jSCfX|RCEQ!MPx^ENjeS+z&-!D_+MmV&G>)KgAdQ0+I>@1$ zF48!J#-YZYYc*{CPvdYax{ouW#*s9Rp`pot!_9LB(qFh}9BT>g<scD7(7chxsWe>sr%6AZ#>F(wP{+=saXt<6e;Q}gI9KGH-noC{JXf?&?`v{f z;KH;><06~q+p1kcqebIV8lLK2M&oiC57W4U#)CAjRL)hnf68uLP2*-2?fMUmYlUvP zV;m8;t3Wiar*T83xSrpXavgoQ(74r#?!0XDv02XTH1z&|tDAnIcexOayJ_eZ(8g^D zpmCq@ei{#0-Sk|(@sM$?Bksa}<1yttLZkQof34Kx5_7^ljS`IljiOad?cEV;Uq1oZ zmaM3jJ6IwSpN5&gcqpvVsHaNb1h)^w5*vL>+F?k;z5n^X{*@jOPiVAhyhNiz<3$?s zf6e)6$p0IfV>ia7tSi4Ps9A*KC&8H5zCyw)PKrryh6jw zU%LFi;reO*FXc@dZ)IFVKw}~e^M4vL|HgY3?HxoP(42?HBpPPOG(M#9QC9b38lTYk zH0!`;O88v(h44$^R}MwKrtyu4{NGxeOhf+P_+I)CLi2z7q;KACnE%uGg~qQm{-$C6 zFU1W3zl%8k|BJ?-rn`S+81bE7#iF&3>ALXwEBTK8sq&E&+)wKyyW! z3ugL45*Mbq2+bvEE^5a}b1==tX)Z={h}ClYr}p!d(_E6~vPxTu=F&8mp*hq-X=av> zJI`${Pg8IHOsiYVHU!WdMsp*Y!)dNZbA)?GG0m0JrO;f3rhfl*$3k;8nyb5JY1+;I zxCy-BTEev*imXFZfBwG5VW!w3))#I-b3<#hCvHshK$@G-+>GX?_Eu!4+j2Ljxkc|K z$;~ZkZq=(|3)-6IHd@5CG+=u39N3tCAf13MCapZtBMDw7ut2FfrXqRsr_E4IK(L7T8aGFOr zV)+(2il(#iqiLG$(>x~C#gC(TyerZ?f#%6HPo#NLI(A$2^g?T|kyB~P|C^`NyqxA4 zG~FI}Ce5?$@4V>%mac3*;pD)I3ZU61%hMVSvG%ulf5zUJ& zKa36CrMc#%G%vH$a5p!0*AlIrD`>i|UP<$6H}9f(mCe4~*-G;on%8Qw{dC_hE4xRr zXpW(Ioy{5C)t;s+x?g?=Y{XyhPP^XHyouJFG;gN)3e8(+zCiO8`=9`MXMbn%=OP)xxH~-fPzDM&5n(xz;r8nIWFiHA{s_S-x zk8OY(xR2&1G(Sye^?l#Z*Y~}Qw`qR?smw2Fx^L|(nqQ|%53SGN(wwXu`G3>=U&SA2 zn*Y<(aMP6eH-E{ZztWsS^EWGM?w#p>sLG!-|Dvgj|Gm~U1T_DpW&UqDEojO7TQdLF zj1n{dZ_P~0{GXPYzsPK~W*3t$td|(3+Rl;O`_kHi)<{}gW;t8Y+FEJb2)CuR zorRo3wzki5b}*8jWVLprH7e70>g&u%YiHpu!d->C33sQphsghgdkXgw?k(KMp~&d| zl?ujf-8BTX_NSGazw5?(rqoyr*#3XOT;gvbrG$LE$S|Nx;MPJ|AlE?O6zJ`m(jZ1nRfbmd0JN}-!1{s zy2|o(jf>VbQmz$h|8#$5WH~nf7rBAfqqJ_Mbq_7)|1$H|&9rWDQ6=0;>o!_<(z>0N znSXj(WdlLB#l~eFupxlf)3nCZdL}*aZHzYYIofXTdY)twtrtl4 zqV*!JcWAw&sLa3hviK{)SB0+$Uw7!PGSPa2miy-^{o8oUo&uxwws4|}wv=~CR-*MD zt-t6w(g(CYRLF(^k&lEQ3qKKlN^3H$&uD!~>vN|_{GvBbwZ2mEYg*sp&N>zCUGQ{+ zX3H7Z6k6ZYa-I2smYKh^DOx|JnY3&O$o9Qojk^hkb@ew|8sJ)g(E2lVwrQe&E9W0t z|B@_BG9AerB#@ZZlT1%C1IdiNTIrRgWM-0CNoKJ|Qp-(dBbnWbIu){cQ8FjVd?a&` z^pVU>V$Yk~g+%uqx$BKdKgqoIi;^3}-I2A6Tg3b%3y=)5M%?|YZmO0nNV1T%zjJnm zl`KLslw?toB}fL73?W&}^4)Xpx|NY+aVxqXcdX}2k}O4H=5O1<&Dq?~ZOJkUElaWj z$#NviTl?;(VRy;Jy-v{GIgqSqtKepO$uN?UB*RHICmBJqA&LAyv4LBStV&`7f%xhq zYly5VH2)`An?xp`tV6P{l=a+xPO^S)Z_mbMl8szc2^*8h{F6;p+|2aUz>_UVWcbOJ zBwMBVsT+`NL$a;%H3ZnAw2l7db$9phJ;^ga?xxB64V^A4YO`#*ZMe z(*Y$MB|O@SZvK$S|80$qBRQVrOp+5wP9-^!H)B^g6<8HwCJxm;26f9+jYk;v_n zt4Xf0T}wxYa@0551Fs{wk>q-k8`4@?-J3{mRp!lV>XvEh-bQl!)MOIP|C75&WcA72 zs&$X>-ZYKmej~Py50E@aBLDwC{TWO02uVdbj|v|XK2DM&DU;+$iX>+Kb{6B_+Lx4! zyN??Ut!1x&xchD8ZjvfVK;qj@;-c=_PH*q3kvy%;I_`&|#B84=c7O3^X~yOMi96^L zk}gS`q|s+VSbJc)CgXGmTpc~)u937!AHMDl|8i&oKn zmO>w-9V7XW zwllPkNWLa9|5x-A++WEjUy#_zf|SpV*jjvlYdD5HJ*NP zZF~NgHo|G1|7y=@b=xxuXBN&vdsdOzgtH6ha40gTa4y<&i_9bJ6ZSh4nV0r_DYxUj zJ&3l9w7mfB1(mQ6?cuZ+roEhsi_l(FWU$cupY{-;%-@PjsJJBUr5q8rQGoVP;WENy z9rorD?d55&AaOZ0U+B?zSjrPuVWyV%y7uvg8n)~#W-D&SZdoS9$RMp>1cgqdeKPHntWEcEvxW94v`_5~tUX0TfVFc5 z?K3US%`2>UHtmaOpF{h66*U&L&zm|gqJ4q%3w!g)_QkX>qkW0BVAU^8b@9t-UqSmy z3yqr48>!n@)4qZBHMFl&&b74DioNUq60f%^?r2kob5KTrEUr#kJ4QZoN&n-ch(XvLqqWv}LId$6&0rLO$WZF|y_dD9| zQ2Lej4_47ywjqG_Pr{#tHaheU1hetqB>pb^L-;41>1qFEX;$}d+W(0BYuK4ih{LHz z6P+2-BAuD&%tFV^zjwU2E#{WenT^hcbY`cs6P-Ee3|1p^(wU3S+?M>rJ9OruvjCkw zh5G5tPiJ27`79xw<#qa? z1f3-%E=6Z`k)`Pj6*2P{S(eUnBFocRna&DyhN-wB9r?ez4s2UvxNw9+`}D+BB-#)_ z$Nb;vbZpp?vZl@7I&0Bc+oo{F*P*kn$a=!{GkpUi*2qS5wxF|d*1{$>UUxR7vzZOq z?hftF=Dj<#J6kH>{GZO&bVkzIhR$|$%=~+^+0OQKc1U>-EqO;(8I`8d*_qCnbatV0 zG@V^dw4B|9y9@WAW5)uWJ%xJ-_oj0&oqg!+PiM5g_kD%?*;l4-O~nI*2h!2a|NrTS z&^eUO5p)hyf?odM7OlE;j-=zx#YVUVrAS9-7M)|Y=;MUP3s0bPqDasG>6}dG6sJf$ zRd^bm(=+9aUbD73XSpXy>6}gHoGdE;@0>^Hd{s2_x4V)o`64=F=v++aauqM3bE(K> zmg7F@e5rGV#4G7&@akNhM(JE5{aWGFmAa13jdZS;cte_*wR4lio9Wyla%&o;WB%`Q z=-ff~QaX3i-GR`=nlpFI z|LNrDxZThEpH6|!^K^=IS}JM?=#=SrDprJ5ha$c(5Qf5U`UD}0a6_jKN;^M#5Z(3vFiq0s!F zj+wuR{J-<5_-De;Qx~Q4rHWrU6#1IYHyQty&SZ(-nUdaf()l5c_PLXk&QEmyRKm}6 zexW17@BAudO15k1{{N2ozkO_9`b!Ca({+CS58WA6{MXqp-RXn~r>86PPcQ7aid}mI zfbPt_cDl3Dot^G%Y0=QFa(9m2a=UZUU0TZAbmz&U8UnigbmyhJh@$h+oj;2XqPsxG z7o@uoUHQLTan}d8w{#b!yCmJgmSa6xOf3u%E>3p|)6*fSIZ$fm;09ExmCcMFj%P0=-26}P6ljmWm9+xl)N+}?`zRgR>4 z8r>b~9z=H(-JMLgjkdGWcCn(>vLS%(Zgh92yD!~6=?;e*$<^SCi6gp9O65W%t=qXZ8?VZ+j&Hw41Av`n7Ig9Su89#@v%)fgc-HVl` zA)tGK_=R*Yvdr{ie)kgNjoTEujDhRuUe3S@bg!WMq{J(QR|&7Cdkx*D__cIx_3dZb z?ijkRVwvvsbjQ-Yfv&Uh8x^`qc(d>p;jO~k9E#j7bVI&}ux3@twtaQ!))vShqZb#gP0J;OhCmgy#obEWfQ=~ja_i4JH(M@;1 zXCyvLSLWQcA%O1lbYBp8QTUQWkqLC&Zuth?SLnV@SN`8M|F@5>nagM1RPtMNHFk90 z?uA^AxzM|cz9)QN_<=)_Np#Ks#We(UKc@SMie~<18t#vwyPr$>!W8T6mvqhl>3*Fl zZqt1$WwKEIZwcS4XhQ(qAB8{B{n-)mUxeoW*@5tzl;7$8!GQB>4Hn(M7?@T1-$FM8 z{L8?M3{1zs^rj4CueBVQ!4>U|nrZt3GchnT1G8Asncn6*D0#MC(JIctz*4v;CXCO; zz`_j7%|O3fYX;_FpwBW>+Z>pef%%m-Un(*%hyj_uyOm;KK?WAGUkBW^eRqZ5ltmaA z!oZ@cGMItI%$MACdtLCCxHtpye_QmD)96bxFtqQfHyN;tlMI;oD}OoR@>U!uF|eYF zD=}~k1H%~Dn}Oj{MhI7CU?T=r5tsSfQdVPNb*D&NL%60;{y(rb1M8@m`TxLr46HB3 z%wJ?fBk9j-0~<522?HY;F#lI{GvWW|>MWq*>lgGJI_oeljP1scNm4uMCAXrT#Yh? zEhTP6VQWXk<^P3kDcE+&s~xVa9fUiYZZ+&gA@~2nE>d=-uv?zHyA%y-g+0Xg%xl|Q z$$j$35lZe$VZU72pTYq-KTx>`Q8-w{{GY<1!o!4zI}|yB!jU<*As}DeF%*uaa4rQi ze?=Zo!OUO$L<%Q~oSZACP&hT`BPpDw+}!^QXHYmZ&pnI6**QPQh`Rz=F!Ogm3g-(i zprE0la8a&bOyLq`U79PGDS0`CD{|#Z3Rg+II#<#HIs(`7>nScr;RcE`P`Hu8 z%@l4*||A5_*u!iOn5 zlInIF&er!a3XfBC4)BDMPf~b~!c!DpRPt%zGs0(u&k3IwzK~b)5(SUKC0_xnkp^-CVGx+YmrO{$G&)7sgR2q>*-RQYcb*hk{R`OCg|8r%+0BDU?;V zLLtl*`G297{rzI0k?Tzgt(>=2sw0f@$X=csQ;`1``U-eUXaj-B_&okyQ?d?xAJ19G z2NXW0@S(y!vRt=<*8WfM=ArN@p6lVyDEvau`*Y1)R zg>NW)YZjN*?9^IJ3A&${kM3O`f$$xaYncF(7|$JN{g$vr5zMgK+N zHwu5K{@>HqivQ_QF@NJtA>|*d(>2BeZz{7~Z%V7mg{4dJhTu($H;t{7Yo|p{hc_$U z^msGl&44#!7HnDW6#zXW=gpE;;`+fGz?%ba5N|fC#I2DxyXCt2t;n2s?p*-wklx%@ zm1MV)3lwH*~ z-95jdM*+QM@RrRwQ>(9fR=~R#Z$-Sr@K(ax3U4Uh26!vut%yW;JP zw@bDxH_Nq{-SBp|uyl2-mt61&ygl*uvZ^d*Z@hi7QdtM?i+2#-es~Aq?Vn}28g}|W zc;^3F>x1zQ)h2Uy{B2vO4Z}Me?{d5&@J_=!67K}OqwtQ!I~vdZ|BD?9_Omu0hj+Xw zZ_Hz8d&`MUMsDBB4um(%>)h9L`xNhUyw8+1L`#`qtK&-9qQ6Xc z7;WpX@qWeo2Jc6_Z}BGKO~m`of_EG;xZ;yqm+w{T2NRv!TQB`&OEmH`-Y*JHkCfl= z{=xel?=QSRRO(OLaIS6HTK{c5;5y26X>kgQP@Ib5lv3WaF~vou2S{-U#c6C2#c74p zITX<;fICMk&PZ`CiZfB1Rr<`rS+Xfjae$)c{KY|vv*l%HPjeMHr-|+ZEXBDgE^u6|jtO+4O3m z?R&-LDV8X%K=BZYD^lE;qFbreDGpWS%2tClV-+P=rI^kC?S4dY4T>93w8_76*P^&K zMLqm)J+^MHuSaqHtV^A%7dJG0vm(Wf>>Cm8ZfS87iaSxR?r+H*wOO;h{FqNe{Pdx3rerM)7uv9>qH--c9jNig*3ntG2!Fq4*}ndnu0Ag6T4hUdrvNtpx8G(i_bG`_3!f1_Ygrcg+<&(I3sQ8ZP<)Bv zC?z%jFTRq-+ryK^SEY}k_&UY06koGLz}4n@!|Zn@if?2O?-j=lym6gOppYNb?&$E- z^`#hCsce5PR8rqdML6gwgjMNRLEU5Y)5 zn)Vmttp6>tZ&f)zspUZI4XXu_)jQ) zN>S#Ywd!-}6RaLPoWG>#c2{Qz-%|YAL|e)?M%+JT7bjB8?`sz)+1IozH{IWUp!g%j zpDF&7mdZQl7faf{@f-ehivL~s2gN@v%U0?y;olVhv8~_~e+nV^Q;O(Bz@IwL)n9b^ z)8J2=DuY88!Z-8Bp8@5&UdSvZUTQmxr4&l@N@Hb?eym)I0}C* zf`jqr#yuV3&y&|SZ?;nY`~(N$FQDQJ5=@Ej8gM55!uZ?aFM@lo);IH4z+(8B|Kn?< z@NEddUrMMUz+cA3UlW%TE|0$+{tEc3;;)E56n`b#QEg=Z6@O*?RkEb^Ui{VY*TP>N ze@)x;{u;JF+bcpghsR$Ve;woL#LRb(fVx~)&-(bA;ctMy3I2xo8{=W2_-=F9jL5Rwj^SoR{$BX|iR_KP5B|RRBdl$%g=&VDvOm7t zItQ5I8e^pnvPv|yP{1MhhvFZPe;EET_=n@Wi+HZ1j<9$mZU;Cz>p)kt)o`rznoT082&T( zkK;dyuTub*>t>|>Q}|C?o&QEYi~j=tbNJ6&4R$W3Gf@9U{Fl@oO*s8g#%)WP|KpFw z_wirFe-nQU{%iPStxna9|2n>Ne$C;t+Q#8~_?rBuy7fjeZ*72I$1mYm@yqxjekI*S zt@pAXmj63$Ytg`OT6=6wTlj6AO>6aSe~Z+@F8)M(m;4w%#(x(-!5@#`$A25&-TYN+ zwL@A{ZIiuYqV@lK_#de9_pMK?&JXe3b?L7xAY1My_+R6HivKzOXKAOYk_q@e zO<=2Rx@+ef^AOCJacigiKXCrPJi$T)ixVtNu&7%W!6H`5ZTDa?TXedP!4d>ZD|bl( zGk@zYw`T^+5V(*3+p$TooDsL;rmx^msR&jSU&-R#&u#QzWht8c2dk>bZ2nKMx^N9) zHvd=d+64b2uuDJ$>k8K+*oI(zf?)(35Nu4aA%QdhS#84!2{s|v)K=DQbms=vKbsM3 zNw7J=7PfZg8+PQnAHh}xTbno9p6^tkcw!1a38Vvc1JE$m((3 zwF|*+TEwneTw3Suw%qigyTJA2o@)7CLQVdIeF*j=7(uXa+Cr<)U8)N9CpaM8SO3$Q z2c`GU2o51QoZwJbkE%M%h#U8VBb2lgfmBiQXo6!1ju$^xVfG5Jk~aU(`AJev7M?=z z1i`5U7ZHpkxRBtqYyugaPH+annQ1|Svy9kAIh)`dg7aSHiA1vZWrG1@3*@Hy9GdSce<4c?j?9w%6$a)6FC3>Ny!HZ?BY*$c4kM% zBhnuw(B$9ERNeb8!Q=m)aRg5iJVo#(!P5k<6FfuktkvMYY!*C+dq3UC^8_ytyh89I z!6<^4EWrKr`Vzs*8PDHlBG4`1V2slV#tL5>_-=O*yZCQ?||?E^G*!1T9ChZECqX1qdR7t^#_NYkDk9gngmT z5rVe~#uL2b6ssgZ|8*a?B*^FgwljQ4=RkswsJIUNnDTA}pHOmp%cqpw0r(lE4GBJ{ zv>?F*g5L?u{0Y7kekHW|KY=FyM!r>YqVPN6BmzzTgCCUqQE1y*as@s;buW&y~`->dlP~<>L2ZsW}+LiO}RsOC#AbY?xu8~U0^BQ zqvXA*=ZoL}AO4_}hbTQv>2Yxl0i{PNJ?4_>_h~6TLFp+HhJ3=UmIr0mdfN|iL1QkBvKN;OLFP^wdEQEI5Rro(hB zR3d2)40P)Q>mOx5Q`|oAi^$Idf4(d7E2ZDkT*JEC*_{9XIk`QQYzUzAxA33I+l4Zw zlr;pDr=mQyOAgGJj}GN&D4YK)#)bgO(+g*yZ2nK#h8PhW0w~WSoR#uGt`Aa{`Il!` z)*QJ$C*`@M%q^V9bRD^r=cBv{<@qVEq^t!fFKD?||3Z`(&bfww@}klg6UzU~ONcKi zT#B;%zbyYRoBvZ@&Y{Til;!_r^MCtg4H!yU14?<7Jko{$%Bu-i7p_5hO%d~dk+mtW zlk;^c%lykS|MCV3*ig8UaN{&GU!wfKJWN@eQQkbwrMv~@Epx7sqP(?YwxMkPFTNe+ z-2cnNDesW$J1Tc4;m(wI$@N|Hh3-yefb#z+pF(*L%Ev2mPoez3yfe`D)5%QNDok z*)CTB8Uo7aifafcpKn>|U5xUD(l63-FBV=x`BIU5{$IXa$t#3cQnru34NSB*RVk;7 zxW+2fB~aCN9p&pqZZO>%c_ZbUa&AKauHI-WXM6N$c`Kg>gt;lC6KP&QFu0K!t zg`B^rtd}T{5;5}^dBunuE6cA^Zb%tJc`W7Etcz^DUbg@vZwTL{JWiyL>mKD|&V9-O z<&bh|;O$Q-yKmS!tT?m)<5iWd3G1n7X!SRREz0`%k8PTcRym?KVda)+-##mrygR8*!G8Imj0C^@ZA z{$H7%$_z@*n8(aSWo9X}5iK;=N=>9v%~!MT2jau20)n8@L|ZbJYS_gVXNxku;v zG18B<-Mey}9XsyYNaX}7X5Cb52%vJ3@MJ2dP&u8-sY;F%n*V41W|3!5Ia9jk|M~el zm2;?^OT|2&iuu1CfRziBl=)XKGSPA`rgDk#^wOd!mr=Q#iafb;g<`Ixa+S!{7HKgl z+7LkHTH$p<4FQ!K#BUVdMCE3YTO5kqD!h$K=KtoU6`6nKE@heji`*l;S9qWBe&GXD z9&|+fAu12&{1GaT=KL|`K2F8_pURV|u4O$?DBFMLb*HkI)r?+D)&z9)R&p~wfq52<{VDt3{!@(Go%q<>1~Gm+2JTq+Zk z{6hHUz&Ztyuc`b@f_I;Gla7f&Pg~&c91&JV&)>8d$K|}FX2!vWj@0B30EXs zK*E60Rz~ns9Z(wMEt-l=+8ixnx$#dUYMbbxmsu8a2Z0#J49Lp5|)NJKA$f z;ZB5mi0n+bizDK@3U?#iJy-r`WRsbt?@729;eLdB=ehexA3?Zps<=qP{qx)d2oF@i zLBfMg&#F3<@GQc^2uBhgu0|d~c(TZmghz=Sowk|q7{X%-Par%lSB^L09&)xdJ(1AN z-+p@Th)|z^3s1HGiLgy<{!e&%8bf%7k~Rb=_iVy<3C|(Cn($m@okw^fp$!B|UXVtL zUqpDZ$R)x{3FY?TWrUY!7vkLOPT`fxy~<&BwJmfFc$@GV!WRgyC4621*AZS%_%PuO zgc>`-8wqXxPbmKnZxJ{17ttv|czgEFcz9>7YX}H!2q2XIhxZc7{KNYtJ|HyzCw$1E z{d7-_@DYiR63YC;$CZ2{jUjxJ@F^)z=gKpL&q~SW|2Fl?_FnUUWxYf=if|0!%jQVo zD}=LtV9?SmI+%< zC#(>LgmuEI;%onnCu|Tlt$4PGHep2A`H#{~Ibkm?NSNfoeL^$;JZb*#euOpzXfJw? z>Jo(J|AZe9{!REHpJ(Im zP|f|nI;BNcrxMx_U}yBzX{ZiTotElMRHvglgL0?0+|<&mGp7IlLUm@UI!>#zK#WQeBVg`cyX@*zt6#8(2X%L#S>o3I!oi_? z4(RJBR5zu1J=I}UFQ&SgYLNd|x1f49)h(%>NOdc!`%~ST>dp$-hU&Idhl_7Vb$hEk z+bBCo+)=ob>B^$I3)MZT?kasZ;qFvz^=+@H?vWDddr=)BvNzRzOjnGQeW~u3Deg96 z^#F+nQay_5K~xW=da#s3vY4z%hfzJ8>Je!R6>y{l*m94idc2fls2)r8xK#g7ZKAd%X2TMdPUB!q-y?8^=e^S{2K9Vh1WT>pF2yf-k=@(M&V7$mH$_75jX#* zdYkZe;T=@(r+O#Vd$il!CA`~i4cK0EFV*|(VE~uRln1CjrmP34K4e)I_Au2)s6J{> z!nkJ%+=BNu)q{x+F+j_vlAY=`lweoZx?syTMGM72!y zU8T`8Y`Gr_Kce~tRWpAjKM{UP^)vOA-2$LG zA+s-c##H?>kF+5`x!+LziR!nxK2bHe$VnpK=lTy+e@yv+`v;1u%)j~zRn6+FZgcAr zkTp#HU;TsXpLtpLFJP&y{bP03rpQ*IWu2Z2?OfUy#~D)K;Lju#$^VTb$aW;)_{KIxVa%A!SKwOQny>P+MAx zd-$_N%{>BC5?PL#`|mU3?o||O=Ktw#Lv5(ySEja#iQ3S%jcTh=+mPDo)YezP8r0Ub z0QZVwZ7phRQ_G(JSFQ~K)Yi+cx71|*d2Q4-vVvCUCe)6nwkfr}sSTsHtx9c1P5xiA z`9HNSgsJzRT&n>>sZxt7}X)UI>7QwE1#LhS}>H>SCYcg?<; z+HKTs864_ryVaq752}b$?oc!C6y8N`6g5r$Yxhull-j+{PpI7|ykGc$IgE)93Lm2O zaIQS!$l%Zy)cD7!Jx=XO@h2SGO4(XJC45@=jPO}%&xt%QH1nsXfuLsoZ@<*8YcHqu zP#aC{O=_|5V|9`ERy?wEmX2f z&HP`yE^G*!)LN#ecS&j;YB9BlTGvF|f;Q?6yg!|xEk)x(t)J(j^k5K-f4zKn3^LiF^S;}1~ zdv~e62=(Qt%m3?(QC~{Ai&K~X*O#<-cNM}Kv$Sy|%TQl7<$2cf(pR9qB6W>8^_8fb z|K|a#Oy-JQO}IMsHK=b&eNE~cQeTVudeqmZzRp1K_~7zyIi$X>_yp?f=VXJy zBjLtE_x~@GiwvW_HTBJ?Z=tNs|C6;P^{vw44ykXGW>McZU)=W8cT(Gi3wNMy=5N2O zCwHd43-!aP?@E1t>bogycj|kIxXrf*b#s3AC!zL_s47c+Z|eI{-&Zjs2F5%rvY+LC zx0Uz-)DOX3fwAsA$aEv-|9QZnQf#Nnl_RLzK;WJ#RMyedAEkZ_^((0#E9E%h@zgJ( zeuDUk)K8^;(%=eiw>epOibLxJQ$|uhllp1YPj|_|p`QCuKf}oKZ&5#s`uWt)rhcxH z=cGNR9zIXq==$@5oLrc8vKD%=@Dl2mirD>M>bm(`zrrc@GvzAkw=3Xk>JqI7uAzQy z8bkd$>eo}hNijDFZ?u2pbVp_VX6m<6zr`Z;?mzY0jN8M&?beYcTvAbiVXpF zeXoA65nI-M)bFSMkoW__2UFh@PdC{kjyo5k{uuSIsk{C2HR?}LA5Hy9g~|NuPgA!| zPyHF{&r*Mh`g7D@pl<#@FmYEy%e5iE{Z|h4QA)m?>h^fB)2&bB|MfAcPJL{4eXRaE z^>?VhLA^@-P3rcZ7xi(}3nFf-6>Y$Bdu)o9s~hX}67_N_Qm-gDOv9+xsQ0PYsrRTi zs5kSl7WIg_-T$R-H-EE#R;qU=FM@hZJxS}CjMU$90o31C!SR`HYwd=Bbfdga{d4L% zF{yt@U2b3hi2BDi|4FAn^-t9^pIHw`QBwY2m;cwlq^`-oX06KohWfW66NRn~zfhk< z{b%a(e`|xrh5C;Q_{pI)ucSe<{ws~?sQ>1Y)PJWjWMF64Gk;M3Q{*q<-@<aV=)@C{l?O=q(UAGOLDPN(8uI^iTH9Ej#;P<{pfQxj zimob~5;s=L4!y?8G-UqnjdGXeKJVF(`8QU#y zL^gCNvXO9O;U>aOX$*5jd^6$Z!YycQDPn$WKX>dmwxN9wjcsXMN@F`37t`3D#)&kB z)7W3ZJJ87dpTL>3-=L@$aD9lA^*=> zazL&hNW=V}hRol{Axa)f<1mrK^T;D;$p0ZaT1M_ zC7xoUm9=X0R64n};%D>yNmNex54g2^%jSpyiOyfg^+2mhO+We~I zCp66eQ-y{e0kt9%XnbMY%lMZx?BO5ruW9I^pvJdKP84b!w8%*`zRx3nP}YxjI9S%t zG^e8R3ynW%IRAIH|C=pWYp0g{@gM$|l)q{GW1{P~<`hC`PH9SdD%YGk&mBT@8k#TD zoR;RPG^eAv70u~su10ePnv2n#k>Fy$Pa{-zQrraUTh0}PNi_ly&<+krN7pJ*2%_Z{O zC21~YJgajVnyb)UmgWjhq`4eToBZ1^ePX$}B28Dx$~1>gE;X6ZbgzJ|Fj+_TdbyqR$$=Kpz- zEpxIp&E08kLvu%(+bV23;r7De!W|si&-!Gil+)aq<}Nvx|2NJ574tuuN6_4Z<^eSK zq&dRrG&KY?_oiw7Z%=3K>^9}Tc@6u~w1LKcS+^WW^B|gs&^-7*;-QYyJdEby*2yk1 z3r^ScD4NI7JUXq1<}nIB*5*sra+!bg1ezyFKQS#Uelkt@ziN{*lICeNpP+d<%`0e{ z|I<8^=6N*F52yufm;i2T2qUH_+f3C+uBUTV4jF6;6%N%KmY z_t3nG<}Ea@rg<$*SHm?~a900yG;gGNy@^);4f%4-|D|XMu=Tx_<{dO|%k}*JZ}U!? zcbRB0cc;1H_tJb&HQYz@evt>VT=#-N^C6mY`{u(mGyl&Q{g{Fu&y!Co`IPW!;WIQ} zr1>mOoA%Ru&Y|0UG+!{1t=CJ+8fA(;8%y&QTFwndOMjK-S2V}a?9m)cvqtkZ>95oD zX}&?TK=VzSa{jbqvubS!pjph9640#BEYURcH!%&im{5@#0<351N;YVAM4B|s|7o@z z=CwsqWd0Iq#xy^snb3TnW}oJG1-wPm%s;mU^M9J}nqmujFDD;JH~$y;DAzwx@>7}< zL_VYWxn*TX_ZP;k!Y}hyeND?*>o+w2r1>q)pJ`5{`MqMkqdCdqv(EW}=8tKT=1-G# zMgBtbSDL?z|CY8~T>fv({)^UBH2qBS?I zc}#IlQmYg*AFcUmZBA7FFF;jt!V8?YinBD zE4dA=ZE2bLrwz-SH=LIIKighAS%B5Qvv8L@Y&Ru$7it1&F?-P3(1O`4K6WVb2`!ud)A}q|YzUw=fmY`Kt~jl)^4zbL`wgvcb7dl}?<7v5^@GUw zxw~oza0_ztvDVMD=c4rsEobb%=4F4QrGcO&^S9;xN$W4mb?&;u3##oO+EdUr8>fwM zO4?J2Ozlu)2yOF!+BO`BOhfa#O_xjh?g8wiv; z2kkjiZvD`noAv^Uni33({VQ_WHCJroEz+MQATddkNc}+8P4d z8Uox-)n1bJ(uy(vclSqVFGG6;Da+Dcj`s4VyIm{&oPy)-vGcZT%v!XE(q5hR%CuKi zyoP}E{%LzPE9EXFSyR`by{0A8dQ4fHwg!Usx(Zk?%XME%Xq*4jw&6g;h5*_d3+4Z9 z`G4E_{}73r(>|B>7POC{y(R5^Xm2HbYubB>xJy9WIwHQEaC_RrY40Jv1MMC2TpI#t z%m3TE(B4%^^M4Ty0d2WcwvOo#;JS40G{y|UY8XL#UlEyqdw+5Be~|-eoBz{3I9JTu zX&*}aFcA#_rW~Q zepJe1LO1z$H9SH4P1;Y=e#(j2!w>DJ74VGkS=!Ih9z*+i+Aq?6A>H$}zAw>!MPwB1 zmnZ8|M$>-P6dfi~#?pRGi*OzFx)k>np!6Ubrv()(*Vf$=7KJ|TK%_)F6e+8$`wD1U zwo1D}yGFb2a!t&1Gyhbf-KK5kFQ0KAfBwmF+TA=dru`1>g!Wss`)Lscye%AWitBLm zlXq!JzexKR#ixDp8=d)R|4wIC+JDgg zM_GT;{)_hCwk~#Z?Y>C-6`d*QOhpGeQ`))7n1YQj?kZeoYC5yn;L;gFXBub1bf(p` z&5`NoOfO}IT$z#1Omt?pq_cYWb7c5+w$RQ1ow@0_dgh=r8=cv0CYC;z>z=mi%t>di zbSt>7vn%tRc~oj%hql|hcfti zKb@uNtSzz(onn_=&Uay|L>Up)7glQ%)GNPolWw{P3a8F`DS!B&-oTAvZW={N18iZ)7d7^ z-ImUFZk6e5Z!2zOIGr7G?miRb6!U+PT~yVsbj;Z4>?Yiuj_Ydkd^&qLOke$`vsX^` zG0}2I(Ak%cY`FP7b2`CY^(c#?m>2=teq+(z!-uH3W1Hr*j0IGwB>@JFq(t zI!6hQ7TR9`(>a!oKK^6;cqu2)InfdElY}P=_56S5R5~M-JWY7ILy=LR|t({bH$r~2e3IvO%M^8e1Q)}_|Zx6!#h=XV%M|4qJg zmvZeCfX+R1?xmyif{r}`lrEQ!Jpx4MK{^j*V&IOoN9Y7}9;Nd#9rJ(H^EjO+=-5+0 z0|mEHo}%-t^rwa9|2op2qw^x2=jqsCWrvvlAB4_JbVeEf^alH7b-v<`eLADvCoAc^ zN@t8cU}*=t+aF%b`RjDvkocx>T&}w#+LPiw{^pAKrn_o|bV_u}beeQ3bi(XIPo1g- zSZ~zm)I}P$I_a59r2~85UNVzTXf|A9rJ%W@6h>_ z&bxHv{~h^%=Y2Zz|Bn1W9d|nB|L#sVolmm+-5v9PRq{EV3F##un~Qe7q@#=fR=M9MTo(~3+doStY#q8T!`Pg@nuWJ#-S7NP@*W+mE;Xn<%Q ziGxJ5iOlZ8i1hxKkvWOnUjR6w=l@+*#^)s(N;Dslj6IrP1s5PP^A}%;NP|MOh$%Wd zATs|aT3omUQQ8;{0nt)KOA{?)!LH|{Wr>zonEM2ryCS_l(F#N>W+S7n(OG1+I`aQW z{vWMMv>K6YJX&2ftUNfw04$5QP5a9g(NIMpyLxqPC z9WHW&9UAUGsV(a$;nAj8@))9Hjc2*XTW#*>j!qytk;u%MNd6z4OeFJ>T zHjjUf==q$#K=h(=U&@tHO1@0=iinvu(W`mxn0yhh(RKavI^9i(-k>`>(VKb9IHCg4 zA4HzYYVsfX;sMdeL?xn_s7%x(su0zPLL!;Joei~Yeje3{8g{IyPwZSiY7s?5ZK6&# z&rDw=jJiZU_wbcPx*4gPXGRIpdqjPr@kDPCy={8>SdN>+NAD25o6Rj<5v%!qq7Owr zuu9y2!bUbUr1M*%PlzTFeM#`h|J_1~%>Rl068>$XCI2z(P9a1% zCEckU5ucjw5V|wbokmIXf05~g(+g*yJ7cP6o47l(^jYZ6Dl(Af(j8QCwlqw94!U#F z-GJ^~O3qDpUAh`9y7NkzkM62;=cl_Q-390_LU%#B_ALnO7H3f1g|pMu?xJ+f{9WhM zU7YR`*3apgpgYIuE=6~Fx=Yhtj_xvam$i;c=N0Y|Ah!>=>2Y@jxO=uWs6P+6IOcO$wR+gX^4O#f)OyD8n%6)=qMW^@muyE$E%b64~Ku7-fF4FPoJ z|J`lqZmXm&{&X|{r#qak{J*=S)o<}O1kl}CxQkFjKzFzQY!Ndbx_b!s6z)ZLZ;^e3 zx&L?fRdPSN`#U0j0Nn#~ZbJawgN26(56yRv!}FLUq#sH5D3POu#|V#gC~}<8h5))J z2v4MYk|W|L3r`WADjZ4oG)L^`+_ig##4}Tc?pbut&iOgYI+yNwxpF?;3nX5cD;Lqd zIOmtpy)@^SDeQ8(SBP9GyeiGjSJO548tK>4eL&Pf}71o4x%d&+w=r%=K zxzeWF$$3P#oAVysIOmBYbo;`$=)Ns7-g0;PNc>&ld&2kWeqdSFk`L+rK=&iMU(o$n zxt|C>6@DiCTsXm@{hYnnvc434CH$K1H*~)f|5iBBVIDcjJ}=z;K2vO=Khph)-pq7= zPNxlYf1&%U3jRiKD!RXm{~`R-3fdC?68=rs%-?u#3VOEBh)V#JhvfP+^rn?E zolxfAn?Za=;Y<$gmv&Td7UQmwy#abl&>Kv1>CNT{z1iu_Au^|Mt~_^cdh_IbUV8H> zcm7;iK*{|Y2h;TmK9k}xV&%$haxM|TS;W7 zaAn~t4nzOniAJCB|Z9j=Ku88r8it;J$ma~u8AAa+c4)FN!eJq3B654 zh6y)wD6%=dEpoo4l&yqY3%3z&OK&?7`G3}i9i-TCO>ZaR&JIQ7|GizscN6X|blYnW z5i@_0z3A75{cBE6I8W&W>Hr~D^!q;Xr>)99Tpa)$6s;aLvt=Vorb zb5c(4TxFdnJYRSLy$kc)i|Ab}@e<*sxqcbF%cWc)yfW9XqIb0vEy!AO4ZUmg-0O_E zQK@$W@s#v#q*tYPlj3it_b9zv#BUYK|9iJv5v%78dUuML|I@oW*Y8pCUZMQIcfa@p z^vwUoAENiL$RnwuHate}ReF!-F;CEYQZY{npB6qNd{+3J@Og(K^8en8^j^x9QPN)) zzCv%b>DhibM&elEYr@xsZwTKMjuRGyo{7m>cy$K>;?&?-{!hG%Q05=+CceAye-1@#2(U{r@m|EI5bsSahmZGB?g-+2MfS7KDW%IgfcRL6 z2NEA-#jT$YCO$;sp-LWR@unXxJVJORv0eNZKbqJsykwWGt*OTmAFmotFx`|Bg(nG5 z&aV5#rxKq_Jd*e<;?sy_`0?qA(Ip_Y$0enlO?*zuwb1iO+{Qhh_-f@|AiR+HBI3)5 zFIMuBG@kg<0r&m+_%ersL)|`kMXp~-e3kL6k*=Nh5nn@mql#Zkd|e)Sy_6d)>2C2` zZ`?$Dv&38S7!3jOZN%pP#CHhq6q^5w+)aE>&fWK)?J}Tw0R3Uzx_zB`qh@T`LP5cz`v&2smKVyCCPNLlfklnr`evbGB`}2tS`N5&z z*_HYDMdDHR$X5K)z)p|bd3XFW@hbykUbKS6o?TOoUnTAnk0GuQk0mY;zefCqJ4Ysd zeV~25`@{|Lo5bVndmW>m9B@z0xW5pMJ>r14NbC=c-(XJ_9v4 z)ct))X<+Oz#36B;xJuk0t`XM<#$G<~w)>lm!oZHs7MjGZ0e|#BYtq2jH3r7+N8BOq z5l6&b`{0BB_`sNN?ESkqCQb%dDB2ws_l1XXuMnI66TeODw(@x5_lVyies^H(nFFu= zKG0syt{BAc6Mv9h8EBtqR|evAD|~Ey+cqB{{*?H4;?Ib`CH|avf*p)*1`>Zk{H0wD zaNnbdzaswHE>^hja=1S|iNCRPG51zoJW(~c&i{pY67i43-xL2ZFz!3MRqA#ge@o(@ zh<_eZ$#f*s+ihZZh1TC~;Po&!(BC3B;l4VF1BUzGUagrshe%B$cl*KPavUFa*dpy7?%aSZl zV&_DS46pM5%*Wb@2bk}XO0BiV{%Cz7od zX8upIt#CV%9Z0q(8E*TMJD}Y4D9hc^pf4kJ0#CG~3UTO^17haX9D z8p%;4$Ex7b!egws_2F?Or${+ocmj!;zqtHAk^j4`>|U@+P8E*K{*W<|`6p+PTtISW zUg|88vsFC5|C{I*K;nh~yZ&##^o~z*p~5aAvFraNx&J4Zl3bS8b~%apKgpH3autaU zA`(-)M*Lc#yM(xs$PFYPklaY}Cdo}C_e<0eklaFYE6JTCw@H-$CwDlWmX&Bj0Lk6L zdj`I9N7KE7E6+@FU-raEVh?{R_d(%9BoC9kNRsXYkCHqo-G%@Xx0#-BB>QSg@|47< zg*N{ed6wikk>^b@b9muD?RiOAql7P$yh1WYe6;XYhxv++mGTmqMhmiy^;8_775 z0!f9$BPo#-72^woEHX$)${Dxq5-PV!(kH2rv`Fe{E=faK&Fnu8l6J0lNFtI%o3%^g zcIo_|AKg*o_NA=r-cs?mh2u%y6?w-hakr(c-`*p6-?%#qsIE++`G4{e{aKXzG07(+ zpXR}zN&KAT7m^7ilSsZG`G(|6lCRxthvchl&f}JD$#2y>z5kWyo_^s73$QG=tN%dq zV;WELlQr17LYIIn;8*(7k^DyA8T;=ff9gp5BR~57vhM~Yf0O((`Th67mE8mz`qR*# zlK#~6r%JONx*z=^A`|FOt4i$K1y*N&df^Q8XQV$QU{T1l1nCkRbGUDdU{gsuqig49DcQyKE z{`A)nn*ZB)aRzCGy3bB^Se)R_BWuvp~yzUjdOhyB{!u%%oKe& zQ`~Pe{1@8(wG1D<^TQd=wC&Dd-}4t{&4y`SbMCIJJR1tWM}&O(BCE3 zccs6Zbn}1uGL63ZKm9$0dkOb;Xg_yu*dIavP>K7}-%lj>|Na5=&Hp9Z5J3N6`iGd3 zo}u>-qkkOz! z_tSqMS01GQP|hEwFaPg9sxX;<|M5K6h5-5+7y3_$Kb`iK__Oq%6EXj%{{sEC$cyw} zqVLfk<&sifrvHk_=v;Y~z6}Qw$I^dIME>75|EK?Eo;yy-f+cOcoBvDkg*F7xFVQdO zdPPbotkSRLdYyhlVpG^k^?cKJ=tp^ER{=fxajqov`x4(0n*WQ87rsN^1_JT-=)a%y z4~$rwKjN+V=zmQAQ~IBzxiSR#fB$pda_;Jk^n2Cth44$E`0@*M<9(xo^tM3~9=ga+8#jV#>_S%*>rKW6GFv zQ-+k8!Lnt`vSo%c!@u`P`!?S{qd9Z-+`FsQN;)gcviuX@{w(r~Ly=$k_BYRem-2`3 zPvKvD`?rt&!?*vMn43&UrspOnH$}?r4nuA#aCwD-qkUP+b`;?kHm|ULRA>_=8$sJ1WFmk8coq^op!XwDJ|NmW>+)+w6n%oH@ z#|V!lcO1Fn9k=sBNKO+(?j&-jk~^8)DgPUl|EKwysmYy5?rgPomR&QXkC5fgA$Kmh z^T}oY?}mch1?0w)yO5mg>P4y|^UqyktFZoGO71dpX8wcyk$wfaE6F`T?kaLOO1YZc zHRP@nzc$S$cRjfqvWnTZ+(hn9ayOH^jodBdZvEfr?d0rTpjJK0A4l$9a(9uthuqzR zx{uyR?*9MHm;dJ;atY*Q{<%lUJ^H^nkCA&r36GO|g4_i0CxuT5pB6sjYLR<3txN7X ziO-XBM_Ts$Ke-ply<`dMGr3pDy-v;^{wMd^B)ZH$%XyRBS8D1la&MD+U;G`RO#$T0 z|JA|=yoRHbH}{%|Ar;l5!Dp7vJ=gH0y43a6|G`V z)%)bW6Zt-^DE=eC2y#CWOh)c!a<-Y|ei8m^Y3?>o?ssx#_2m8_C-cw!Wg&N;$Hae( z8?hN?w=KPbiGn7E)|6j{15v)$IGJ!e2 zZ)#P7)h4O62ElNGH3`-xF#q>y?%|)o9?JX!GyhDqE!}`%LxPP=)NL+;jU6Z0#1tEO z=l|~!j3U^EU{iw472V9YzXic)f-NoCEpG1zW0bHJfz02Tn_Jxd*kD_Nu>{)@Y;XT& zVvn~CRi>Fg!Hxts5bQ*-bM_QdunWO)3TX-mb|cuG;1Gg62=*t~lVBf3_afLk``G1H zWKHdB6HTyRDiRz(Am`7b2N4`>p{#f)!BGT<5ghL7dhrNH2#!n@f}@RC%f}ELJ4xE{ z1Ty5{1cDO@&LKF7;7o#(3C!>bY!)Cmb&@Kl6Pz*0+Rq}eSs-1nR(dYM1qA02od3W2 zg;rE1!Nmku5}5xJTq?Yb;0lq;3I1!%=U=7J)dbfOTtjees{82mMzWS~B#^%aHxb-S zFp=OE0<(02TZOj~+)i+(_#IZuxl=HX;I6?VO3FP1PZ8Wp@CdD2Pw>G1<~&5; z{`_4BXV%W61dkJpCwT0C^(P4Q|Lkt#tO_xEH$gP=xGPtUa!37Q10|5Z8!eS$7Q?|=30 z2;7rDL#?0L+4`e;^3$M_-er>bt6fwFHoOG7{tx~T|C8V^^7aERg1-s=5&73JKba8W zTz&!aZZ|DR z{&4bk{ZD>j@;j4Xg#4;1+7v*3G4k^N{1UDxMIQn3OOZGKm$D4`Wj$YxyiEb*b@87c z>h%@L50k!v}N5pFBo zj{No_V}vQ7{k0pOD`Qy@j^2d`uL7@|cCwcv3 z6;BbG|C2vWcsltrM9y?5a+Xk^1@h;l+b-oi;rYS~gf<0`zesp7`Af)OBd#eRf0_8@ zLYJoLAb+JRO1X;s)yB0GrCck#PIx`}8!T$=-$?!@&u^A;ixus7yG_O0ee@0$?<7CY zD|eB%$wK-)!h6Zz=au`VJRp3K{6k)UnEWFW9~F)_{l9)bPW}n{8;#j@Kc8(^8dW~Klv}nf9dtF$bX%3t?^q5>yghoZpzcaC*PO;o$!0|KcrFe zKT7$D{GdbrLjG4D{f)fLKmUhU{#3r30{#~H$Ls%Eu`rns6Wy2>rl7Dag()e_C4DO4 z)WT^fOlxUYYdQ+kdp?7d87a)kfSvNMV@B zN?u=CMVkUBtV&@uudgm;4GP}>3u{SPo5DIiXE=p*ji)wVSf9d86gHr6fHF6vun~pr z#W$v~iLW(+!bpjugqsRw{)Nqb&K4B5^n5ghF`jRw#<7M!AEzb zu#=RXg}ZotR|>m%zPmzuP}tKedr{ci^L;4D{0sXjZGY1TouqJ}#DjzfQ#gdeDdLAx zI85Yl;Ss_kg-1CQIhw*TBF74k^ZM}=PVoFh3MYAfvLEMDDO^I~G_Rjd;S9$qoavRb zD4Z?j9O1db^L+Gt6)zB8NZ}%{Uu?wAmrK2JnQ|@{rhUGG!j&psCA?aAjqqBBBG*y4 zUc~!<;YJHt%QsVaox&{?#w+1g;cdd(g?CW6(-HA;!n-Kk?Uj2d+$-@u;r+q~gbxb6 z{}&#n@Q70+KI+HqF|Rx>{Rs+BdgUn!Pka81qR$E^P=pTcLH=K;Dw>6fQ=%CE?-{mmpk*a7kO2`*J*7O1O0P?RmH?;bw%(5w1o?2ut=4H>rSkYPJ2c{Re-9T8uHa81wG%ATnR*C8BkqHXEAgzGDF zz4ZOSgd6zKhDz9oaAT28tj|_u1mQ@}M@iY#_uu@Va0_ce?JGK3;uzspgj*9HLTLU^ zxUHoPcSpi@gxeGDM>v*n4~2FhbnDXVJ;R;s#%8#)aF_I+q1~ShcN6ZO-lZhmlW;G4 zWWwDI2={hR#JT4H3HK51YtIC_U(bd66COl(0O5i5Dce3j?wGw^I6T-oqn{lS9!hwa zx^cLP*3~0~ngT*i0k)Q7DDFXcEa8QU+7v)|ywIiq!V?Kk5;<9DlZ(iy!qbGO6P_V* zrbCglgqi}va|q@Cq4__dnZL*dnNfrnQFJ@;Vv4g9UPAa4q4_`IWrS~vTu$hUZYZuG zyoK;eLbG~8HyT$HUSk90+H{Y!y;vf=j_^jp>j`hLXByoP3@y|qyovB;E4cc;z< z|5n1g32!63lkj%JJ8ZwW+aT_jiSEh6a2(-XcD%X9Us`G)zYyU)g!dEPOL(6(>jvMw zt9;uj2p=GH{|;tOYfrwpn{463gcArKA$)@HQ9`qQ!tqu`H);qUw?7DT_e{bk37;W+ zituUofTC@Jd-Bjd`5Bt|+hdmQenR*h;VXpC6Uy_$7cAu7d=*iSLFONRL@3V>Klb~} z4bB&Y=Kq9d{4vD-94-Tw)z;)!kS8`-TM!n$fTvb!i@i%>oswx!z?K-eYh5&j}B{|~<-H2)_w z^B0l-hd&YioGRIU@Zwi?w6T4p1E8`K(6VS?>(iLUVY1PKt9; zT!G@;6qlkX^DoZpqw`UmU-{nuiwja*$VY7opty)|QHqOseQ}CQP+T%KnG`85t+Zu? z%Lu>R~28yHrZ`R`Y>2=b)UJ0qH9uIi{d)sYY%+3 zpN|gDUSm>R&nxRw+<@ZN%G^-65yg#tbQ6jrJReDMloB@e%4RBR3Mg(taZ9hu|BGW3 z-O5CFC0UgJ7v=vpR@*7MJ;kvUccr)k#hod-UA$9z=RbR1w782^-`a*(`MXivJyYCS zU)+=8u@v`GXm8;@!hMB@d(e4q-f?(@o29c zlbzSa<0$<^@py{AQapj;a}-accs0e7C|*eMWQub8;wco({B5yg_;iZrs6kBu#WN|M z?|)ElZ_a92&u^u8C&k;8e>=rHETk(0DdW;i zig#sCJQnYv_z1;&DL$lx`zYS;a~`1hpmF_HUD1cr#(`hem`6wUu_v9bC%(Cm_769(kOmI@mmr5^A{Tv+upoytzb{sTKh$cF~t(avXY~8 z94tTUbA@8nc>0e>#TrG|PMxA0zSyAHRK=Fi%-@!DS}b-Y_JrpDevrSXX#P*}M~e2? zC&iyEs+Cf-`9k7vl-x=EJEe6g{z1w4>w}AOlcO80pSpbBC}GO z&GXr%%t2|+R2eet07`RHnxB&SzgnA@(tIhmgT!rhX@P8$OAAq2gVMs37E|UT!bL6F z(iW#=woGXW;gZ6ogiBLeMr2t^!$g*&w7etYD+q^DlK-biW@#mfD+^Z{TA$L!DsCX$kkUq$lhxWJ<&;KH8ky-6AEUG> zr7bCK<`hb1{vul#v2~56v>l}}l+5ZWng3JTTDXnnXmf@PJ6_86rdX{VD4j#ek^L#{ zL}?F2cc!!prQIm)YH3-f{6FJ+QrbtEdr{ik5+-VHE$u6DKU1svU^t{80tPoQ)Lr4uQg zOv$eQ?H$h9T24{IsgzEmbh?Rp)0Wfkdr5h=oN9k%x=To|b(gl<* zqI98EA3VoP7iY77NfSZoGPQX*r7J|dr)_iqfN$9;YRi zn$iR(QhJ8cvqOfR>$pR=PiMYZ!HrPoAWqU1XKDy3Hjc6dUKyVpv)#r5`eN^eq{ zIAoaKk5qcYiN>uPZ&7;N^;7u=sKf6H-xIzs{6P4j(7giArI{5|`ou=b+W$<&&xKzI zzZ8B&sW@cVI7(kr`ew*5x9#5wbHYHF7Z!w}!y&_7aX9dV8?h3lh*FnQnNponJn-p0 zlq$liLy?41&G_$ksMzp&Q^l6BO{rtLa-{TxeM;Y%Zq0sA=?Bk$H1fMU5`HFfXYMaV zt5N!u$hqZjL^DwOod`;QQ2K|G^Z&mo{pGgT7LANQbpIui`KO~4O-?i=k@KMu++z$w?H)@sifB`pU>@#7Q*`kknfViKX`!soV~o4S`nENZ=7LE6?`Du_JEEP4 zwkH~EIqvp?Ro{UqyLxe}BicD_foK;Z@Bi-ec(gmwzC?Qv?M1X_x(Zd7|64mYBWS(* z5gnk={(fH^NOY(an*xXq79Qfz-jE+1W+bb71kq_kM-rVtbQICCL}vbOA<`>AGkzS= z@usJr!lDzEa1zleL?@^De$}U1G4+J#bfPnqd8RPk{Ij!s_gN`Am-1=~okw&&CcVEOLqPQlcw~E+e{v=yD=$g*~u6i|x2=(r#Zxbd8d)w$GuOg*DFC z5#1sEdZHVMZX>#p=oX@zvR6VyH)qMVUYi2aBGK*o)9SSGJBh{-Jx6qxn!20lAtE=V z_Y>V~RjlrP>9HaH0MUb{r_aGg4--8}^aznVHXb$IeYlIp8*%eX^tcgg;Rz$|o?i5n zicb?wAbLjpS)0DojdD5eA>QbDqMwLfAo_ynMWT0zULtyp$R7G4dWGm!`-!3(9CvTZ z{kAuHo#;)Xi9~PMLp$zPn7g2IzwnLTB6?fD=bhD7;eM+dy-V~7(R)N661`9KfnA-t z-|f2lV7A_mh(5MEQSPXAx56gOLiDM6DF2T>w@#+d4n;2;e?7MW@2ltE5&b~)z2mmHC!(VtGoB8(dwMhah4S=7?*6}dHPLTG zzf+!)=nu+f=0txI{bj$cj@->3hwcZ|?!OE$D^~@HfoKOr!wOH zGrc^GHC2}Xm#0gkwiPDMKzT;Wvr^V)wDQc9vlb|u`76iWu6)O??#h}b%Cl3R!$NLd zZm~veIuNlbfbu+)=cT+D<@qQtBxQbkRJFW-_=4FTsON?(HV zl9ZPgx9k7x%qlPAc8A2}D6eX}vb;QHUHq4aN?*~EttZ1MujIM>zr2bSUG?<(v%EUx z;gr{)Y}fph*R-hf-m-lVkfJGI3GJP-O#zCoPx&Cq8&KX|IU7>m$bJG=-k9=sBAWc6FBclOpGBB*rSK}sS5v;3@->uipsb63i@I^Ji~n?u%Dj>C zO{Qf1zeS?VKT~d}{2t{yC_hE{PRb7`VVv+T%6C(~Py8Or^8ajG?ssD5`Q-;Go7Gc( zNcb@2M=a_V8=3Jbr~DY@$0~^(g=~xAMMZ;?@UCvRCDF>88%6TOhQoB&J zNI8D zCnuhQcz)t3iRU7oig;$?sflMKo`!gO;%SMe%hsFjg?NU+cC6XhrT~{fJPWa2^&Afn z5AouxDN*L^#B&hOneNRDtp)jiJdbkbC7#b#m%eQvUVwN>;suEpCDx=6oBtCpGT5w& ziwPGeUcz*@xHnhCOA+h(KVF)6870^RVM}_L#mf`R|Kp*GuBfdTCNBR^hcRA-cq`&n ziANHzM!X*J>cn#Xcnu}5nH`_8_y2eu;^7Ld>(FjNWKFG4yaDmX#2YHQkwx8Nqqm6> zcPPdqyfVrW;!Uk+WHaK;iMJ%S>wiB!qZJxsO16rvi4P{;hIkiZ`yil%?TEK0wquWY zEb$JhZs%;glh4`Nh$*`g??t?u*LNqD|63>b^lRChcz$M7g6IR8JM_!u8OR^oAf?I(EsM6aAoTp>P%_$FoA z^*`}x#HSNqNPGtIImGh+_$*)dY$LW&=X&Kl)jD5zfsbB9d^}nK*3N;1T zcA4mVawYNg#8(ktOMJD@za~u}zHXAt8+`OeU-xF>*NAT+9!G5cPkfv3cAt3%@twxg z-{r-35kEzIH}ONn_Yj-m6W>dGUz+cS^Z{aB|7Y9#F!AHWj}VX7=DYWQ4pqg+tk!>f z(53+5Cw(JN6Te9O46(UA@w3DeEZ%<}PMB>kh z-yr^g_)X$>h~KgV%YWNQW;pK>zeoK3V9SmWf2g#Nh(9I%nD`URcb)&Q|DXBo`hxgd zC4Wh5(}B48Kk+v{Cr2#Xj{{4{2BhFgQOPBtCW6@fpEw>&R;7fVqc(~EA^w-j6xK*(GAdA++(K@I-Qphqs7$HQR3_?IV=7K#MR$%=rlYzR zmFcNGOl1Ztn^KvP%6e30qOu^BnW@Z8Wfm&4tJVM&^M5Kbe8GK}PE>ZKBJ;Pk?_xRb z{Hp9mWlt)*Q_0LfZPOu@y=(-G>_g>9D*IA7gvx$Y4wSgR@BoME!$Cgz;B3sT;-Ly1 zrp&{s9AU{>zWKlOqp6txQ!(=w@%~>qfy$*+PNZ@Hm6NEPOXXxLr&BpaX)^!HX=yF3 z=nN`m`&7>Koss#Qa*m~?*8`RFsF?ZN;?ASWg{pFq6>Tstrjq%;qL)#*nabr=mv8MJ<=ji<0g?Nt+@FS2e2~gRSuxvpk5KuE%A-`?rZS$&(^MX_1Y6PLRAl~@ zC%y7iT9?W*R9;rjvs5Nfd4Y;e2U5)c)uk6zH1qe0%)jy~l{XZ6jmqmH69;otd{d|? zz{dX_Dgl*useDD{Ju074d7sKhR6bCe`F}cMDt=7m6H~NxQa+>dIh8L`g^IuUw_Pdo zuY6kn%$p0(m|GqW(e{%py(w2U-_Bpj8uN1@)wm~6_x+nT7IYUhZOmL zc1Zs%)>SR=*I(fD&)hV24iyN8hR8*%`&eT+=$vR`Y^Z)66{tT1k&qQ@W zsxwoajjFqE<}wFV-TYr#qba~zTflPCBeuE_ z)fK5OOm%VPEFxT#>SC6VG|lx?Cn^+q(i))lE+;=X=#* zR9C0Ek{Vf=>Z&5EWc#gNcmqZA$azx~`y;^t|Z_?A?6r8=7G_Eg76G5@E!HPvmY z+5}-s*0JpdTcbLb>JC(QqME(^OzYj5s+|A7k=%{yepGj-x);?w)bgH#ZBpGkRlDaTMf zmg;e73zKZc32M+^|5s0@dOp=tsGd#rRH~<|uBHH6?-^9jv=(gt+C-4GW<5Mdndb`6 zOLeLjP&KQkdLh+|s9v1v>DsAYO7(K8mzn66Y=kpT^-8LDQoV}mja09udL7kk)YP?> znI&JJ)}?xbS8k$uE7hBoc}p5~A*#1gy@TrQX_{fy!Z@n;QoT$0cl*}vF=Dmuqxvw_ z`>EPxKUJF%q-zSu_#+BEDjc6C*i}vSajI>qPf-1w>XTGoq52fnXO;Fe)n~FyYjy(F z7pa>6Q+=N53u)gnG|{F2s_rkqeinI^>IYO`qxufj*QvfCaiT-@?M`gYn5 z)pwQlp74E3PCxrpKcs4gPxT|=#}=|}|5U}#te7cZP_0n?lIph#eI@*wYUcm$<(5=) zREtyth4NGjX`fXLeNReM%T(?9-xfQT;*8sRt4dC&HmKH8ooe0JZ7SL_JsXV<$z&3{ zRC`o^quQtH+Wd~HJO00?YUXd%vpxP(N*q%CMHS8e(;TY5Qk-~ zRL%UeYm5Yvc}XTGnVDn?l4&eInUZ8GlBv@+v-Kv^l9=I>Oh+<(7Sei2W+a&@8z|SS zWEPUSNCrq|BN;+6t0lXQP5YnBP9ob+=E!=b&n6_A6q0!cTPB&0WKoj&NfstqfMg+( z1qa(n+axjb&qgv?jASWSBw3tf36Ui&nyuHSgS1GpEXnyK%aLqJvOLM^N?w6vsK|;W zD~k*xG5_~1tRm4S0+H2>xa*T-4U&yX)+AY_W0N$qs5^8k{puO^5S8h96@pl$&n<-ksL*GEXmPo?U?`a(;KI@#^Xs&AUTQT z#K9=Z$;P!VRXmmCG?FvKZ7y&jk~2xpBRPxYY_FU{a_(TQj9BIcB(ITNNOCjDMQY?? zlFQY|B_x+xb?eDxe(yMbEy)!mS4qFpzKgVWuEzaIqVJWI>qu@;&h>*j$&Dm8rEMzb z7LtcaZY8;!C4( zlBY=?C3##`#*;jjHEt_ zB%hFcYOBkRy3Zwkkya7^iljpFHA#Ww8xk3QqIn_7`C56)&sq*iN+iW}6SPGUiTnO{ zXqrQ!DZsY0N@BK8lK8rH6&q<$yhZXWNn70QlpjdCB;TpnBk5bF)+^=vAq#2NNPZ;w zh2*C+O5(o-$a?r2$-gAOll-Mxe~|o{W~#S;3;!|2_1U>rZ8B<8QiED{{cp8uQ=|#h zrb_El%Vq&;(^8v*+H^`Y|ED&Ca7N)w!kKL?wOOdy)jqWW;SgJ+wustn)Mn3$mM|x^ z#Z_@G;oQ{bp|+s-ywv8iZ%b?Q+w&Vn^!%rLN~g9EwS}$0^tq1OBGeXDmBmakn!exca36~eHK+XC|ZAIZQhaxLcv*|#56>8r9Yv%vdR;RXxMbnqI z)z+eR5Vf_b?L=)IYTHvAPHjtS=KsoHPq;p{4ZN};HTl1_wlTF$ygq{3NF|RFZYtbN zxVdl(hv|A%98GPE$X3Fwh1)n3*;cq+b^zOWj-_T3g!CPa*x2q&Z4W8CP}`N7nZNl) zZFeJXv5GbkxP{tY)b^&fkKYmdN|gWC_7~R_V3`NnQyfOz_rJ$bJH&A{b*RL{sM+;D zwIhT_TGWb132h3{fpjdjtEe4E?G$RqQ#*;;2}(H865O)n6x8JZj$1!ZrFI^*)2N+6 zP3E8JXQuho&Z1^h0JU?xa;_2gyQgQavryw?1yP?K%S&#=1=Wu;WHLZ-!xvEAmusX^QNay+SFd8 z-lX;twLhu3L68a8UQybs)Ls*L-SVy3iNZIiy(#jR@NMBc!gn2tyhrVQkq?CC|I~Ex zU;9}66XB;0MLx?OVyt~ZtuEzDp|1aHUsL-=MVWss=eUXiwaovi6{v+0i#}RXF%p)A zF|~?FRhS5C4sA)FqO3KjHKn&wotoRl9VuO5PuLfJ=TPK(YCm}XBQ@{;wVxIJMffYV z-$Z^F+Qq+L>0i{{N&PqVMHKo+_^)AoGU`wtB0jlr3hGmeOyy8yYT-20r}fHo)Tfs? zgHZlom;cvimNJWQz@aVaFFotCN}NqNyKoNSoYd!XM0{@HJk;kEna}Iv&~2^>sa8Pto;-HU&`Mkh=H(`o>Z=5sq-^Rz!W2 z5zE|^`eq`Vdu0n1w-k=1KE~@?N!gmZ_y78~QnsVMz0Vm--TQxiM@9Ynf9ktXf1CQQ z)UTnw8}&mK-JSX#B70IlfcjqIdpi`_hx)!E`%&ND#B|cPy>lS-gQ*{6Vmf8l4;kdD zav1f)sb5I_2o;YM9!32$>PJ&QUd3amAM1$taYmd;)=!{*GW8R^e$s!>I@V92erlSg zDyLIFoBA2zX9~}$TQsHI7 z%c)y}_!Yt{sb3{>wdp}3ey#92>d#ZZUi=2?kBHnz{U(u{9g5sS{Z{G^QNNA)IO?}c zyu+Reso$ABL!u8v)bCR0Zs9#Ph1Kt+exHi>3moidGOXdFmmSsL5YSdPYe%3q$w3L-;ktW9G@8mrM5 zCS@fWX8SZ&PJh!UzN$mpUyapitVv@HD@svRe*s`s)}gVkl;P>&ksTxrGk@tD(Ad!P zjc9D_`6e_*C}E^mYzm;Usc%J#ys!X1P= zIuzN7#?GGaB4t+^yLn}I8hc3G(<^(?*jvgzUfEa0{b=kjazLtU?FZ4hh{nNmTu%<6 zaXJnE|6h&6Xz1b3#t}9|Hn2wukD{Uf|1#wm8v671#&HTA?=w%JaiZt;7w|Mrrs4np zy>TiH`}22OYy{4r{S}QfX`D~vEE;C@G|m>DBRtnSJn^c5jm}c>0@|O^xRCZsG%ljG z6pf2%oTDy_P6*R7va;4A=);@7J>=qD>YiV4U`Xr6( zEo6PT!H7j~qH&uPn*wOuLgQ8oWzpMd+(qLKh3*uNnD z3qnl+){~cMyh-B~8WU-}O5-(4b~neYwb!%HhK)B&bW8eCvGJC1_g2rwJ2Ygujdy9h zN8?Kx@6-60#s_IWjSp#jq~xIvX?#M%Y@f!b5?u?Q8!_bz*I^NN7z8xF_WCz8%={Jd z_kS9BuM}v63Kgw-)?-_u4ef z>S=UnbS>X_&xnoKcV79P#t)wV=+|!M?-m-r(D>E!-=t^?X#C+b|Dw4mjlXHmq3Ay} z{-rsM@#bVS5t*Fklp<54wZx|qPVLZ+-sZG4XQ4SA%^7KW|8JWATW^~)DS76!C_W$@ zLUT5eStkjZ|EtY8X%4437tJMU&P`K3-<*f$ys9GqPe;4C08JTwb3vL5WlgzXc{CTH zxfo6JfBSDT+o;8j8(G4L^=&DdYtUSprsK=dT#n|lX-H|y3s*43E$*79xgyO~X%3^g zGR>7TJ?q9Q*{C*GOLdy7PcmX_(p<~wG}orN&Y+*YG)L3iTKX8FO#!~aZD?*gNm2ga9BYbo z)uw>-a+l^#G|m5M%KV$V(%dcEimY#Y&^(6bo-_|q+Fmr}|IK}9?niT9Ybwj!pQg+| zy*h0kn1*N`O!IKnJw$jY&BHA8U&SM&A4&75RHu2gZ}V81C(}I6>&Gke1mTIolYHhW zDxNAljpmsmr_(&c5nJr2I4k8e&HtsGOY>uz=h1wd=J_Qg_oIVZ94rbnparSa;{AKBYri_YiM3;zp}}q*QHUKH_*I==8ayziRR75 zvyn9ar+FLAyF_jm>XkmtJ86#750~7NdsEPq|EJ$7Ht(hRIL-TLn#t3=pXLLOsFM%U zd?@7#J!0H)9;G>6#HI{e?5uwx98s2{d1)`5eucY0CVYFDNAQ zx0YW@=R1k7(0tXmsae39wKG>yn*wOQN%O5#$sTWRzC-g}h2B#)-WNCjr}<%;N%Nz$ zS2RDNH8ssoX$DG=*)~6?`GtyK3cvETzNYz&=Qah<%uUkUJk0{lF3pf;gJw|)C7KD% zNW4t5DiYH)^Up>m+jljZX8tBhQD#%v61Hh}2CLBQ(fpHUpXRSLzoYpR&F^W-{M`pD z+a2Ejn?GB#*4tlEuXw8H6VO)oM7t(j@fC~p4m+nmL?wPsU*7tQ}^%|>f>TJwm{A)He<7p=J+ z@yYYjT8!3wv=*W@Kdl8U1*2dCp3P?p-BWY#+Pis?Jn+=AP zxdp8)MMl$-|F_1_n#BBD+YIK@+K!f8%+t~o&>Bl?2UR9Z$Iv>K*73BC%T7->Xm&`PK^QU!=@LY$s*dcK~t&3@0kSeq;RKi8RGnaV%Qd*Z8fBiWnqzAwiw60O{ zN?KRZx_V%uog*pIx>lj~K-!M`G4y+)w*4H zM^-l*u5q;PN)=jnE8!mB&-+xo-$!i+Z; zT5r+%kk;F@-lz2rEi-?u#cuxClI>`l0;GTB2(6EWpQNJrXS5<(pVP|I`hwP1w7#_H z;C-sr*R;N&W!L<)zIA9(Ybr=Nt%6rV=|y45M5|Kv(O7zgmQ4pfTJzC5tp=^{XvzFr zEm~b#Z6ECzarg9EJ+JhQ*s<}wSAL-Nqj6j5Pev^N7uxRp{gw8dw0@(V+VbzT{-Et# z{ZHC*{?=bEpVr^Pe`x({)z!W!ZG@B4p2Ebz5op^KKznN8G_=k9#ivU@poz~wdq&zr zXv_aCe`e{k(4NHn+h+dKXA{mYoFg0I_FS|_(Vm<3DzxXJZPrbDUfT1~UWE4iv=^ei z0BxDS>)wAoTzC?`DDA~uMb%wAJ3QJ;(q57FQnZ(+y)^A*6m_|wpZ{Z zYoE5vzrB*_)}NIpS=XwxSEFqvPkVKtrhxXEwC(!e7He}I+8faxPJ4aY>(X9tumwdo zpzY0HTSR+f+9PRiLVHBo!v90so6_El_Et`(y}57;;g-VD!ZH6H+wHAsZ$oK$o&|F`Haw6CDOD{XhfWH;5_o%Rv5_n^HG?LDQK|I^+(ZBTq) z+6U6!&lC&oPy2wBYkLo(eW>(6(8`(#s$XbNcSBS8B!+NYcoJIQ*k+W%^L;FJ7=h8l3ip>t{^93o9 zc#&~y`C`BJOI0-gr+vAP4(|OcrC&w+X4+SaYf@-mOZx`e=Kr*>PitviH>RBSO}_nG zXx~TsR@!Fov~Qy=|8L(xdmQaME#IFDzRKOS?@{u-gHhV|(|(fn1GFDi=t0^K(SC&X z!c03E?T=``P5V9C?^wuk-1~phy6>w6_wpYn zx|jd>7aX-erv0hJPXs8jymno}v1mkFp5HEer9xZguY~j~eix!$r~RF(G-x+zcWJk1cZRHZ0qwTKA;WS* zR=m#0itZfg3Hw7^R z+*yOpfppfSvjZLTe>!Um*AWhXA>oi5RMd%5^n0y z7F*-yQnnD9`HPIEGsbhx5uL5+Y@?9;zq6f>ZZC1H9~nD-r0hgzXOUfmyLx>$I=f5R zLn#06nE$J2QvjWP=w~1YuK*6Ab26Pneg0w652tg4SB|7}l;=k) zdW`T`;c>#_g(uKC(Gl^J(k&7{MR=<4G&-k?oFSC|cg}KL#j}Oy&^gyD=g~P|qWs^s z?m`RM$X`t7RXUf@c|-}93NNE${!hm(x6!#m{7Q!+SJAoJ^K0l_>-lwb%>U`!;1!z! z=-ec{na(X3=-e&w9y<4m+$X%>=R82?K`9S;3j{Ua4W7Jef9RQQ?j^GVkGrIfGed@b^g@LPu> zIXZzzURV%@4n>M|N}gx$|D+Ssy_Qae?tFA?3ZRn+YjmfhQ>SC*Os7Go>Fc)Wv?X?g zU185h`*gmO^1WAnp!1{WKPhDXPe*e>=T{45`|)==e<<{)@Gs%t!heMSIyBOqOo(uD z;S|Ct=}zT{_|$Z#@qAh%?kwm|uh0x$pONlNQfBswrhx7M-67Iv70xD{U8sqsJE!9+ z&P8`_5t)B?-c;ARWd7X+=SC*o?G~I3K zE<<+>MVF28uL+1~7qq&rHX%>U_brlO{R?iS)((j6@_Mrh_Q zvbAs<-_&+q-(LDy;SRzb>F(sCJJa1o;;zEogu4sP|3&tsyI0D!?fXdFm+rYD`_bK> z?s4Mg|8x%&%Ky6u(>=r$r5sB4FpzVst-{+Jirg;L6wtj> ze4J4J-@TjeJt~_2i)aey-cR=duRNIcLD7flK0@~u@kfQ@=|1K&AD8lk@JZoQbe|S^ zM)<67f)c^W`}Xnw@{)RNhu3sVTG=}{NHlY$E&)||No#{H^r(q=z9O}wxqO$ z9lBkg)05Jt`<=-5!XJF}M-_jf`?FVmq5G@nzbX2=70spP|J}bN{w@56-pnHZ(wofE zT(5f2n_NWZ-<#6wQ_-7R`ZU66y*{0a)6<*5D>F)&DI4&f%)d7vafonMpE(=7*`>@O z^#0$Qi{9K)<`K>-oKHBvLy-lHxb5mK#4q>JTbN##-XiqYrMD=()$K{G-eU9?cSL*% z;gZ6ogi8yT5iUz_IY-2o7p@>2N^eDxVZxOhimXg;6_HhitEKwDMs6I|ptt70sOzP# zMQ=F0wFlfg->g6DSlV-=26h}VF#2tJ>(P6i-um>ep|=6Ok@PkkSf@d6qk*;ev6o@? zHXc~w9D17wM+^)<)c&-kH;Ues^fslp8@xjq`jvdfU?*YsL5XHGF&%dONy`^mbD6&MukWE>d>Qa$Y!}-tOw> z9`sJ6=hk>Ay}jriNN;a?`_bDc9SwT>8X4K6x4$<304qK*7(Gbh!SoI>JxN7A%Pr(qVTZ&OX}9TJMepi?QRRVA zGr9rPF20uD-Sn=bcLTlaO?1ns>*?J{?=E^b4Q%K7e6wp%ZQdfhmELV4x6`|m-W_Rl z$h=3=8|SzqrmS_3_K`b^?x%Mzz5Cn`A_lfy*BwIAAE5W3@v+;esfXx2Oz$~*kI;LX z-lO!M7+CiTdgFzU2_GL=_pE`P+`0KAy{DYw_`t*S42*Z@l*@dE-m@YTh74<@QF_nQ zds*TO^jE?rplBRW!!qT z4E?p~FH3(Y{pFOuJpC0cVUkUwzasr%^jD|9Qd*b(%1T~^{;Kp>%kp(qAbkztn!>fR zZ=Cz<(BFstaQfTQUzh#{^w+bB)=9hm*C=gBe>3_U(H|v!WBQxWA2HY&`tJP??j5r> z?DRLaTJGmOeK&NY>2D!%OB1t%F;e{Xe}8NG+gS9!gze~WPk&GPW9jcge+T+I)7J%$ zdl_$kC;R1&`x`04dFby-e>ba}{)t9^cQw98x^?1v3HP=f8{2*9A4-2eiTeu=u#olq zK>7!X94yrJ|9_)*82!VgA3isk6pQWPvOEPzOoSky|=hD{&ZT~#_=bLCf zzd(2){fp?2qkl2|o9JIc|0?>I(!ZSkWdkp*W>5OLXAk-=|4RB-*sARn$L?>rCJwyh zM*C{|*U`U*{EL|7>HaMHB_?hr?p?w6P|0R99{ulq+wlU-1O0iD? z^aEjD=-vX6o_9t1Rr)1~|3}t$Kut|OZ|9k;SkYYzhzi(1z=CvXN)c&dL;WczioId) z4J-EEd&Po?QWO;IT@2AHZ50t3!>Al=9_ImW*KmtNG&(jQRcFELDQleECPQ z#eV_M-+mbdi(dg|%9lSgeo2FCDdoR_&t%ro;JQlJgH=|rzS0d~wN$VnQw19d$P-pz zaqr6bn`rE&Qs{Pm~&lFZ?SY2eL z)Zq%rZsasrJHhG=YiC%y$Sgc`Z&+Pr`EBhAs|T!Zu)6b-yF6@Oxy#h@z};Z=gw?CO z_tf&R4|wv`T>8M;O{Q{Q^Y5^$%*a+hSc72ohcyt^0Acd-O!&LQ+M_&Zgm5@7p0%yP zu=a#C1lCZoijB`U4%RSH&N>I31&fP+IIIz{4uCZh*4``zi)(MR$ncVY7o64@So_1; zhm*tFmzl8klm5ob&j0cEt}{Ew!WswbKv;*ulJ7smIvCdfSfRwuwZ7uFH5*s3F89S>`wN*)F4SXf8HI;PUCQ>9z)@}BQjx($PMoPq-@ zrlr}Pp!7tgCn-G{)+q`mDLqx`X-ZF5dInPkXELpHCRk^~I!7#2+sd!p59>Tw7s5Ip z)&;UU;;5l}Yu#Q1>*B0Mq_)NWOJO|=Ycj0cU|k058d#UZx(XII_mv`}6{RJ*8rGEZ zw8zUsFUT4T*0r#1fOQ?L>$y-O$@0=VH^RC}u-Luy+g!n#XZHe0d3{41<`VBIfU0P9{@_lc?jCs(>1U1|BJTJj*QM`1k#>k-xYundY( z+}Wwh4o~4d<*_nx}6E@DOgV{zP!@y)=IaBCDj0~bME%9z1&*aob>VewyQ{twnau()Xd zmgmorY1%hJhLKAW!s4y*{43#$r?iy+s1Wg_O^{2ycrumbr8z7@)R!T;1?)nKXH zw_-6yvS`3cVI`uLf1Hq~`#H;D1NJ7c3HExhP1tM0F2QEcKY+zx^Iw4RG&(@Cu-AdT zuH?(f*|D>o_WH0lg1rIk4OO6}@Ut}o=V+HQ6?PZcyTINN_RgBiP9pHlKw1AV;2*c0y({eQ3cBh47jW7h zx}2M&ntQ<>1iLrv0kHeP?gx7}wXm;LxYU>~wCw&x4Ge_Mo}Y`xw}7}dwiW^IE%sp8 zd%+%}QJm>8RkCN6sz^H=_DI+xB&f<^kAgi~a^Xc9_c~t0+GAjASF!hjy)W#;VDAU} zAkAWb*ayHq5cXI}&OdHMrqaF#!#-3ijZ1fkl#X>ut&W2|USxEcDokna!(mT=JrVX1 zu#e0NDAT&=ISTeMu#c7`+=sK`OX-e-eHrZIVV?v01lXs+J`wiGuuqcYY6k36V4n(m zk_4H#kG$Nf*_{siY}jYOK8rc9&&<`ba_%Hrfw0eoeIe}gU|#_HeBm#UeS`{dPq+y7 zrJD9)P7C`I=2v#S6E+X(e7^wua@aS(z5@0&u&;!DRo+|pI=y|h*31-Lx=4eH&uBv$(2tx}?Fsche_Ot#?;>5!u8F4*_N=H-nJPn*C0 zCVda~eXt+U(?-C`mV80BT_bK~p za1LyK`IrBsI1A2&&D~=j?D<^7u(JZbD#>NT#r7`{os#40+Ols*l(fj3B9M0j?!)iE z{v7tZuouF95B7(!--rEyR1voMYD9^#ZpFH zg2MhxT0wIE0`@nszl8l2?4_`mWoBrJcnZiG;%nHl^4BO?fy4e5_K&c?gUz0wm3%M% z>XP+v>4#jppJewZnf?ODfc>j{xWoPpwhNp6|6j0I!v0fp;Yn7uoI<6dSj>X`5A1(o zuM)Kj_~;`W#j8a|l-sZ!iQ>F?8!p|_gB`>6VF$3Q(m-sj)JzDwrUpmC;RfaU;k~C_ zSF;o5R@*PHQ-=v?jF=uq4Z8HFaA!+r!x|&ruR~fWzk)AHd-$-~;(rplsYZ zo#9M@(*@2LI6K1Wqse!IvooCTaCU*SE1a&91vfF*w$n{?O1X}O(*sT~4#MeKer<{T z$B@%oJS4|Td3S@eyK3tTrym@)p}$120RP{&Gf*mugOYp?ID5ev1ZN1G!IBrZl+^Q3 zIK$xVDOt-u=CCuoP0KhO&L}t|;Ec?(%k_+gv$u3|p3SwY;p_wF1UUP`84qVaI0wPe z5$YTOXRH{YQz4uKwSZiE2g4Z$huiv4wOs!Nm{oB<=rOt_P&WCdnoHO8@4Chof9?mInCW%R_ zPv<0XPJ<&rIIKi!>`XZ4!Z{1h*;)$Ou){g0DD`C^I0>9co-a5xICTZFY}5FBz-b8B>tCTFkP3ATxDd{e zgEVN$&N18RxNE^}A%`Bkdy=hg9qu~tHix?|Tnp}ca4&|tKHLrDG^6A5a9hIN8}5d1 zw}QJ7+}3c*vh#H-N;ihP8Qe|aZYn!UZa#kU*y#kgtz;w2n6uz5mCO3ul*c=8_2HMh zrEDiTmQQ2cws5<`Z3lM;xb5L?3wLYPyp0I(FB}4QJGdQ`DUX0FI9_#jl+&9Dd%*1k zcPF@=;dbGmFnNdW?kKxUv2$ns6b#&5B-nShM(qlBB;0Or`@roEw!?rzdjt{(mi=m)ny+#$-;^|Lz=?(Wj263g}sQozrD)!zzpsB(1iFTr7O z_mWt_!i>T&?W6XLfqN?4ec&DpcV8);)aQP1_lL`#pN%;{o(?ZM z6Yha<_4zLk#u4|b<^O|w4BSIlZKc}+xQD_W2lr^W<5lxvQbsBA;czDuIO80t{E2X- zPUQFEo^n(Wq70g(eB+$`s2_Q^QV& zdj|K1@}RbG&s55L0mf&;J%@qfbK$c8XXg0@=K{Fw|Cw`ows7w-LV?~|qs<8U8_`;`hI>OQ0VXNB*72KPC*v*AvM`+_#v^OaUyEi=l8 z@Wlx>@o)RU2M{`?4w@D|F#Ds^k^83*o*B_g%R2;l2)+d(>-k zN~w;8$3EOQ;J&58Z_59w^UO7}2KVjqUWdbdhiQ5CdvN*pA>8-jejxRb^)7xw>V5?G zW3EYI_TRDGhr2HOv2Wmh3U?XYMR1qGT@3egxJ%%ER*s$W(qqd0YCf=q`vu%DE8YA` z_fn<%Cgm~ri*sAbJ%2geujIVQ-bl;!wM?w;3c2~iJ8Sn_xZlJ5PBP`rDZc0jxU1m) z2=^DbKf(Q3JURO`rri2t$HM(p>2GjIYoxJP9^~44~wRU}Y>%nFJUxypO{L4{8taNHAx?W5hGzmEf%nZ!LH&%Cnvk|ID?-{lR1Zzpjh| zPRo@qob};V;B5eJLwGHjBkr1K3U4ELWo@88%FpV>8*gKHo59-z-lpXjj+N}x26(OD zwH6C?R$>6J4g4}Z2E*ZP32#q$TfyrIudSSRdhOtKh1Xt9-5TDG3bui_ZKe|*ZvnUz z+bit=uVcaI6*BWX!PCQV!CfTklMmtTq)|H;lDi1t4(Z8BzDDsDfaSX@?IBDaO;XHW z@Or}=3a^jW#%@acD($C~FaK~Y4Ny8z>F!Jw>;Z33fd|7Il3}?(#qBGphQZs5d!y7g zbNYS;Zv?y<@J7NLB{jw;wBBfLXn1?Wy93@Bc-O<*2j2eh_7wrC%>4vRI~U#o@UB(P zSfvNTI|$xM@D7GI5#Imc9R}|Zc;nz5TJFC>QuSW}Z+w0aXCyb=;qbV(OeharUzh{A z>5r5vE*#|5g?ALZF~~wyE^d=mG0Y?!yDn91&_;eHax!kb5MCs-%6{^ zSUJ4&;GJKt{#DuHwDRl|w7eI>yByv{@GgaSF}zF4|8%Z&?_Rb)Ef3+mCd0c-)&ASoWAfLg7+xAhv7XUocIR$1s=S|;5{yBnK_WH8U^o3c+bL{3h!xn zPYIKML(XIh@0qfS!J7tex^kYA3riC9yjaMVOIyDHe;w`NFT$G%?-zKp;JpcNHoRBh z&4KrFrS*7tFEOoj=dLvu-n>fpiIwiBXB6J6@Lq#AAKrpW_sNy+H)|9Z;dOX#RJu=B zj>yA%3*L8??kxE>ym#PzQtAE?ymytp2k(6aA23zGqcsB`7o3F(zJm8Dyru9K75v5U zmK69i2Jk*t`i0UjHHuR$Q^2vy;eDl1Ul*Je8vI7-x5{Ms@8SIf?+184R=TgMbgx%> zY*6X3CA^<2J-SqS^sV&ZLHaAazv2C+h58*HyN;ENMN*3SC%nHZJr1e#IKI;3+)5Ab zb^pL~;H`pZ!TT59>PnA0D?Og5^q9o}o?YqjmdY=I=fYo0m2kWJ@EVmKKf>eQ5-13n zDv03K3LL{@BZXh-u^L`d@KXlx4fs$%N=>CDruthAzXklY*+{X!r|`?$Pl3NK{Pp0s zgugy~z17B7m_|;MC7iz@e7*?5m%+A>356Hfeg%GK_#4CD68G-YTZ^0b+o5OFz3zbUGjhV`%F!TcWTfuJ+zb$-z2DE|rNtycpfWI~TPVi;@4}V+u z9W=Y`;Oiq`_L&ntg5Ob`r#CSyTjjw*QoHj zD&1AqtGtf#yUBV<_&wnFhu;%^U--S?_bD%DGkP;sdwBi-N2TXBiu;x4URdx4h_Chs z!rucvumAtZ_&H?{FJ&15f2cfT&1M{bPx!;6m|TZE>-ods9|C^_{QcmMgg*xUDEOnx zOK;V*djE&(U-aw)U;g=5ipkY`*d+M-!#@!I0r1CW+N5bj@*wyJOBT{<|H~fR$(Jzw zL*X9@e;oY7;g5%Zn3%*yvVLCG`xD?Fkv(OTTn2NSPK199{G;F>EtzJ*JS+Lf!asra z!#@uG@nQ@w|Cq8KVV;C4ZyUK?PKJL9{Dl@I?B_#eZ6 z6#ldDAA|q6G?3)-glLmmm5T)Mr^0_q!P824EvL^?Z$214SEJnLg#R4;>GBlY*P90Z z4EVF)v;XJCKiBr({DVKU39IBBZH1S(&%l2f{@V)XD&>Cuih@^}DwwZyfl}TDaFW-R zzM=F@_-`?gU;R7y?P!QV>%QMwBLY6br?Rc%%Vl<6pS zm3r_41wQ;LgG`%pLZwlmKSmYs>&#SsLump(%{f&gm#h-1>!E6jK(&PG+NiEo$h0VA z)+spa7M%4_t!R=BP;H6oMv6DgVilL0;f+z<1l7%yziBgmt3uo6sBXnR5Y;xQZXq`u zc*|4OTR_|d)wZbaC~Z+~r?kD&tx?@Z!M02lY^QX4R68i>Snzj1wUcr>7o0A#*cOF5 zq1siprPZBL)$^Zh=BnpBT+pY zRlZv_0@cx|9)_y;e^kdP-3Qf!P~BJYeoPg}6;M-A*%2X)>u7)t{$TJ zP*le$&_}>}+=}Yqs2-=x2}<=@K=nve|S6UWe-S1-?O}ZbbE_g2TH27S1GZMfJ9Ve>g9xmr#9K!Ca;D zRQ?sF3SLz@AJqkw)`9+5+v~E|sJHA9c2uPB!hL4o< zF;fK#m42f1Q>BZPE>^k()z276RZH?O5b)Uf64gIYU8*)OQ@Wg~0yzaj^=qXoQ2j>1 zw@ej$r}TTJKPdeX)t?mn%v8ZIsQ#+pw}SJ#23Lv=qWn)(|Kg>TI*`8+tcB`7sM@Hm zLe)a`-}2`d@ekG20(jC_imHQvP<3URtMU;LF9sO+s8$sO1t-*Cq_n0qR$523p&(J3 zG8GUQ2>8H(+g;a10WS}jS>jA9J#SLn0>L2&)<&=$f^`sVgkW6+>myi?dsn6BgXM3Y zDu3D$fjk93&=SFh@;G47h)U1t(iMX;f{L_wurY#d5Nv{=o$@zDu$j2`pp`5O1+-SW zxzaXDw@@nnAHh}#+A@&e>?yJk4ca5vTGr=>O{(;qk03w)kyZ}2N3a8e4hTBR;|!h` z^gs+jCj|dP&{@_(K^FwOAlR||W>xLksr)M^*}2m5qjLMp5p+c`5CN;|kDwcZ?vMX;xWVN4b5g(N!4cxSbS=c|c?1&?9Ead2 zjXhdchJl>_AdvUJq%-htD>xp(DF{xGRJ_XzPDF5$0$$p!Du2{Y@gzCR3Qk2J7yc2P zhTwGFHQcPZoSE%t5S*1U5uAf?H|+`MA~+8L50LW_Jd5B01dk)Q5W#h7(nSa^R?U}i zf7UL2DT2ugE-N^fYmm3A-1)CWaFv3ql}=%*;2NdZmcJUK;Ccj)BDev;LkMn^`jN`H zNhx0)VSGz@+>HosReGD!+m+s-^iBkKA-EU8-5gX7um2ga0rw$z0KxrPu!w!Ih1fLb0&jk$bg5XO8-)rnr1j~w89)@2P_-l<_ zq4XOB-zxY{Vh48-D)#(<;70{n@Mi?v7QZOx*FuKJ>F>%}nQ^k@2>wLyS0VGa3jBj$ z)fyQYHJ>4{5ZJN-(G9!yIv3$);6uOAK;R>2AgChXm%sEdUphmGAVR>SvZiA&mN_Up zieW0_D?yM-&tXTZyLE&>SVBk$d5K$>0n3~2aYrCr3tx$-Z zJ%nY1>m%GygBu`hS>}%bf^cIA@>wgN>*{GR!cAofEqYoZ z+zDZ8gj*rp9AO*T$?}L}pC5AUmXbSnT7DoHwneC?{b4(V?GbK|aBGCyly5#*RIy7B zw^h0wQ@JG`c91CE>V_Q=?trjM`GY+Wc2b$nj2YyV=ZK-KaA$zpUJa2Uc72=_ubJR9j!4}205jzl<0nw5pw zwT7b+^2@*Tax7-XTi3)ug0%BD@RXqX_RtcrU_x$`c-vpY(+L z5Z*5bmE%rj4#Ec*AY}i~l!FfoU+^R48_yCfGLIpA9N`R2{sclU&a()os@PLXpGNqM z2(wz%jBuI+MbC2xrz3n`g4fQebebuE>p|4Mh>#cmx`N7EnXBb1gmVzSgYYGU3lP4H z@D+q}5zdpMan0~R5O?t^!ub-Ep|OSB=m=j!_$I>F5xyb%_2^P-{w;)jIdifIvj$#9 zhFp`MBYY3xVubG_{GdE~iZqkBiw_ZgB+G;FW2O1~UkG_ze5xG10?IdML}m%X&m=E4 zo=2JV=p4fK8a zsc8s*K=>oVpOy2IL|x9c@r!_KZd2xO2!9vvEgqPk46^Z@%PNF_BK$|I=r7Ip@A7Qf z;z>doeg7h~Wm*hZBebMi`c1BoZsJ0&Lzg$C2-*J!2pLpm%HU(VzOu(b7$S_yyYC?7 z<*_UsGDfsB!aAa@5jMpChly-6!xYhGhzvyQBLbrJq`D%$N5s@bB;S8Pq?bPhv_Q1B za@Jw0U|qS$#F(!rRKds)=%5|1;&qf2MhJM7;RV zFt7hPYD+|0Dd6>g#&3tHz2K~sqiqmvCrg@WTj^;FIk-Kd&WJi7>L?sOALb=cv_pAm zA4HwX_TTI(5p_YdquhsKJzVY4PE!AaTO!&8QFlaL5y^5_s*(FfBu+*_4@3hI^+YrP zQ7_hvs5c^Z_^f$1X$a1aFDi%){SfsR_s*V&yE=Cs*2Xm-?T%;-Cr&SJG{%vFfEhOb6+ zlXjIUh^|3&J)&z7sq>d6I7;>`5i8flKVK)~cIVdT+YVyeEm_6Nd>!3}h@bz;@<4uK zI)q{U+P`@ zu85Xt+U1B=Ao>c?*J2p!XH{G9@cBk_{1(xV^4KN%PU-iEevm=5xFl5gKPmkg(JzR8 zWn5`_Yh}x6%KRM>U$bE&SIYdt-at(Kv)q4$x~#uZyAjbph`3zbo%pPVyT`w3=W0Zj z0$ZuWRDp}gQ{XGD7W_biA)-iutpDZ5>kuvrub-m^YU~Zz|8pgzsP#n6K&>rmKy6*r z2(=cdnW(MBU#dZ^l#h{Ytku>=Z5^o@u10QRHnO%JYMY_9K5BBG6SWOcYbldjZ9}CS zDJ?6lDBT#fO&FAe9`e&UmsO$G3N=0@I19DbvP7(HF4I=6jr0v3?6ob`3>Mo;_P<

7PTW# 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

Fh&iuV|j5>Fg~SJ-om1ed!!&WIx0G=^UW3 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

3zE`-tx(zK8fO;&B=SMZGeo#CIEVQH3Ug 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

`V9y;C}&sA$+d1PvL)78_|cKdOm6+PN`1k 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

JyLo`CF$$aa=sJR+jrB@QBc5`*24 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 z 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

#Ynw`> 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ɱG8AMTv9N#-;Y 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%0A8LGx#h%hr{rBr2l7Mq_+KE*_ZJZeAVby9!@d> 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

L78V%a(f-n5%$Sfk_JZ6d0+1UxA?t1n3-$ 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 z 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�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

Bh?1acz{&ze=1SE|EZ|n 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�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�`!dnPD(YQ9rIsjRUGlDi*92Z|cn#sz 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%0AoY*(l$s(s1 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

}|Tze`m2cn=ck|L$X9&wcE9kUfRjQ;a=DFk4i_ z>yAD0EU*XtfA3X{i$nB(&%-iSTQ13-=h*WId&;oqQT9B^9_jz=LI3wWA!D`8r;wL| zrA4)cr`c1EJ?Q_QXE9q=#HVQXNdIR~1z1s3x2nXR+U%*!p6cwWg4wFDnutEno*GDM z!dfE!bp`g+Vb4qKLI3x>fY}#CwV&w!o_fgZL-c=718E4JhOiNA44c5Fuo-L)Tfmm^ z7521aPb-XHg{@&5_Oz9Ov&7L^{4CpV53wfM(^1AM@66s!?CHYZ7<;<1XA66}v1dAa zy0hnX_Vi%SK=$-xPha-*!ahs?XHOpypLy8R4@rMGKy)@PHG|kQls(e_*@OP?86snJ za`vGAdxm3ngs5&cl09#;=MDCZVb3Vcz6nQ*xbDZEu}I#6xGm|~@*fWbgAF$_r)Xau+L|nmO&xc4p zf^$W+h577R$esnrKZc)(c)w%MA|#99l05mR>{-j6W$anW9`t|D3e-sd&pmHfAz2Nj z|GV!I>{-X24eVKu9R1((g^brpXJgMsxCw3+Rd3nKo-^#(#-4-h+0LHbDEN{+(*N1B z6Ydh#IlPBG``NP>`B!kCi0k?6`5MVL@PMd}#v%6nz@Bf}bCf;bVfHXQB4X7IdyXOb z9v&CfZGU9X&+PdL`3ZPZRQvM_l2cInf9|c$vga0i&avlD_MB(W@9epNnqT2XcnMyH zI7)a=WX}~Oe?asoeEwn2HTL|&p6kf}f`5zZRyUCR3vY_}oW`Ep>~)Uhf9$c?lg6wD z(f>UL#u;de>QSTrdu&O(9^`o5y*~Da*y~3gfI-Z<3HrY`f;=j^&$2hp-j3`|u(v#W zlk9zfy(#wI$zEb_e)gjOdvkEBe4_gb^-BL|Zvj|P#MK7&-o@S`?7bWLJ+KhG7v2X8 zi*C2{7DZAFqW`@CS&^nWkU*weFV396r%s*iamRuVDB^R zeG)nPzqb^|rC}NPwCKLlz0V>k3(JY>$W&l&1NK&AZyokN$KI;!t%RD&u!@M^53;u! zlIpMqtO;wu+M@ef^FGhsy6k-cIr_i%B^j%uQ4e{2__B!4c>;}EnBHFO?Z@8U$os&)n03#A{zwMEfg*lJWA9-0zQNA-2)x7DI|Q>s zA^N}j+VPG+@;V$TsxxpDd&jc(P2{8D7*U-+Zy^~6$3ygg??jB>7I8ghKMyV?0l)m8GGM{vqk*O%ia&zJCD5|BL4`^71h4Y zM}q$E{aD88kuGHKYW6N-@2Bj1zecva1TGcv6ES<2Az2PrK=gm_N{rD5a2=SvYuNia zd)Fdg2iJ>ryJC#~@7;j$M$vuu@or{cOZIMIpVJn$viAaex3Tvyd$+T9AA7%K?{4<) zz^%~#y}M+rj^rNXd*N52dVTF@??Lu{jr<#UKvb`?LrA`b--+(Kr}qeZPqOzYdw*c> zG0c7skBjQ8`w_`c@C0)AeEXTbXV~j@iBp(8jam0OJ&WWVJTIz#@+*6thJ2B|*VucB zy;s_4J9WB)~R6W$Wl+43LzoYtLY zZ-%|-|6cTeuOT(KM#Nqdx3XXs+M>?`y`uZ>;PbOD%)S8fAPk9E{ldNok|>Oc?m6j8 zu&*@xlI$zOz7+ckqJY@P805fwFh9Hl77*RX?z@wHh1ho&a`b;6o(uP}`|d@4A1o}Y z`z^}8lI$zSzT)h=AF~g@2Sr@9W8Xta9)=~vDtJ%vJ;J^x*!L)M^nc&uGIq~o-;>Cn zf~7?F-N9FeeYM&5H2W&C?-}-$XWz4^DGSSq?)mJifTSXPPQ-(%`QKNEeGS<6Jp1ah?*+`h2wxJ_ZR;UH|M$HtW3?v@+1HePjWF97 zqW`<^KE7s1n!^?%))lbt754qgzE} zLiB%iw2veC0iyq_PI7{MXW4fW`Ogsj--rJ1JB_Fg~wzdwvT zBD$Ym{4w_5$No6`?_hs|{mlL(YEqCy_t^T;|NZFy{```=$I4%T{dcp!AnNagcZpb? z$bR&He<9@P|LRtS+5a&6i?IIz_7}x$F^K-Z`WcMT|NX@=M*mm0Ey4cB*k2O)BM|-H z?VtX~kvsvP6xFTJ|NW(rmw``1_r9K$vGd1Y7M6qM*dzaRZy)zoJHi|nt1+2`R4;@L$Qzr_A#?5~S)Jy;*U3>(0P zun}wwo4}@`x|incZ^`}^lALiXUtxbMKKlSFUuAzs_P1t#JNCChg8r{=+a5`WJh$z{ z{;upt|Mz#1Tvc{M4bCEe4^DPwe@~9IWq&UY-eiAo4y9}Yy>-M`Kal;y*gpvOI2hu1`qBUWL-X9%aLkT?=>LB7fBzeKYS91vqfs*kj)iZ* zapI|^7*Ak78oPfY`_cdX=>LB7fB$6EyeppVi18FS6;6ZG;S4xaJhdC+_u2m$`)9L% zG5hDRe?I%s|NS3g_9HkK&J)#mN*)?!2TnE>Sr!|bffE(aOxCw3+)e+l@WEPr;$bW?w;U!U>3BMt6kMk9b|A6TKe)NC!D!b19 z4Ez7W?BDFa&3^QM{|zMn!kh4xsGht3kffpe?4bYq4b-^LzKL0j1Ag{rF-HFncw`*# zLZ9evGY~)$gdrG)c;&i}D-h#AD-Ogt@GJ)s94N+tBnR%{K#Bu*aDY(HFbC#?`9=46 z2^2t55Z(#zf_IDVGZH9-TP5H^C1 zMRmlQB54Mj!xpe5d_`2}!>b&az=75r7{Gxx9O%h`wjAipfp(~D4?93~zd$D$t37ug zX;;j4gWX||JT<+L^oD(4U)T@!7uD7Va^Ou44C26W4h+WZYj6l03WtfRegu-&;Yj!f z93`sbFdE4iI2OJI$HDR9xfvKw@3I4mRY#S`LOeu#N+#Ik27sUvuDd4(#H<7aZ8ifepCTMz{%XhFe6n zooz_A!!O|uxKlifvoWw6$sV{Deg*fz{i5my-*DhZ4jkaX5e^*0>>>Cq{0<%#)x94@ zatwYCk3;l-Rr3>)6YwPb8KVCOPRaOe86;;o@Gl3>a^O!6oa4Y{4xC4R0saav!b_ss z{%=Uo{{vSrM*k07%~Nv?`E~dg{2TrQZ-{5yeY?p)4+m~>z~I1b%>D<{P=mVYeu@iZ zkeJYdS!j!Aus=bsjDtSthXELbA@L0QXE4IS$2l0~;9VSyaWDr3aSkRhNWv5($fA23 zg6RLj{K)Ts1zH9L=HNpdyoZBDIamm@_rm*NVOT^|^~I3f4Nfr zGFC^g5(i)8U}X;0q(-*b<`u2V2QlohPl4w}EXT`hT!J#vMd; zU!6GEpM#w_*pq`@FxwS&gWX{dQPuZC(i`@HePKUQ)eJx~5DtQa;cIY+s49nX@I4L= z=imemj^N;E4!(|>k?;*T3ce}2pJ{_*kc@?I!EtcBc+NeqCL(zoz5^%0$?#p#eNPEa z;ow{jPUYbH9Gr&P>2L;|31^9CHe);+&Ve7m58+3mdR+66%!do$$M6%lP*jzRIe3JF zOE|cdgG)L1IR`)G;3^I-L*;U~0)7Tpit4tjk*tAh;X1fpRL9{9BpcvHxCy$CWs8i} zQQgMDZ#cM}gL^pmC2DrSop2Z2EvkFpi{vY~5AKIwi>l@Tl7sLN{1$!(4~yy*ca(!? zId}~D_Z&RQ!Q&YJ0Dpu(!4sl-?tVss{vSMr@o9KQJX03qa~!R9m~nVdsT>n?ut$_#cO=axl%I z0vyyh3KXOq2fp$f)B$Iuq1p$bdP7~F%FgI(Bm8`!=WcI`y_k{mV%{4RsS@SXW+9CXGN$S zYS58F6_8hi&%sKtGOQxH=Ub>6hq`d6I)|Ebs0N1`aHuASUgS_MRMv)d;PdbWQQh_> zBz0juSRcMDsw3PGNh8=8Hi1oHGtvEY5o*Dqwg_8t=oJiF!B=5x*hW-GxE+%AumkJ} zJHgJP`x8W{D~Dd^P&W<@=1_MI_2p0x)bxbCU~kw*RD0eJNq;y14upe5wGZym9)f%* z90rHO5u)1KNDjTjp*J}67KcV*_Dwh%j)7xEw|9lcAsG)Rz=`l}Q62wDNG8K~;d^ij zoGQAXD?-ybWO8T*hjwsiCWn@DXcmVSa_D^y&E?Q+)T950KEU`x_>t&-!Vk?uG9NC0 zAHz>XwLgoHEQU+qQurxcCaTI69NNU8&p5P>Ln|@63a*B0;95}~z4b^whhISS|IkJm zt8JqHhqhpLE8GUR!!Jek3fjq`-#N64LtkTRH;49Muor#>_rd+5+J|qD9DoPmA^0u) z4jzU_l|;W7970)HICO?XXXWO!i(^dvrP_N=Fo3Bx3@Uk zk*&4M$Du16a+>xZ9QvC>SFxXe!fWt4{7ZD-ze4{YxdH!$H{mT&9h3i%q@f0NXuyo9 z&S#6mB{-DjaDEQi98Pf9!{HEzy;2kQK|e(Q4+mxJ-b*-)JOZOI2IHctNg_!>f(&zD zKG8i-!gp}E7>5gRxDba6V)jmW7rYzZBdRT<|A+5GUKkdE=>MlrVthY*06qwd!-wF* zqPq8z9InjaM>t%T!;f;f6o(%}&ExP1_#}KvRJSUPqzrr-qW_1V%~Mkjd3jg?R)pyP z;Yu=AkEjZV>vFg%hih}V8fvP;8n7m;C8~R`gXDRL{vUo3O;3{Y3u{ zw@2Oqc7&ZobzfbObcNkuci02=6xIIs=J0S1_u=p$4)?`uKZyPx9)L0W|JfNB4~DNn z^#AZsjE9M5Q5hbA%a`~im-aQH*aegx;jc@X_y)uaE1 z(f`8>F}nyZ7FEqsB%i`%a5-E7KNHpQU&Y~XIlP*~UvhX2hc|L~Eo#=m_3(3u{vSsF zSGV1Sd^6kvx5903yJJqrB^dAE@IDUj#CR9n4fnvk@GDVmc|Ve`;WzLAJO~eos`5Jy zpXTsk4*$sEBbYr3kHPQZarlF%ZuJwA6VUA>KV$q0JSD2iGaSCe;j_rk!SnC}{1sjl z&o##QGW<MfZ$~L^*O7M`9ew;Yb{_ z37CW_NRUN!D;$AHe&lz+0 zL!$esBT|ARRXI|UBc(9)2uB{p0R2DmIL1%FC*f0~+N;tWDbJBI$e)JKz-M7uSWY}! z1LF#?B76>3f|X$vQSDVVjx^v%b&kBi5%;z=QBw=nhIQcc;#r)@5%mAaOUUcOdayox zSybC^$dMKtX@neSW~2$mO<^7so}(K%(t)GS z`OuLgTRGB+BU3oinIpqF(uE@fIntFQy*bhiTR{Jhp#MjDBIzZnHU)T@!hXX`a zGYH9G_!=AnheGuKa|1CR!I6m^d7UF;I5HB+8*mhS6OI<$-wH*>B6$mrgX7@@Q5_%j z|HwPYC&9_^UHG1;j{H=PEaAvBj?CxCbdJp7$PCoXgtOrLaJHx(-3LfMgdf4VaGt1Y z79jZ;egYT5MR2ir8qaBDDMvo%$fq1x#S!%X2>O3y1u8#-D@C>C)kxOBwQwC=FRGd^ zkZgb(;U>5lZV}ZH*v66HII^81$2jsOM-Fmi2S>i*$WB!5g1g}!xL0(4pAy-JWIsgz zkD&iY(ErtQaR{^D!tdZ=cmy65)jogEk#ih5&XJ!v@&jgngg?O(@T91={0ov(@H9LF z&x-0bejdpM_$#~!FTu;=DfjvPog*ekoc@2CBToPSn{%h3QwY{{b@=!HJ$7v0|>MuSK~5dA+I!8j_q z+lZSV(lw zrRaS~3d16>C@dzrXM6MkBoD&k@FDmxEFr2re}toDIr=C^OL6ou%svjEfKS4wL{(oJ zNg4PwdR+6#%tVOGEvtt8ugrN2{Z<2CNBd!P=tQ z{_{v)fG@(AU|sRlc#P}Amth0g5H^C1MYXl29Cey@GmgH>(dL+K0b9aXU@Or*+oP?K zp#MkPV%!e47uDnHh@=zj47>=L*XehQa~>QSKoM?XWp z60U-)^VF{%q|;CXlfqW?!P%2;jfGDoj-^fyVIKhfVgdIf_& zAo_pwPmHgL>Q;YoG{e!qIeMF;|6uk8{1@JYw?y}IVDvvEX{bRR8lpOjOe7Y}LR*Y^ zAa>8~u`xf#p5R!3V|Q~b$gzAJ3vn#Lu`nv}%8H@?$6`q0qWjq?mPC?*1R3Ut?xTz4 zM{)-&01Lu9;a#HIlY2P!FvkjUtQg1c#q52sFf0O#itbqvyC2B|@IhD{J|wDpFM*^a zd;~rUAA^sJ?wW+ylN_tbv8OmziDRWWR+eL>QBwv!4WEI}itZJ*SUDu+VFg$bJ}0`@ zOk$OhRDo4tHHiKnt07~xx3xIdh-0-mR+nRSQ1d)|0lo-d65Zd*#p)rc57GZ)4KQvf zx@SVHF_I>*DQpIt!xo~t_g6T!j$^GjHlAaza;!hcT63%i$J%hL6UW-3z8!22JHU>j zy06Yiy1=fm8|*Hsd+CX!7wirDK=l7uKN+ja0UR5}v4I>L#<4-D84O>8L*P)+y*d;_ z|Bs>n$6m+mNce`R_V7(4qv04h7NY;h#>rUS`vi{7<=8}y&EnYG9Gk+icThPAPKNJ7 zbP082L;|DXM4feI&Et9EkoO`w(OF|BHAAWAiw+f@AYJwwPlJF#9q51TKV& zM0M{=kSv9t!ewx|=)RN2K0~q+u7a!K8n{+;`%G*-$Ifu|BSHU{;$s4TO4<~_ic`4 zIQAcA(@=vtG(@#!6AAi%EQ_%%#yz6jz2iP4ei(p37=mHZ-C8`#3Fim@7{|A8JkIeB z98Yk(EXR`^zn|kNju+xMal8P>8Mn=W`Cxu{hp4tz5XqhJE_gS*M^rWUB0>L;7sj{< zEDDQ>?$25A2RQx|#~w2Kk0N;tJ`SINPm1c^OCc!@%fP20 z`hWac8LP^29Iwam@*JGl) ztzjG37Pf=!MRo5TIsP8UJ8^s%$2)U;0LQy?*id^E>j$LvV>1{?+76jl8gBxB)Qa2y;jy6^At ziAdgt=>PFa7*B@pit30>;rL>XPv!VLj!)zGY>rPy%?vmb&VuiYZl8?LLGl6o5TgIb z=gL^^=X~S~;K%S2xDYN9-K)*|YvDT4 zT>%^a9LX1O1KbEV!Of!k&Jy3s38x`!qhywY3x{%5#D^@gOId6ZdflA|ERA!#iLBSWtA&*u-5( z(Ek(Y|A|6K?iJn7A&J6Biol|<7`z`oAiB>*qBti?bK)URJjRKKFM78A?ki00WTh--6OHS0|L}O0W$L!0n0c;2xIp%akPfIjG z(iAp>&0z~s9X<5_L@VU4!q%`2Y%8jJZ_kOVoan%b^_=L)i3yzO#ED^?=*)=$oan-d zUYzKPTXlooVGr0-RNLu|qz~*1`@#OA+aVJJkqm-^;cIXR94e}3YB-V+oEXiC*D)Rm z-+-gwn~piR4`4h7j)my|3HMl`|GQVf5)(Nwj}vcm;(boM!-=V!n1p)t|HQi(zXzv? z>PSvQG9Auz?d@zNb0GSE;zNwl{}XfbRLVsEEV?Ve z6HAeN3YWpb75U;ww(y6gE9KO*@Fo`5GI`hVgV8LRD|=EOx#oWbl_cn+S27vQg=`?E~q5|YdCH~2fe z0{;-zmjC3W)1a<#GR}$XoG>}@7bk9W;%`*`18=~8;Z1l;bU$e%{zH<68q}cyGom^V zElvhFkwtEcNe}cwAM}gvz9oZ5LNE*?FbZR$+mVt9P8Q;1l9P9EGKE=!40B*Um|t}F zCs_bVL3k&;3*HUy5#85a@?K6B;pBbD3ybcj;$%@I#o+z$0r(&+E~>}!FehtsvIHl~ za8`FLUw*%)SU;f^}g%SYLF1`pb%UC_qw#eJT_OJu&2s?@HmYqSe3&O6P?8Z6n z6WyJYJ(wzUvL~n7bFvpFFLSatCzo@w4=3N@WM59c!O4D{9Ky-|oE*f-0oceuQ9Un% zk-R3l*JhJLIXQxp!;lXb)uTiIPmYvC9nVpm9Lvc!Q8^lp$y5IpCns=n9P;s^dejq< zye+!F0Z&fiUfR&cp0{QEmBSB%kC-7IAVZCl@1MBD&u%NTUBImr0@?%L+~&;N)kV+{($7 zocx@Vt2nuqldEytHK<&Q@jAF3$!?6l;N&JwZoqh>==QzjW+YogwTIg{xrdY6Ik}UQ zUt)Ggp4nYUuuWCJmy`QB`4#eg;`w73qyHzrk+ItUgPi<{lZQBYgp=Q*<~w*;R9idB z$>W@KxA1+Q{0CJ2m?t^G$+Mh1$;nfk{28;qvOKFuoVwC%Qk0r;2dueohrdUd%D46JC|62ar4{s>k>cr>b-6VNR9d zR0&Q!#;KC1LH|#o|GUp!>Tymz#i=JSi~g^+Pzp(D(S4n!p5|0VPCdh^a-4b=vt>n9 zUmi(?JjrvMs=}#C$kG4RcB&$&mZ!1?ry6mpCZ}HFR4qddMBoa(}<-kj>nsUDo_CiSWAd2ZDcNw5DW zQqYG}eUbP3f1Vn^sbQQN$f?&jH3+kV^UMxGGE`J&$Z$@LO{3c>~EPQ9bXY zIrT25#&Bvpr^aITEjTVu%>+)p!zuLt6wWkthEGD}WKnJZJxz^SF2`j}ITIOV=Z z7D}bMm&Lg464C9SsZTkzf>Y@KspWaL`57u#it1>r=G1zGYdEzQgLQdkKS%Nf+#sr> zy@^x%IklNnJ2|z5Q`=4ys+{LNAoZ5|ikEkB$S4j4uvJA#wbLuds zzTwm%P8~pUP*hv~776;ldlkr;N*&?UQRK%&_qT7U&5foD1OD+cE{bsmEYV%@Geot*RYB9cpP!l}zSx81G%&Z(Q6y27bzxVt|% zbrpj@MfIq!bLt;Xq5r3(|K~os8>mG8S7+TVPG$IignbEol*ReK2;Rp&yZi3D>%A)K zdVoi~+Gv}D+#$h);EA}v3K2*!2MV<@D)}DseR%^XO0@P}? zTCKI!|M&UMyt{AE-{;?teVBP>cJBE;$ILr9`CoGKzvX1&|H)ry9^1z+ng2gZjb{&m zlm9Cx|Bw8yl^Wa#93g?TB+x?wB7q|%aGV5sO5kV-^wK;5AN~iZ{|Am$zG-dXcnO>& zffJbXL?55{9|$PNoLdEg5{OA4B!P$o!pu+nx8=CxM3tJ=8#qM*r%T{e@=sH0R!iUv za?Vt0<~{;Pc@Tq}WW2@wAS-}mvaW6tZ98hID^p$H1k zk-+m3$d$m4C6Fh9+a-`Mfhq~~lR%jS3M5c00pfo^@jrM%9m^>pCH~uXmP?>g0>uA7 z1#97+3JhS*81A~=gM}CL|>LhT7 z1V%_8DS_b<7|POy`ASQXbEl6pQUaqSP)q(@puyokV0bj?7^P-~2kIp-P6A^k&?tes zncAS#X#RmFa+;Oee%&L12@)Xw2gdvO#Qy;C-`tN1{6qqaB=A!S%#grD2~3v2B$n1f zO8mEF-YTIQU-OeRvo{zIY0t+SZ z5cv-)wdD~11CJ`lj>BRJJSl-C5_nt!OC_*E0?YWT<-T7L{{zH-^DF#3uu1~N|G;Wr z&NUL)Ac3_Kcv=Eau^i&Rt^FBt*8B2rl)z>QY$E?zrFQ&@|AFUxIk!sSQweO7z^fA2 zE`gUNutNebNMNS~_DEnCOW3W{j>%qfex}r%zy@BFz%L}wMn3W1w(2EveyP-W8v?(Q zK)VEfErH)j;5SSq{@a!Ldvab;YDz#LuulSiApegUe&A0M*e`)UOW-XDye5G+B=9=( z{Kc2&ujIVxfgxuz{mMe0v}7@ zBl3y=b_6~l=buU~Zhs~cmcYM6dP(4O3H(n2U*K=vOW@zk`K40(+poy^uaEP!;9cgx zH_E{S{pm9CSf_G&W^&3=aNmm@EpnX5F-#@?n>NVts7z5s_0wi2p+Tmzd@;C%M{~Q$>jXa=P+uX=jR@Cvuj^IU;eEe6}z3TylK) zFXxN&5xIc;1nGsO7m;2}dWlk7eqVAf^>Hp2StW9X$Vibak#dnMMRG*061h&~YLV}W zT*F^otJLg4A^uCYa?F}XK&}@d;>i!muja3EMG6?m6Uk?wpHkbNLXi@YBJzuU{8Dnt zl$w(f=`V7#NQFp^NTo=X2=QNTV4laB-_%I_x8)Q6N^P%ai_8<5L;hT)c2&$LXMr#0!y-#X7K$tq zd4#FNe_PICa+WAH_$JFlR*Ebqe}z)J`-uO-SvH6&Pl&uNvRdRtktao-7g-~+L1eAS z(;`o?gmo$8S+8Mp>L(jTHj8XxD)Ha8iuf-+{FkjFdqlR0>=fC~{5zD|{JY2@ z{#(voa(+fiUB&X-L|zg3xyWxsej)O*2=QNj=_~D5{MD~B98@H~75N?czgKEJ{L(J+ zn#ewpS4D{b;=_OW6Z8LBsU6$bMgA&6{FgVB|85cUyh-|&QrpgVME))EuE;+`-V-?} z^1eu?NC$K7S88OXbdkdmHpnK2ME)-FH}XGFYHRtiU0DchK=tL z0r{86=S=-VsnJX2O9>t;@*fEz!&f3-i~N^){-@NI{Edc#M<_M7s)9#K@F)rPB)?ZC zXYgopj!|lMdhj?Px&)7x;7JlZfvG3@@}Eo&@!#mW!Jq^k2@?N}>rli+*_o-V;#C3uDeuan@J66_*`I)eK)C!HXnF{0|cU%{T-vW-9UD_}_wkC3uwtFO}dG61m^t&!5>JlK!QJ%V4ehXSX!=9gLuJwa{4JXYdBaa z!4e5_9R_{)A0++<%QUAQ=l&8LD8UK|-XOtBmNP)9vCxB6c61-P}gC#gxg11XBB|%KnPzm0_oJn8KVdM<=aqg60tprDqKhnp) zi=0tP?d*?{;N23eBfp+>tWw*C1_?Gxu#tS?zc~X6jw6ToZ#4YicnMCH-~Q64FOUQuAZLbBTh1&A z&XM4Q{G>;8PNOSb|jPg9|12hy)i)koX^5=9nyD6 z-y?mWw1ad%X(uW1KX`!QgQSN@iT}Y582&pc@jv(x!~Y=tnDi6Uf0BMm`WflJNIzHl zSI$E4-{gEr`XAD-NQwVJ;(zdKa)|$-BQzZ9L3$)jbqz)r zALkqiohPAl$?vVyph4(-a=41@Z!eV4wGz5WLYGVEVhQz?5b;0M$5+~={MBVj%}Z;c zDPb3G&ua%3={uDix^(4 z)Yh_8LaQXSOhPLqw4A9clp6g%^cXphD>afX^n`@gNN6?rPx|=8|IkxD&eIY)D4}O0 z^jit7m(XqrZIICO651%C%@W$g5}s9RTe5|m=ad>55!x!D9TFn`hlu~ia~RsmoV$F# z-6Nr2NNBHwUX;+!m`eP&ZEhpy=SuB5c}YUQlF%>7_u+rYjMZ{3B4(y-%IFE z5_&~Ke~?f+f3?q-=a1yP3Tp4dh5js|zewmc@?ZDme1n|7Dm5}U^p=G7OXzJ0y(gh} znEI|#yUyPyr$eb}4+5c133ZWwK&hRnLlQ>P-z4;>zJ#xra5nkG|F_`F|CV1N;VKCe|HA{AdV}v*)e;^g;eq7W`1m)HbCZvA zi-gBZ_*MzuCE?p7JWRraC47g3iT~jtzMM(^cBqdtT*4zHOra3IQ~9>SsqOnH z2{%Z1w1n#=O#Ba1C>Yrt9?Sf9E496Al<+tSH<91$Q`Z$kD_TFH88htnOD5CjN(s{}u;+C*gJp|DG9MQEFsRcpo``P-;A};a4U6R|)?~ z!mmsC&rE#{)XLv5_5U#O-)KbPHzoXzgx_M$x0Tw_ApVEnQ;xCh!X4tADB=C$93kOO z2_NE5x+F~e4hMW5C4PoW71DZ|4I5O>1U+>BK@573(|j+ zeo6Wt(yt`^KMDU=!}#w_l>D`Xzd<;dd|KZBP?=5-agG(|NO6u5r>C~T>7~@H0f+eS z9HSg$*3{!jk0(9B$3ID&Q^Yx0oQOC9aYEt<^8}UJ(ukIhqa1TOtOdH_M46NLZ+4t> zsyJtgL;QD$|IQhj$H*7wEOE{eC(d7;t<<*dTylCVHImLbUz`o%Tp-S1aT4P66X!y4 zt`+AZaV{6I08|-ohlHkuone#TK zMjvx-7v~;vhKMstoIAuBE>4npi2u$o4I7QfNr^L39OA#jm1Djka%!3XE~R#kMvF6+ z%rW8+|DAe`8cWc*Tbw3w8knI`slfz?`0tEUj`3(Y_lmPZobloi>YWMV{D{B0PpR$u zPsEud&QHlF{@W32A*Yp;`0w1WQ;h$dDdJ3JU>fOk(g#Rqkj^BXMfxD=Y;l%|Ge?|< z#hEM40y5{3&Ib)Xe^8uO^>9pb;uzl~*5|F@i-;_MM;7x}xD+L_u*&d-$Eb@ie+zY?cSoR`G;Ia7)M zwwzy*^Rh4huf_SDIK+R4Lcy*I;=e=uciQ=@eH^hrkp7YMRnk9^{+X2be;nTbad>0L z;r$bDaN41Yq*DM2;8d8;Kk(ks~D1QzAVyPvl6Yrp!n$a*k4J_Mm1sMk2?OPyDwz zPmstDC32!f0uniisV6HnEsx-^bc95Lq#>mm4NJsfAVTVrMoD9&r%2>#iJU5tizRXz zIj2kH9EqHvVJ+cIiJZkiob+tN54OG~k#kL0BE2PYoF#R>Fb3rmB?ih$&$$B%zTB-Y)iP3%&ROjat))`l75f$`%1O7*%G;qf$K?sVEAlp zjzsb$lFM-;{+l%%=|@h1Qk0;BUnG%15-FBQr9?_3QZA8F^2?OIbpgY~|44;~4X#E8 zNTgaK#Q%s7|0Bfz2=U+6c%wuJ^^uz-Li~^1qUD&{wE?$DWH4*FJ;RUOAyFhH#YIPk zN@TZ0hDl_$M21UbyhKtG8N)8$DG`jrT@o3|5{Un1UqnWcGg_%xw~;!D5b7iK5}{Ct z+^wlLf1^akNu-ItBL17*6uF0-dzIP|n;?-X68Vuteku{-e}qCI@)OPT?v2bpQ6jAp znZz*h-~M(oIrlT?K8B}CWQIhhF+8300j25tb&;78nMMACN{y_K%#p|w5}7NJr4pGZ zkw+ymUm_1nWC3$N#GEfMypZ$}rM9Pw$XQIfM5+0%7J%(+G)>m;(4VdB3Xho{LQ{+s)gkqr`gULqSMvRNXVnEI?zJK9^w zA^zL7w^brLBtra;5dSR#>|{>jzd`=U9*KM=k-ZZ6t3-Y#k>5(>1&O>YkryTM3yHKb z|Id}0FBc*&k@HKX87%shM1D;^@!x1@k>5$=Rf+swBKssl{Era-jSe6A1M~k8)ZRLa z{7E9OON9D=8ns=q# zqs2W*++)N&UR>h8OZ+z$rF#PNpQzNd(>+<-ptu3@MX4DLH$+aD)FF+?J27!x(kN++ z^c2!lNlzm^o%9USGfB@Pjgy{DdX7>p@LYLu1q0`ad%3vhi`z%s3&g!h+yv{rP^r;6 z+>6P%M5$>%0&ZV%FD3u74Bx#%-0z8-CGOSYUdhy}lp0;#y@s4?efhsH?)BnklYgC3 zbB^Fr|97eX8^m*S#a$$Bp17mL%@_AJar=ooK->axOT;Z?2}PvEO3jXQOU3OkZW;OI zO3mJMiT`e;a^5ByxHpJg*vp-DS5#kOfKSg?{Qd5GKJW||R^6ye=e>Ga%pNKm~-223>6SrC1 zdT|@X9m||P{C6A4X#x$lQlE6ki9250d&u|UzdM1PA1O6hHmp%sIO#T+7 zwuRLH-L1+o2=8te_hoT+i2H)LJH_22F7e;xeA!=7|95}J^39rjQQTjM+s5*V|8}fi zBIlP%?I`_9+~0}&Yw~|X`dg(o|L@6pg|uC%{na1D{Y2b9iu=B}uZsIuasMRl>*5ms z-PbgyZ5#35CH@;scHb2D9dX}cnQtpKUI_PHa^6#FaiBxozlpnF+ymkg|J^Q4wIy>E zxrcoDKM?mLasSS8KJ?}M2RR=zCuN8GPc6j#RNViF`JhzIlvNZP-wW4r74$ zZ_prmr$om{bc96jlITdL694Tyjv{BYQd@hSMDLbpJ^93cvj?LM7 zr%LoeiB6N~42cr|qYr2vn|~(r&mzZ+{A`KNljt1siT^g|d~z1}ay~54$0WK?qRS-u zh(s4l^ik$nr1VXWZFC7aOZh9xqp13SB)Wq9l}hc-dR(GUNpzJ&pOokmOkJ(iph1-Q zA6=^)GujA5*Gcqg=6pt}(Xpc&B>H=aZj|U=iEfhUHi=?ehJK_#Zvw<9r~ol@k5C#C|Bz4Qz)FR?6%oglGGC3Yh7pF~Rh zj|DUgjWi|_3o;NQ4U;;g5mJ{lN*W_Qh4fU?(@0MzJ%jX2rCRb?5{ol%Ht9K}=aTj& zJ&*K!(hEovq!*H2q*TkfSYnqj(1*0I(zn(q)j_ySVwW>;g;Ikgu`4B(EwQU4cCEy& zX6iLerSyq?kDTu-HHBz7*GcSp@_(Sz%uXyvV$BlEl~{j?lN8S*98kAVWEcC?Em zRw}V#@=KK35{Un?a^^h1)C!5!NUTy~RT3LO&J9d`f#GUW3I!uIVuK{sATi>9>?Wq( z%yGDd^j6Z_NC%VNPCA724$>s)P|{&a@n3AX#8MKgW%y3g5fU3I@4ld6(AZrPtC!d) ziH%`&v`vcD*$i69SPg67ZaX8fMz*j?sX>+4IEg(Zv3n%;6N%j`u^&lnJo8LYYW79! zK5~An)ad^R#C|HViR4crCH}`+bzozYN$LNOO<{N{DgFO3`u}6}|HtV6kJ0}hqyIlf z|9@;Y^Usmke2LAK*gWIamp6Z`e63=Eym=1;4@+#3#1^s*kB~m9)X4hSVu>x281X;0 zRQX08#g;QC@!zhH$0W8_Vvn=TRTA4Qu_q+HkQ-mKgPa4TSk$%U*`i_f z&2>!;<2&L`+v%yF7uPn{4`BmJ2gJ`k7{92XG&wd|7te|>if0!h+_t$co}v@dJl(f%Cjv7IUDT=itvmKhi{)AX}83!0u=!|F^ zP1@J8ZzAg7X$G^rYtLphp>x_=OkMnqvp4yMF*Y%bwhSybT^~3ySvxveH$0woPDMPs zWT1(m;G9wKle*g*McV!UXn5tZ8ICSL4Gl2#lwaW7^g-o^wMkgLgNl z;=`Nc`cuq8=gftif|VSSb@3XT3k3|X*Gx^RcyjQO?JF@U&$d5@q1oNO5vvSiwTsbh zn6HiTF(oMIz@7)w^E4#&9>%7on(fT5sm?|FYU*m6Qp4lbP01$gpX`c)#-`-(`o=i; z`cF<-+jJx`-pGN%(nz-}zn~^Jo-9N|*0j&T$e=Qg%-NgXJ8W7``*{_rE-o|EQe0m* zVif)#&nnSiyi7^-0;za*@9W|@y$f_*x31Bp*7{6GYimdA+;|OAutguj+M0-h_v&aBc0G+% zZI|?!FW-XpR+%MTT-DszXqHi-26Y1!AfW5WFtCP7wDgv(T*5_FZ9A9^b*yOLgY`Sf ztlY}|dnX^*y|C-y4F@MJIMlM*cE!Vh@Q}|@Yl*>t!V)Y%-L(Z8K$Yh?@tl4Lv$B>| z9j%)?TBieY+Gd%RTH5}Iu254`Vdt!kojXuL@BjFA$EkNehYI@NY^I@qa&&UM_9E-N z(edmejj~V08ma|~a^#kEv_8#!YWk*$Z7VfjazOhMZb|@<0o3@I@s)3sq2=?tHqPZ{Wp=a%JEOXJH21{{Y=TMcd-t`rZ&JwMW&l?1!CXJ5U|e`; z`C6{i^IrEiZ{tohue!*LO?7SEh~!w*pH*UlXjDA={As{28%J7kmCiWkp#>wflq(Fo z)n;gJ;1I1u19rD>#z3J#`zB&nc0IhY^MMteOIOCYmmW$)OMf&Kx*I2_?QbW@)dsWtG>v2ulpkL z7GH!?=+ldIjtqR3mLH0U7q{{Oy~8c{@1!+0H#PI@j-szmYg1;cFrVfwzaFufK#=4KjPUXi#mc z3HnMrD{;gt@oXhIC4*|)o@$C$fD6IX`Y5H}10Ag^;x#6F+v7T+^Y+ceYHd+yZ{LMA zd+_-OI%h4^s`sGk-WSIw><9K;_{A><);12Qts9b3@Pl+8(p*%cyeI- zQVhu!3K}aEb$AL7&f3~}|3-^w+P>bC?d+*a0%4;nNng_<-TWCDX|{h_MwVflXC&l+ zZW59RP>F%)E+8vSCLO*(8XBfDx) zXvAiy3cInI6pK_dIP}Qgt`*xmcW$*U@mBAUyH!pPFe*an06_h!MzjR`zXXw#h5>`= zFxE_>=OT)Uxhf`9mqQ~Sh}R@~uGYGjqx(A*jx%+aV+cBD%!3T zDbXW~tGB>3qNo~bw~>Pg)z)FX7Br4cwrxV)42@957#bX^UIZl$Lx7E>S?T~=*hr74 zEI>0nWyra!86|JPS{-{V(%br+hMC@pMA){SaN)eaj8twJNi(EB0=0E9V- zUW-+a1(=wf(z4yR1emSuNw#4X*TL?6Q><|A+WZg&P@>npwgC#hiK~`l@Qd=eNAhaQ z;#n0|Ju8DW8eTspo?TXzs;#Rx+8LCys`~NC<}s;0$OegUaK;F8Hn+HX*vNYTGXUShY7@vV ztZq&X({VzeZH?+JH|aFBtnO%elEQK-CdR$$hNfzQ>bD)VX#{KBC0swq@()M_9wBq?)O%eBJd3V zNO0!NKxvDx-2ABu(3wQ8z&R~gf%!(H7I8{zC#ZsUPi@l#BQT))RyWs9Ftb|Q*oaob zY{aat0yRU0{fEhXhHJmdOlJFbto@DH1+<0>bxI#!=dWE?)kTdfy}`;IXaq&u!)h|y z9auzbQb#Ls>=}?&xy?vBPUkiD^wyNt3l}3p9kaQ%H`Eg-N1Si-Fi{j9FhB@LOxrmIIO0Xt%~}N!R4r z#+W_40Y`oQh1Y;0gGc2>4YgP=sXA+n6g8w$ib#bBn2lD{(6$B~HLlmQ4Ny-X_csF> zyj?aQ)A3vyk~+7|Jb3>D{x)F0dC_w=#V4G5vllZ<=}Rwqc3ynK*_*tWCrNtM{ZB=j z*?YGQg5LuIZ3HaW+=k@PTHOQjf-$uXFgxQ}11-#HlE;N&a-+!rGqi0IQedAVAFa}X zZPWSNMwVt0ptJy9V4gy0dHB%khYvlZ8`4{mrY!yOVP#0C)kKMvpgYz4FQs)M0HzOB2dMr z(JEQzn|w`&`nFsxA$U|;X_a`(@Zj8)2j@&SVv!K0T3c=*Y9G>Y5jSID?w!V|!2tT0 zUDP%SEbVQPrl}W0B{Ajz5)qpa#!%vf^@`|o_D$B!Z~PL4hn6l&TiWNI`k4wn133jn zBa^CZBu@B7`}B?W=^HAeG(lS*@b#u&k!DR6!$F|JT`hQ+RR?x#_C_yp!VIHbo%~=c zs<ly}PldJ0G5i1$AiA6t5}i{W)7(GSC1^(ZIG{4Wm-EXbD5LR>B16@ zMsZ2kx0Ao8945%MXod*A^A2GWKfqE(n40)=8G5){Z6ztQ{ZCf-yh6WoC z&6v4wnsGO6hKz!}WSZbjOV8hYjA<#Y4+Epk831pQdPKJP(C5I8)m;nI=%Y#r>*&NwYrFF5Wnh`K6U#Q4%6u!f=!RxnsXFyxs@ZNIY}wGgHgEg%xptPqkWT7UP*ns9Kk!>U3BEpSHf)N=DTQ=rs$IH&`^?Vm&mP>P zJ{C$LZ(kg_ZVKwlHNaV%+b{;>s~fY(1a*i*mt#jD+P0Q+Ym@#Lf%yh&E` z7;bZK%*!#i>c{>+Cb@VJnlaF*^2Gy_b&a$f0Gr9W2@Ikg+t3ah$A}N^L46QT!sksx zpptaXndWN_&L!$5q_?FWH|&PbAZ@Xh!%ps6Irsl)(a}pEMT_zbh8E>DL!Jx=jwixD z#E^jGC{Yyz-Uad7Wb{%KGLTxL?vzsHMN6YNtj zu4`0{iA%p+ftFR6U0IA{i+fV=YrsC#U=rGM5dzJr5ej4ojcZ$@enhnNL85}S64SsC z{!rKGQi2vvJv?YA?3(#h=bB0W%2j3Rb8#A&%8eJlq`djw)R>{o4LEivHQ{=VWZMYB z^%yN@1ls^u+Mq{ax@tLcEjW-!IP`xl-uGbp4tN!wQ-7w8TszJsN;+pf*7f-M&J}R$ zT4eCNJJc952ZZZIHB)E4>$76-Yv;%9z7xnyF%3v8`kzj zeuDORX;drCFkmAeW?r#`ww1K6;PTS;=$^)~nD*@7yHx$%_O$M>vB|D4)v>YC7RQ{U zVGkrCUuz4#HV2=h;oHCo4*W__`ByHIq5M5*d~49Sx*pwem=&js@c0KtpnM!t=^1WO z&8P;rkhBK(cC5deVQ}eS^m8<-Lyk4KL2*$5(ywb4Bd6V<6+o;V=$oDi8ef`X*8MZS z3nY&kcNZ!zuty4QlShmn+oa=MP@o~$Z3QE0$2MWr6}3%g8s&J)8afph(lKlfW7VYb z^&P*j#m|7A59v05dkdaoRXUfqcFs=QaB8&a5DZDZqeEqa>i7hN? zY)IljCo2(s4KoV@kpx!TI(SkclGJy=amO*;I^)Aa9stuL?OW|wLmN=}u=9z7)1U2} zrjGFL)s1=t)!kq^Sx}a2O5*6I;0FGiU69Xza}u!%8YtM@u+X7LtAP?5WRB7|s#VSd zn$B4(J6A4%;PWcc-IF+WDx$|uwa&A|aW5fy+)G|Gs?n%MJ@`9r%n#6_{{6V}Dyvds zn}?3B9To3iKYDnw8G=g#_2aPBipd(M>(C1t9E2T(shHl;I>$HnC7Qc!rDn(YEa7h3 z0*a#_9KUtVU8@3n)uIFQRga7P(l#h@{5(XDpNDALmS>Dzi`<69$ZfvFb8ogkR4l#h zE!P8$Vq-59mo?NUn~VU?XAu1;(h%Jc3?Z3&3L6Rsqv#7fS>1#%vbU|I$8SLU6BgEW z5-f_{KLhF(Tr)(mbbB!C@i%l;_go*s@K)z@cuT8OIlF=h^){*`#7W?2H?Ru)d9XdJ{P@wz{Y_R9z?R)x|Auj1$x$NMy znHXhnXpb(4zrptDM!@k5#**tIJpj`~o!j5WJRPS;>l3tgKtql`Ae!!4M2Q^`(=mjm0b^X&468`9>G)9>C3r3=0}Jg z^CK_X3vL`8&a0pLGwRMWicKMu^x6pulc!AqN@)yECDcE~JF+s~wjJ0$;K7GMeH{a} zmGy1_5O?0c-CsvS`XI^?I_XZd;G{df)RQM5dNPoTD>D%tfM|Ne5b73HPqgu1vopFF zIG|dv>L;1eWwEE8@6|%jXC~@sv5wA5rb%vpFSE`}A`|8IVAPvZ-4#b(_o25d^38#I z;Vt9GrW#bk$sa$qp&6^M5CUy14vupW0E^qY1wtLzjy>T&El8aHiq0Nx^x&Krr^Mx0 zW?j#%KDc!Q4od9U&;yt5gU;GzC0}FK1{u^VAA~JA3MwgXa5TlU7#)VA;{4hsC|lL} zwK!HA9@leq&4?5gJT?fyb3D}zfZ{ToPN>$kV^TZ;?BT{$&9QS^3!wSJcujHo_duX| z08Kqt!i^I;9J(HR?%=$Z&MDI{gz2^>PFHDh`jg!TxceqyOed9I>2w;`=E8B>OCv^a z%4?`?GXBHT=DHDgV!&(b8dIY&?1N0w$oQbzh7mX^D&eIKOhcuH8smf7p3$Q-I7)K* zw>^l{EM!c91JB{DI6FDC;*pNlEgdbe7l0Bt*4un=-L}rn&&O+SHb9}prs^8wT8(N0 z!%${&@R=BbZP;`wh=2_FU^+`rNPP!gjBB#qDyDfsB$diCfp>DOVRH*Vdo zqV)J$FENxDVXqF2sNm-&^a@pniaLJWfDCa8&x&qM_`|jtx0?M7r&iT_0 z&RK&Nr!N+qyTfa@^g%bI&wi@{*=QlIsn#|%zE_0{G!TY$;h; zr5fQ|YkGj1(W=k757G1n)X6;h?yFS1K*EAVlABcB1!N02LE8S~6@tSU_;C zABLO7$YdSJ746Tkzv)ZG<#5k+J^N_dG1PlETJ4?2ah|-*?UxDKgS3dyS?m4VJlz1s zgH%#fI~2EfX+9;+n}o#=lA}a5PY6YL0kGjQTbLv@pOAtXnGXS{!VSloo*7ksVDT3C zk<@4U=tR_c-dJx;iBlP5;_gmIIf!3}yg@7<#Klxxo@%nASXiEHQtKzX2t4D8XDWi! zue5m>$HSZ^nkDUsUre3lS#P<|n0|2bCP-kjH_t!PYiIanG&}sV7d>SzqHHIjnHFEV z*-$3ERH6{=EsAN4YNsySaJ<*4YCG1t&8;7^Sobr1#@Qv@pbX=(A=uWT$zyhP3BhZw zs{~i2%~m#^%*;+s`!XxdPVRbmYI=>F|C+Z8?64<#k52S%^!i8~=B*fAI=VWp`%*8Z z^uLMIP}o0pZ|$ghXt){}R*y;O-?o;aoFZk>u@4vCN&*oqt<7+C9$Y!a*z^}{GB)dT zbf2YfDL=LbcXHsh!T_d63>tucJhde!{ObX3R1pHT2`W%0uEe&oDKtKf z2@M_g@NI=mX@|}nAmAoXCyS4%#N{Y8qH#^ha{_0k`J_%X>!ePMS9)*JC%{SP=tXYx zM%YHXk1&UwdRO`<8KXrzowjGx!>SAC_^*EBEu3QG$}FtGeNRPVc5Y-uro8yd`yZA2AbSIlPWroew(8=r=AVAyc}US25P8o5v~ z1eqv1#7jl&kkMy;>;Gx`vZOJN(|Cz-L`i9dg&yThB6lC7-bknKg;EDj??nEN5bb45 zoYw3$miV2C5_-~R2~7>gxT8=0ADVOW|L{{!p!JxoRx$1_s`s#eb+UPQZ6DrW&~;bN zxVg`O#n+z+$+&Xco{8sFnvC(rWIcX{YYuu##ECZ``NSK% z!J#jJQTCsP`T4IQHKQsS!1D$+eg9T9&vZmJO-3}E?$m3_@58X=8}+d?zaBb3yh@M% zvJw~n5!)0bM~V7musV&zxAz6WPFAZ|+sO7l?JJCNiG2x(0HEP;=+Mpw;e|w3D918w z&v>-BC^J!Nj1=3NnVNC;Yj7C}&tG=)g&EHn$Mb{`Dm@|Ojo)#{B6{4hcEKbrQf=v? z88)iRl0sM|vX08xw|M18 zRMa<*Q{PsfTX2kuEM{lV=xBYyvs7WV8!a5)15{L~R}sJV43S&)&_tbA`iaOwTBB-z z+M{s2j;`>lN6{JG?kHUSVa(eJy~ccs#^>3aVR^}s>PW|Y_F1jRyNI@}MI0vv2&URL z;K~AA_P|}V%v{~TtxU}fxS31M4R??5*?^h@0NSo)FbC50sWUkp(UChPRF29^j4QPi zpFq^Zh$r@!co9YazL(*<9y0WfuGw&~Pt->1Xq`pJpWgwQ$%?&JWj~%!iXpC&967W4goW zBFp4dD>oCahMw^>Ur*AtRKMkTq8x3J+v`fd+Pbxq&uzTa}M z+@jX8-@SqrT2Rn8UQ^RIo-_D}?yi>MaJQImiuBg1x?T=!+WddJUT*5{da;+p^(udI z@Uj0N&kH|GQXh++=YEHeB|T2?M*7E4(IS%;yUNDQw7b9dXI1f%8GMyz=^v_z&B0HD zXZNvBT=1a(x5s$Cn#^%3i!xDXpFgjP#&kWpL5`f*6LVN?-H_Ge&2e6V2Cy*-s%!P% z9LBLN^h6r>0`(ZLqxCxvmZSr2H!U;r*J+22Q4tx{&BP<9Orp+Ax*Q^Y zCXI?&`iDAzz0N;?0W3FHuZzlSpyRHpA_FtpX&|D)#`sX&L z8ipoo`H2piTbheYx`^KelRLZ2M#j_3E;q5Z4Z}5&t{dC~(IYT=4dA+gZHF&n{5|nX zxQk}@Alz)*ii5_9)RnhGe&8z}?OwU+%kWmuSaRUuDPHHOd1ReofexM?^d=qUh~J?C zrP5sJ=vRpgIglnvrIXqtZcimb+;vo=dG< z2IC-YEnZpV^_c5EJ%3a!(=qr^(7be16EmnmjX9mh11@7>aN@bUXmBt}eKr%NlFWPY zx&?@15D#clT2PoMf6HahR7R=CXQEt=nJDYcL}}h;qO3O)rL~)ha_ut8R#7j?q*Ckj zMb*&DWIlI?7iA;q3Cv`Uk3?#Gq+M1Q!2NQ8_xXs<`SG89g*oqUyl7B_8itQaPDnvr z;M7-wf$t3aCx?-RHBg-i>$!-g-DApE`Mq<@P6o5xmbxUxV;5+!W!WG zz4a>$K3bOwHoYzvoR_P*r5{M@x6`V@+e=-QozrLO?ND4KyZ`w^EAcH*;_7VMA(}GX zPMUnjP(;7XsT7wDJ*b{4!4IKz)O0BNjyfJgQEtR~|8l)Ij=KlAO;5G$nj5hJKysAu z@*uX^JX{r2bxDQ86YAhm?=Ar0X=A-3XL1l-_xHoc1Cw#zH2zC1t`cYRT?;mJJ+vAZ z`wu+26TP~o(Aydc@V>(!E|0Vk24Ah0%GII^fWXc9*Nu~onSR}lewErwZ>6b*#?*Kq z$F-NDLm)Xy6gCW;nS-2N&^^J1S9SqF3)2HzO0PL}ZQiY_FV9=9J=1F~$2oKSLL}?u zeW!z?Q?xb{<$laWxoa{}7L|!|1Nx#WDKk-8!}`O2oaKG2nG}dQY|jn};Tojkxw?xXI96gzGjI+Z%(Rc!6qiN{-9*vKHVku_IZ-Vu)8o=cxYtz%mzIrh z7%_eVBiT%%<9#KJJH|%Vnl!!F318$oy}sM+B)j~EW|Wuq)(>o7v~LCgaWn4GZq4}X zt8f;gPPRGI)ko=l3z$6&<3l}L9bYFGJmfjPs_gMhRomKT{k|1D{<^bZc~+$mop_-l9;Cai%5RGHsZNfmhySR;GXUWwQ$}{B`PXA7A-xU9`+^vI9Y$uQH8SCV zYlYqm4KMM7%V9zu4W-uiW`;e$-=i0P;Ce&S9=%poX$(l5FX4WbF@M->?Uin)tEV1= z?UZX|ZEh1bL8$9GDj+SZEejfuNi(Bt&wHa-?GUotA^a6o?9zYlD`stlZ zo`FZtKY*-io@%wZX6IJt;xpk9&B?d|WL~miC~kPfv(j8eM~|C*gO_)FnwL{$d3{oN zAjke(aZ%wAUXv;MjeN^S4;_s+2j@Sq8gMyKf86$r)}Bh2m>k?wy8^Xf8#a6^#!g{T z9X_xc=*Yxq)^x6)-Zgv9f%!}HqkGsz+giUmnH5~ld@h}zi9CquLZxugzA&Sql)&jg(_^75)E5HRP zC8)q$e!?igr@qXnMBqWGK>sj#SS@@eKzlTQ8q~YPtH`>qmsVkHOgPG5spR-iFqwuDeTT7J~5b zn{o#p-P3jdL*}MvW^T11*>B#h4Y60l^Xf;}jx$F&CaBg~?l(FfCWY--!ZQpt&wR%i z#mLe2jJ*tLt{$t|ZA`TT5AKA!B5kUrmlN*Rd~0ML?~4YN83#&vS+Z6?5V6;aD)N)# z)jTzKKyaO?zwvkFBNr{z3gh9*$I~3hhf%{x=_V@AFkI7@h{}y8OMivJ)VZ(UYHc@G ztf~uGJ?+a>LSjh0`<$J-Cc?B$Ukb{MVnVMqm>rVw5Sh3Krl)_U=VkfE7=jnRew5dv za*bsAQ)>I8%$!o&8I7nOy`ck7=Co|^Ccf16LX(p>9@bun`c}ONrmJ$te4NF1Z#ad( z#V>m8PNV1GPHm?-+Ui%vjomL_|H)4DI~F?+#A+L675cBkYNFno^L99%MOpP-+k1|S zI{MkqNBY%|!N;h>6hQjnLpLQkC5FiZOzb|Gcv$t&4DEGfWWnxRfQi`!Y=g?@^%GZZ zH*JO%VeU$#*O;#Is~)&cD>bXUKg#bLPhSJhs`469=P`$2WmPBZaIu?7`ZdCh(06!m zSerH6wwl^2Hm0wMnfFU-P(#}e+%!h-(lzK=Qt0r;TUkdlRTZPdU(CTAru)XjmdxVQ z&Rz3|Md)0Cxqn+!FsvD1hAY>Jf~^=(kergX>328d^Im-?2UqKH!C?a>37YNyD7B~n zx%8)yg3n-3)n}&A#ygM?PF5+gY7sQWZ>^fG8&Q9?xgJnffX9N8qsQ4c6kdZifaDaX znYw`Va=9MC8K0MqpI%@@qx`r1k?~w$ki0FzTC)mU1gEz^vt|4)z@adUoM$y$ZAS(gmon zU4;d?6QhPVHn1qa1B3@3b71vstWBKnn9cZ)T`HT53kx61LTLPBS6a*PpyTY-=V<3j zsfgigOm#5gqoRI=wRhFVv+>XPS~x<%M-)=me2m!wlUptAqGc*|^#vVu5yH+c?0R@k z*K_c8A12XPR-%$3bE;E>PuR_e35lXFp)?iY&Y6CvkYf`d6Y*v7M(Xzun2!^RvGegf z7|>GtZa+`Zn^rhYLeG3Ug(8g_6jv`j#xp32%&UH-MOb_(Ou$&Z?OZ$-Z<{D5Ia(Px z%1|&jDv+)hDnAR+$>J7s?ZvDYy(`|TuZ#fsbj9x3s;_)Ky58%uH?G%jc~!e?p$;|a z%Rt3{$7%&Zb${pg7p6MA2c!&u+kBL59s%mSf3xvcbir$)_D?UMxkePH)|EDL%Iq z-SXzetLd8HaIL9=>%AEFCx+woE>+D+C!RAS29s zbzAsd*hXq-U0a?y)Vdqvc$kJp7|B_HnoF%pRtl|??*tg!;yABPzPf&G#qhy!%$4j3$ zzrYg^80fMOwDJ$M@(-x)850C|iQ$(45Kc21JrePPfqwM@BLgB!{Vlk4re8l*9-OBa zA$Sro9f8C99nbm;Dz7k?5(+Ak_)-$}mXAceAUR6(5x)oYh6V)#7+5?@QF^Od5Wukm zb03BE;1!%+JXic&3pN8cy_spY4!PQrg%=d3h8tdyF!oq zU;sbV(SlV8_woj|gvxz78@>!P1#*gfuqC!3{gCIHu2;-B)LjBEjhk{)kqV z8M#!VhYsHJhzMt%N36^|kEnb|sfx@4iTW#eHc!I)h%it)CQj;Fvh>jU^>{0B|F)g@ z@4z0oFLvnDi5ZQN1;V|Vd0JFILs<%SQQxu90-jATIB&^c+oE4%4=`@p!U2HwF}mI> zf&WE}@pD2%bw}Z4Fi7lWz^Td?6{qw~FqPMkHG0_$NHJrt&s_GF!&z@{(K?K$qjCTq zV@&qJ(uQxPP9KdNKn`BAyC)98qO9y{u-bMY7w^wlZq6;>);Ht%wp5?=I@dIPQ&Nw@ zwSDF}IUvmpYw4v|Mx)yBWtZvfsS(Q1E+b6AAic0j}qz)@&@ zGeztoqXPNr)vVZp%ZbFq$R{81VI)1B`j}XE)Aag@A84gU-c}5#Z5o!W&3wl*z+-$% zc}^$bsY3fB3JW~q2uT5(TcyTf`f@rW4zKJ-d}yxf13UK3!Z7Ix_JKv~Rdh_<&^1ZV z=(}lG1sk5%wi>xnHlR7x01FMb*>DRsQMCfo1Cmp!@9|i+>LOTBv^LNzy=S49pQ^US zlQr$j6{&y;E!q}ywQUa?fD;1XqTUmjgR|l84Y+!iZniQrSk=`{edA@dO?Z-5oqiRm zakxX1RaM<&ndMAMOkNo&b9Rwg(0kb_hCP?xq9u_;Hk;mCWK%IUG|rSL^ivThBNR120h& z+T}e`3|ZZWsscndJ%URi9Mnq#|5Z)rlERE7371 zZ`Myo@idus#m2I6C9@894Uxv1u!tft)kpJUvqO{jx}}C7ZYM*Qc|U2}!B0`EVF~Kd zCK`;-{GnmkQ-3sa)??l+u*2qO;cIByAk((NJ+yIyYVlGanx#{OM||VPxB*Jx;NoV? zm6xuwl}>|a2@_L?MEz|F^QE_{j3Hz!#=%FLiL*b~S;JRseS9Sp4?f-3NgQB7S+#w} zm*E|g5KY@qQ`NnzvMjx0%v5^yYqQk|W8KNYk{OwK3UI1@=|FKp{Z^Q!;X%;BJutJl zdX7gCbZ^a@nYPUKZ=2+sVh``HpId=pywNC!1=io67<4Rl7)Xwi;&RLYEqLq02M;Qm z&r@IWEg!vCd^~nFimx`_*An;z>c`*~A?Bm9S|4G+k&+7jy5X1wYpF92&z9`hg7!yT zNW1y9SJEm`=|p?7Vps$2=uVm_JT8VMi6%51` zdevxdnyOVy)hedaD-S%!9(vmAm$I<}wH7||tQym%RX(fB)0nQFdZQL^Y}x98n8RBA z8dm{gVExb}oPAjtu8yYVX5Wy`JKp2vRFT)zwpJ0qW~3@ZX`@QaL~d*-?AZKZ!iL*| zXXMjGrM#llhx8bPAg2NPI=m>{&)Ol_bU4<4bh-)q7hh=toZ(YZl!gYchaCFBMmJG; z^@4%gNrQwp;?1y8jeXcfIK79}H+s&oo0!7Gdy|madNsyLh79^~?ReN2`onn6&Bj;8 zXUKqf=(c*>VGpag>cx+dR2Sz0#EnLvJ4|Ct)OJr9s4>nnTX4!NI63&Jv{LZcK7Fni z54&&#jB_5(&a05RRT0d5T88dV-EiQ^xmd8>_iGwxvToKvFpkN>fz9LKOu|aKr5!5? zBu9y=#glbfXlQ}~wHOblQC)*4Nfoxmd(`nb>oISP({OO*eOi8v(G`no8lVy5F`cZ$ zt(Tz!kQ^oEF%y+?-&PgvZ?F;ZmWf)nm}Tg$`d1|M{Uw-~K0PtrtGW6a&>&-+;j8gF z>}KuOt+@ZK1huZFDuzDIq#iceuO%W8war5!61vZ;PQ$keu>C_%y0*?F76Wiv(4V@o5w;dhek2g(nCy z&w3*}3~T)sTQ&1Zs)c!ut|u2jE60nZK1Y|gYp={(g*FT@-kBR!vJb!)WqzWc;;WY$__=@`frwrQ zE0ddfIW;m|yx2^;a}bp;Q+&!Rp2A1J9YJUNK;zVh#3yo5FTqAPXvhl?6w%Oq_1zfU z#lX_uFa^sTPd{~E+UYxGwP#>Ba;?WU7x(bty}^VGUWW+*!M9iB8E38W-~fZv(TG$m z0GtgQ=RP(XjlcEN4^5iy^X{kRPu6)wT9tw0LL8yv{XNulyNjAYa+IjFVZ~7-WRBEnoAC2;E<8qgEhiK0^N_bJJu5vlp&9MUGec08m#iBx z8V+Q*$8mEe9aEpu?Yp#*yQod;MmL%l#G+BVaHgiW?7n4<>rb#y^+;J8kEUb5p4&GK zyQTA)<;DY~XU}%Gcr$a{vK(!e1qD3Vk<|AmvJyiIa1l7K7R$5&3@FSw<$2Ka5!JtA zVZ1!pGiVlEJU~!9Ae`Pa{q66(zh$9^&qj~}Gq8p59#8p!M|Y?Hq=na}^c?n{siz2e z<`kg-f2W664~M+LCq?iUAFdP?;$=W(tIdRVKyvvnASaL)(p9U~6F2=>Hy;P>IO@(AS$l;1#1oH@BX&yICFHhCePJ8)5t=Sldc&5I& zPG9j%B!2+aP-FNk2h}2~`Vo4KX$C;9!j1$_51}FRfXMpM%l1C-`M`0&$(@ASb@Az+ z9)J>m@WD-9r#S|E62;)P_sVMTS<&S^MBn2_AJ-Nh;w~fz_x7Sa_^tOGZj+YZBqU zUSoBE=q+I@TbO#{o896%idjEdkGAI#NtJGD#jI=_yOBSC{VERA#wnA*uyGacQ5YTv+&@P`W937!RxtJ zk8twM;N5l$>_2>jo#ZRE_EVh9$?;A3CONJT)anB-HVNm)H~UV1nX6vQKpx%r=4XiW z7~xj^Q&OvNcMk~q5N&+_sq8J^DyWaGP0y0gZC|Zh63f(l@jVmk2VM0&@{2^h5AuH> zF6&>iG7sc-ABgkL`z;1ypuyKdeJdSWa#p{5{U%ukM)V4hu?p=Q zGI%{FUXdI})jfyTKH{02>R(8EOK>=|of4X-w!U1+o2YQc+wq5ia6GEuu74Z>yIr-u zC66E6u*`SF=K)-F$yjZ#(X7kL>PKa?=^OLwRYgve;cG(tnScv3%5<4grcFBjk`tf2 zF|p#oJ*gk7ik#p@PAC~L8&yhOc$m(7c=^d&;LA~~N-w|CruDy%bt`mZqaNd=8Cw*G zu{dDvu1{oeGgyLdmD$s;GMM2w1;%GL`5Ho}@TQoCFbz2-M13FX5p*N0Tfj%RXGgyE zQh(x38~~c;!UPAjea9swsPc2y!T|S{NV;)7PrXdX+$_Zc{To$4vf_SK@q7letIWUs zQe*1zI^aq?se~IF1%|2mH`<8d++v*XKDj!;Wa$HsU0ov{Aj6I-#&?-|Mu|%guuvbw z11aC76PbozgEy?gZERdwercSH~n1k|cO2!xLoumZMqGR`DGZjg{b0^t@hfe^wikPDEA z3gKdaTGWab#0w%`YE>>?5S3{g2aC&@g?;Q(meXZd2ZQL0ovvk9z0_IHv)`}%Is1LS zKkOfb-}`&c=Un&MXYYOX*~g1_(8aiETy4gz=cB>%GoaZSJ8qFb$ojZfcE#G!h<}Eh zKk}!t;-4`Z?&VT4Ce2>n4EA~$Vf;0OmnF}C`I8|(;!8PN>qirPSMI8n`!>gtSZ4}( z{FwH(kcwk>eSyJ#Eb@h>`nJvOF`O5Dnw!>``Ew%_6mM7!mwqw$Q~VPSRJU)~vPlw1 zbZ&}0r|!6A)1~XyUyUQ(g1Py3oQlMs@hkSwaLF07w3bCozGz&i8MJIuxKdx;T6Rl} zlb%My0J=mf!u=l&S+C-X(iF8!Eg5zbf0{Qs^v&Dx$qhTcvL@Vt7SCI?Vf~sHu%vkr z>^ul^w5!e20mF{Z!qP()_;dy$Yg}mbn^QrNCswnBfbjYFZL2x#=y%6b{&%>|k@vq& z>d(_Y^q>%+L553*(`PuZ-c?^cdzZhl#M`$P^mZ zw6V~TJG(=?V?!d3lZqg^Fj*`q#t;+mX2e$%B=aIX4-TK5ID?h6`^@R!&YX9U}up?DryL%m!SEs(Qi z?6Fd07KUaO`b(IlUr^N%kLi88MdMBrw~pftQQ1J&zapxNe`f0+X_K+$Lj8!b=($IP z;F+G*P!E- zh&U|#@h6}7(Kqhxy$fiPxEbRgLur((=}?fsa=q!JqyE4dy=6s8-FmbjR`QX zyoqBq0)5qY&X1NZ9&Pq<7gHQzuKpj9iH56BjvA9E z+b154!mMz^==emu@c22F zfA&_MfYH-f0IhI!Q!b)Mzw&RIi|FFf@h~cgGv%n^PgKL71nKLSApNkYL?uC2{{>A? zX>B~?8c$e|ay;V!lplTlgRP>P#3L8JO}!ZX3KoYy+M2LVA-x4f#VMaqEVyCgo*`7$ zFDyB%tJ$9U)K^t^Zoo048`fX0sBaOoe8c*SVpwOzG=@QW4QF$)9OBnj zd+6k0+b*+eP{xKxjU7DHoglqvgG>iC>=9_P8}@3z{(tj%HDEk`Uc7#z#ODZy9pkW7 zf69b4Yq)kQCOG~PuMLlYI3YobmLa>3j(ytV_3;+n_!U(51n+AgP(K}^vKKx7$DfNA zHew5k(~mX}jRX!p=~rsXXrovhuFhAA>krq4@6VYH4kxYCbAszuy-qFqIGi``k0_u9 zOyV2u9kOMM!wFgi@CA$VbyKU(efmCK{EO-NMsSS*iBqqVJQUGu=Kc5^xBmD8kF{pi z5S?)RccyMX;!EkGfBLE`*_KZjuG8Iz_-FR~{4FRlc7Z#%&N5BGSP(hJ?fCR?_>)JT z#Do+PVm-vgmdRbY4aq^F?u0{Sx+=~+ea+RpLw4Pxs`=5-Y)+3`EAf-)@jbY#1rzvO zlZ2Edc3`;x=~>RN$MTDl<>wy#ttOA7-ts%DDHp-q)7Pz)QaN1z>e%Q`kIRRFW((=) zFSuaDRSV@&m391Yxc>E7UtCGl8W`*Q(1X9t#4_V{MHe_dclr6$7i&Cfd{6W({)yV& z!-=!FNgOd}jS{_HV0&5+UzY$DE~;7kIJ)X_w4epksjW3an6!y*gMHxlbys_7dOw7l z-{s>)?P1FlFR=<|z?ArbFy8NzK~FM=&Nu%3jUk?Qbx>8D2E~Q3M#jFN1E)CT4+CDi zob5*LRu*+Na!`b%X|}hkvJB(DWb0^lkx=5P{ans7S)lA1QgvHf9&SCKl*|?k9g-xqt26a?#@no-7wn5 zFXxT<^{)$u-?YAszlY6yxa2RVW-p((XtjAX@yVha11MhJ6I6U4&$i!oX$s3Ir;gGU zx8M8RNAL5Oy>3Pf+6l4dum19?X#Sa_PzP|7t{tgFEl|a5!kUM$|wZ`P80jMM{I`aNxc?9try_ zP5?_I=H^uwt<&|PJ}KsG%1O9lhI?p!wxvs%9qs|+?{aEc8oi@1VsvFs!g3f+m*K|~ z;b)>tL5v|x-8*$w9{p#LYq}!S?~G2$izjZkbM*f)iF_Q(=)IU&N#{hT!;?o>+ru~S zo-c%a;l z^#y&rGo--&HyyslZz9(4`}_Pl=QVIYpo^;E1J2ty2zs2IF23Wrs9Bg)Z0h^vH(8Uqn~LP+Uhtc#~|ruTfu z9)J3Px;~zp=rQ+D3x{`oFE~E$YwFlP-rdyCB9CZK?AYP3HeqU2&NQ`#&!Tu)p8nr? z*R<1kDFQD(S(?6>yRUCNZxuLIGk)ZOGu4;e>Q7m|UMF+IwiAQY zxVw(dv?BY^lKo{jV5%4k2vws?0Ob?<*u`J>vmJe(@RSth7B9y*QV zcxip}md6vVYqrKZ&Yxl(hYT7A(s3^^CD93ETx8nud3_j?uN?iPc86c#!XN+HO%eqi zxuIt3gLkV1x%DlQ!=zq3%n&`p&EW;L*uODNiRDd0CbcH|AI6Cg6k`8~HjM&dM2M9a zDqQ|ph36EgbX${cPMN2ks4a;UDNCmSD!}H_M-h9u$ zLzIj3xoL9w(+`C97uL{8iae8N+`hJRd+btvLxASew^#pePm>wRdZIJC?EmTL%(jsx z>rm)JHUCh^C~AUE*W%njTg{gq%sW&+`Pir03@{-CTbh`G18;vg+7)kBD_Zwyb1qpM zk4d*BbK9wkhuek};8T z4viMa!nW=?-tU`!voD@Gjju2}MHHNnAwrW%`*H@jzw3@k1yn61;QTALHXG=i^pIJ! z9FAu&kLDEd1SS8*5QNMX3qes5B41QX#JH5oV>fv2<6o}Yq-14{D5Mz zgySMIzC4`{mt_x>?0UW4;aGp;c!HAALP=Jyh;&v#afe%U9C*uD$1V>So*3}L6Wga8 z9{N=#g$Q%_Is%JQlFE(n>G7!xzWJvO>fo7R)?J8S!Yew+C6VkZAZBI;(jgJ+{vUsB zBi3_MMGJf7mi3$D5i{H&={NqFt$)Ttfsn{4QEdYFkQ`Gc>mGU?V6t+%nO5GglmTqC|(7Fe=f}3B=PS;d{Y~kt!WmyjnxK zxS*DvaL=b&OXp`xm(Pm}W?OfBC1MX=bm_4XxFX|7ES?u$VBt|6XW{Z(oVB#2DEmcg z!eJ_$Clqrc*x`~Nef=&)50A5SvBiipv1I(LGD{);q?EZ>XSapy6;TMK#@O{odQE6G z)d7d2VBoc`W_&-ov)c_Z4RmMN^_qq?OFYa+Dg;lgJwqI&_PeAlohu{Sii7_WIhQq9 z1s(ciWOYG?EOoC9;t3iODc6wDgobzz8SbZ-Hw^bs> z;XMmWa1uv7@U*Pnc}UIzr1%WJT9Pc8Upce&N^p6)^Xl z6}PsU5?`{tVGVSK*KF^j4p@0u4NM>!gCTb2+OOjAk0{BhT2~28AYEpK?KNcVs>8H` zV62{eLq-EwjGFqAN43N)-f6&%BG-@6@KOIt#lTQ-}s?_h76k_G-Sy3VF)=I!ov(9xDJYy7$WT&Lc4}oh7DOUhO7!h zmZl-G#SJm17{Y4|Sq6sCvLW7{hESX#Tb3bPhaofu6s1Ja>Tw$dy)_)@D%SV#wy-)H ztqMW`72)n)VbqyC6S-PoW}$7650fRma%K#;H##;+Iv2DvHO+7zkK}AvD2LjhZ0VC-@>m3S1(|c*z5;w+K7M zu#g)p3$O(1m9eA&c1KD=sP<-wY*P@u9YpUa30U;vL@1=bgoS$Bfo2V_3Wru!62(F; z77<~BhRlv3To0%=h>YIyXTJ$DTAXel%TC|%l?@k1oY6~VYY9J7f@z#XtSUW%p1-ZK zjp&@bjWqtgF>EjO;Kqs;2~))=UU$8^an|_i24`cT-nB~sEAl$O3tO+?TcPu}I3-~` z43#eek?8od9rj8Ce8CN%B~eA5s>O{9Zdfv42nY-QN5{d2Q=aMvQ!F)^ly0mKXTjE{L0;P>cg}h_q)Oq z?20v)h5xKbV9M`=?UzIlk$EFzY~<1{<#lVrwN3OOeEX(Vn>LP*hMiN-iiYz4+Bp~+lU~IGw5Y*BYEuCXK!IV?A9Y9_agsQ&k=7lEg^$VO7*z(m_~Nm#pwrJ75es(B!9BX>!5*ph zYX2ZvDgGIIFl^aB;FkRxRNiQAC?k+UbaranvJGplj#R zb^DCfQ!{3)J!R9DtJf^Ja@`f-Exch%D@t=2YD7Q{ysT4G{~CbCFO3;u{y^tk+oQA3 z?$P-X{J=Tq$F^@I#%Of%f*ze03&Uv|$wD$n10Zni|3(t1jI_xaNdz_0Mg>ZNPZw7@ zDDDbmcHR{dY3XlLNsl_eABkb3v{I`OmKo z_@8xHA}GP(_wT(T1c#H-Q)h`>&ElbhO_v6TUvp)gnVgZ~Q~KX#oi1-L{i5Jp;cGQJ zGwGR%`cTdYWw4Hu#qh)k$LIJrJa6NOWeH~MR>qpm!S@g91J>h>_Px8pex2R`;dQI% z2ZCS6?Pk1_8E#S$qw>**!bdGUVxw>O|4p+PXgH@msX5$vTx7ZPxHcMZh^Zdlus#OR z6Mp(HM)d5|z9-E&Jx1ul4Zp{!<-&MWW7USsHz}y!sr-FW+$#Us-y1SdoNDNFKmK2DZpSAdz3I6xJ(3f2$?yGb zOwgP>+!!8sQ78uw>>J9#1G;7Oz|5%y^RkZ64C1HXQYy}d!vkykUW&h&tU1Uq32Ai< zr~a&s((>3FhUE`6LOk=XmN0vBB+TC2;3>-kp0d2blQsoBX;VNJ`?W!})R>#m`LFF8 zAfojYh%XrF3R)rU5=rbZ;@FcDCAZlee6X?(QqMplbr|ioXbekD8}?KoZRQ}ADL&LC z1>*x{t0hPRSxkDwBNIz>^p`T~g6O@NQD#LT)m99o9F1cpQjU7zFU9e?FZI}{6Lk;> z%5s9853{u~(n)ozV+_j=4!Hc_NX@=*OtR}Wg_r(3(wF``Foj8=4yn39i3G#KH&$-7 zV>tMGg?H80yZ$_ggu1O)qKjh@WFW5lMC7~f6ZM^Blwt0t0_UE0V8C+@3`lOc_V-65 zc3c!dM-Onm|jgH#J@7J{N<4KqY zV4u3$l5x~NDbH;@p5ln@EV-|R`((J3E7;T@DazU7VyT~g(c29?Z zja&yGu3>)g3y8pJtBuTVRXt5ccMFNp2LFz3AJ?ws@5 z%t=8%vORJ+ zU*2`{q;Y;=$dGzjFr_SuqFtYuL+1q6 zrK4zsH>L@DCx=fIgl+{im)k{Wn`Gup#Aa6L0i&_LWh*H(5Jd3UyW>+zLg=9+pe!G@ z*2lS0Ku>U5%=Mxq)iOp$T|E|s+X>zjBw_(QSwCOK(IFfmhfVVX{KHH;XZ;mQeE>hsR#Sf^8HDKe7PP*c_YwY+S6@KO~ z8xj$MG{el2AK&GC5SWcbI0aL)xUy|RD##GJszhd~kkT-1&{z>KT)7%RM#zK)7;++M zRz{EoV2+Cvh0bq+MdAY|$kWscm-OT0P^%#aw1%9U8gfEu2un4DApx^lcrrSfK6S~o z+R1xpP?O3e5wB;zoo#!hqP^c; zRL3Wj&j9-qmLgDUYw`|Q$>rAvy!`rB9kWs5A;e>b&-k*xB^jcrb@;(KnPcyB%jB$zQn11{fRJIq3dwBd zu2E2~u8ns`og1}dL1r>1vx`Dy(n7qa;-#41*AU-K&f>1FO!Nv;v+z_RC!>tr%O7eTRMug}<1s%Z(ji=p>QFlMV-Fll*O0+5 zgku@PNDZNML-?p66K2R}04$R8nt_2E!t4xjXEUUvz3Pqg5l#*?Y?@Cx!gCS$I~u~{ z_p}@(PHBjQZUY1L!5g|ga2h$8DwtwwV&c&LyLKgG6_IPM5SB@0&SA1GjdQ&4YK*Lq z8*^a@n=woV-ZH~xYQ#oV14hGSmPh^p&6_!*q9D>h^5g3yrPU#!c2HYy2jBK+Uyw|1 zE=Zr$`XeFDm-lvKt^!fTgz?JGvusF1TSI)+TY?-?<` zIkAMSJmfotZ@oXr;@0~MuircH`n?MiBJF^$h5<6a?~2l?({TL_m2~U<_2*0esS4m? z*c>+T?A1J`))UPU3+NX0lEc~ z1IPrhGbR?<4jT@ybQ(y>nSP-x+!xBiotO!G+oRRsi~esV;kQQDGpm-}uzF*qZ;cIo z*eV?()3^Si@E;aFP!i37GC*g#*35A2?u9Rljc&N?+l8BH*%oX2^;;;B-_4H-;)t_CV5cnnAs}j7$SKL}zy8>4QGZ|KS zD&F~I;CITjo9%z6*3LVw79<>Px9s6_BgBDe6g++%A+Zs{urlc z7|+9^H|?VP`CaJ3c!5tP#l>m1K!g9mb9P zwjWpi4WVBT8;qgWE-pW5Z$B%e%Ez}iaJ_>Np?)0iaQJw?7oMIR_SS} zI^;XmCDtH~LgeYTFNmVc*)fhgj*ITxVamTK3^D`Um6ASm=IGs1^m5cQQDKb456V|W z8{gEn@z*;4RObuev%?3JDtXvQtu>P9Y$T=7NFt+=U&}m03$3+`}qeZAyM3>cg%?W?4P41kxOwy_)%v zqaKRQ59PvLa+nS;)2h`(v_vX~jheGks*uYRRWROCHp}!VRoD(&i&jLLi%Mgc)Kc}~ zmLAM5x&hmh^U|>3f5c2@{bT2)fl+#ERe|BGU&I$@{US0}8{hhoq?FJ-$L~ccrEzQf zc+D;s$M&&2-Cj;xzAhr!9~)s{xtaQ{cm-vMe`cS~?^8>3`FoQh=A8fBM;?|Vi*Aj^ zjmFqACgSGAH?b{zf_w52$BzIt#O&gMiO25S`PfIEd-yBS+;2(hs6q6sY2h2m!dP}g zO^p4c?zx9y8ao}Q{NqB<@ThyQ{nk69d-KMt*o)U)z9B;IWSoqZyUbg2@tSzqdCkRB z%ff9loG*1td)-BuMgA-un0;D;9iMGa($p(Q5jaTCG`8q@UB+;3S^27n1+G_yLLgSc*^!aMnpNaBnxPL9r2b{#*4z26*3-&^_ppmmz=o&>n>h5!N`72g{T5jIi?1UJe9p_T^Ni&PZu~+3PUY_~tRT zW5kVn_CFe-*(*RG&Nlco^XZI%))NWSUF9Ue5aXC3JvU_D zY@&mh43UI=0>QW#B6QL_noPYml`~E+zn~Ea){)(RRg+(f%Vtr&FvRk?#{;bZrFNGh zp&EEDH;yPvmF0p&$WTW?Ag1Pykj{-H^7idT>FwH!3Br9Ratq$pG-A)W zAwlxj-tTUI?f$F!>-zTBF2}@QxhmUF_P%<}fqjE?YT)L{JJv|9vqrN+@G#OHN~6<$ z&?EVXJ597{B)46o3&Jl1q{gB&atDDfvbgcd1Y$Hdgv%MSD2h#RfC2YOmd!?oTPQ_o zt((KZs?5)|@=2_PX(uxIl##|f>jXdV8Z*)CA}}?j!YsWa;U{*c;P{}f8W6Pa zGFZSG9v^zbVT&zlmzpMSCFL^*jDW`nvn?!-maq?bOJg(i=)n+cHyrlRnlgkk48`X? zXFT3X`@5~)-QyL9J?qdXH{pUbl2l6quuFQRkuOflo##9+qC+?s^C^QGLTZu+gIj0I z0~F((PXknA&8YxW+LhE{ghfuLvRl}xd|CyW?{Z8ugk~}oh6n;wJQn`*7*Q6n#uo*_ zKA4<1n<6+mq$s8a!HXVK5xfIf6z)VQ52#OJSY0EK#=GUk*immb5;o*^h;CUR)Qf)= ziOdqRyGK?PTLnKf%qShjBXD>MA=AUYts@&;N4nuJNe^+&f}V^`N8XZqMK_Ldms*8f z(hCwaQN5=Kd-5RH;QdB-7%964D%E{OVl74yP8Cs$9ZOlyK#zn4HR!?wsa;}P!IR_( zJ<=q^Dm$Gp(H>z4zmEK2$=-({8QK8J;D_UhrRf##o7iOX9GiP+YAO27D`!>~T90-L%}^&dD{2uRt+Q0_S^i5kl9}uE(o-TKOk8}LbdwES6zx07KRHl3Kav!qH5A&;g}lm zTk#xfg1d+rTA|cv=HXSwLNZf?-VLe8>W}Q`>3Kp6QM;@SF-~0o9r7UgnahS!0_k~% zUVed?oBP5Z#s@i;98c48$N{0-%ZP=)-z9CT*d31iW=$1MkTVE^X%@&9T-3(Vlvyj0g;&bu!Fh5>?M1> zJ!Yr|t<#uuO5~`(93<2UlcxkjZlt5&{*+bB;zH1+g@*x|oK?DB}X z5iu6Ogv~vo*XwPssVmRdLk~~HTeFH>{*%Y!1;#sfe&D@&cErhzKM01$alhOz=PYKHYdFXfb^1;%y zf6iU1m)64g`NJ@N&J&3660?UNKE``f@5At^2j?O=;yHgT1|(wKelOmToVW9_yLaC4 zXe(SKh;jAR7e?XB#(=xa;*pJrp%S;96-IjahrOp}Eo-4|$A>U7hUai+1eA`8(D5il z#8-}x-x<79$3|R-){|Fv-mNpE`{U#z?gCE>+c~~{5dk}M7OKMo=RXBG@%iT0qKS+1 z$&k|{_)0uq92X5o8eQ6cFlC-zF<;0Tr(G54C4U&hq(+!_UI@GSbB*A5Ham!QtRoJ4 z_8eoTZf7KQL;De(?tD~-U!3kJY6oxU#k-slBmaf*gCk6C8}wu|1eT(Q@ByxBSBK*m zsO5(2{_r)xw$Z?{cR8jw33(9K&AEZrT+ouuno>P2Vnht}w@^7YOBfeAbP;`uSU~DU z3^Sj{A#~cd+(}>*h^L;8Yl|t@{v(;BbJL|4EY5D!kcd?ff)j&AOW2*tUX5wK5WKUF zB#_-K`m@Nrt+N(^v=)bK4~{Z>_hekXjFBzj9xP)_DnLpSM_>o@h{bq8VMA(bXVZOjTVw zv^~;8HG?tl644^6hlmR`BZJ}+489{qD}k=3WOfR+69;#~I*H)#q9jiV^qD=t2!cpg z0}BZ`GqP+YLX76%(y&T0V7jVBAk&COJSUne5h-L-q%SDsj4*R0!N~L^iFn5M$AzAT zuUh6JDRdC)%B*7#qDF#xnOZ~uH;Spu=%}{l(1VsT< zQAF45xl>*kG#~1! zqf}&R8+BO`h6wpUW{)FVV0MOvbeNhu%%y~bzZae7a}I3tON>13JrM|qPmsyPE7(;- zHICXfLDs%{P8T>yrblQ}z|2jxyZxrdoWogKuqf>2X^C-vm@6O)ns^031%w&S`P)Xi zw6W^~ovk^F_z97_J9MUpbU}qN%(SDJ15S0cpDnE*dV8Tz1)^L-WPC$*D?{u>hS>KE z(Hae9uIg@^prnwhCc>c#r5a+$MpuyC22@=Ib+b`l7UPf>&c%&*TAd?cI@1k^qm{+!f;QW1sk%Yfms%-0IY#S4=RN9pb$K@5L~8E zz6xN7X$DAtus1suLj#bJVH0;|Xwj*xVtIqz< z=Q%QlSIiU^u$@<66^4}6aUfdOVVFUOA#*U>pa!-4a#(qF;g$6Qs?CN?4)hP9bYWkq zv>D$In~u*S0#ER<9VtPgz#Lt~u?-B}DrM1AcI zGCI|y!R&}x-KOz+7HBD>+@ zFzAgAH7y9nq4y|G=<@VoTltdSiEYi4yy%a`#!;cJ)~;E-ZjHPm&mX67BT1G2R4AuQvtD3jg`f zJ(lqzUzEk}cyzoSU7Vo#m6j!u4=YM%BybZ$%G1Sn<;xC?8mXqO` z)E4aa+75(*}za>3 zAH#RwG?AIxuui>E!VZv5tU0(rD#9n2)Uvm|X}A9qq&YutbgVp3#JG0N`VDLK@{;Us z7q3eSC9dsNQ(UBcd<(vk zGD6<%Ct2BK>{RtT%s65dYe6`5Z|;I@G#Si{R*__Ap`HHKk{Zpz=p?`3zF; zmO|K>^q|U@!WZ|k@4Y)RVx}3Rs$RKruUL9N`q~Gcd*tg8ZZ}PV@k_kE9hSj(;%n!F z?@l`u^TsrO_&se_y-I8=#Kc`J6(*Xt3V0X1tWsf{AWHh7)ZI$Nw?AR>LAYp^#rl)4 zQkNZ*M3(ul+gvx zJ}rVpuhxSQZAGF!H4bvQZC zAM;GjUbb}AmW>e(a^uuRDlozXUlkmF!K@aUd^vMW%7SAw0|Nd83<9PFz6{icD=z(*gle4nkO&;b_b*@&}=-SdV*} zf$dUs(-4#Y%6p?MDxza`*w3)li$gE~TdAnWXZsj(3{g`JQAl33xlO+`V2vLIdC9focyW@MDF5iiSn& z>iiF}_GK@R4rvZXH2FQ-?Yb|up+&8?T^ah?>+SVP4uKq&>=Q_rc%6X;VGd*784r0O zcE`z^!VH%%Qx9nnBH=|k(+vK>KWyN|PXBGeqPQFaUx<^k&nl>FoXM=3T2ddaTKS@Qweq2O z!&eX82Di}u7`)(nx5j_r=N?a3>RIjgzklbSY!5&8i5?LdiY|Dg%N|LT9)9+hEjMFF z3_SNA)f-4E_8I$yN)tqtBauby!vq|Gin9zD%<<`HgfKm(t<=oY=0quYGb9;G{$H$X z$;AQ^Y6_*T9`#IHGHOLvvMNJU^N~v)xm`cO7EI!3TJ4dqRwx#g_T$(J479KS2nW|r zih-=qnWqOv&Lc-fLXH6&w>J-+l|PhwU{X7#1SjJzV90qeP=iCW3PlLesK{{s%@a^= z^j#{KSe%&)X@)pX8)E%1R9Nq>s2}Qx)TvV5JIJY*Q<0$!PrH!J|C4`X;s4`V>o#7v zF)nz;G2o^(7hb(#{k5^0Htf=(YG=XB0`y8r3ANS@F*6xr-YJMJt5955ocI)nOQ#Zu zwIBjvAi|sOkIYk+=keD4KW}YV)Zk`#Ab*CmLcKe z42h#`h^^Rgwm7IEQN0au{4ykrx1l1Bci*0>oz1BP`8GrXH6#vj2OpaF7OwA9qKN}@ z&%^-MVT@KC#%R@H?4BLQXy0M%Z5>9g?=U(-hp~5bcwrnQWzV}ky-U{~pWa2N9LnB7 zmFDeGlL>;iuz^w%kRuyIj(ZFda|}_N4cR&ki9BY=_R0zQdd+gV|ef!!>08H{_W@Lp;U}k;x2sbIuT<(~uV_4N+r&IZYyqWChHU zsHlS)qz;OvJ17$9pePh5PJvQGJ@5^Vi40L24Doh0#6i*!|2RXm8bgdLhNxDC2&9In zkcLQ=hMejfVzM^Grf!I0X2_|zA&QwH?jMF|aX@H+V^AM0ZLOeIbd)p9=*5Bgn11vp=xmP`C&eO7%4U40^LPRCaz}K`8!spZg z2;ut>fz8Mef!L7wGDH&uCZ)3gJB(NirYaUjeGU17ERW~6Y@nRB)wk%Sg*X!el|a4! zpEsd>B3G#^k^u4Tpe2$s3rQTD@%{KblKd<0Oxhbn$E*{D)m48YmlTpJ17NoyKhCr1D%@oRUa9*q+K**0X(=Ih;Ckl=U33EwP zGSdTV@9H5v;QYN@$51rt?inO*KWx-OAf07>I~A5}O&<29OP^9hWnB3;-EieY6!-GN z9%eiqc@8*MInxu7oHPzreZ)UU2l#M&I(4!Gw5pn%k1ykeqEFDd+$dZp4G~6x6py-Q zh^l0Wf@X+bWrz|6q~YunmCC5veTrTkb+sl3F2@AUIZxErC_x(%YWSHM-ImQ) zXObo*r}8P8Wq)-++DCYjtgXAKLD@KgCtgLNCq;)@B9b)?rbu)fo=X8@)i*@rGNg5e zC{aKxD^kp99Y}|0Mmm#qKXk5P#2ZiNK3*-9Y~@s`b)am%1bZj)ybhzs)L^{Z{^~Z; zSagBVz;3$MqG_OgGGBD%N`UX6ubf(U z<~*OQ%^;&^kxInUquaJ-iI z?6yzhDt`NOU%E36q<4PoV^e3Xd`Wi(p0$1=Yh9l$be*eKzTxTjjR)QBJx$p>Uw8s8 zL+B$@PyZ>0fse%@ik{wl;^}Wp#Xpb7xu8x7BWTfC(X5>he{|=29@_c%r=m^moSbOv zZI^Fm!?x8IgGhg?GWX~8VJ0i@NLc}0ZfK~ zS%Qiwnq)6t4(u*aY-TTf9!7#{#m75BlsX3_QGUflVd6`SG%i=nE-zk_ioM5;z`$e3 z`t{hb@zu*@@G;)bV!`T>%I-!tdxJk^e?^o~6Olm+vD+4sgjTWd@T4 zu8K^#=XdM;fYpW;QO8v5qd2B35oEV%tlEa`$A&ChLzE;o4XU9-Z~jeN^6)aC+Ii%! zqn%EqBtx2Qu?kVx@%@$RGcdf(Z)vq?qqks5^X&l7S&bn=0Wdi;Dmpg%#7Nv7M&brT zL})U88-m`~F<34dry_9}GB(bPl;KpGU63i^O$~;XPHf(*&F~0ohG`n2UiSxpdISwI4g+Zx)=__p4hqcKVK$r$ z1$kITSi_#@*}t*9U~;yVNwT6_SGwZM=L097!akTnb-RDxUq>C#yNqZp)QBb+I6N3~j! zu{XP00&kBFxm7q{`8f;h)7F$SX#3ko^*L|KseSARd8yZ91J#&^(m|iCvy6SG6$V5U ze#n5#%n3`6;}Y83UAyIKL*yP$-%UPthkzMiBOn!~S0;mGi9jmh)MeVlS8t#-&e3zs z@t>LZskR7UGlq1%UZhJU-9wI6UbBe-XP@`CB?JH5Z)dKV_G6xS{%TT}V+2{1xoELC zyZ!Xt6N@AOgi^l^V7?9md|C|i;te8(5u#@`bz+fM7s>t@5+X(oA9ICe zpZ6C};78c9LLx~XQIc0OrCBN=ry+#{a|}48sAMLsOU33~sj2-MCe1BvQ>uk;zQ$;J z5y4J@v>(fvAv&ueW*0-o+K?^)vkUAaPNx5cOd|`U$;ln-Vr)swiNUPqYf5ahosSLj zMb0C}YK|m2%#j4x%qLup2o(IBg+Az zKj!&21kY|oc??^|*eS^r%qgP*h^b zxhjwbW7z`oEz$z=fKqc$zoD&(RG~B%j6D?YserZ(lXtbu$*Y7^E*q+|Lg!U!S~r0- z2_@DIhCmFFVu48?_^aLVzOkY~8v)NE(phAO2$q0dw=He&Tu|;_vH#0lTYQ=?Spqhn zA}LINDF-^6y0i@s+lnDOpCOseEyPtiiI?#e+ck?uH1qm~Q&zAScG*GDIJvT-F+j(x810Woo8Xs)6&Ttb|R4@fy(F^gS~G>T}UkUJBLr-va5h!+D}I4~y` zc8)CC;f|w`4o!9GbIyy|Ft(}+FSWSF=E#WUI>lpSj|ZTH>nACJ+kB$2X#{MsdyU5C+tGzh$Cse|4e^w%YIK(d_smRb{sHe|Okj=>P8?toJB*FC!ze@@-tglnzQY;$*m?*Ke_c8bVI78Db(l*;9me6T z!w^x2*=;(^Zq#8M*uW440;wT~+m=c&D*$u3LGiU1Q}3{61Z$~o*`)aB(*YDqLl}{H z0Bout4DVH&8_PxU(UilA-8>X~uXi9E3cAA>;k69oH-rZPQv^V~uvQPz!iB0V^jsl0 z6rT#gbl`2pQR`(}(rh+lVZg^r$nzZ%(Pig4!tBt<&iWbV?Xc;VXbLTKTOACd!!Q8v z8)#NtGW^QPVhE@_)sNR5P?90dVW&abt@f9;aI~xnh3I%81VPX!ZiVMg=A~G6N|J#P zN)Z{W+*8gF)?ShODX=3@Qv@Z~3C$pbgGG7Sl8wab3qgNu)3gY}@-)CXEnC7tu+bJd z*ka44hUj*NNat7xYCwzGu^WSE1N_%a2u{o6wFd3yI$!V*q;1fo+3kAk)zYdy9#~tz#oHM7cF& zkPPt~_n5(QY+Gj|uz7|RkGMm*FVs-AoK2!(_HFYo**y2PEkUl)gqd8u!wMB-I zkjkAgvJZPxNvHgX^CiMm61kQ+wjmk{2d_itwB7^R{E$)2)-YroJhzQFl+di|!B(hF zlZFwicF)5fZXd8VJGMZU%frJjRWBOEsGIoMQh;Pe+jlB+?m2^Kinm3S}9xzzlQe(Zduf3hv?4Axzbkm&97+ zSX>|v4G!Y?bbG0{ECg~xM#D1pak7U3=?+s{V?{lMGH9MP7;8sxG)9a4?p+xZq87$&-<`bOLGF zJAuQ_Uyn1ELZK7kYKDw7GuSO+FbhWB(00r;zkzyF#9*x>N<#X4hA#Np8`?m^47&uuq$Hc)X_>&)$;cA|y^MD5kI0Cc6b~WF+d{5_&?f*-YJ7Xgk@z*}cVWhL;-o zSQJq*2!=OMjrH_HDzA3&m}&&_DJw`{@)S;6^xOwgv7w=q@(MdsB2E3zA zo#L!7XcJhQst1c1t`&jQ+lh*Bcgwac39kXRjS_qENCoHVS_578peIDIj=4)1@ZlyC zSCG|N=T9&pP*M0ne=XB_TBLp0%_=J8Fp?t=kj_Jd2ONu^dfS2r?)iBPIIUp3ayT)y zm~a^c!k)1Xx!$s89jEd!aAf~dUrNVA{B!>ydYl4O6jDjOMjyTd@nt*PZCr@m(Sknm zoFSDPQi3-Gn4uw+dkbKh*sO^(jv7EO(T}YaAhvl(Aj4@c&eg5d?d|%2v}MSu02b9a zk%A2&5JPC!kg+kOLx!vZL&(GsQZ{50H)LFa3lFf)8&B~gDGX@gEG}9(bJvNA)3etWEC_}zCy7^=vEVL1l!tnPB7;{p zBWN?7u_4hEj&bEXCP8-G{c^=%`mwb_a{IJXI<}HYV+W^@G=ocEUQ)~}Fxwmw)Nu12 zu_B5SxF86|3=0}($I6CraO=1ln`N0zwvO zk-!{tHbpCONPZSr=U zqQn8SSD1D?%snkz63i6gZs~7P#|@z-XXZ2;*iE-{v)cmc1!{v+Ij%Nj zeK|8H<4$Fda4NTNfjN>$pOu>_Ei|xG8$wuyEFWMN#pV7EBSks#IqGOZr0zo4!9Wlj zJZRrDYPzr8T@%QHM|OX!_JSNZc=TKM2!@yGY()E>F^zsW=I9E1+oM$=9E1Ha3xJ+F zOf*UEUv?F2zPZ|V>rj7gI6O+#gt4wV8igTVq|0wgMI@xNT^DL7j+UjoP&yuOb9L|3 zt4$0Nyv-TWgMp+n?fae~vG-;7>EEt7jM0i)YY4zOrdC6z=Rf2-l^+*^b+0eXM6Z&M zV>d)seWdVZaw+Ht16Fwb4K;4v!hY9Z)UR6=E2%ix+E-L@9O-BCSi`tyP&|u;Gs3R) zE52D@;;V3lo|w#rLa|*((P#Jl`)a~9M^ska3mM+7j~y8?hS%<1pT6Vc_2;Uu)}P6V z7-T|QtodJ20rMrR1{ajY5c5fqd+v!uAc2X_KD*^*9Zp0XKI(i;as4Fv^SjKz^qF%V%7^y9wWX;%q2@~)yh$kYLj`e3GG#{;reug{l}&zbTCF<#bGI( zd;o6JmQ(|Rz>xO@AzQIWoBs*2RNclZPGSv$UCq)ssfkfyK0)`k6GljTihMqBVh(4{fIHH=KfTR)P+7(b7s#P)NQH7B)6n^46F;5+JJY9Ol` zlmTYTsOUr5GXo{!nGe_N_E9*-7x_G-o{ zicUF|xsyy=6QTt)TEJFJlpG(r;ngiDlSdt^IoNlK*JapD zC1&eLC2vU1PK5DR8Ux@&RZ`@@{9k*QxMH=KL1E8O$xQY6celAkl6%n;Iawo3a+S5^ zo%u@@R$a)!F2gTeyfolK zj6Np^EDD^V=_a&+WvF%m4=Ga*L6c3&r;&&clv@OG-iqAQDFR4^XqL=7C1D&WGN5sV zl5aRK3P7c@a*k0DOU<&rJo4AIp4-G{4@S8+O!`y*+NSB+yT-qY!KCc#hC_BftQIq> zSw^$0p{Sp|&8OqIPV~CVa6WL7xZ!9qieBa6lxUX2Svz1iy0TZm#Tq$xTui-Y?%7;Z zaFibGQykeGT$2VL#D}tsI88f{WjcaU{zH>%LS&2ewp-oOMtx)|phH;mG0#j)M#gkx zi85^1t7^q+?bSR$1inXs`P&9XSvDEDPMN84vSEfqq%4T41EL99Jx5C`p!e{{qROr{Zs?kWD03D*5)cfW9D^}^DkK% zV-F=M;Db#+IvjS|&*QQYsO!qPT1YGhh0yC#fB7FKpuEvZrQf}@v-|_(dJ!_7O8V8 z?5&Xk(SvdVW#AyX3k`r~DG;vF8A33OboW9rYWN~3p4eq|9Ec$DpB@P^VFEGZIu*Ua z5Gfv*O+uMY451KN^iTyIRvXzf#Bq!!vUNGkV;@y8klwB zF3rP86o@q0y_-a&$PRO@!R8jN%Sk0Pc_QR0mha6)%mDLf8boJt#@c2 z?Z?K_(CB>TOM~yw4Yh24Fs_i98sr$3$CEUIs2UZ;1O8J8Va+HwM@INyo&l2&P$213y1LFTViC?hCw$Kou&hPkarg#S#?;}CF(k>6FI{2aS%Pl6M$((%CaK`BWH-* zXdfpIB5*D7LaZYY#H{oJV_0Mmbt||svgdaj;a~;qBFDHbZ~aJ!=q5_-28g88D9r|> z{2U-GK0X)UNK-BcX*Wja2dU67P6RGvo6Mz!cY^nMh6YGwCohPPPhJr7QMHv$j534- zsI1aP`>j6?+UwXrWIOYhlf)-6?kE|!%vFGDq_)HYNI0+j)kqSohqB&4N`+FO0YXd2 z4yppgv2F>KC@`L6&3PSw;E36sj@){G3?55zX-yMYb+s1t#eyJ@xe94C6wO^%+-(5VyyMpQroE;V$YYDhuJF5REI8M(-Ez-S!|hjTi4- ztPA>KnqRzkYcr!j!Lm)teNP+Z*joKgkIl$2@c_rRhlwbi6BDcLuw^R4odYS)8$1ed z*KzygLS*GDp0=!;Ry6A6eBQ?;I068fG`MEEouH5~h9#0=lkn|wHh?ZOTn|jEacRrs z65!(FHmrz-aRYfWtO$Fz%b>Lf&uzmDgRxyJH!d_r>B0%A3mwivDr=OFy~fPD5JP=8 z7|Y;>cgV5}O)xOLc5$kr6MKTv%$yk8W4D38#QZ`mOl;a2QHG9m5U!$o(FzhP!zfwn z$X_QxZSCIcgaOy$$h!>0hvO?2qkZtx?Ys$oc{|4bn0WKf{JWY8dQ3ctlmEHV4N8m0 zjEOPCfy9sk4O5EI#-gQ=LET6N;ur-?>gI6TA9JPJxw$CY&{(Iw=K zeb4APU^pO5_L{wkFS>b7hld~RU`Q}Alnsr{}2SX$i;K<^{AFC)%F*-JQfZ5PBkQ9P}FB8kr=~?bX}rZY7WieYq5+}-(oA&k zRmI35xD5EieMRy}&(0a@))9?^40Uo9$>Oocy-fdN!O8U?sRQ=cmRW<$RX(66PDVkp z26nePVCCo}j6Ny^Fk6ANh)hB<5p?Y9%{GhHmNnyo^;#L~sj9PFYv@bGMcK0-GCGqX z;<_Pn18^)enh(q>vHgHGiYS$)Jcy@E2Fb*0RxoFQG~f8Qb$(zgZjD|rF)c3Q)(BSF zCf;rpZ~jgDt-YeKHSYej-}d}&`>XjzZ;k6Y?Kh+$i0u{cYri?r+hN~szirlAVC4J# zS@BoS3?e)~o;bfHAMwxeml}P^m}!ZJEN*{Ycw+pOrJVoT_;Z}v_SY%Rn_zg? z3Go|)@S-Q$Uz`4@{dJXM(vdpj@%GnspJ;!*Ql2NI+R&kyo)pqL2?QI(bw?M^!R*>$ zcu^Kk$Dk@6I<3y*zOPz{P?Nk&-U=ATdoRd)k{V_bq zsc=d|8g0m8G(=!AWSsz+Fe2e25&;QP?js|tU6B`itXG_MLUw{hW2SU(sMr*bQR4E z%b-N9=vLL5E)jT$V+>t zm)TCWu<+DgbP}6jx&MSfRe+D7oyM znNgg4`I(BdEcR+vyVV>>6qSu;vPl>s8yQj+Fb4@U!xcekC@8TzveP)C2KKEv%es+dHA`Db>jRshG<-d%xmX0B<5m> z-OmRtTtqkA{$R`O$?L31=((}QPE-gaKTAb&;n*S zcx%?VX;tRVEmYec13+&17RJ4>)on`{`B zS8bl$y3sXWcR;WhT8^pY*t?6bGCEjl96bX&_)FxCPO7BAjw|sSE8MIFb4`YGfK;#n zV2A3~imkK|ZJDXimAG0+(HNCpsaL~*w7=uFHPv+)kqxU5lu`&YGMBWIs)%^rop(_M z{jI=%1MV7ZaV$72+`#M$eFHO~BHJ|jksDs;R5qb~s~2Hn zFf&fY`s7qr4%-mZC<8w73W%w&2hs>9=>UqUPG*pWKYUGFm~a$eH=Y&=(J>sP1jg*L zSb;#MTAEv)RtchVLDnR)1scLL*|#(#$UBXyCz?h$8VX0dE`?=Mz&~(%1vNwf0Y;vKE{kF3q>^DtTJ-AGFXn`yvqe3JUOB;`Y%fo zk=l{J#TdE~W|FaSRUmcFOOaCrx8G5Mf|_6u>_0{hk7vWq*P_PmkRX zwKyz>c-eF@l8*X_f%&V`ih&~>n<-dRK&FIO7C1Vt5jlbG`nltz7hbeMe{s^S5J7Y^;UCToaQ4EMW}PQ9Ib<(AWD$nv+c}pIM@)I+a2Y;_B zpnI^?THCqL0W(!LCPVDyhV1`9+Ny9Q>2d_*K~Vd(;ZABu$ABJXr$U8L9YrA#mn$m$ z1i1$`xzQ+k?bPm3q#Oz?TAmpQ!oURHqU=Etp zm^cNTfLyNiF%&D*nUP+d%91o>4xO1@ibL0^NM3uc#@b*wUM{A^TpJ_B~L2 z$Gwi60NhC4B`Y^WuB*~5^y28MWI{v512T3##k}3b>{g zp|Kj=nd<5{2T&^&p;n&f&^_*kgalt8(ntfjc0q><-Tl+DW z5OFlWBS?Rmu;2iA8rfojL|29f^yKXiw$?J2o$RP_X18d+MWxB9up{hpOlyR0hNaoPwReQ+u)2beYCuGHa!;-Xp~9GkZcTpF8@;hghYZmM1t?t=L-?ZipenXz{Q z$;<^7U>@6{t0rc`aZ>QtY$E=8&B3jz><6J^y02HqUC_QC2&kkpqTGkc>^}VIJ}0by zmyR3;rf2YCL);a+uUBtum6Myzm}KhKJ^H?B+|jbK;tqmZN%f>DUxH zjEh)@dAg{>#2Et9xcSn4GnwLfP1MQ%^)oFQ($jU)zHz*BL~c5c=LC@4dG;Y!%$zee zekZdx`Qyta904=;W#68}gm86sJQKR?@QcKw^JM#+rm@$OOtYxdH&4BQnK^VpLxd37sEEJ2lT1bD+f z4JP3bsjd5(n=gqO(iI0x=0_^-^5gLhW)#unflLr0O_zJct*tb2<0jQ5BX%XW`*N3# z2o6^1oH>9PCta5BX8T*UbT{jwLxI zA+t1(LZ}J6k52nB$@plB1CWZ?#I^Q35T+occ!&OGWE?P`Q8i?jV?y|r4R;qQBH1C% zmcb;$khrE6&Fb&-%iKRre?#|Al990JRJm~&(KVkovCTS2HRYZ=X&Aw7%cwFolGkuv zgWj;6SyzJI$~}UkAP!9E4YEg_pFoT#f)vY^ZHJkcZjJt0&1I3`(&5bI;gNSUoQl0+ zyY9Y_8DdQD5jFw#U`#0E0@H%(Fq^DwDnA%D-mRe^9De3Srs?v+Ry(Kn)&EjrE~e_2 z{8MX1E~kQ=ML3luVThi{NrfkLyxKq)(5^{m5>Pq~(YQJ&RnQQP3YcZ1>VcUg^s`Kc zX+n`*cJwo6NB8TJQ6xKzM%7_-q#jFQ>o6NphmmH%^c0n=OGf|eFiMrPqf`OmE$mEP zZj^-%qa<~h+3he&6PV&qn!04vpdL$g=`e~9n7*JUb;)QpJ(d8Fn3+I1@#kC*?4XoS zAk)ZkW|t~`14zr!8JwAgX^7Yl?1;X@2>Ly~u@%mGBSKb}jHnK#Wyri;GO{_CrXk7q z$-&F|L1gthJDMqwx?!(C>O!*b3PYamFiRaw-N?ND8i^Rld?7Cb&4Zj7i5N&x2&PU& zYz0yj=X1bLY)#Di#%$4JN#Fh)oz4)wtb-4=%(Mh?gH)Q07z)hEMU3n)VrhrD?C8%i zd;=*Q5xLJD?wS2;A+(ate4sLR*^!_VTjq6kgxD@SQYe_p&ynZ|WKat#eT;CJ z*wUc0BeMZ%DH~4rHBwlQwQ2B-6Ls@qCVwrP2phm9y&Pzm%evR=5P~@#BR$t%+vU3S zqqU2`Zr8p-o6!MZowga#rUSlOC1L|Q0Kt*PzY~?)n9%@IB?L_Gv$e{s0kp z2}lBD?^}LwOP#H~Z~4J_kt&S3#vhak zqP6tH=XE%Tbx<1$$I4@0eja%GLFmhWrW1_LQ31PT7ZCyRVfrO?oMvbOj1ZWWU`HU1 z4#^b6T4%3ae0;Wq$q)1=|4RZyTb!I4xR=Cbnet+5|58mVFS zq5PpZgK{dmhat9ZLmXrbUnhaj5SK2)9J{IrjlrpCorb7ShG-jxoM;(hq%`D=&5&CF zhIk7ZqNy07#TlYF8=`C)Vlg-5V9gLw&Jd~65HSYGoZT#24v_iBJYzaz>v_ZaMjfzo zGkfUv)SrzW<17%BDR;q{zZ^+W;HYPcn5h$|Q6ig}OW^oTDmLbV*cU(}GrcC-Td5FW zp|mEsZ`9+S<6Cm#{I<-{xVs}-4+mN~90L1mcL2}vf|Yh=*uMRc5|EEE$T*cP8c0o; zTyP%Cm4y=Hwj=l2c7XH<WA8|_Ie81b?@Mj?z zd7ukJz*!gbLJfF=_z^iycyq5rfJ8Fy@HQD%-5bu7fYgP1W0xCY(aHF?7_u~hv;^g* zAlrfS!nO=y0fulBU^l28hBZ4ocT@~vdblm*01}F!W9*2>X{*VwDt@|C0_DvM_`GfvC}^uMMLBK$ZFnF|4r zF-06Plv87gF1V^$9AS~uCn~{?&my8AEJkSrwjAAIoYufh4H~K;TpXA)Ep@^WyPF|e z129Ji<+sB~9UW%5cNo>X!yGO4`0!S{M}G_m1w+88qsz~6V24qkJB;P8!$ zFq{sfNp=`pUx%^vbr@4ahauJuWA*4T#M)u3o*m}Np$>CC*I}#+9p<#J!)V|g<^-<8 z7!x~;Cf#8STOGdj{>k~ly40m}y4zul$sLB7br|zwhp~lr7`_08@Y$aXVfa7@n^Ov> zvgaEjdl@2K8S>;ZkX3-q->FDuPQ@B!hzZsZBaI=lmmw;sA%dDAmTN;47(;YlLwq+3 zG2R*C$zzBu6_{Ket+m6LUOSAI+hP34I?UN^hdFr!BeY)UPJ7+hTKXuB^8T+7J&MAWIFi6~|nL999`xtRS;b+<>+<0FnLu zt#893-Ov2H&`nr*b&?xb;eyw=4kSs=FEt(5931roITCXQb0t_>P6lgZGgYGY@O-39 zgo;Uu_i_r|_T~^v3Qau4ROW&V62`WU#CKe*b2oMcWte$tDoi*|9YIjYrX;74o z{~#4Epy5A2asw3wMGz7a9R&pyZA#wx9KZP;yRrP;Gk4zHnYs6#^E)&5?j1Ry?Mneq zhYtVTHBBe-iqhj^@*p=aCKe@3AgkW?`8ZH@@5}U&MSp+SAcI-k|6{AwH{-xkAEDNkei2`=f+@Xh4C+Qd`n*KJ zoJw_J+{O}EQcW%03RU(zmDa$bYAGFVrQwN5i+b1bLKhR#wsK6#0)t*0vGRE{V&&I{ zs_}^fY6W4a`XE&IvQUMlp}L?@CK0Uh+3xY*a-mhGXSC`cAdm0gBhK1v{+!USZFX`f3VnTuvlfV*a+)a*AUb~Qj9(7SPhT+MN?cxtft6B`ANc#sDSjiBUb z(B&K?NCyQraNM|JzWuNLh^kt0BUUlfI9PBJv&`l&lgwf!QUrx(K^r}Swyy-~9k8dC z#X5rp_=5=$g9#dgt-rx$uI$J#(+39A8wS%a2Ga+y@e zqk|Fza8=OnFzh}cjx#q~aFL^FrfXfQ98tmCT9c*O;cF&i-T}a|a>LM${YPI-w z6*YU2-smNnwFqEL=9npF>)77n4gHRFCn+pvJgmF;<_7GldATV~n@ef3SCAW(!eqXn zST}`9b+E@l#;bV+bKMf>EMGf{y9TkYC5k|$Mb6MUbNBjSb$c$Qv_yGO)(EP)LZNO5 zlva#YE-Uz@KkW-^hZs9GyKTWfXZws|mV^#Ue#81QL{HP~y5Yv$G|S&qWk-NCO;VM(7h8#PkpDDD}K z4U89b1P$BTTP=>x%XtXWL08Nw+nWMnC1?d*13|Zhpe$j~)C#%=f+ls4e;jm|3!0We zx5S{EUeHVn62gO~Wl&x;Xx;^{ZtSLX&?F7gyn^!BK`~m;TnU;DL31T&_=AEnIBt5l zMxSaDdT-z4vbl#ZTfYz-=DxeE?zD^g(GJH0IA#~l{@w7;-#F_U(G7VT>hJ5%NKQ#GSBfCSBCuT&TI$QKgS8xG7m7V+T&5 zyU_J#d%c+4d;Qs}U;90fv+mR_A~T6~xLx8L_4f(6b@xJ%+%pHe^AF~sWFd)L&YDOr zhSm7i3d?N=J#Gpun$zhSm)WH7ZV z#UmY82n8-#u>)qR@PlrVma2 z*1mWTGDTw8Nero-&N|EljhMZmBS?lFr74bsX@*!^#s0%g@ElAk!#YNMKg{&am_@bF z2+NelN>UmJlPj^N5FAsQ?lVf$c~Y7ZmeOwM(D?FBVkLbAtwD!90Nl+SOcH|HMWh|2 zYyDA=wl1M@3^Q#KGn2lchFRklD_LzEOz|D1f4~2!ZYa5V6eqK$xIKu&{JDC;3f2^Q zU`l%qkJ4n$!9-Q88z}hD*b+&hy1gnPC{++7=|NSI!Gd%zsEfEuuuqyoiv1Fua+nEp zSlu!UP-T3}SczFdQdf{#2m6=l=P^^@+U%YpJ%Tli6bAh=mp=y+27}Tguz%{~Z|{ey zxtDR(YqQ%I@y43|!c+Fj53cV5wy&Zs?v8EtKsQkadrn}*DX>9<*`@P76ReAEaS!UX zF73CR3N}$JS>=cLDFJIx_9jSn2nvPa^T?o9Fmuw?MPh3o-hgm<;=^+vp#c$A$*Dps z_=5bSVC772KqtX%iB$|12?<`zi~?%}5&sXhHEQR53X+R#9Y7 zARH9E2E}?ot~Jy~D^G%!xCE_f2~s42WP%`x0rteE?hKaN87x>BOh_4Qz2IQV!eDy* zU^%m9b3|M)m|!&6DyzX{vcb~5*c2331j$iQKU&{24kq2Y>X}JO&}i4QA!`*XOhkUi zQ^rN5s7UV%UKQW}e)YE%Np<|=Dlw*fIHWU%mJFsEZM7iX|X&tTr#U@o(-Gxj(; zer#Gdj-UR~AOH5hJDXqKIXON4`qA0L|Ni{$$?4|e@!`F*i-()5!-ty(XBUUR++JLs zoSi;>^=0eHX{^7yefQDHyT^yy^RuIOUVHW47eD;Uo#V~b=I-WldwBKueEY-iZqL4d za<%>D%{R{;onBo$zJ0vCJi0hJzuMLP?}P2>Pxl3`Juh%=fBf4g=c^H)_};sl)BBG$ z_qUgydhOtNyF2h;dwFp0;^4vN*7?=VgC8GUJi7Jdottm|;O*11 + +

+ diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_bg.yml b/plugin/platform-bukkit/src/main/resources/messages/help_bg.yml new file mode 100644 index 0000000000..e530a5aa8a --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_bg.yml @@ -0,0 +1,335 @@ +common: + header: ==========[ AuthMeReloaded - Помощ ]========== + optional: Опция + hasPermission: Имате права + noPermission: Нямате права + default: Стандартно + result: Резултат + defaultPermissions: + notAllowed: Не е разрешено + opOnly: Само за Оператори (OP) + allowed: Позволено за всички +section: + command: Команда + description: Кратко описание + detailedDescription: Подробно описание + arguments: Аргументи + alternatives: Алтернативи + permissions: Права + children: Команди +commands: + authme: + description: AuthMe op commands + detailedDescription: The main AuthMeReloaded command. The root for all admin commands. + authme.register: + description: Регистриране на играч + detailedDescription: Регистриране на играч с дадена парола. + arg1: + label: Играч + description: Име на играча + arg2: + label: парола + description: Парола + authme.unregister: + description: Премахване на регистрацията на играча + detailedDescription: Премахване на регистрацията на даден играч от базата данни. + arg1: + label: играч + description: име на играча + authme.forcelogin: + description: Удостоверяване на играча + detailedDescription: Удостоверяване на даденият играч. + arg1: + label: играч + description: име на играча + authme.password: + description: Промяна на парола + detailedDescription: Променя паролата на дадения играч. + arg1: + label: играч + description: име на играча + arg2: + label: парола + description: нова парола + authme.lastlogin: + description: Последен вход на играча + detailedDescription: Показва дата и час на последното влизане на дадения играч. + arg1: + label: играч + description: име на играча + authme.accounts: + description: Акаунти на играча + detailedDescription: Изброява всички акаунти на играча, според името и IP-адреса + arg1: + label: играч + description: име на играча или IP-адрес + authme.email: + description: Имейл адрес на играча + detailedDescription: Показва имейл адреса на посочения играч. + arg1: + label: играч + description: име на играча + authme.setemail: + description: Смяна на имейл на играча. + detailedDescription: Променя имейл адреса на дадения играч. + arg1: + label: играч + description: име на играча + arg2: + label: имейл + description: имейл на играча + authme.getip: + description: IP-адрес + detailedDescription: Показва текущият IP-адрес на посочения играч. + arg1: + label: играч + description: име на играча + authme.spawn: + description: Място на съживяване + detailedDescription: Телепортиране на мястото на съживяване. + authme.setspawn: + description: Задаване на място на съживяване. + detailedDescription: Задава точката на съживяване на текущото местонахождение. + authme.firstspawn: + description: Първоначално място на съживяване. + detailedDescription: Избира се първоначалното място на съживяване. + authme.setfirstspawn: + description: Задаване на първоначално място на съживяване. + detailedDescription: Задава първоначалната точка на съживяване на текущото местонахождение. + authme.purge: + description: Изтриване на стари данни. + detailedDescription: Изтрива стари данни според указаното количество дни. + arg1: + label: дни + description: брой дни + authme.purgeplayer: + description: Изтрива данните на даден играч. + detailedDescription: Изтрива всички данни на даден играч. + arg1: + label: Играч + description: Името на играча, за което трябва да се изтрият данните. + arg2: + label: Опции + description: '''force'' за да се изтрие без проверка дали играча е регистриран.' + authme.backup: + description: Създаване на резервно копие + detailedDescription: Създава резервно копие на всички регистрирани играчи. + authme.resetpos: + description: Рестартиране позиция на играч + detailedDescription: Рестартира последното известно местонахождение на указания + играч, или на всички играчи. + arg1: + label: играч|* + description: име на играча/всички играчи + authme.purgebannedplayers: + description: Изтриване на данни за блокирани играчи. + detailedDescription: Изтрива всички данни за блокираните играчи от базата данни. + authme.switchantibot: + description: Промяна на AntiBot-режима + detailedDescription: Променя режима на AntiBot системата според указанието. + arg1: + label: ON|OFF + description: включено/изключено + authme.reload: + description: Презареждане на плъгина. + detailedDescription: Презарежда плъгина AuthMeReloaded. + authme.version: + description: Информация за версията + detailedDescription: Показва подробна информация за версията на AuthMeReloaded, + неговите разработчици, помощници и лиценз. + authme.converter: + description: Преобразувател + detailedDescription: Преубразовател за базата данни. + arg1: + label: тип + description: 'тип преобразуване: xauth / crazylogin / rakamak / royalauth / + vauth / sqliteToSql / mysqlToSqlite' + authme.messages: + description: Добавяне на липсващи съобщения в помощния файл. + detailedDescription: Добавя всички стойности (на англ. език) в помощният файл. + authme.recent: + description: Проверка на скоро влизалите играчи. + detailedDescription: Показва последните играчи, които са били успешно влезли в играта. + authme.debug: + description: Отстраняване на грешки. + detailedDescription: Позволява различни опции за записване на грешки от плъгина. + arg1: + label: секция + description: Секцията за отстраняване на грешки, която да бъде изпълнена. + arg2: + label: аргумент + description: Аргумент (Зависи от избора на секция за отстраняване на грешки) + arg3: + label: аргумент + description: Аргумент (Зависи от избора на секция за отстраняване на грешки) + authme.help: + description: Помощ + detailedDescription: Показва помощ за командите започващи с /authme. + arg1: + label: команда + description: команда, за която е необходимо да се покаже помощ. + email: + description: Добавя имейл или възстановява парола. + detailedDescription: Основната команда на AuthMeReloaded свързана с имейлите. + email.show: + description: Показва Имейл + detailedDescription: Показва текущият Ви имейл. + email.add: + description: Добавяне на имейл. + detailedDescription: Добавя нов имейл адрес към Вашият акаунт. + arg1: + label: имейл + description: Имейл адрес + arg2: + label: Потвърждение + description: Потвърждение на имейл адреса. + email.change: + description: Смяна на Имейл + detailedDescription: Смяна на имейл адреса на Вашият акаунт. + arg1: + label: стар-имейл + description: Текущия имейл използван към Вашият акаунт + arg2: + label: нов-имейл + description: Новия имейл, който да бъде задеден към акаунта. + email.recover: + description: Възстановяване на парола чрез имейл. + detailedDescription: Възстановяване на Вашият акаунт, използвайки Имейл с нова парола. + arg1: + label: имейл + description: Имейл адреса на Вашият акаунт. + email.code: + description: Изпращане на код за възстановяване на парола. + detailedDescription: Възстановяване на Вашият акаунт чрез код, изпратен по имейл. + arg1: + label: код + description: Код за възстановяване + email.setpassword: + description: Задаване на нова парола след възстановяване. + detailedDescription: Задаване на нова парола след успешно възстановяване на Вашият акаунт. + arg1: + label: парола + description: Нова парола + email.help: + description: Помощ + detailedDescription: Подробна помощ за /email командите. + arg1: + label: команда + description: Командата за която да се покаже помощ (или за всички). + login: + description: вход + detailedDescription: Командата която се използва за идентификация в сървъра на Вашият акаунт. + arg1: + label: парола + description: Паролата на акаунта Ви. + login.help: + description: Помощ + detailedDescription: Подробна помощ за /login командите. + arg1: + label: команда + description: Командата за която да се покаже помощ (или за всички). + logout: + description: Изход + detailedDescription: Командата за изход от Вашият акаунт. + logout.help: + description: помощ + detailedDescription: КПодробна помощ за /logout командите. + arg1: + label: команда + description: Командата за която да се покаже помощ (или за всички). + register: + description: Регистрация на акаунт. + detailedDescription: Команда за регистриране на Вашият акаунт. + arg1: + label: парола + description: Парола + arg2: + label: Потвърждение + description: Потвърждение на паролата + register.help: + description: Помощ + detailedDescription: Детайлна помощ за /register командите. + arg1: + label: команда + description: Командата за която да се покаже помощ (или за всички). + unregister: + description: Дерегистриране на акаунт. + detailedDescription: Команда за премахване на регистрацията на Вашият акаунт. + arg1: + label: парола + description: Вашата парола. + unregister.help: + description: Помощ + detailedDescription: Детайлна помощ за /unregister командите. + arg1: + label: команда + description: Командата за която да се покаже помощ (или за всички). + changepassword: + description: Смяна на парола + detailedDescription: Смяна на паролата за Вашият акаунт. + arg1: + label: текуща-парола + description: Текущата парола на Вашият акаунт. + arg2: + label: Нова парола + description: Новата парола, която да бъде използвана за Вашият акаунт. + changepassword.help: + description: Помощ + detailedDescription: Детайлна помощ за /changepassword командите. + arg1: + label: команда + description: Командата за която да се покаже помощ (или за всички). + totp: + description: TOTP команди + detailedDescription: Команди свързани с допълнителната сигурност на акаунта Ви чрез секретен код. + totp.code: + description: Команда за вход + detailedDescription: Изпълнява проверката на секретния код на Вашият акаунт при влизане. + arg1: + label: код + description: Секретният код, използван за влизане. + totp.add: + description: Включване на TOTP + detailedDescription: Включване на защитата със секретен код за Вашият акаунт. + totp.confirm: + description: Активиране на TOTP след въвеждане на правилен секретен код. + detailedDescription: Запазва генерираният секретен код след потвърждение. + arg1: + label: код + description: Секретният код след изпълняване на командата /totp add + totp.remove: + description: Изключване на TOTP + detailedDescription: Изключване на защитата със секретен код за Вашият акаунт. + arg1: + label: код + description: Текущ секретен код + totp.help: + description: Помощ + detailedDescription: Детайлна помощ за /totp командите. + arg1: + label: команда + description: Командата за която да се покаже помощ (или за всички). + captcha: + description: Код за сигурност + detailedDescription: Команда за код за сигурност. + arg1: + label: код + description: Код за сигурност + captcha.help: + description: Помощ + detailedDescription: Детайлна помощ за /captcha командите. + arg1: + label: команда + description: Командата за която да се покаже помощ (или за всички). + verification: + description: Команда за потвърждение. + detailedDescription: Команда за потвърждение. + arg1: + label: код + description: Код за потвърждение. + verification.help: + description: Помощ + detailedDescription: Детайлна помощ за /verification командите. + arg1: + label: команда + description: Командата за която да се покаже помощ (или за всички). diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_br.yml b/plugin/platform-bukkit/src/main/resources/messages/help_br.yml new file mode 100644 index 0000000000..818daf57ad --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_br.yml @@ -0,0 +1,46 @@ +# Arquivo de tradução da ajuda do AuthMe (comando /authme help) +# Tradução por Frani (PotterCraft_) e RenanYudi + +# ------------------------------------------------------- +# Lista de textos usados na seção de ajuda: +common: + header: '==========[ Ajuda AuthMeReloaded ]==========' + optional: 'Opcional' + hasPermission: 'Você tem permissão' + noPermission: 'Sem permissão' + default: 'Padrão' + result: 'Resultado' + defaultPermissions: + notAllowed: 'Sem permissão' + opOnly: 'Apenas jogadores com OP' + allowed: 'Todos tem permissão' + +# ------------------------------------------------------- +# Títulos das seções individuais de ajuda +# Deixe o texto traduzido vazio para desativá-lo/esconde-lo +# alternatives: '' +section: + command: 'Comando' + description: 'Descrição breve' + detailedDescription: 'Descrição detalhada' + arguments: 'Argumentos' + permissions: 'Permissões' + alternatives: 'Alternativas' + children: 'Comandos' + +# ------------------------------------------------------- +# Você pode traduzir o help de qualquer comando usando o padrão abaixo +# Por exemplo, para traduzir /authme reload, crie uma seção "authme.reload", ou "login" para /login +# Se o comando usa argumentos, você pode usar arg1 para traduzir o primeiro argumento e assim em diante, como exemplificado abaixo +# As traduções não precisam ser completas, qualquer parte faltante será obtida da configuração padrão. +# OBS: Coloque os comandos principais, como "authme" antes de seus subcomandos (como "authme.reload") +commands: + authme.register: + description: 'Registra um jogador' + detailedDescription: 'Registra um jogador específico com uma senha específica.' + arg1: + label: 'player' + description: 'Nome do jogador' + arg2: + label: 'password' + description: 'Senha' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_cz.yml b/plugin/platform-bukkit/src/main/resources/messages/help_cz.yml new file mode 100644 index 0000000000..4d16d551b6 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_cz.yml @@ -0,0 +1,45 @@ +# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called + +# ------------------------------------------------------- +# List of texts used in the help section +common: + header: '==========[ AuthMeReloaded HELP ]==========' + optional: 'Volitelné' + hasPermission: 'Máš oprávnění' + noPermission: 'Bez oprávnění' + default: 'Defaultní' + result: 'Výsledek' + defaultPermissions: + notAllowed: 'Bez oprávnění' + opOnly: 'Pouze OP' + allowed: 'Povolené pro všechny' + +# ------------------------------------------------------- +# Titles of the individual help sections +# Set the translation text to empty text to disable the section, e.g. to hide alternatives: +# alternatives: '' +section: + command: 'Příkaz' + description: 'Krátký popis' + detailedDescription: 'Detailní popis' + arguments: 'Argumenty' + permissions: 'Oprávnění' + alternatives: 'Alternativy' + children: 'Příkazy' + +# ------------------------------------------------------- +# You can translate the data for all commands using the below pattern. +# For example to translate /authme reload, create a section "authme.reload", or "login" for /login +# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth +# Translations don't need to be complete; any missing section will be taken from the default silently +# Important: Put main commands like "authme" before their children (e.g. "authme.reload") +commands: + authme.register: + description: 'Registrovat hráče' + detailedDescription: 'Registrovat daného hráče s daným heslem.' + arg1: + label: 'hráč' + description: 'Jméno hráče' + arg2: + label: 'heslo' + description: 'Heslo' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_de.yml b/plugin/platform-bukkit/src/main/resources/messages/help_de.yml new file mode 100644 index 0000000000..b1841ef416 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_de.yml @@ -0,0 +1,29 @@ +common: + header: '==========[ AuthMeReloaded Hilfe ]==========' + optional: 'Optional' + hasPermission: 'Du hast Berechtigung' + noPermission: 'Keine Berechtigung' + default: 'Default' + result: 'Resultat' + defaultPermissions: + notAllowed: 'Kein Recht' + opOnly: 'Nur OP''s' + allowed: 'Allen erlaubt' +section: + command: 'Kommando' + description: 'Beschreibung' + detailedDescription: 'Detaillierte Beschreibung' + arguments: 'Argumente' + permissions: 'Rechte' + alternatives: 'Alternativen' + children: 'Kommandos' +commands: + authme.register: + description: 'Registriert einen Benutzer' + detailedDescription: 'Registriert den Benutzer mit dem gegebenen Passwort.' + arg1: + label: 'spieler' + description: 'Name des Spielers' + arg2: + label: 'passwort' + description: 'Passwort' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_en.yml b/plugin/platform-bukkit/src/main/resources/messages/help_en.yml new file mode 100644 index 0000000000..bcc501b7f9 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_en.yml @@ -0,0 +1,45 @@ +# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called + +# ------------------------------------------------------- +# List of texts used in the help section +common: + header: '==========[ AuthMeReloaded HELP ]==========' + optional: 'Optional' + hasPermission: 'You have permission' + noPermission: 'No permission' + default: 'Default' + result: 'Result' + defaultPermissions: + notAllowed: 'No permission' + opOnly: 'OP''s only' + allowed: 'Everyone allowed' + +# ------------------------------------------------------- +# Titles of the individual help sections +# Set the translation text to empty text to disable the section, e.g. to hide alternatives: +# alternatives: '' +section: + command: 'Command' + description: 'Short description' + detailedDescription: 'Detailed description' + arguments: 'Arguments' + permissions: 'Permissions' + alternatives: 'Alternatives' + children: 'Commands' + +# ------------------------------------------------------- +# You can translate the data for all commands using the below pattern. +# For example to translate /authme reload, create a section "authme.reload", or "login" for /login +# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth +# Translations don't need to be complete; any missing section will be taken from the default silently +# Important: Put main commands like "authme" before their children (e.g. "authme.reload") +commands: + authme.register: + description: 'Register a player' + detailedDescription: 'Register the specified player with the specified password.' + arg1: + label: 'player' + description: 'Player name' + arg2: + label: 'password' + description: 'Password' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_eo.yml b/plugin/platform-bukkit/src/main/resources/messages/help_eo.yml new file mode 100644 index 0000000000..ed9ba3fe7f --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_eo.yml @@ -0,0 +1,31 @@ +common: + header: '==========[ AuthMeReloaded Helpo ]==========' + optional: 'Laŭvola' + hasPermission: 'Vi havas permeson' + noPermission: 'Neniun permeson' + default: 'Apriora' + result: 'Rezulto' + defaultPermissions: + notAllowed: 'Neniun permeson' + opOnly: 'Nur el OP' + allowed: 'Ĉiu rajtas' + +section: + command: 'Komando' + description: 'Mallonga priskribo' + detailedDescription: 'Detala priskribo' + arguments: 'Argumentoj' + permissions: 'Permesoj' + alternatives: 'Alternativoj' + children: 'Komandoj' + +commands: + authme.register: + description: 'Registri ludanto' + detailedDescription: 'Registri la specifita ludanto kun la specifita pasvorton.' + arg1: + label: 'ludanto' + description: 'Ludanta nomo' + arg2: + label: 'pasvorto' + description: 'Pasvorto' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_es.yml b/plugin/platform-bukkit/src/main/resources/messages/help_es.yml new file mode 100644 index 0000000000..cddf5f7050 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_es.yml @@ -0,0 +1,294 @@ +# Translated by MineSAT + +# ------------------------------------------------------- +# Lista de textos usados en la sección de ayuda. +common: + header: ======[ AYUDA de AuthMeReloaded ]====== + optional: Opcional + hasPermission: Tienes permiso + noPermission: No tienes permiso + default: Por defecto + result: Resultado + defaultPermissions: + notAllowed: No tienes permiso + opOnly: Sólamente OPeradores(Owner's) + allowed: Todo permitido +section: + command: Comando + description: Descripción corta + detailedDescription: Descripción detallada + arguments: Argumentos + alternatives: Alternativas + permissions: Permisos + children: Comandos +commands: + authme: + description: AuthMe comandos de OPerador + detailedDescription: El comando principal de AuthMeReloaded. La raíz de todos los comandos de administración. + authme.register: + description: Registrar un jugador + detailedDescription: Registra un jugador específico con una contraseña específica. + arg1: + label: jugador + description: Nombre del jugador + arg2: + label: contraseña + description: Contraseña del jugador + authme.unregister: + description: Cancelar cuenta de un jugador + detailedDescription: Elimina la cuenta registrada de un jugador. + arg1: + label: jugador + description: Nombre del jugador + authme.forcelogin: + description: Obliga el inicio de sesión + detailedDescription: Obliga a un jugador específico a iniciar sesión. + arg1: + label: jugador + description: Nombre del jugador en línea + authme.password: + description: Cambiar contraseña del jugador + detailedDescription: Cambia la contraseña de un jugador. + arg1: + label: jugador + description: Nombre del jugador + arg2: + label: contraseña + description: Nueva contraseña + authme.lastlogin: + description: Último inicio de sesión + detailedDescription: Ver la fecha del último inicio de sesión de un jugador específico. + arg1: + label: jugador + description: Nombre del jugador + authme.accounts: + description: Mostrar cuentas del jugador + detailedDescription: Muestra todas las cuentas de un jugador por su Nombre de Jugador o IP. + arg1: + label: jugador + description: Nombre del jugador o dirección IP + authme.email: + description: Mostrar correo del jugador + detailedDescription: Muestra el correo electrónico de un jugador específico, si este lo ha configurado en su cuenta. + arg1: + label: jugador + description: Nombre del jugador + authme.setemail: + description: Cambia el correo electrónico del jugador + detailedDescription: Cambia la dirección correo electrónico de un jugador especificado. + arg1: + label: jugador + description: Nombre del jugador + arg2: + label: email + description: Correo electrónico del jugador + authme.getip: + description: Obtiene la IP del jugador + detailedDescription: Obtiene la dirección IP de un jugador específico que esté en línea. + arg1: + label: jugador + description: Nombre del jugador + authme.spawn: + description: Teletransporte al Spawn + detailedDescription: Teletranspórtate al Spawn del servidor. + authme.setspawn: + description: Cambia el Spawn + detailedDescription: Cambia la zona de aparición del jugador por tu posición actual. + authme.firstspawn: + description: Teletransporte al primer Spawn + detailedDescription: Teletranspórtate a la primera zona de aparición del servidor. + authme.setfirstspawn: + description: Cambia el primer Spawn + detailedDescription: Cambia la primera zona de aparición del jugador por tu posición actual. + authme.purge: + description: Purgar(Limpiar) datos antiguos + detailedDescription: Purgar o Limpiar datos de AuthMeReloaded anteriores a el número días especificados en la configuración. + arg1: + label: días + description: Número de días + authme.purgeplayer: + description: Purgar los datos de un jugador + detailedDescription: Purgar los datos de un jugador seleccionado. + arg1: + label: jugador + description: El jugador para purgar o limpiar + arg2: + label: opciones + description: 'Escribe ''force'' al final del comando para forzar sin comprobar que el jugador está registrado' + authme.backup: + description: Realiza una copia de seguridad + detailedDescription: Crea una copia de seguridad de los usuarios registrados. + authme.resetpos: + description: Purgar o limpiar la última posición del jugador + detailedDescription: Purgar o limpiar la última posición conocida de un jugador específico o todos los jugadores. + arg1: + label: jugador / * + description: Nombre del jugador o escribe '*' para seleccionar todos los jugadores + authme.purgebannedplayers: + description: Purgar datos de jugadores baneados + detailedDescription: Purgar todos los datos de AuthMeReloaded de los jugadores baneados. + authme.switchantibot: + description: Cambiar el modo AntiBot + detailedDescription: Cambiar o alternar el modo AntiBot al estado especificado. + arg1: + label: modo + description: ON / OFF + authme.reload: + description: Recarga el plugin + detailedDescription: Recarga el plugin AuthMeReloaded. + authme.version: + description: Información de versión + detailedDescription: Muestra información detallada sobre la versión instalada de AuthMeReloaded, los creadores, contribuyentes, y la licencia. + authme.converter: + description: Comando conversor + detailedDescription: Comando conversor de AuthMeReloaded. + arg1: + label: trabajo + description: 'Trabajo de conversión: xauth / crazylogin / rakamak / royalauth / vauth / sqliteToSql / mysqlToSqlite / loginsecurity' + authme.messages: + description: Añade mensajes faltantes + detailedDescription: Añade los mensajes que faltan al archivo de mensajes actual. + arg1: + label: help + description: Añade 'help' para actualizar to update the help messages file + authme.debug: + description: Funciones de depuración + detailedDescription: Permite varias operaciones de depuración. + arg1: + label: child + description: El hijo(child) a ejecutar + arg2: + label: arg + description: Argumento (depende de la sección de depuración) + arg3: + label: arg + description: Argumento (depende de la sección de depuración) + authme.help: + description: Muestra la ayuda + detailedDescription: Muestra detalladamente la ayuda para los comandos /authme. + arg1: + label: consulta + description: El comando o la consulta para ver su description. + email: + description: Añade el correo electrónico o recupera la contraseña + detailedDescription: La base del comando de correo electrónico de AuthMeReloaded. + email.show: + description: Mostrar correo electrónico + detailedDescription: Muestra you correo electrónico actual. + email.add: + description: Añadir correo electrónico + detailedDescription: Añade un nuevo correo electrónico a tu cuenta. + arg1: + label: email + description: Dirección de correo electrónico + arg2: + label: repiteEmail + description: Verificación de la dirección de correo electrónico + email.change: + description: Cambiar correo electrónico + detailedDescription: Cambia la dirección de correo electrónico de tu cuenta. + arg1: + label: anteriorEmail + description: Anterior dirección de correo electrónico + arg2: + label: nuevoEmail + description: Nueva dirección de correo electrónico + email.recover: + description: Recuperar contraseña usando el correo electrónico + detailedDescription: Recupera tu cuenta usando tu correo electrónico para enviarte una nueva contraseña. + arg1: + label: email + description: Dirección de correo electrónico + email.code: + description: Envía el código para recuperar tu contraseña + detailedDescription: Recupera tu cuenta enviando el código recibido en tu correo electrónico. + arg1: + label: código + description: Código de recuperación + email.setpassword: + description: Establece una nueva contraseña después de recuperar + detailedDescription: Establece una nueva contraseña después de recuperar completamente tu cuenta. + arg1: + label: contraseña + description: Nueva contraseña + email.help: + description: Muestra la ayuda + detailedDescription: Muestra detalladamente la ayuda de los comandos de /email. + arg1: + label: consulta + description: El comando o consulta para ver la ayuda de este. + login: + description: Comando de inicio de sesión + detailedDescription: Comando para iniciar sesión utilizado en AuthMeReloaded. + arg1: + label: contraseña + description: Contraseña de inicio de sesión + login.help: + description: Mostrar la ayuda + detailedDescription: Mostrar la ayuda detallada del comando /login. + arg1: + label: consulta + description: El comando o consulta para ver la ayuda de este. + logout: + description: Comando de cierre de sesión + detailedDescription: Comando de cierre de sesión usado por AuthMeReloaded. + logout.help: + description: Mostrar la ayuda + detailedDescription: Mostrar la ayuda detallada del comando /logout. + arg1: + label: consulta + description: El comando o consulta para ver la ayuda de este. + register: + description: Registrar una cuenta + detailedDescription: Comando para registrar una cuenta usado por AuthMeReloaded. + arg1: + label: contraseña + description: Contraseña + arg2: + label: repiteContraseña + description: Repite la contraseña + register.help: + description: Mostrar la ayuda + detailedDescription: Mostrar la ayuda detallada del comando /register. + arg1: + label: consulta + description: El comando o consulta para ver la ayuda de este. + unregister: + description: Eliminar registro de una cuenta + detailedDescription: Comando para eliminar una cuenta registrada usado por AuthMeReloaded. + arg1: + label: contraseña + description: Contraseña + unregister.help: + description: Mostrar la ayuda + detailedDescription: Mostrar la ayuda detallada del comando /unregister. + arg1: + label: consulta + description: El comando o consulta para ver la ayuda de este. + changepassword: + description: Cambia la contraseña de una cuenta + detailedDescription: Comando para cambiar tu contraseña usado por AuthMeReloaded. + arg1: + label: antiguaContraseña + description: Antigua contraseña + arg2: + label: nuevaContraseña + description: Nueva contraseña + changepassword.help: + description: Mostrar la ayuda + detailedDescription: Mostrar la ayuda detallada del comando /changepassword. + arg1: + label: consulta + description: El comando o consulta para ver la ayuda de este. + captcha: + description: Comando del Captcha + detailedDescription: Comando del Captcha para AuthMeReloaded. + arg1: + label: captcha + description: El Captcha + captcha.help: + description: Mostrar la ayuda + detailedDescription: Mostrar la ayuda detallada del comando /captcha. + arg1: + label: consulta + description: El comando o consulta para ver la ayuda de este. diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_et.yml b/plugin/platform-bukkit/src/main/resources/messages/help_et.yml new file mode 100644 index 0000000000..03a7021349 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_et.yml @@ -0,0 +1,45 @@ +# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called + +# ------------------------------------------------------- +# List of texts used in the help section +common: + header: '==========[ AuthMeReloaded ABI ]==========' + optional: 'Valikuline' + hasPermission: 'Sul on luba' + noPermission: 'Pole luba' + default: 'Vaikimisi' + result: 'Tulemus' + defaultPermissions: + notAllowed: 'Pole luba' + opOnly: 'Ainult operaatorid' + allowed: 'Luba kõigil' + +# ------------------------------------------------------- +# Titles of the individual help sections +# Set the translation text to empty text to disable the section, e.g. to hide alternatives: +# alternatives: '' +section: + command: 'Käsklus' + description: 'Lühike kirjeldus' + detailedDescription: 'Detailne kirjeldus' + arguments: 'Argumendid' + permissions: 'Load' + alternatives: 'Alternatiivid' + children: 'Käsklused' + +# ------------------------------------------------------- +# You can translate the data for all commands using the below pattern. +# For example to translate /authme reload, create a section "authme.reload", or "login" for /login +# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth +# Translations don't need to be complete; any missing section will be taken from the default silently +# Important: Put main commands like "authme" before their children (e.g. "authme.reload") +commands: + authme.register: + description: 'Registreeri mängija' + detailedDescription: 'Registreeri valitud mängija valitud parooliga.' + arg1: + label: 'mängija' + description: 'Mängija nimi' + arg2: + label: 'parool' + description: 'Parool' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_eu.yml b/plugin/platform-bukkit/src/main/resources/messages/help_eu.yml new file mode 100644 index 0000000000..52fad80256 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_eu.yml @@ -0,0 +1,23 @@ +# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called + +# ------------------------------------------------------- +# List of texts used in the help section +common: + header: '==========[ AuthMeReloaded LAGUNTZA ]==========' + optional: 'Hautazkoa' + hasPermission: 'Baimena daukazu' + noPermission: 'Ez daukazu baimenik' + default: 'Lehenetsia' + result: 'Emaitza' + defaultPermissions: + notAllowed: 'Baimenik ez' + opOnly: 'OP bakarrik' + allowed: 'Edonor baimenduta' +section: + command: 'Komandoa' + description: 'Deskribapen laburra' + detailedDescription: 'Deskribapen xehakatua' + arguments: 'Argumentuak' + permissions: 'Baimenak' + alternatives: 'Alternatibak' + children: 'Komandoak' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_fr.yml b/plugin/platform-bukkit/src/main/resources/messages/help_fr.yml new file mode 100644 index 0000000000..dce54f167b --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_fr.yml @@ -0,0 +1,45 @@ +# Traduction des messages d'aide d'AuthMe (par exemple, pour les messages de "/authme help ()" ou de "/register help") + +# ------------------------------------------------------- +# Liste de texte dans les sections d'aide +common: + header: '==========[ AuthMe - AIDE & INFOS ]==========' + optional: 'Optionnel' + hasPermission: 'Vous avez la permission' + noPermission: 'Pas de permission' + default: 'Par défaut' + result: 'Résultat' + defaultPermissions: + notAllowed: 'Non permis' + opOnly: 'Seulement pour OP' + allowed: 'Tout le monde est permis' + +# ------------------------------------------------------- +# Nom individuel des sections d'aide +# Vous pouvez vider la zone de texte d'une section afin de la cacher, ex. pour cacher la section des alternatives: +# alternative(s): '' +section: + command: 'Commande' + description: 'Description' + detailedDescription: 'Description détaillée' + arguments: 'Argument(s)' + permissions: 'Permission' + alternatives: 'Alternative(s)' + children: 'Sous-commande(s)' + +# ------------------------------------------------------- +# Vous pouvez traduire tous les textes d'aide en utilisant la syntaxe ci-dessous. +# Par exemple, pour traduire l'aide du "/authme reload" créez une section nommée "authme.reload", ou "login" pour "/login". +# Si la commande a des arguments, vous pouvez utiliser "arg1" pour traduire le premier argument, "arg2" pour le 2ème, ainsi de suite. +# Les sections non traduites auront leur texte par défaut (en anglais), il n'est donc pas obligatoire de tout traduire. +# Important: Il faut mettre la commande principale (authme) avant sa sous-commande (ex. "authme.register" pour "/authme register") +commands: + authme.register: + description: 'Inscrire un pseudo' + detailedDescription: 'Inscrire un pseudo avec le mot de passe de votre choix' + arg1: + label: 'pseudo' + description: 'Pseudo du joueur à inscrire' + arg2: + label: 'mdp' + description: 'Mot de passe de connexion' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_hu.yml b/plugin/platform-bukkit/src/main/resources/messages/help_hu.yml new file mode 100644 index 0000000000..93bfabd8fb --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_hu.yml @@ -0,0 +1,351 @@ +# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called + +# ------------------------------------------------------- +# List of texts used in the help section +common: + header: ======[ AuthMeReloaded Segítség ]====== + optional: Opcionális + hasPermission: Van ehhez jogod + noPermission: Nincs jogod ehhez + default: Alapértelmezett + result: Eredmény + defaultPermissions: + notAllowed: Nincs jogod ehhez + opOnly: Op jog szükséges + allowed: Mindenkinek elérhető + +# ------------------------------------------------------- +# Titles of the individual help sections +# Set the translation text to empty text to disable the section, e.g. to hide alternatives: +# alternatives: '' +section: + command: Parancs + description: Rövid leírás + detailedDescription: Hosszabb leírás + arguments: Argumentum (változó) + permissions: Jogok + alternatives: Alternatívák + children: Parancsok + +# ------------------------------------------------------- +# You can translate the data for all commands using the below pattern. +# For example to translate /authme reload, create a section "authme.reload", or "login" for /login +# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth +# Translations don't need to be complete; any missing section will be taken from the default silently +# Important: Put main commands like "authme" before their children (e.g. "authme.reload") +commands: + authme: + description: AuthMe operátor parancsok + detailedDescription: Az AuthMeReloaded fő parancsa. Az összes adminisztrációs parancs gyökere. + authme.register: + description: Játékos regisztrálása + detailedDescription: Megadott játékos regisztrálása egy megadott jelszóval. + arg1: + label: játékos + description: Játékos név + arg2: + label: jelszó + description: Jelszó + authme.unregister: + description: A játékos fiókjának visszavonása + detailedDescription: Kiveszi a játékos regisztrált fiókját. + arg1: + label: játékos + description: Játékos név + authme.forcelogin: + description: Kötelező bejelentkezés + detailedDescription: Ez arra kényszerít egy adott játékost, hogy jelentkezzen be. + arg1: + label: játékos + description: A játékos neve, ha online + authme.password: + description: A játékos jelszavának módosítása + detailedDescription: A játékos jelszavának módosítása. + arg1: + label: játékos + description: Játékos név + arg2: + label: jelszó + description: Új jelszó + authme.lastlogin: + description: Utolsó bejelentkezés + detailedDescription: Megtekintheti egy adott játékos utolsó bejelentkezésének dátumát. + arg1: + label: játékos + description: Játékos név + authme.accounts: + description: Játékosok megjelenítése + detailedDescription: Megmutassa a játékos összes fiókját a játékos nevével vagy IP-jével. + arg1: + label: játékos + description: Játékos neve vagy IP címe + authme.email: + description: Játékos levelek megjelenítése + detailedDescription: Egy adott játékos e-mailjét mutatja, ha a fiókjában beállította. + arg1: + label: játékos + description: Játékos név + authme.setemail: + description: Módosítsa a játékos e-mailjét + detailedDescription: Egy adott játékos e-mail címének módosítása. + arg1: + label: játékos + description: Játékos név + arg2: + label: email + description: A játékos e-mailje + authme.getip: + description: A játékos IP cím mutatása + detailedDescription: Kap egy adott online játékos IP-címét. + arg1: + label: játékos + description: Játékos név + authme.spawn: + description: Teleportálás a spawnra + detailedDescription: Teleportál a spawnra. + authme.setspawn: + description: Spawn beállítása + detailedDescription: Beállítja a spawn kezdőhelyet a játékos jelenlegi pozicíójában. + authme.firstspawn: + description: Teleportálás az első spawnhoz + detailedDescription: Teleportál az első spawn kezdőhelyre. + authme.setfirstspawn: + description: Első spawn beállítása + detailedDescription: Beállítja az első spawn kezdőhelyet a játékos jelenlegi pozicíójában. + authme.purge: + description: Törli a régi adatokat + detailedDescription: Törli az AuthMeReloaded játékos adatokat a megadott nap szerint. + arg1: + label: nap + description: Napok száma + authme.purgeplayer: + description: Játékos adat törlés + detailedDescription: Törli a kiválasztott játékos adatait. + arg1: + label: játékos + description: A játékos törlése az adatbázisból + arg2: + label: opciók + description: 'Írd be a parancs végén a ''force'' parancsot, hogy ellenőrizze a játékos regisztrálva van-e' + authme.backup: + description: Biztonsági másolat készítése + detailedDescription: Létrehoz egy biztonsági másolatot a regisztrált felhasználókról. + authme.resetpos: + description: Visszaállítja a játékos utolsó helyzetét + detailedDescription: Visszaállítja az adott játékos vagy az összes játékos utolsó ismert pozícióját. + arg1: + label: játékos + description: Játékos neve vagy írd be a '*' gomb az összes játékos kiválasztásához + authme.purgebannedplayers: + description: Törli az adatokat a kitiltott játékosoktól + detailedDescription: Törli az összes AuthMeReloaded adatokat a kitiltott játékosoktól. + authme.switchantibot: + description: Módosítja az AntiBot módot + detailedDescription: Az AntiBot mód megváltoztatása vagy átkapcsolása a megadott állapotra. + arg1: + label: mód + description: ON / OFF + authme.reload: + description: Plugin újratöltés + detailedDescription: Újratölti az AuthMeReloaded plugint. + authme.version: + description: Plugin verzió + detailedDescription: Részletes információ az AuthMeReloaded telepített verziójáról, az alkotókról, a közreműködőkről és az engedélyekről. + authme.converter: + description: Parancs konvertáló + detailedDescription: AuthMeReloaded konvertáló parancs. + arg1: + label: munka + description: 'Konverziós munka: xauth / crazylogin / rakamak / royalauth / vauth / sqliteToSql / mysqlToSqlite / loginsecurity' + authme.messages: + description: Add hiányzó üzeneteket + detailedDescription: Hozzáadja a hiányzó üzeneteket az aktuális üzenetfájlhoz. + arg1: + label: help + description: A 'help' frissítéséhez, hogy frissítse a segítséget + authme.recent: + description: Utolsó bejelentkezett játékosok megjelenítése + detailedDescription: Megjeleníti az utolsó bejelentkezett játékosokat. + authme.debug: + description: Hibakeresés funkciói + detailedDescription: Lehetővé tesz több hibakeresési műveletet. + arg1: + label: gyermek + description: A végrehajtandó gyermek (gyermek) + arg2: + label: argumentum + description: Argumentum (a debug-szekciótól függ) + arg3: + label: argumentum + description: Argumentum (a debug-szekciótól függ) + authme.help: + description: Segítség megjelenítése + detailedDescription: Részletesen megmutatja az authme parancsok segítséget. + arg1: + label: konzultáció + description: A parancs vagy lekérdezés leírása. + email: + description: Hozzáadja az e-mailt vagy megjeleníti a játékos email-jét + detailedDescription: Az AuthMeReloaded e-mail parancs alapja. + email.show: + description: E-mail megjelenítése + detailedDescription: Jelenlegi e-mail megjelenítése. + email.add: + description: E-mail hozzáadása + detailedDescription: Új e-mail üzenet hozzáadása. + arg1: + label: email + description: E-mail cím + arg2: + label: emailMegerősítés + description: Az e-mail cím ellenőrzése + email.change: + description: E-mail megváltoztatása + detailedDescription: Megváltoztatja a fiók e-mail címét. + arg1: + label: RégiEmail + description: Korábbi e-mail cím + arg2: + label: újEmail + description: Új e-mail cím + email.recover: + description: Jelszó lekérése e-mail alapján + detailedDescription: Visszaszerezheted a fiókod e-mailben, hogy új jelszót küldjön. + arg1: + label: email + description: E-mail cím + email.code: + description: Kód elküldése a jelszó visszaállításához + detailedDescription: Visszaszerezheted a fiókod a kapott kód e-mailben történő elküldésével. + arg1: + label: kód + description: Helyreállítási kód + email.setpassword: + description: Jelszó beállítása + detailedDescription: Új jelszó beállítása a fiók teljes körű visszaállítása után. + arg1: + label: jelszó + description: Új jelszó + email.help: + description: E-mail segítség + detailedDescription: Részletes segítség az /email parancshoz. + arg1: + label: konzultáció + description: A parancs vagy a lekérdezés, hogy lásd a segítséget. + login: + description: Bejelentkezés parancs + detailedDescription: Az AuthMeReloadedban használt bejelentkezési parancs. + arg1: + label: jelszó + description: Bejelentkezés jelszó + login.help: + description: Bejelentkezési segítség + detailedDescription: Részletes segítség a /login parancsról. + arg1: + label: konzultáció + description: A parancs vagy a lekérdezés, hogy lásd a segítséget. + logout: + description: Kijelentkezés parancs + detailedDescription: Az AuthMeReloaded által használt kijelentkezés parancs. + logout.help: + description: Kijelentkezési segítség + detailedDescription: Részletes segítség a /logout parancsról. + arg1: + label: konzultáció + description: A parancs vagy a lekérdezés, hogy lásd a segítséget. + register: + description: Fiók regisztrálása + detailedDescription: Parancs az AuthMeReloaded által használt fiók regisztrálásához. + arg1: + label: jelszó + description: Jelszó + arg2: + label: jelszóMegerősítő + description: Jelszó megerősítése + register.help: + description: Regisztrálási segítség + detailedDescription: Részletes segítség a /register parancsról. + arg1: + label: konzultáció + description: A parancs vagy a lekérdezés, hogy lássuk a segítséget. + unregister: + description: Fiók törlése + detailedDescription: Parancs az AuthMeReloaded által használt regisztrált fiók törléséhez. + arg1: + label: jelszó + description: Jelszó + unregister.help: + description: Fiók törlési segítség + detailedDescription: Részletes segítség az /unregister parancsról. + arg1: + label: konzultáció + description: A parancs vagy a lekérdezés, hogy lássuk a segítséget. + changepassword: + description: Fiók jelszó módosítása + detailedDescription: Parancs az AuthMeReloaded által használt jelszó megváltoztatásához. + arg1: + label: régiJelszó + description: Régi jelszó + arg2: + label: újJelszó + description: Új jelszó + changepassword.help: + description: Jelszó változtatási segítség + detailedDescription: Részletes segítség a /changepassword parancsról. + arg1: + label: konzultáció + description: A parancs vagy a lekérdezés, hogy lássuk a segítséget. + totp: + description: Kétfaktoros hitelesítéssel kapcsolatos műveleteket végez + detailedDescription: Elvégzi a kétfaktoros hitelesítéssel kapcsolatos műveleteket. + totp.code: + description: Feldolgozza a kétfaktorú hitelesítési kódot bejelentkezés során + detailedDescription: A bejelentkezés során feldolgozza a kétfaktorú hitelesítési kódot. + arg1: + label: kód + description: Kód + totp.add: + description: Fiók kétütemű hitelesítése + detailedDescription: Engedélyezi a fiók kétütemű hitelesítését. + totp.confirm: + description: TOTP titkokat visszaigazolás után ment + detailedDescription: A létrehozott TOTP titkokat a visszaigazolás után elmenti. + arg1: + label: kód + description: Kód + totp.remove: + description: Fiók kétütemű hitelesítés letiltása + detailedDescription: Letiltja a fiók kétütemű hitelesítését. + arg1: + label: kód + description: Kód + totp.help: + description: /totp parancsok részletes segítsége + detailedDescription: Megtekinti a /totp parancsok részletes segítségét. + arg1: + label: kérdés + description: Kérdés + captcha: + description: Captcha parancs + detailedDescription: Captcha parancs az AuthMeReloaded számára. + arg1: + label: captcha + description: A captcha + captcha.help: + description: Segítség megjelenítése + detailedDescription: Megmutassa a /captcha parancs részletes segítségét. + arg1: + label: konzultáció + description: A parancs vagy a lekérdezés, hogy lásd a segítséget. + verification: + description: AuthMeReloaded hitelesítési folyamatának befejezése + detailedDescription: Parancs az AuthMeReloaded hitelesítési folyamatának befejezéséhez. + arg1: + label: kód + description: Kód + verification.help: + description: Részletes segítség a /verification parancshoz + detailedDescription: Részletes segítséget mutat a /verification parancshoz. + arg1: + label: kérdés + description: Kérdés diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_it.yml b/plugin/platform-bukkit/src/main/resources/messages/help_it.yml new file mode 100644 index 0000000000..efa6d65b99 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_it.yml @@ -0,0 +1,151 @@ +# Lingua Italiana creata da Maxetto e sgdc3. +# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called + +# ------------------------------------------------------- +# List of texts used in the help section +common: + header: '==========[ Assistenza AuthMeReloaded ]==========' + optional: 'Opzionale' + hasPermission: 'Hai il permesso' + noPermission: 'Non hai il permesso' + default: 'Configurazione base' + result: 'Risultato' + defaultPermissions: + notAllowed: 'Nessuno autorizzato' + opOnly: 'Solo per OP' + allowed: 'Tutti autorizzati' + +# ------------------------------------------------------- +# Titles of the individual help sections +# Set the translation text to empty text to disable the section, e.g. to hide alternatives: +# alternatives: '' +section: + command: 'Comando' + description: 'Descrizione breve' + detailedDescription: 'Descrizione dettagliata' + arguments: 'Parametri' + permissions: 'Permessi' + alternatives: 'Alternative' + children: 'Comandi' + +# ------------------------------------------------------- +# You can translate the data for all commands using the below pattern. +# For example to translate /authme reload, create a section "authme.reload", or "login" for /login +# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth +# Translations don't need to be complete; any missing section will be taken from the default silently +# Important: Put main commands like "authme" before their children (e.g. "authme.reload") +commands: + authme.register: + description: 'Registra un giocatore' + detailedDescription: 'Registra il giocatore indicato con la password inserita.' + arg1: + label: 'giocatore' + description: 'Nome del giocatore' + arg2: + label: 'password' + description: 'Password' + authme.unregister: + description: 'Rimuovi un giocatore' + detailedDescription: 'Rimuovi il giocatore indicato dal Database.' + arg1: + label: 'giocatore' + description: 'Nome del giocatore' + authme.forcelogin: + description: 'Forza l''autenticazione ad un giocatore' + detailedDescription: 'Autentica il giocatore indicato.' + arg1: + label: 'giocatore' + description: 'Nome del giocatore connesso' + authme.password: + description: 'Cambia la password di un giocatore' + detailedDescription: 'Cambia la password del giocatore indicato.' + arg1: + label: 'giocatore' + description: 'Nome del giocatore' + arg2: + label: 'password' + description: 'Nuova Password' + authme.lastlogin: + description: 'Ultima autenticazione di un giocatore' + detailedDescription: 'Visualizza l''ultima data di autenticazione del giocatore indicato.' + arg1: + label: 'giocatore' + description: 'Nome del giocatore' + authme.accounts: + description: 'Mostra i profili di un giocatore' + detailedDescription: 'Mostra tutti i profili di un giocatore attraverso il nome o l''indirizzo IP.' + arg1: + label: 'giocatore' + description: 'Nome o indirizzo IP del giocatore' + authme.email: + description: 'Mostra l''indirizzo email di un giocatore' + detailedDescription: 'Mostra l''indirizzo email del giocatore indicato se impostato.' + arg1: + label: 'giocatore' + description: 'Nome del giocatore' + authme.setemail: + description: 'Cambia l''indirizzo email di un giocatore' + detailedDescription: 'Cambia l''indirizzo email del giocatore indicato.' + arg1: + label: 'giocatore' + description: 'Nome del giocatore' + arg2: + label: 'email' + description: 'Indirizzo email del giocatore' + authme.getip: + description: 'Mostra l''indirizzo IP di un giocatore' + detailedDescription: 'Mostra l''indirizzo IP del giocatore indicato.' + arg1: + label: 'giocatore' + description: 'Nome del giocatore connesso' + authme.spawn: + description: 'Teletrasportati al punto di rigenerazione' + detailedDescription: 'Teletrasportati al punto di rigenerazione.' + authme.setspawn: + description: 'Cambia il punto di rigenerazione' + detailedDescription: 'Cambia il punto di rigenerazione dei giocatori alla tua posizione.' + authme.firstspawn: + description: 'Teletrasportati al punto di rigenerazione iniziale' + detailedDescription: 'Teletrasportati al punto di rigenerazione iniziale.' + authme.setfirstspawn: + description: 'Cambia il punto di rigenerazione iniziale' + detailedDescription: 'Cambia il punto di rigenerazione iniziale dei giocatori alla tua posizione.' + authme.purge: + description: 'Elimina i vecchi dati' + detailedDescription: 'Elimina i dati di AuthMeReloaded più vecchi dei giorni indicati.' + arg1: + label: 'giorni' + description: 'Numero di giorni' + authme.resetpos: + description: 'Elimina l''ultima posizione di un giocatore' + detailedDescription: 'Elimina l''ultima posizione conosciuta del giocatore indicato o di tutti i giocatori.' + arg1: + label: 'giocatore/*' + description: 'Nome del giocatore o ''*'' per tutti i giocatori' + authme.purgebannedplayers: + description: 'Elimina i dati dei giocatori banditi' + detailedDescription: 'Elimina tutti i dati di AuthMeReloaded dei giocatori banditi.' + authme.switchantibot: + description: 'Cambia lo stato del servizio di AntiBot' + detailedDescription: 'Cambia lo stato del servizio di AntiBot allo stato indicato.' + arg1: + label: 'stato' + description: 'ON / OFF' + authme.reload: + description: 'Ricarica il plugin' + detailedDescription: 'Ricarica il plugin AuthMeReloaded.' + authme.version: + description: 'Informazioni sulla versione' + detailedDescription: 'Mostra informazioni dettagliate riguardo la versione di AuthMeReloaded in uso, gli sviluppatori, i collaboratori e la licenza.' + authme.converter: + description: 'Comando per il convertitore' + detailedDescription: 'Comando per il convertitore di AuthMeReloaded.' + arg1: + label: 'incarico' + description: 'Incarico di conversione: xauth / crazylogin / rakamak / royalauth / vauth / sqliteToSql / mysqlToSqlite' + authme.help: + description: 'Visualizza l''assistenza' + detailedDescription: 'Visualizza informazioni dettagliate per i comandi ''/authme''.' + arg1: + label: 'comando' + description: 'Il comando di cui vuoi ricevere assistenza' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_ja.yml b/plugin/platform-bukkit/src/main/resources/messages/help_ja.yml new file mode 100644 index 0000000000..830275e456 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_ja.yml @@ -0,0 +1,45 @@ +# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called + +# ------------------------------------------------------- +# List of texts used in the help section +common: + header: '==========[ AuthMeReloaded ヘルプ ]==========' + optional: 'オプション' + hasPermission: '権限を持っています' + noPermission: '権限がありません' + default: 'デフォルト' + result: '結果' + defaultPermissions: + notAllowed: '権限がありません' + opOnly: 'OPのみ' + allowed: '全員に許可' + +# ------------------------------------------------------- +# Titles of the individual help sections +# Set the translation text to empty text to disable the section, e.g. to hide alternatives: +# alternatives: '' +section: + command: 'コマンド' + description: '簡単な説明' + detailedDescription: '詳細な説明' + arguments: '引数' + permissions: '権限' + alternatives: '代替' + children: 'コマンド' + +# ------------------------------------------------------- +# You can translate the data for all commands using the below pattern. +# For example to translate /authme reload, create a section "authme.reload", or "login" for /login +# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth +# Translations don't need to be complete; any missing section will be taken from the default silently +# Important: Put main commands like "authme" before their children (e.g. "authme.reload") +commands: + authme.register: + description: 'プレイヤーを登録します' + detailedDescription: '指定されたプレイヤーを指定されたパスワードで登録します。' + arg1: + label: 'プレイヤー名' + description: 'プレイヤー名' + arg2: + label: 'パスワード' + description: 'パスワード' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_ko.yml b/plugin/platform-bukkit/src/main/resources/messages/help_ko.yml new file mode 100644 index 0000000000..561dc7157b --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_ko.yml @@ -0,0 +1,45 @@ +# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called + +# ------------------------------------------------------- +# List of texts used in the help section +common: + header: '==========[ AuthMeReloaded 도움말 ]==========' + optional: '선택' + hasPermission: '권한이 있습니다' + noPermission: '권한이 없습니다' + default: 'Default' + result: 'Result' + defaultPermissions: + notAllowed: '권한이 없습니다' + opOnly: 'OP만 가능' + allowed: '모두에게 허용됨' + +# ------------------------------------------------------- +# Titles of the individual help sections +# Set the translation text to empty text to disable the section, e.g. to hide alternatives: +# alternatives: '' +section: + command: '명령어' + description: '짧은 설명' + detailedDescription: '상세 설명' + arguments: '인수' + permissions: '권한' + alternatives: '대안' + children: '명령어' + +# ------------------------------------------------------- +# You can translate the data for all commands using the below pattern. +# For example to translate /authme reload, create a section "authme.reload", or "login" for /login +# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth +# Translations don't need to be complete; any missing section will be taken from the default silently +# Important: Put main commands like "authme" before their children (e.g. "authme.reload") +commands: + authme.register: + description: '플레이어 회원 가입' + detailedDescription: '지정한 플레이어를 지정한 비밀번호로 등록합니다.' + arg1: + label: '플레이어' + description: '플레이어 닉네임' + arg2: + label: '비밀번호' + description: '비밀번호' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_lt.yml b/plugin/platform-bukkit/src/main/resources/messages/help_lt.yml new file mode 100644 index 0000000000..ee141497bc --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_lt.yml @@ -0,0 +1,45 @@ +# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called + +# ------------------------------------------------------- +# List of texts used in the help section +common: + header: '==========[ AuthMeReloaded PAGALBA ]==========' + optional: 'Neprivaloma' + hasPermission: 'Jūs turite leidimą' + noPermission: 'Jūs neturite leidimo' + default: 'Numatytas' + result: 'Rezultatas' + defaultPermissions: + notAllowed: 'Nėra leidimo' + opOnly: 'Tik OP' + allowed: 'Visiems leistina' + +# ------------------------------------------------------- +# Titles of the individual help sections +# Set the translation text to empty text to disable the section, e.g. to hide alternatives: +# alternatives: '' +section: + command: 'Komanda' + description: 'Trumpas aprašas' + detailedDescription: 'Detalus aprašas' + arguments: 'Argumentai' + permissions: 'Leidimai' + alternatives: 'Alternatyvos' + children: 'Komandos' + +# ------------------------------------------------------- +# You can translate the data for all commands using the below pattern. +# For example to translate /authme reload, create a section "authme.reload", or "login" for /login +# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth +# Translations don't need to be complete; any missing section will be taken from the default silently +# Important: Put main commands like "authme" before their children (e.g. "authme.reload") +commands: + authme.register: + description: 'Užregistruoti žaidėją' + detailedDescription: 'Užregistruokite nurodytą žaidėją su nurodytu slaptažodžiu.' + arg1: + label: 'žaidėjas' + description: 'Žaidėjo vardas' + arg2: + label: 'slaptažodis' + description: 'Slaptažodis' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_nl.yml b/plugin/platform-bukkit/src/main/resources/messages/help_nl.yml new file mode 100644 index 0000000000..bf3cf3c9dc --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_nl.yml @@ -0,0 +1,45 @@ +# Vertaling configuratie voor de help commando's in AuthMe, bijvoorbeeld bij het gebruik van /authme help of /authme help register + +# ------------------------------------------------------- +# Lijst van berichten zichtbaar in het help scherm +common: + header: '==========[ AuthMeReloaded HELP ]==========' + optional: 'Optioneel' + hasPermission: 'Je hebt rechten' + noPermission: 'Je hebt geen rechten' + default: 'Standaard' + result: 'Resultaat' + defaultPermissions: + notAllowed: 'Geen rechten' + opOnly: 'Alleen OP''s' + allowed: 'Iedereen is toegestaan' + +# ------------------------------------------------------- +# Titels van individuele help secties +# Stel de vertaling in als lege tekst om alternatieve commando's te verbergen: +# alternatives: '' +section: + command: 'Commando' + description: 'Korte beschrijving' + detailedDescription: 'Gedetailleerde beschrijving' + arguments: 'Argumenten' + permissions: 'Rechten' + alternatives: 'Alternatieven' + children: 'Commando''s' + +# ------------------------------------------------------- +# Je kunt de tekst voor alle commando's hieronder vertalen met het volgende patroon. +# Bijvoorbeeld: om /authme reload te vertalen, maak een sectie "authme.reload" aan, of "login" voor /login +# Als het commando argumenten/parameters bevat, kun je arg1 zoals hieronder vertalen, enzovoorts. +# Vertalingen hoeven niet compleet te zijn; missende secties zullen automatisch vanuit de standaard vertaling gehaald worden. +# Belangrijk: Plaats basis commando's zoals "authme" vóór hun sub-commando's (zoals "authme.reload") +commands: + authme.register: + description: 'Registreer een speler' + detailedDescription: 'Registreer de gespecificeerde speler met het opgegeven wachtwoord.' + arg1: + label: 'speler' + description: 'Naam speler' + arg2: + label: 'wachtwoord' + description: 'Wachtwoord' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_pl.yml b/plugin/platform-bukkit/src/main/resources/messages/help_pl.yml new file mode 100644 index 0000000000..a25326e81e --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_pl.yml @@ -0,0 +1,45 @@ +# Tlumaczenie configu dla AuthMe pomoc, kiedy wpiszesz /authme help lub /authme help register podana wiadomosc zostanie wyslana + +# ------------------------------------------------------- +# Lista tekstu uzyta w pomocy. +common: + header: '==========[ AuthMeReloaded - Pomoc ]==========' + optional: 'Opcjonalnie' + hasPermission: 'Posiadasz uprawnienia' + noPermission: 'Brak uprawnień' + default: 'Domyślnie' + result: 'Wynik' + defaultPermissions: + notAllowed: 'Nie posiadasz uprawnień' + opOnly: 'Tylko dla OP' + allowed: 'Dozwolone dla wszystkich' + +# ------------------------------------------------------- +# Tytuly z inwidualnych stref w pomoc. +# Zostaw tlumaczenie puste aby wylaczyc dana komende. Np.: +# alternatives: '' +section: + command: 'Komenda' + description: 'Opis' + detailedDescription: 'Szczegółowy opis' + arguments: 'Argumenty' + permissions: 'Uprawnienia' + alternatives: 'Aliasy' + children: 'Komendy' + +# ------------------------------------------------------- +# Mozesz przetlumaczyc wszystkie komendy uzywajac tego wzoru. +# Na przyklad jesli chcesz przetlumaczyc /authme reload, utworz selekcje "authme.reload", lub "login" dla /login +# Jesli komenda posiada argumenty, mozesz uzyc arg1 aby przetlumaczyc pierwszy argument, i nastepne +# Tlumaczenia nie musza byc kompletne; kazde braki beda uzupelniane domyslnymi wiadomosciami z pluginu. +# Uwaga: Postaw glowna klase (np. "authme") przed ich dziecmi (np. "authme.reload") +commands: + authme.register: + description: 'Rejestracja gracza' + detailedDescription: 'Rejestracja gracza z określonym hasłem' + arg1: + label: 'gracz' + description: 'Nazwa gracza' + arg2: + label: 'hasło' + description: 'Hasło gracza' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_pt.yml b/plugin/platform-bukkit/src/main/resources/messages/help_pt.yml new file mode 100644 index 0000000000..2b2ead6c36 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_pt.yml @@ -0,0 +1,45 @@ +# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called + +# ------------------------------------------------------- +# List of texts used in the help section +common: + header: '==========[ AJUDA DO AuthMeReloaded ]==========' + optional: 'Opcional' + hasPermission: 'Tu tens permissão' + noPermission: 'Não tens permissão' + default: 'Padrão' + result: 'Resultado' + defaultPermissions: + notAllowed: 'Sem permissão' + opOnly: 'Só OP' + allowed: 'Toda gente é permitida' + +# ------------------------------------------------------- +# Titles of the individual help sections +# Set the translation text to empty text to disable the section, e.g. to hide alternatives: +# alternatives: '' +section: + command: 'Comando' + description: 'Breve descrição' + detailedDescription: 'Descrição detalhada' + arguments: 'Argumentos' + permissions: 'Permissões' + alternatives: 'Alternativas' + children: 'Comandos' + +# ------------------------------------------------------- +# You can translate the data for all commands using the below pattern. +# For example to translate /authme reload, create a section "authme.reload", or "login" for /login +# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth +# Translations don't need to be complete; any missing section will be taken from the default silently +# Important: Put main commands like "authme" before their children (e.g. "authme.reload") +commands: + authme.register: + description: 'Registar um jogador' + detailedDescription: 'Registar um jogador com uma senha especifica.' + arg1: + label: 'jogador' + description: 'Nome de jogador' + arg2: + label: 'senha' + description: 'Senha' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_ro.yml b/plugin/platform-bukkit/src/main/resources/messages/help_ro.yml new file mode 100644 index 0000000000..74e92c1f45 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_ro.yml @@ -0,0 +1,45 @@ +# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called + +# ------------------------------------------------------- +# List of texts used in the help section +common: + header: '==========[ AuthMeReloaded HELP ]==========' + optional: 'Optional' + hasPermission: 'Tu ai permisiunea' + noPermission: 'Fara permisiune' + default: 'Default' + result: 'Rezultat' + defaultPermissions: + notAllowed: 'Nu ai permisiune' + opOnly: 'Doar pentru operatori' + allowed: 'Toata lumea are acces' + +# ------------------------------------------------------- +# Titles of the individual help sections +# Set the translation text to empty text to disable the section, e.g. to hide alternatives: +# alternatives: '' +section: + command: 'Comanda' + description: 'Descriere scurta' + detailedDescription: 'Descriere detaliata' + arguments: 'Argumente' + permissions: 'Permisiuni' + alternatives: 'Alternative' + children: 'Comenzi' + +# ------------------------------------------------------- +# You can translate the data for all commands using the below pattern. +# For example to translate /authme reload, create a section "authme.reload", or "login" for /login +# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth +# Translations don't need to be complete; any missing section will be taken from the default silently +# Important: Put main commands like "authme" before their children (e.g. "authme.reload") +commands: + authme.register: + description: 'Inregistreaza un jucator' + detailedDescription: 'Inregistreaza un jucator cu parola specificata.' + arg1: + label: 'jucator' + description: 'Numele jucatorului' + arg2: + label: 'parola' + description: 'Parola' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_ru.yml b/plugin/platform-bukkit/src/main/resources/messages/help_ru.yml new file mode 100644 index 0000000000..fff9581584 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_ru.yml @@ -0,0 +1,153 @@ +# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called + +# ------------------------------------------------------- +# List of texts used in the help section +common: + header: '==========[ Помощь по AuthMeReloaded ]==========' + optional: 'необязательно' + hasPermission: 'есть' + noPermission: 'нет' + default: 'По умолчанию' + result: 'Право на использование' + defaultPermissions: + notAllowed: 'нет прав' + opOnly: 'только для операторов' + allowed: 'разрешено всем' + +# ------------------------------------------------------- +# Titles of the individual help sections +# Set the translation text to empty text to disable the section, e.g. to hide alternatives: +# alternatives: '' +section: + command: 'Команда' + description: 'Краткое описание' + detailedDescription: 'Описание' + arguments: 'Аргументы' + permissions: 'Права' + alternatives: 'Альтернативы' + children: 'Команды' + +# ------------------------------------------------------- +# You can translate the data for all commands using the below pattern. +# For example to translate /authme reload, create a section "authme.reload", or "login" for /login +# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth +# Translations don't need to be complete; any missing section will be taken from the default silently +# Important: Put main commands like "authme" before their children (e.g. "authme.reload") +commands: + authme.register: + description: 'Регистрация игрока' + detailedDescription: 'Регистрирует игрока с указанным именем и паролем.' + arg1: + label: 'игрок' + description: 'имя игрока' + arg2: + label: 'пароль' + description: 'пароль' + authme.unregister: + description: 'Удаление регистрации игрока' + detailedDescription: 'Убирает регистрацию указанного игрока из базы данных.' + arg1: + label: 'игрок' + description: 'имя игрока' + authme.forcelogin: + description: 'Авторизация игрока' + detailedDescription: 'Авторизация указанного игрока.' + arg1: + label: 'игрок' + description: 'имя игрока в сети' + authme.password: + description: 'Изменение пароля игрока' + detailedDescription: 'Изменяет пароль указанного игрока.' + arg1: + label: 'игрок' + description: 'имя игрока' + arg2: + label: 'пароль' + description: 'новый пароль' + authme.lastlogin: + description: 'Последний вход игрока' + detailedDescription: 'Показывает дату и время последнего входа указанного игрока.' + arg1: + label: 'игрок' + description: 'имя игрока' + authme.accounts: + description: 'Учётные записи игрока' + detailedDescription: 'Отображает все учётные записи указанного игрока по его имени и IP-адресу.' + arg1: + label: 'игрок' + description: 'имя игрока или IP-адрес' + authme.email: + description: 'Электронная почта игрока' + detailedDescription: 'Отображает адрес электронной почты указанного игрока.' + arg1: + label: 'игрок' + description: 'имя игрока' + authme.setemail: + description: 'Смена эл. почты игрока' + detailedDescription: 'Изменяет адрес электронной почты указанного игрока.' + arg1: + label: 'игрок' + description: 'имя игрока' + arg2: + label: 'эл. почта' + description: 'электронная почта игрока' + authme.getip: + description: 'IP-адрес игрока' + detailedDescription: 'Показывает IP-адрес указанного игрока в сети.' + arg1: + label: 'игрок' + description: 'имя игрока' + authme.spawn: + description: 'Перемещение на точку возрождения' + detailedDescription: 'Перемещает на точку возрождения.' + authme.setspawn: + description: 'Перемещение точки возрождения' + detailedDescription: 'Перемещает точку возрождения игроков на ваше текущее местоположение.' + authme.firstspawn: + description: 'Перемещение на начальную точку появления' + detailedDescription: 'Перемещает на начальную точку появления.' + authme.setfirstspawn: + description: 'Перемещение начальной точки появления' + detailedDescription: 'Перемещает начальную точку появления игроков на ваше текущее местоположение.' + authme.purge: + description: 'Удаление старых данных' + detailedDescription: 'Удаляет старые данные старше указанного количества дней.' + arg1: + label: 'дни' + description: 'количество дней' + authme.resetpos: + description: 'Удаление последнего местоположения игрока' + detailedDescription: 'Удаляет последнее известное местоположение указанного игрока или всех игроков.' + arg1: + label: 'игрок|*' + description: 'имя игрока/все игроки' + authme.purgebannedplayers: + description: 'Удаление данных о заблокированных' + detailedDescription: 'Удаляет все данные о заблокированных игроках.' + authme.switchantibot: + description: 'Изменение AntiBot-режима' + detailedDescription: 'Изменяет AntiBot-режим на указанный.' + arg1: + label: 'ON|OFF' + description: 'включить/выключить' + authme.reload: + description: 'Перезагрузка плагина' + detailedDescription: 'Перезагружает плагин AuthMeReloaded.' + authme.version: + description: 'Информация о версии' + detailedDescription: 'Показывает подробную информацию об установленной версии AuthMeReloaded, его разработчиках, помощниках, а также о лицензии плагина.' + authme.converter: + description: 'Преобразователь' + detailedDescription: 'Преобразовывает базу данных.' + arg1: + label: 'тип' + description: 'тип преобразовывания: xauth / crazylogin / rakamak / royalauth / vauth / sqliteToSql / mysqlToSqlite' + authme.help: + description: 'Просмотр помощи' + detailedDescription: 'Показывает помощь по командам /authme.' + arg1: + label: 'команда' + description: 'команда, для которой нужна помощь' + authme.backup: + description: 'Создание резервной копии' + detailedDescription: 'Создаёт резервную копию зарегистрированных пользователей.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_si.yml b/plugin/platform-bukkit/src/main/resources/messages/help_si.yml new file mode 100644 index 0000000000..207ec58915 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_si.yml @@ -0,0 +1,45 @@ +# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called + +# ------------------------------------------------------- +# List of texts used in the help section +common: + header: '==========[ AuthMeReloaded POMOČ ]==========' + optional: 'Neobvezno' + hasPermission: 'Imate dovoljenje' + noPermission: 'Nimate dovoljenja' + default: 'Prevzeto' + result: 'Rezultat' + defaultPermissions: + notAllowed: 'Nimate dovoljenja' + opOnly: 'Samo za OP' + allowed: 'Dovoljeno za vse' + +# ------------------------------------------------------- +# Titles of the individual help sections +# Set the translation text to empty text to disable the section, e.g. to hide alternatives: +# alternatives: '' +section: + command: 'Ukaz' + description: 'Krati opis' + detailedDescription: 'Natančen opis' + arguments: 'Argumenti' + permissions: 'Dovoljenja' + alternatives: 'Alternative' + children: 'Ukazi' + +# ------------------------------------------------------- +# You can translate the data for all commands using the below pattern. +# For example to translate /authme reload, create a section "authme.reload", or "login" for /login +# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth +# Translations don't need to be complete; any missing section will be taken from the default silently +# Important: Put main commands like "authme" before their children (e.g. "authme.reload") +commands: + authme.register: + description: 'Register a player' + detailedDescription: 'Register the specified player with the specified password.' + arg1: + label: 'player' + description: 'Player name' + arg2: + label: 'password' + description: 'Password' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_sr.yml b/plugin/platform-bukkit/src/main/resources/messages/help_sr.yml new file mode 100644 index 0000000000..144b9d9adf --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_sr.yml @@ -0,0 +1,45 @@ +# Konfiguracija za prevođenje pomoći AuthMe, primer kada kucate /authme help ili /authme help register + +# ------------------------------------------------------- +# Lista of teksta u pomoćnoj sekciji +common: + header: '==========[ AuthMeReloaded POMOĆ ]==========' + optional: 'Opcionalno' + hasPermission: 'Imate dozvola' + noPermission: 'Nemate dozvola' + default: 'Početan' + result: 'Rezultat' + defaultPermissions: + notAllowed: 'Nemate dozvola' + opOnly: 'Samo OP-ovi' + allowed: 'Dozvoljeno svima' + +# ------------------------------------------------------- +# Naslovi pojedinih sekcija pomoći +# Izbrišite deo teksta ako želite da iskjučite to, primer da sakrijte alternative: +# alternatives: '' +section: + command: 'Komanda' + description: 'Kratak opis' + detailedDescription: 'Detaljan opis' + arguments: 'Argumenti' + permissions: 'Dozvole' + alternatives: 'Alternative' + children: 'Komande' + +# ------------------------------------------------------- +# Možete prevesti podatke svih komandi koristeći uzorak ispod. +# Na primer da prevedete /authme reload, napravite sekciju "authme.reload", ili "login" za /login +# Ako komanda ima argumente, možete koristiti arg1 kao što je prikazano ispod za prvi argument, itd +# Prevodi ne moraju biti kompletni; sve sekcije koje nedostaju će biti uklonjene iz početnog tiho +# Važno: Postavite glavne komande kao što su "authme" pre njihovih sledbenika (primer "authme.reload") +commands: + authme.register: + description: 'Registrujte igrača' + detailedDescription: 'Registrujte specifičnog igrača specifičnom lozinkom.' + arg1: + label: 'igrač' + description: 'Ime igrača' + arg2: + label: 'lozinka' + description: 'Lozinka' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_vn.yml b/plugin/platform-bukkit/src/main/resources/messages/help_vn.yml new file mode 100644 index 0000000000..f63905ed36 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_vn.yml @@ -0,0 +1,45 @@ +# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called + +# ------------------------------------------------------- +# List of texts used in the help section +common: + header: '==========[ AuthMeReloaded Trợ giúp ]==========' + optional: 'Tùy chọn' + hasPermission: 'Bạn có quyền' + noPermission: 'Không có quyền' + default: 'Mặc định' + result: 'Kết quả' + defaultPermissions: + notAllowed: 'Không cho phép' + opOnly: 'Chỉ dành cho Op' + allowed: 'Dành cho mọi người' + +# ------------------------------------------------------- +# Titles of the individual help sections +# Set the translation text to empty text to disable the section, e.g. to hide alternatives: +# alternatives: '' +section: + command: 'Lệnh' + description: 'Miêu tả ngắn' + detailedDescription: 'Miêu tả cụ thể' + arguments: 'Arguments' + permissions: 'Quyền hạn' + alternatives: 'Các lựa chọn khác' + children: 'Lệnh' + +# ------------------------------------------------------- +# You can translate the data for all commands using the below pattern. +# For example to translate /authme reload, create a section "authme.reload", or "login" for /login +# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth +# Translations don't need to be complete; any missing section will be taken from the default silently +# Important: Put main commands like "authme" before their children (e.g. "authme.reload") +commands: + authme.register: + description: 'Đăng ký người chơi' + detailedDescription: 'Đăng ký người chơi chỉ định với mật khẩu' + arg1: + label: 'player' + description: 'Tên của người chơi' + arg2: + label: 'password' + description: 'Mật khẩu' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_zhcn.yml b/plugin/platform-bukkit/src/main/resources/messages/help_zhcn.yml new file mode 100644 index 0000000000..c08add0991 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_zhcn.yml @@ -0,0 +1,204 @@ +common: + header: '======================================' + optional: '可选' + hasPermission: '您拥有权限去使用这个指令' + noPermission: '您没有权限使用这个指令' + default: '默认' + result: '您的权限' + defaultPermissions: + notAllowed: '任何人不能使用' + opOnly: 'OP拥有此权限' + allowed: '所有人都可以使用' + + +section: + command: '指令' + description: '功能' + detailedDescription: '功能详情' + arguments: '参数' + permissions: '权限' + alternatives: '别名' + children: '子命令' + + +commands: + authme.register: + description: '注册一个玩家' + detailedDescription: '注册一个玩家' + arg1: + label: '玩家' + description: '玩家名称' + arg2: + label: '密码' + description: '密码' + authme.unregister: + description: '注销一个玩家' + detailedDescription: '注销一个玩家' + arg1: + label: '玩家' + description: '玩家' + authme.forcelogin: + description: '强制玩家重新登录' + detailedDescription: '强制使指定玩家重新登录' + arg1: + label: '玩家' + description: '玩家' + authme.password: + description: '改变某个玩家的密码' + detailedDescription: '改变某个玩家的密码' + arg1: + label: '玩家' + description: '玩家' + arg2: + label: '新密码' + description: '新密码' + authme.lastlogin: + description: '查看玩家最后登录时间' + detailedDescription: '查看玩家最后登录时间' + arg1: + label: '玩家' + description: '玩家' + authme.accounts: + description: '查看玩家IP下的账户' + detailedDescription: '查看玩家IP下的账户' + arg1: + label: '玩家或IP' + description: '玩家或IP' + authme.email: + description: '查看玩家的邮箱' + detailedDescription: '查看玩家的邮箱' + arg1: + label: '玩家' + description: '玩家' + authme.setemail: + description: '改变玩家的邮箱' + detailedDescription: '改变玩家的邮箱' + arg1: + label: '玩家' + description: '玩家' + arg2: + label: '邮箱' + description: '邮箱' + authme.getip: + description: '获取玩家IP' + detailedDescription: '获取玩家IP' + arg1: + label: '玩家' + description: '玩家' + authme.spawn: + description: '传送到AuthMe出生点' + detailedDescription: '传送到AuthMe出生点' + authme.setspawn: + description: '改变AuthMe出生点' + detailedDescription: '改变AuthMe出生点' + authme.firstspawn: + description: '传送到第一次进入游戏出生点' + detailedDescription: '传送到第一次进入游戏出生点' + authme.setfirstspawn: + description: '设置第一次进入游戏的出生点' + detailedDescription: '设置第一次进入游戏的出生点' + authme.purge: + description: '删除指定天数之前没登录的玩家登陆数据' + detailedDescription: '删除指定天数之前没登录的玩家登陆数据' + arg1: + label: '天数' + description: '天数' + authme.resetpos: + description: '重置玩家登出位置' + detailedDescription: '重置玩家登出位置' + arg1: + label: '玩家/*' + description: '玩家名称或所有玩家' + authme.purgebannedplayers: + description: '删除已经被封禁的玩家数据' + detailedDescription: '删除已经被封禁的玩家数据' + authme.switchantibot: + description: '改变AntiBot的状态' + detailedDescription: '改变AntiBot的状态' + arg1: + label: '开关' + description: '选项: ON/OFF' + authme.reload: + description: '重载插件' + detailedDescription: '重载插件' + authme.version: + description: '查看版本信息' + detailedDescription: '查看AuthmeReload版本,开发者,贡献者和许可' + authme.converter: + description: '转换数据命令' + detailedDescription: '转换数据命令' + arg1: + label: '类型' + description: '转换类型:xauth/crazylogin/rakamak/royalauth/vauth/sqliteToSql/mysqlToSqlite' + authme.messages: + description: '添加信息' + detailedDescription: '在语言文件夹中添加缺少的信息' + authme.help: + description: '查看帮助' + detailedDescription: '查看帮助' + arg1: + label: '子命令' + description: '查看的指令' + unregister: + description: '注销您的账户' + detailedDescription: '注销您的账户' + arg1: + label: '密码' + description: '密码' + changepassword: + description: '更改您的密码' + detailedDescription: '更改您的密码' + arg1: + label: '旧的密码' + description: '旧的密码' + arg2: + label: '新的密码' + description: '新的密码' + email: + description: '绑定邮箱或更改密码' + detailedDescription: '绑定邮箱或更改密码' + email.show: + description: '查看邮箱' + detailedDescription: '查看您的邮箱地址' + email.add: + description: '绑定邮箱' + detailedDescription: '为您的账户绑定邮箱' + arg1: + label: '邮箱' + description: '邮箱地址' + arg2: + label: '邮箱' + description: '重新输入邮箱地址' + email.change: + description: '改变邮箱地址' + detailedDescription: '更改您账户的邮箱地址' + arg1: + label: '旧邮箱' + description: '旧的邮箱地址' + arg2: + label: '新邮箱' + description: '新的邮箱地址' + email.recover: + description: '通过邮箱改变密码' + detailedDescription: '通过邮箱改变密码' + arg1: + label: '邮箱' + description: '邮箱地址' + email.help: + description: '查看帮助' + detailedDescription: '查看邮箱帮助' + arg1: + label: '子命令' + description: '指令' + captcha: + description: '验证码' + detailedDescription: '验证码' + arg1: + label: '验证码' + description: '验证码' + captcha.help: + description: '查看验证码帮助' + detailedDescription: '查看验证码帮助' + arg1: + label: '子命令' + description: '指令' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_zhhk.yml b/plugin/platform-bukkit/src/main/resources/messages/help_zhhk.yml new file mode 100644 index 0000000000..b3b4650aac --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_zhhk.yml @@ -0,0 +1,45 @@ +# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called + +# ------------------------------------------------------- +# List of texts used in the help section +common: + header: '==========[ 登入系統指南 ]==========' + optional: '選填' + hasPermission: '你擁有此權限節點' + noPermission: '你並沒有此權限節點' + default: '預設權限' + result: '你的權限' + defaultPermissions: + notAllowed: '你並沒有此權限節點' + opOnly: '伺服器操作員限定' + allowed: '開放給所有玩家' + +# ------------------------------------------------------- +# Titles of the individual help sections +# Set the translation text to empty text to disable the section, e.g. to hide alternatives: +# alternatives: '' +section: + command: '指令' + description: '簡述' + detailedDescription: '詳述' + arguments: '參數' + permissions: '權限' + alternatives: '替代指令' + children: '指令集' + +# ------------------------------------------------------- +# You can translate the data for all commands using the below pattern. +# For example to translate /authme reload, create a section "authme.reload", or "login" for /login +# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth +# Translations don't need to be complete; any missing section will be taken from the default silently +# Important: Put main commands like "authme" before their children (e.g. "authme.reload") +commands: + authme.register: + description: '登記一個新的玩家帳戶' + detailedDescription: '透過管理員身份,將一個玩家帳戶以指定的密碼註冊' + arg1: + label: 'player' + description: '玩家名稱' + arg2: + label: 'password' + description: '密碼' diff --git a/plugin/platform-bukkit/src/main/resources/messages/help_zhtw.yml b/plugin/platform-bukkit/src/main/resources/messages/help_zhtw.yml new file mode 100644 index 0000000000..77eb6441a9 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/help_zhtw.yml @@ -0,0 +1,349 @@ +# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called + +# ------------------------------------------------------- +# List of texts used in the help section +common: + header: '==========[ AuthMeReloaded 幫助 ]==========' + optional: '選填' + hasPermission: '您有使用此指令的權限' + noPermission: '您沒有使用此指令的權限' + default: '預設' + result: '結果' + defaultPermissions: + notAllowed: '無權限' + opOnly: '僅限管理員' + allowed: '開放給所有人' + +# ------------------------------------------------------- +# Titles of the individual help sections +# Set the translation text to empty text to disable the section, e.g. to hide alternatives: +# alternatives: '' +section: + command: '指令' + description: '簡述' + detailedDescription: '詳述' + arguments: '參數' + permissions: '權限' + alternatives: '別名' + children: '指令集' + +# ------------------------------------------------------- +# You can translate the data for all commands using the below pattern. +# For example to translate /authme reload, create a section "authme.reload", or "login" for /login +# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth +# Translations don't need to be complete; any missing section will be taken from the default silently +# Important: Put main commands like "authme" before their children (e.g. "authme.reload") +commands: + authme.register: + description: '註冊一位玩家' + detailedDescription: '以指定的密碼註冊一位玩家。' + arg1: + label: '名稱' + description: '玩家名稱' + arg2: + label: '密碼' + description: '密碼' + authme.unregister: + description: '註銷一位玩家。' + detailedDescription: '註銷指定的玩家。' + arg1: + label: '名稱' + description: '玩家名稱' + authme.forcelogin: + description: '強制玩家重新登入。' + detailedDescription: '強制指定的玩家重新登入。' + arg1: + label: '名稱' + description: '玩家名稱' + authme.password: + description: '修改玩家的密碼。' + detailedDescription: '修改指定的玩家的密碼。' + arg1: + label: '名稱' + description: '玩家名稱' + arg2: + label: '密碼' + description: '密碼' + authme.lastlogin: + description: '查看玩家最後登入的日期。' + detailedDescription: '查看指定的玩家最後登入的日期。' + arg1: + label: '名稱' + description: '玩家名稱' + authme.accounts: + description: '透過玩家名稱或 IP 顯示玩家的所有帳號。' + detailedDescription: '透過玩家名稱或 IP 顯示玩家的所有帳號。' + arg1: + label: '名稱' + description: '玩家名稱' + authme.email: + description: '顯示指定的玩家的電子郵件地址。(如果有設置的話)' + detailedDescription: '顯示指定的玩家的電子郵件地址。(如果有設置的話)' + arg1: + label: '名稱' + description: '玩家名稱' + authme.setemail: + description: '修改玩家的電子郵件地址。' + detailedDescription: '修改指定的玩家的電子郵件地址。' + arg1: + label: '名稱' + description: '玩家名稱' + arg2: + label: '電子郵件地址' + description: '電子郵件地址' + authme.getip: + description: '取得線上玩家的 IP 位址。' + detailedDescription: '取得指定的線上玩家的 IP 位址。' + arg1: + label: '名稱' + description: '玩家名稱' + authme.totp: + description: '顯示玩家是否開啟兩步驟驗證。' + detailedDescription: '顯示指定的玩家是否開啟兩步驟驗證。' + arg1: + label: '名稱' + description: '玩家名稱' + authme.disabletotp: + description: '為玩家停用兩步驟驗證。' + detailedDescription: '為指定的玩家停用兩步驟驗證。' + arg1: + label: '名稱' + description: '玩家名稱' + authme.spawn: + description: '傳送至重生點。' + detailedDescription: '傳送至重生點。' + authme.setspawn: + description: '將玩家的重生點設為您現在的位置。' + detailedDescription: '將玩家的重生點設為您現在的位置。' + authme.firstspawn: + description: '傳送至新玩家重生點。' + detailedDescription: '傳送至新玩家重生點。' + authme.setfirstspawn: + description: '將新玩家的重生點設為您現在的位置。' + detailedDescription: '將新玩家的重生點設為您現在的位置。' + authme.purge: + description: '刪除超過指定天數的 AuthMeReloaded 資料。' + detailedDescription: '刪除超過指定天數的 AuthMeReloaded 資料。' + arg1: + label: '天' + description: '天數' + authme.purgeplayer: + description: '刪除玩家資料。' + detailedDescription: '刪除指定的玩家的資料。' + arg1: + label: '名稱' + description: '玩家名稱' + arg2: + label: '選項' + description: '選項' + authme.backup: + description: '備份玩家資料。' + detailedDescription: '備份所有玩家的資料。' + authme.resetpos: + description: '重設玩家的登出前位置。' + detailedDescription: '重設指定/所有玩家的登出前位置。' + arg1: + label: '名稱/*' + description: '指定玩家/所有玩家' + authme.purgebannedplayers: + description: '刪除已被封禁的玩家的資料。' + detailedDescription: '刪除所有已被封禁的玩家的資料。' + authme.switchantibot: + description: '切換 AntiBot 的模式。' + detailedDescription: '切換 AntiBot 的模式。' + arg1: + label: '模式' + description: '模式' + authme.reload: + description: '重新載入 AuthMeReloaded。' + detailedDescription: '重新載入 AuthMeReloaded。' + authme.version: + description: '顯示 AuthMeReloaded 的詳細資訊。' + detailedDescription: '顯示 AuthMeReloaded 的詳細資訊。例如版本、開發者、貢獻者、及授權。' + authme.converter: + description: 'AuthMeReloaded 的轉換器指令。' + detailedDescription: 'AuthMeReloaded 的轉換器指令。' + arg1: + label: '工作' + description: '工作' + authme.messages: + description: '修改目前的幫助檔案。' + detailedDescription: '修改目前的幫助檔案。' + authme.recent: + description: '顯示最近登入的玩家。' + detailedDescription: '顯示最近登入的玩家。' + authme.debug: + description: '除錯。' + detailedDescription: '除錯。' + arg1: + label: '子程序' + description: '子程序' + arg2: + label: '參數' + description: '參數' + arg3: + label: '參數' + description: '參數' + authme.help: + description: '顯示 /authme 指令的詳細介紹。' + detailedDescription: '顯示 /authme 指令的詳細介紹。' + arg1: + label: '要查詢的指令' + description: '要查詢的指令' + email.show: + description: '顯示您目前的電子郵件地址。' + detailedDescription: '顯示您目前的電子郵件地址。' + email.add: + description: '新增電子郵件地址' + detailedDescription: '新增電子郵件地址至您的帳號。' + arg1: + label: '電子郵件地址' + description: '電子郵件地址' + arg2: + label: '確認電子郵件地址' + description: '確認電子郵件地址' + email.change: + description: '修改電子郵件地址' + detailedDescription: '修改您的帳號的電子郵件地址。' + arg1: + label: '舊的電子郵件地址' + description: '舊的電子郵件地址' + arg2: + label: '新的電子郵件地址' + description: '新的電子郵件地址' + email.recover: + description: '使用別的電子郵件地址復原您的帳號。' + detailedDescription: '復原您的帳號,將寄送新的密碼至您提供的電子郵件地址。' + arg1: + label: '電子郵件地址' + description: '電子郵件地址' + email.code: + description: '使用代碼復原您的帳號。' + detailedDescription: '輸入已寄送至您的電子郵件信箱的代碼以復原您的帳號。' + arg1: + label: '電子郵件地址' + description: '電子郵件地址' + email.setpassword: + description: '復原帳號後,設置新密碼。' + detailedDescription: '復原帳號後,設置新密碼。' + arg1: + label: '密碼' + description: '密碼' + email.help: + description: '顯示 /email 指令的詳細介紹。' + detailedDescription: '顯示 /email 指令的詳細介紹。' + arg1: + label: '要查詢的指令' + description: '要查詢的指令' + login: + login.help: + description: '顯示 /login 指令的詳細介紹。' + detailedDescription: '顯示 /login 指令的詳細介紹。' + arg1: + label: '要查詢的指令' + description: '要查詢的指令' + logout: + description: '登出帳號' + detailedDescription: '登出您的帳號。' + logout.help: + description: '顯示 /logout 指令的詳細介紹。' + detailedDescription: '顯示 /logout 指令的詳細介紹。' + arg1: + label: '要查詢的指令' + description: '要查詢的指令' + register: + description: '註冊帳號' + detailedDescription: '註冊您的帳號。' + arg1: + label: '密碼' + description: '密碼' + arg2: + label: '確認密碼' + description: '確認密碼' + register.help: + description: '顯示 /register 指令的詳細介紹。' + detailedDescription: '顯示 /register 指令的詳細介紹。' + arg1: + label: '要查詢的指令' + description: '要查詢的指令' + unregister: + description: '註銷帳號' + detailedDescription: '註銷您的帳號。' + arg1: + label: '密碼' + description: '密碼' + unregister.help: + description: '顯示 /unregister 指令的詳細介紹。' + detailedDescription: '顯示 /unregister 指令的詳細介紹。' + arg1: + label: '要查詢的指令' + description: '要查詢的指令' + changepassword: + description: '修改密碼' + detailedDescription: '修改您的密碼。' + arg1: + label: '舊密碼' + description: '舊密碼' + arg2: + label: '新密碼' + description: '新密碼' + changepassword.help: + description: '顯示 /changepassword 指令的詳細介紹。' + detailedDescription: '顯示 /changepassword 指令的詳細介紹。' + arg1: + label: '要查詢的指令' + description: '要查詢的指令' + totp: + description: '執行兩步驟驗證的相關操作。' + detailedDescription: '執行兩步驟驗證的相關操作。' + totp.code: + description: '登入時,輸入您的兩步驟驗證碼。' + detailedDescription: '登入時,輸入您的兩步驟驗證碼。' + arg1: + label: '驗證碼' + description: '驗證碼' + totp.add: + description: '為您的帳號啟用兩步驟驗證。' + detailedDescription: '為您的帳號啟用兩步驟驗證。' + totp.confirm: + description: '確認後,儲存生成的兩步驟驗證金鑰。' + detailedDescription: '確認後,儲存生成的兩步驟驗證金鑰。' + arg1: + label: '驗證碼' + description: '驗證碼' + totp.remove: + description: '為您的帳號停用兩步驟驗證。' + detailedDescription: '為您的帳號停用兩步驟驗證。' + arg1: + label: '驗證碼' + description: '驗證碼' + totp.help: + description: '顯示 /totp 指令的詳細介紹。' + detailedDescription: '顯示 /totp 指令的詳細介紹。' + arg1: + label: '要查詢的指令' + description: '要查詢的指令' + captcha: + description: 'AuthMeReloaded 的 Captcha 指令。' + detailedDescription: 'AuthMeReloaded 的 Captcha 指令。' + arg1: + label: 'Captcha 碼' + description: 'Captcha 碼' + captcha.help: + description: '顯示 /captcha 指令的詳細介紹。' + detailedDescription: '顯示 /captcha 指令的詳細介紹。' + arg1: + label: '要查詢的指令' + description: '要查詢的指令' + verification: + description: '完成驗證過程的指令。' + detailedDescription: '完成驗證過程的指令。' + arg1: + label: '驗證碼' + description: '驗證碼' + verification.help: + description: '顯示 /verification 指令的詳細介紹。' + detailedDescription: '顯示 /verification 指令的詳細介紹。' + arg1: + label: '要查詢的指令' + description: '要查詢的指令' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_bg.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_bg.yml new file mode 100644 index 0000000000..4b370bd983 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_bg.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cРегистрациите са изключени!' + name_taken: '&cПотребителското име е заетo!' + register_request: '&3Моля регистрирайте се с: /register парола парола.' + command_usage: '&cКоманда: /register парола парола' + reg_only: '&4Само регистрирани потребители могат да влизат в сървъра! Моля посетете https://example.com, за да се регистрирате!' + success: '&2Успешна регистрация!' + kicked_admin_registered: 'Вие бяхте регистриран от администратора, моля да влезете отново!' + +# Password errors on registration +password: + match_error: '&cПаролите не съвпадат, провете ги отново!' + name_in_password: '&cНе можете да използвате потребителското си име за парола, моля изберете друга парола.' + unsafe_password: '&cИзбраната парола не е безопасна, моля изберете друга парола.' + forbidden_characters: '&4Паролата съдържа непозволени символи. Позволени символи: %valid_chars' + wrong_length: '&cПаролата е твърде къса или прекалено дълга! Моля опитайте с друга парола.' + pwned_password: '&cИзбраната парола не е сигурна. Тя е използвана %pwned_count пъти вече! Моля, използвайте силна парола...' + +# Login +login: + command_usage: '&cКоманда: /login парола' + wrong_password: '&cГрешна парола!' + success: '&2Успешен вход!' + login_request: '&cМоля влезте с: /login парола !' + timeout_error: '&4Времето за вход изтече, бяхте кикнат от сървъра. Моля опитайте отново!' + +# Errors +error: + denied_command: '&cЗа да използвате тази команда трябва да сте си влезли в акаунта!' + denied_chat: '&cЗа да пишете в чата трябва да сте си влезли в акаунта!' + unregistered_user: '&cПотребителското име не е регистрирано!' + not_logged_in: '&cНе сте влезли!' + no_permission: '&4Нямате нужните права за това действие!' + unexpected_error: '&4Получи се неочаквана грешка, моля свържете се с администратора!' + max_registration: '&cВие сте достигнали максималният брой регистрации (%reg_count/%max_acc %reg_names)!' + logged_in: '&cВече сте влезли!' + kick_for_vip: '&3VIP потребител влезе докато сървъра беше пълен, вие бяхте изгонен!' + kick_unresolved_hostname: '&cВъзникна грешка: неразрешено име на играч!' + tempban_max_logins: '&cВие бяхте баннат временно, понеже сте си сгрешили паролата прекалено много пъти.' + +# AntiBot +antibot: + kick_antibot: 'Защитата от ботове е включена! Трябва да изчакате няколко минути преди да влезете в сървъра.' + auto_enabled: '&4Защитата за ботове е включена заради потенциална атака!' + auto_disabled: '&2Защитата за ботове ще се изключи след %m минута/и!' + +# Unregister +unregister: + success: '&cРегистрацията е премахната успешно!' + command_usage: '&cКоманда: /unregister парола' + +# Other messages +misc: + account_not_activated: '&cВашият акаунт все още не е актириван, моля провете своят email адрес!' + not_activated: '&cАкаунтът не е активиран, моля регистрирайте се и го активирайте преди да опитате отново.' + password_changed: '&2Паротала е променена успешно!' + logout: '&2Излязохте успешно!' + reload: '&2Конфигурацията и база данните бяха презаредени правилно!' + usage_change_password: '&cКоманда: /changepassword Стара-Парола Нова-Парола' + accounts_owned_self: 'Притежавате %count акаунт/а:' + accounts_owned_other: 'Потребителят %name има %count акаунт/а:' + +# Session messages +session: + valid_session: '&2Сесията е продължена.' + invalid_session: '&cТвоят IP се е променил и сесията беше прекратена.' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Вече има потребител със същото IP в сървъра!' + same_nick_online: '&4Вече има потребител, който играе в сървъра със същото потребителско име!' + name_length: '&4Потребителското име е прекалено късо или дълго. Моля опитайте с друго потребителско име!' + characters_in_name: '&4Потребителското име съдържа забранени знаци. Позволени знаци: %valid_chars' + kick_full_server: '&4Сървъра е пълен, моля опитайте отново!' + country_banned: '&4Твоята държава е забранена в този сървър!' + not_owner_error: 'Ти не си собственика на този акаунт. Моля избери друго потребителско име!' + invalid_name_case: 'Трябва да влезеш с %valid, а не с %invalid!' + quick_command: 'Използвате команди твърде бързо! Моля, влезте отново в сървъра и изчакайте малко преди да използвате команди.' + +# Email +email: + add_email_request: '&3Моля добавете имейл адрес към своят акаунт: /email add имейл имейл' + usage_email_add: '&cКоманда: /email add имейл имейл' + usage_email_change: '&cКоманда: /email change Стар-Имейл Нов-Имейл' + new_email_invalid: '&cНовият имейл е грешен, опитайте отново!' + old_email_invalid: '&cСтарият имейл е грешен, опитайте отново!' + invalid: '&cИмейла е невалиден, опитайте с друг!' + added: '&2Имейл адреса е добавен!' + add_not_allowed: '&cДобавянето на имейл не е разрешено!' + request_confirmation: '&cМоля потвърдете своя имейл адрес!' + changed: '&2Имейл адреса е сменен!' + change_not_allowed: '&cСмяната на имейл адреса не е разрешена!' + email_show: '&2Вашият имейл адрес е: &f%email' + no_email_for_account: '&2Няма добавен имейл адрес към акаунта.' + already_used: '&4Имейл адреса вече се използва, опитайте с друг.' + incomplete_settings: 'Грешка: Не всички настройки са написани за изпращане на имейл адрес. Моля свържете се с администратора!' + send_failure: 'Съобщението не беше изпратено. Моля свържете се с администратора.' + change_password_expired: 'Вече не е възможно да смените паролата си с тази команда.' + email_cooldown_error: '&cВече е бил изпратен имейл адрес. Трябва а изчакате %time преди да изпратите нов.' + +# Password recovery by email +recovery: + forgot_password_hint: '&3Забравена парола? Използвайте: /email recovery имейл' + command_usage: '&cКоманда: /email recovery имейл' + email_sent: '&2Възстановяващият имейл е изпратен успешно. Моля провете пощата си!' + code: + code_sent: 'Възстановяващият код беше изпратен на вашият email адрес.' + incorrect: 'Възстановяващият код е неправилен! Използвайте: /email recovery имейл, за да генерирате нов.' + tries_exceeded: 'Вие надвишихте максималният брой опити да въведете кода за възстановяване. Използвайте "/email recovery имейл" за да генерирате нов.' + correct: 'Кода за възстановяване е успешно въведен!' + change_password: 'Моля използвайте командата /email setpassword нова-парола за да смените Вашата парола веднага.' + +# Captcha +captcha: + usage_captcha: '&3Моля въведе цифрите/буквите от кода за сигурност: /captcha %captcha_code' + wrong_captcha: '&cКода е грешен, използвайте: "/captcha %captcha_code" в чата!' + valid_captcha: '&2Кода е валиден!' + captcha_for_registration: 'За да се регистрирате, трябва да въведете цифрите / буквите от кода за сигурност, използвайте командата: /captcha %captcha_code' + register_captcha_valid: '&2Кода е валиден! Вие вече може да се регистрирате с команда /register' + +# Verification code +verification: + code_required: '&3Тази команда е чувствителна и изисква потвърждение по имейл! Моля проверете си имейла и следвайте инструкциите в него.' + command_usage: '&cКоманда: /verification код' + incorrect_code: '&cНеправилен код, моля използвайте "/verification код" като използвате кода, който сте получили на Вашият имейл.' + success: '&2Вашата самоличност е потвърдена! Вие може да използвате всички команди в текущата Ви сесия!' + already_verified: '&2Вие вече можете да изпълнявате чувствителни команди в текущата Ви сесия!' + code_expired: '&3Вашият код е изтекъл. Изпълнете друга чувствителна команда за да генерирате нов код!' + email_needed: '&3За да потвърдите Вашата самоличност е необходимо да добавите имейл адрес към Вашият акаунт!!' + +# Time units +time: + second: 'секунда' + seconds: 'секунди' + minute: 'минута' + minutes: 'минути' + hour: 'час' + hours: 'часа' + day: 'ден' + days: 'дни' + +# Two-factor authentication +two_factor: + code_created: '&2Кода е %code. Можете да го проверите от тук: %url' + confirmation_required: 'Моля потвърдете Вашият код с команда /2fa confirm <код>' + code_required: 'Моля изпратете Вашият секретен код с команда /2fa code <код>' + already_enabled: 'Използването на секретен код е вече включено за Вашият акаунт!' + enable_error_no_code: 'Нямате добавен секретен код или кода е изтекъл. Моля изпълнете команда /2fa add' + enable_success: 'Успешно активирахте защита със секретен код за Вашият акаунт.' + enable_error_wrong_code: 'Грешен секретен код или е изтекъл. Моля изпълнете команда /2fa add' + not_enabled_error: 'Защитата със секретен код не е включена за Вашият акаунт. Моля изпълнете команда /2fa add' + removed_success: 'Успешно изключихте защитата със секретен код от Вашият акаунт!' + invalid_code: 'Невалиден код!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aУспешно автоматично влизане за Bedrock!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aЗаседнали сте в портал по време на влизане.' + fix_underground: '&aЗаседнали сте под земята по време на влизане.' + cannot_fix_underground: '&aЗаседнали сте под земята по време на влизане, но не можем да го поправим.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cБяхте изключени поради двойно влизане.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_br.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_br.yml new file mode 100644 index 0000000000..396008bce8 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_br.yml @@ -0,0 +1,176 @@ +# AuthMe Reloaded | Tradução pt-br +# Por Eufranio, GabrielDev (DeathRush) e RenanYudi +# +# Lista de tags globais: +# %nl% - Pula uma linha +# %username% - Substitui pelo nome do jogador que está recebendo a mensagem +# %displayname% - Substitui pelo nickname (e cores) do jogador que está recebendo a mensagem + +# Registro +registration: + disabled: '&cRegistrar-se está desativado neste servidor!' + name_taken: '&cVocê já registrou este nome de usuário!' + register_request: '&3Por favor, registre-se com o comando "/register "' + command_usage: '&cUse: /register ' + reg_only: '&4Somente usuários registrados podem entrar no servidor! Por favor visite www.seusite.com para se registrar!' + success: '&2Registrado com sucesso!' + kicked_admin_registered: 'Um administrador registrou você. Por favor, faça login novamente' + +# Erros de senha ao registrar-se +password: + match_error: '&cAs senhas não coincidem, tente novamente!' + name_in_password: '&Você não pode usar o seu nome como senha. Por favor, escolha outra senha...' + unsafe_password: '&cA senha escolhida não é segura. Por favor, escolha outra senha...' + forbidden_characters: '&Sua senha contém caracteres inválidos. Caracteres permitidos: %valid_chars' + wrong_length: '&cSua senha é muito curta ou muito longa! Por favor, escolha outra senha...' + pwned_password: '&cSua senha escolhida não é segura. Ela foi usada %pwned_count vezes já! Por favor, use uma senha forte...' + +# Login +login: + command_usage: '&cUse: /login ' + wrong_password: '&cSenha incorreta!' + success: '&2Login realizado com sucesso!' + login_request: '&cPor favor, faça login com o comando "/login "' + timeout_error: '&4Tempo limite excedido.' + +# Erros +error: + denied_command: '&cPara utilizar este comando é necessário estar logado!' + denied_chat: '&cPara utilizar o chat é necessário estar logado!' + unregistered_user: '&cEste usuário não está registrado!' + not_logged_in: '&cVocê não está logado!' + no_permission: '&4Você não tem permissão para executar esta ação!' + unexpected_error: '&4Ocorreu um erro inesperado. Por favor contate um administrador!' + max_registration: '&cVocê excedeu o número máximo de registros (%reg_count/%max_acc %reg_names) para o seu IP!' + logged_in: '&cVocê já está logado!' + kick_for_vip: '&3Um jogador VIP juntou-se ao servidor enquanto ele estava cheio!' + kick_unresolved_hostname: '&cErro: hostname do jogador não resolvido!' + tempban_max_logins: '&cVocê foi temporariamente banido por tentar fazer login muitas vezes.' + +# AntiBot +antibot: + kick_antibot: 'O modo de proteção AntiBot está ativo, espere alguns minutos antes de entrar no servidor!' + auto_enabled: '&4O AntiBot foi ativado devido ao grande número de conexões!' + auto_disabled: '&2AntiBot desativado após %m minutos!' + +# Deletar conta +unregister: + success: '&cConta deletada!' + command_usage: '&cUse: /unregister ' + +# Outras mensagens +misc: + account_not_activated: '&cA sua conta ainda não está ativada. Por favor, verifique seus e-mails!' + not_activated: '&cConta não ativada, por favor registre e ative antes de tentar novamente.' + password_changed: '&2Senha alterada com sucesso!' + logout: '&2Desconectado com sucesso!' + reload: '&2A configuração e o banco de dados foram recarregados corretamente!' + usage_change_password: '&cUse: /changepassword ' + accounts_owned_self: 'Você tem %count contas:' + accounts_owned_other: 'O jogador %name tem %count contas:' + +# Mensagens de sessão +session: + valid_session: '&2Você deslogou recentemente, então sua sessão foi retomada!' + invalid_session: '&fO seu IP foi alterado e sua sessão expirou!' + +# Mensagens de erro ao entrar +on_join_validation: + same_ip_online: 'Um jogador com o mesmo IP já está no servidor!' + same_nick_online: '&4Alguém com o mesmo nome de usuário já está jogando no servidor!' + name_length: '&4Seu nome de usuário ou é muito curto ou é muito longo!' + characters_in_name: '&4Seu nome de usuário contém caracteres inválidos. Caracteres permitidos: %valid_chars' + kick_full_server: '&4O servidor está cheio, tente novamente mais tarde!' + country_banned: '&4O seu país está banido deste servidor!' + not_owner_error: 'Você não é o proprietário da conta. Por favor, escolha outro nome!' + invalid_name_case: 'Você deve entrar usando o nome de usuário %valid, não %invalid.' + quick_command: 'Você usou o comando muito rápido! Por favor, entre no servidor e aguarde antes de usar um comando novamente.' + +# E-mail +email: + add_email_request: '&3Por favor, adicione seu e-mail para a sua conta com o comando "/email add "' + usage_email_add: '&cUse: /email add ' + usage_email_change: '&cUse: /email change ' + new_email_invalid: '&cE-mail novo inválido, tente novamente!' + old_email_invalid: '&cE-mail antigo inválido, tente novamente!' + invalid: '&E-mail inválido, tente novamente!' + added: '&2E-mail adicionado com sucesso!' + add_not_allowed: '&cAdicionar um e-mail não é permitido.' + request_confirmation: '&cPor favor, confirme o seu endereço de e-mail!' + changed: '&2E-mail alterado com sucesso!' + change_not_allowed: '&cAlterar o e-mail não é permitido.' + email_show: '&2O seu endereço de e-mail atual é: &f%email' + no_email_for_account: '&2Você atualmente não têm endereço de e-mail associado a esta conta.' + already_used: '&4O endereço de e-mail já está sendo usado' + incomplete_settings: 'Erro: Nem todas as configurações necessárias estão definidas para o envio de e-mails. Entre em contato com um administrador.' + send_failure: '&cO e-mail não pôde ser enviado, reporte isso a um administrador!' + change_password_expired: 'Você não pode mais usar esse comando de recuperação de senha!' + email_cooldown_error: '&cUm e-mail já foi enviado, espere %time antes de enviar novamente!' + +# Recuperação de senha por e-mail +recovery: + forgot_password_hint: '&3Esqueceu a sua senha? Use o comando "/email recovery "' + command_usage: '&cUse: /email recovery ' + email_sent: '&2E-mail de recuperação enviado! Por favor, verifique sua caixa de entrada!' + code: + code_sent: 'Um código de recuperação para a redefinição de senha foi enviado ao seu e-mail.' + incorrect: 'Código de recuperação inválido! Você tem %count tentativas restantes.' + tries_exceeded: 'Você excedeu o limite de tentativas de usar o código de recuperação! Use "/email recovery [email]" para gerar um novo.' + correct: 'Código de recuperação aceito!' + change_password: 'Por favor, use o comando /email setpassword para alterar sua senha!' + +# Captcha +captcha: + usage_captcha: '&3Para iniciar sessão você tem que resolver um captcha, utilize o comando "/captcha %captcha_code"' + wrong_captcha: '&cCaptcha incorreto. Por favor, escreva "/captcha %captcha_code" no chat!' + valid_captcha: '&2Captcha correto!' + captcha_for_registration: 'Para se registrar você tem que resolver um código captcha, utilize o comando "/captcha %captcha_code"' + register_captcha_valid: '&2Captcha correto! Agora você pode se registrar usando /register !' + +# Código de verificação +verification: + code_required: '&3Esse comando é sensível e precisa de uma verificação via e-mail! Verifique sua caixa de entrada e siga as instruções do e-mail.' + command_usage: '&cUse: /verification ' + incorrect_code: '&cCódigo incorreto, utilize "/verification " com o código que você recebeu por e-mail!' + success: '&2Sua identidade foi verificada, agora você pode usar todos os comandos durante esta sessão.' + already_verified: '&2Você já pode executar comandos sensíveis durante esta sessão!' + code_expired: '&3O seu código expirou! Execute outro comando sensível para gerar um outro código.' + email_needed: '&3Para verificar sua identidade, você precisa vincular um e-mail à sua conta!' + +# Unidades de tempo +time: + second: 'segundo' + seconds: 'segundos' + minute: 'minuto' + minutes: 'minutos' + hour: 'hora' + hours: 'horas' + day: 'dia' + days: 'dias' + +# Verificação em duas etapas +two_factor: + code_created: '&2O seu código secreto é %code. Você pode verificá-lo aqui %url' + confirmation_required: 'Confirme seu código com /2fa confirm ' + code_required: 'Registre o seu código de verificação em duas etapas com /2fa code ' + already_enabled: 'A verificação em duas etapas já está ativada nesta conta!' + enable_error_no_code: 'Nenhuma chave de verificação foi gerada ou ela expirou. Por favor, use /2fa add' + enable_success: 'Verificação em duas etapas ativada com sucesso para esta conta!' + enable_error_wrong_code: 'Código incorreto ou expirado! Por favor, use /2fa add' + not_enabled_error: 'A verificação em duas etapas não está ativada nesta conta. Use /2fa add' + removed_success: 'Verificação em duas etapas desativada com sucesso!' + invalid_code: 'Código inválido!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aLogin automático Bedrock bem-sucedido!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aVocê está preso no portal durante o login.' + fix_underground: '&aVocê está preso no subsolo durante o login.' + cannot_fix_underground: '&aVocê está preso no subsolo durante o login, mas não podemos corrigir.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cVocê foi desconectado devido a login duplo.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_cz.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_cz.yml new file mode 100644 index 0000000000..4954457e3f --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_cz.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cRegistrace je zakázána!' + name_taken: '&cUživatelské jméno je již zaregistrováno.' + register_request: '&cProsím, zaregistruj se pomocí "/register "' + command_usage: '&cPoužij: "/register heslo ZnovuHeslo".' + reg_only: '&cServer je pouze pro registrované! Navštiv naši webovou stránku https://priklad.cz.' + success: '&cRegistrace úspěšná!' + kicked_admin_registered: 'Admin vás právě zaregistroval; Přihlašte se prosím znovu.' + +# Password errors on registration +password: + match_error: '&cHesla se neshodují!' + name_in_password: '&cNemůžeš použít své jméno jako heslo, prosím, zvol si jiné heslo...' + unsafe_password: '&cToto heslo není bezpečné, prosím, zvol si jiné heslo...' + forbidden_characters: '&4Tvoje heslo obsahuje nepovolené znaky. Přípustné znaky jsou: %valid_chars' + wrong_length: '&cTvoje heslo nedosahuje minimální délky.' + pwned_password: '&cZvolené heslo není bezpečné. Bylo použito již %pwned_count krát! Prosím, použijte silné heslo...' + +# Login +login: + command_usage: '&cPoužij: "/login TvojeHeslo".' + wrong_password: '&cŠpatné heslo.' + success: '&cÚspěšně přihlášen!' + login_request: '&cProsím přihlaš se pomocí "/login TvojeHeslo".' + timeout_error: '&cČas pro přihlášení vypršel!' + +# Errors +error: + denied_command: '&cPokud chceš použít tento příkaz musíš být přihlášen/registrován!' + denied_chat: '&cNemůžeš psát do chatu dokuď se nepřihlásíš/nezaregistruješ!' + unregistered_user: '&cUživatelské jméno není zaregistrováno.' + not_logged_in: '&cNejsi přihlášený!' + no_permission: '&cNa tento příkaz nemáš dostatečné pravomoce.' + unexpected_error: '&cVyskytla se chyba - kontaktujte prosím administrátora ...' + max_registration: '&cPřekročil(a) jsi limit pro počet účtů (%reg_count/%max_acc %reg_names) z jedné IP adresy.' + logged_in: '&cJiž jsi přihlášen!' + kick_for_vip: '&cOmlouváme se, ale VIP hráč se připojil na plný server!' + kick_unresolved_hostname: '&cChyba: unresolved player hostname!' + tempban_max_logins: '&cByl jsi dočasně zabanován za příliš mnoho neúspěšných pokusů o přihlášení.' + +# AntiBot +antibot: + kick_antibot: 'Bezpečnostní mód AntiBot je zapnut! Musíš počkat několik minut než se budeš moct připojit znovu na server.' + auto_enabled: '[AuthMe] AntiBotMod automaticky spuštěn z důvodu mnoha souběžných připojení!' + auto_disabled: '[AuthMe] AntiBotMod automaticky ukončen po %m minutách, doufejme v konec invaze' + +# Unregister +unregister: + success: '&cÚspěšně odregistrován!' + command_usage: '&cPoužij: "/unregister TvojeHeslo".' + +# Other messages +misc: + account_not_activated: '&cTvůj účet ještě není aktivovaný, zkontroluj svůj E-mail.' + not_activated: '&cÚčet není aktivován, prosím zaregistrujte se a aktivujte ho před dalším pokusem.' + password_changed: '&cHeslo změněno!' + logout: '&cÚspěšně jsi se odhlásil.' + reload: '&cZnovu načtení nastavení AuthMe proběhlo úspěšně.' + usage_change_password: '&cPoužij: "/changepassword StaréHeslo NovéHeslo".' + accounts_owned_self: 'Vlastníš tyto účty (%count):' + accounts_owned_other: 'Hráč %name vlastní tyto účty (%count):' + +# Session messages +session: + valid_session: '&cAutomatické znovupřihlášení.' + invalid_session: '&cChyba: Počkej než vyprší tvoje relace.' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Hráč se stejnou IP adresou nyní hraje na serveru!' + same_nick_online: '&cUživatel s tímto jménem již hraje na serveru.' + name_length: '&cTvůj nick je přílíš krátký, nebo přílíš dlouhý' + characters_in_name: '&cTvůj nick obsahuje nepovolené znaky. Přípustné znaky jsou: %valid_chars' + kick_full_server: '&cServer je momentálně plný, zkus to prosím později!' + country_banned: 'Připojení z tvé země je na tomto serveru zakázáno.' + not_owner_error: 'Nejsi majitelem tohoto účtu, prosím zvol si jiné jméno!' + invalid_name_case: 'Měl bys použít jméno %valid, ne jméno %invalid.' + quick_command: 'Použil jsi příkaz příliš rychle. Prosím, připoj se znovu a chvíli čekej před použitím dalšího příkazu.' + +# Email +email: + add_email_request: '&cPřidej prosím svůj email pomocí : /email add TvůjEmail TvůjEmail' + usage_email_add: '&fPoužij: /email add ' + usage_email_change: '&fPoužij: /email change ' + new_email_invalid: '[AuthMe] Nový email je chybně zadán!' + old_email_invalid: '[AuthMe] Starý email je chybně zadán!' + invalid: '[AuthMe] Nesprávný email' + added: '[AuthMe] Email přidán!' + add_not_allowed: '&cPřidávání emailu není povoleno!' + request_confirmation: '[AuthMe] Potvrď prosím svůj email!' + changed: '[AuthMe] Email změněn!' + change_not_allowed: '&cZměna emailu není povolena!' + email_show: '&2Tvůj aktuální email je: &f%email' + no_email_for_account: '&2K tomuto účtu nemáš přidanou žádnou emailovou adresu.' + already_used: '&4Tato emailová adresa je již používána' + incomplete_settings: 'Chyba: Chybí některé důležité informace pro odeslání emailu. Kontaktuj prosím admina.' + send_failure: 'Email nemohl být odeslán. Kontaktuj prosím admina.' + change_password_expired: 'Nemůžeš si změnit heslo pomocí toho příkazu.' + email_cooldown_error: '&cEmail už byl nedávno odeslán. Musíš čekat ještě %time před odesláním nového.' + +# Password recovery by email +recovery: + forgot_password_hint: '&cZapomněl jsi heslo? Napiš: /email recovery ' + command_usage: '&fPoužij: /email recovery ' + email_sent: '[AuthMe] Email pro obnovení hesla odeslán!' + code: + code_sent: 'Kód pro obnovení hesla byl odeslán na váš email.' + incorrect: 'Obnovovací kód není správný! Počet zbývajících pokusů: %count.' + tries_exceeded: 'Překročil(a) jsi počet pokusů pro vložení kódu. Použij "/email recovery [email]" pro vygenerování nového' + correct: 'Obnovovací kód zadán správně!' + change_password: 'Prosím, použij příkaz /email setpassword pro změnu hesla okamžitě.' + +# Captcha +captcha: + usage_captcha: '&cPoužij: /captcha %captcha_code' + wrong_captcha: '&cŠpatné opsána Captcha, použij prosím: /captcha %captcha_code' + valid_captcha: '&cCaptcha je zadána v pořádku!' + captcha_for_registration: 'Před registrací je nutné správně opsat captchu. Prosím použij příkaz: /captcha %captcha_code' + register_captcha_valid: '&2Captcha je v pořádku! Nyní se můžeš zaregistrovat příkazem /register' + +# Verification code +verification: + code_required: '&3Tento příkaz vyžaduje ověření emailu! Zkontroluj svou mailovou schránku a postupuj dle instrukcí' + command_usage: '&cPoužití: /verification ' + incorrect_code: '&cNesprávný kód, prosím napiš "/verification " do chatu, místo použij kód co ti přišel emailem' + success: '&2Tvoje identita ověřena! V rámci své relace můžeš nyní používat všechny příkazy.' + already_verified: '&2Již můžeš používat příkazy ve své relaci bez omezení.' + code_expired: '&3Tvůj kód vypršel. Použij další citlivý příkaz pro získání nového kódu.' + email_needed: '&3Pro ověření tvé identity potřebujeme, abys ke svému účtu přidal svůj email.' + +# Time units +time: + second: 'sekundy' + seconds: 'sekund' + minute: 'minuty' + minutes: 'minut' + hour: 'hodiny' + hours: 'hodin' + day: 'dny' + days: 'dnu' + +# Two-factor authentication +two_factor: + code_created: '&2Tvůj tajný kód je %code. Můžeš ho oskenovat zde %url' + confirmation_required: 'Prosím, potvrď svůj kód příkazem /2fa confirm ' + code_required: 'Prosím, zadej kód dvoufaktorového ověření příkazem /2fa code ' + already_enabled: 'Dvoufaktorové ověření je již zapnuté pro tomto účtu.' + enable_error_no_code: 'Pro tvůj účet nebyl vygenerován žádný 2FA klíč, a nebo již vypršel. Prosím vygeneruj si ho pomocí /2fa add' + enable_success: 'Dvoufaktorové ověření bylo úspěšně nastaveno pro tvůj účet' + enable_error_wrong_code: 'Nesprávný kód, nebo kód vypršel. Prosím spusť příkaz /2fa add' + not_enabled_error: 'Dvoufaktorové ověření není zapnuté na tvém účtu. Můžeš ho zapnout použitím příkazu /2fa add' + removed_success: 'Dvoufaktorovka byla úspěšně odebrána z tvého účtu' + invalid_code: 'Nesprávný kód!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aAutomatické přihlášení Bedrock úspěšné!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aPři přihlášení jste uvízli v portálu.' + fix_underground: '&aPři přihlášení jste uvízli pod zemí.' + cannot_fix_underground: '&aPři přihlášení jste uvízli pod zemí, ale nemůžeme to opravit.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cByli jste odpojeni kvůli dvojímu přihlášení.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_de.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_de.yml new file mode 100644 index 0000000000..433e42a706 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_de.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cRegistrierungen sind deaktiviert' + name_taken: '&cDieser Benutzername ist schon vergeben' + register_request: '&3Bitte registriere dich mit "/register "' + command_usage: '&cBenutze: /register ' + reg_only: '&4Nur für registrierte Spieler! Bitte besuche https://example.com um dich zu registrieren.' + success: '&2Erfolgreich registriert!' + kicked_admin_registered: 'Ein Administrator hat dich bereits registriert; bitte logge dich erneut ein.' + +# Password errors on registration +password: + match_error: '&cPasswörter stimmen nicht überein!' + name_in_password: '&cDu kannst deinen Namen nicht als Passwort verwenden!' + unsafe_password: '&cPasswort unsicher! Bitte wähle ein anderes.' + forbidden_characters: '&4Dein Passwort enthält unerlaubte Zeichen. Zulässige Zeichen: %valid_chars' + wrong_length: '&cDein Passwort ist zu kurz oder zu lang!' + pwned_password: '&cIhr gewähltes Passwort ist nicht sicher. Es wurde bereits %pwned_count Mal verwendet! Bitte verwenden Sie ein starkes Passwort...' + +# Login +login: + command_usage: '&cBenutze: /login ' + wrong_password: '&cFalsches Passwort' + success: '&2Successful login!' + login_request: '&cBitte logge dich ein mit "/login "' + timeout_error: '&4Zeitüberschreitung beim Login' + +# Errors +error: + denied_command: '&cUm diesen Befehl zu nutzen musst du authentifiziert sein!' + denied_chat: '&cDu musst eingeloggt sein, um chatten zu können!' + unregistered_user: '&cBenutzername nicht registriert!' + not_logged_in: '&cNicht eingeloggt!' + no_permission: '&4Du hast keine Rechte, um diese Aktion auszuführen!' + unexpected_error: '&4Ein Fehler ist aufgetreten. Bitte kontaktiere einen Administrator.' + max_registration: '&cDu hast die maximale Anzahl an Accounts erreicht (%reg_count/%max_acc %reg_names).' + logged_in: '&cBereits eingeloggt!' + kick_for_vip: '&3Ein VIP-Spieler hat den vollen Server betreten!' + kick_unresolved_hostname: '&cEin Fehler ist aufgetreten: nicht auflösbarer Spieler-Hostname!' + tempban_max_logins: '&cDu bist wegen zu vielen fehlgeschlagenen Login-Versuchen temporär gebannt!' + +# AntiBot +antibot: + kick_antibot: 'AntiBotMod ist aktiviert! Bitte warte einige Minuten, bevor du dich mit dem Server verbindest.' + auto_enabled: '&4[AntiBotService] AntiBotMod wurde aufgrund hoher Netzauslastung automatisch aktiviert!' + auto_disabled: '&2[AntiBotService] AntiBotMod wurde nach %m Minuten deaktiviert, hoffentlich ist die Invasion vorbei.' + +# Unregister +unregister: + success: '&cBenutzerkonto erfolgreich gelöscht!' + command_usage: '&cBenutze: /unregister ' + +# Other messages +misc: + account_not_activated: '&cDein Account wurde noch nicht aktiviert. Bitte prüfe deine E-Mails!' + not_activated: '&cKonto nicht aktiviert, bitte registrieren und aktivieren Sie es, bevor Sie es erneut versuchen.' + password_changed: '&2Passwort geändert!' + logout: '&2Erfolgreich ausgeloggt' + reload: '&2Konfiguration und Datenbank wurden erfolgreich neu geladen.' + usage_change_password: '&cBenutze: /changepassword ' + accounts_owned_self: 'Du besitzt %count Accounts:' + accounts_owned_other: 'Der Spieler %name hat %count Accounts:' + +# Session messages +session: + valid_session: '&2Erfolgreich eingeloggt!' + invalid_session: '&cUngültige Session. Bitte starte das Spiel neu oder warte, bis die Session abgelaufen ist.' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Ein Spieler mit derselben IP ist bereits online!' + same_nick_online: '&4Jemand mit diesem Namen spielt bereits auf dem Server!' + name_length: '&4Dein Nickname ist zu kurz oder zu lang.' + characters_in_name: '&4Dein Nickname enthält unerlaubte Zeichen. Zulässige Zeichen: %valid_chars' + kick_full_server: '&4Der Server ist momentan voll, Sorry!' + country_banned: '&4Dein Land ist gesperrt!' + not_owner_error: 'Du bist nicht der Besitzer dieses Accounts. Bitte wähle einen anderen Namen!' + invalid_name_case: 'Dein registrierter Benutzername ist &2%valid&f - nicht &4%invalid&f.' + quick_command: 'Du hast einen Befehl zu schnell benutzt! Bitte trete dem Server erneut bei und warte, bevor du irgendeinen Befehl nutzt.' + +# Email +email: + add_email_request: '&3Bitte hinterlege deine E-Mail-Adresse: /email add ' + usage_email_add: '&cBenutze: /email add ' + usage_email_change: '&cBenutze: /email change ' + new_email_invalid: '&cDie neue E-Mail ist ungültig!' + old_email_invalid: '&cDie alte E-Mail ist ungültig!' + invalid: '&cUngültige E-Mail!' + added: '&2E-Mail hinzugefügt!' + add_not_allowed: '&cHinzufügen einer E-Mail nicht gestattet!' + request_confirmation: '&cBitte bestätige deine E-Mail!' + changed: '&2E-Mail aktualisiert!' + change_not_allowed: '&cBearbeiten einer E-Mail nicht gestattet!' + email_show: '&2Deine aktuelle E-Mail-Adresse ist: &f%email' + no_email_for_account: '&2Du hast zur Zeit keine E-Mail-Adresse für deinen Account hinterlegt.' + already_used: '&4Diese E-Mail-Adresse wird bereits genutzt.' + incomplete_settings: 'Fehler: Es wurden nicht alle notwendigen Einstellungen vorgenommen, um E-Mails zu senden. Bitte kontaktiere einen Administrator.' + send_failure: 'Die E-Mail konnte nicht gesendet werden. Bitte kontaktiere einen Administrator.' + change_password_expired: 'Mit diesem Befehl kannst du dein Passwort nicht mehr ändern.' + email_cooldown_error: '&cEine E-Mail wurde erst kürzlich versendet. Du musst %time warten, bevor du eine neue anfordern kannst.' + +# Password recovery by email +recovery: + forgot_password_hint: '&3Passwort vergessen? Nutze "/email recovery " für ein neues Passwort' + command_usage: '&cBenutze: /email recovery ' + email_sent: '&2Wiederherstellungs-E-Mail wurde gesendet!' + code: + code_sent: 'Ein Wiederherstellungscode zum Zurücksetzen deines Passworts wurde an deine E-Mail-Adresse geschickt.' + incorrect: 'Der Wiederherstellungscode stimmt nicht! Du hast noch %count Versuche. Nutze /email recovery [email] um einen neuen zu generieren.' + tries_exceeded: 'Du hast die maximale Anzahl an Versuchen zur Eingabe des Wiederherstellungscodes überschritten. Benutze "/email recovery [email]" um einen neuen zu generieren.' + correct: 'Der eingegebene Wiederherstellungscode ist richtig!' + change_password: 'Benutze bitte den Befehl /email setpassword um dein Passwort umgehend zu ändern.' + +# Captcha +captcha: + usage_captcha: '&3Um dich einzuloggen, tippe dieses Captcha so ein: /captcha %captcha_code' + wrong_captcha: '&cFalsches Captcha, bitte nutze: /captcha %captcha_code' + valid_captcha: '&2Das Captcha ist korrekt!' + captcha_for_registration: 'Um dich zu registrieren, musst du erst ein Captcha lösen, bitte nutze den Befehl: /captcha %captcha_code' + register_captcha_valid: '&2Captcha richtig! Du kannst dich jetzt registrieren mit: /register' + +# Verification code +verification: + code_required: '&3Dieser Befehl ist sensibel und erfordert eine E-Mail-Verifizierung! Überprüfe deinen Posteingang und folge den Anweisungen der E-Mail.' + command_usage: '&cBenutze: /verification ' + incorrect_code: '&Falscher Code, bitte gib "/verification " in den Chat ein, und verwende den Code, den Du per E-Mail erhalten hast.' + success: '&2Deine Identität wurde verifiziert! Du kannst nun alle Befehle innerhalb der aktuellen Sitzung ausführen!' + already_verified: '&2Du kannst bereits jeden sensiblen Befehl innerhalb der aktuellen Sitzung ausführen!' + code_expired: '&3Dein Code ist abgelaufen! Führe einen weiteren sensiblen Befehl aus, um einen neuen Code zu erhalten!' + email_needed: '&3Um deine Identität zu überprüfen, musst Du eine E-Mail-Adresse mit deinem Konto verknüpfen!' + +# Time units +time: + second: 'Sekunde' + seconds: 'Sekunden' + minute: 'Minute' + minutes: 'Minuten' + hour: 'Stunde' + hours: 'Stunden' + day: 'Tag' + days: 'Tage' + +# Two-factor authentication +two_factor: + code_created: '&2Dein geheimer Code ist %code. Du kannst ihn hier abfragen: %url' + confirmation_required: 'Bitte bestätige deinen Code mit /2fa confirm ' + code_required: 'Bitte übermittle deinen Zwei-Faktor-Authentifizierungscode mit /2fa code ' + already_enabled: 'Die Zwei-Faktor-Authentifizierung ist für dein Konto bereits aktiviert!' + enable_error_no_code: 'Es wurde kein 2FA-Schlüssel für dich generiert oder er ist abgelaufen. Bitte nutze /2fa add' + enable_success: 'Zwei-Faktor-Authentifizierung für dein Konto erfolgreich aktiviert' + enable_error_wrong_code: 'Code falsch oder abgelaufen. Bitte nutze /2fa add' + not_enabled_error: 'Die Zwei-Faktor-Authentifizierung ist für dein Konto nicht aktiviert. Benutze /2fa add' + removed_success: 'Die Zwei-Faktor-Authentifizierung wurde erfolgreich von deinem Konto entfernt' + invalid_code: 'Ungültiger Code!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aBedrock Auto-Login erfolgreich!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aSie stecken während des Logins im Portal fest.' + fix_underground: '&aSie stecken während des Logins unter der Erde fest.' + cannot_fix_underground: '&aSie stecken während des Logins unter der Erde fest, aber wir können es nicht beheben.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cSie wurden wegen doppeltem Login getrennt.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_en.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_en.yml new file mode 100644 index 0000000000..40ed034b44 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_en.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cIn-game registration is disabled!' + name_taken: '&cYou already have registered this username!' + register_request: '&3Please, register to the server with the command: /register ' + command_usage: '&cUsage: /register ' + reg_only: '&4Only registered users can join the server! Please visit https://example.com to register yourself!' + success: '&2Successfully registered!' + kicked_admin_registered: 'An admin just registered you; please log in again.' + +# Password errors on registration +password: + match_error: '&cPasswords didn''t match, check them again!' + name_in_password: '&cYou can''t use your name as password, please choose another one...' + unsafe_password: '&cThe chosen password isn''t safe, please choose another one...' + forbidden_characters: '&4Your password contains illegal characters. Allowed chars: %valid_chars' + wrong_length: '&cYour password is too short or too long! Please try with another one!' + pwned_password: '&cYour chosen password is not secure. It was used %pwned_count times already! Please use a strong password...' + +# Login +login: + command_usage: '&cUsage: /login ' + wrong_password: '&cWrong password!' + success: '&2Successful login!' + login_request: '&cPlease, login with the command: /login ' + timeout_error: '&4Login timeout exceeded, you have been kicked from the server, please try again!' + +# Errors +error: + denied_command: '&cIn order to use this command you must be authenticated!' + denied_chat: '&cIn order to chat you must be authenticated!' + unregistered_user: '&cThis user isn''t registered!' + not_logged_in: '&cYou''re not logged in!' + no_permission: '&4You don''t have the permission to perform this action!' + unexpected_error: '&4An unexpected error occurred, please contact an administrator!' + max_registration: '&cYou have exceeded the maximum number of registrations (%reg_count/%max_acc %reg_names) for your connection!' + logged_in: '&cYou''re already logged in!' + kick_for_vip: '&3A VIP player has joined the server when it was full!' + kick_unresolved_hostname: '&cAn error occurred: unresolved player hostname!' + tempban_max_logins: '&cYou have been temporarily banned for failing to log in too many times.' + +# AntiBot +antibot: + kick_antibot: 'AntiBot protection mode is enabled! You have to wait some minutes before joining the server.' + auto_enabled: '&4[AntiBotService] AntiBot enabled due to the huge number of connections!' + auto_disabled: '&2[AntiBotService] AntiBot disabled after %m minutes!' + +# Unregister +unregister: + success: '&cSuccessfully unregistered!' + command_usage: '&cUsage: /unregister ' + +# Other messages +misc: + account_not_activated: '&cYour account isn''t activated yet, please check your emails!' + not_activated: '&cAccount not activated, please register and activate it before trying again.' + password_changed: '&2Password changed successfully!' + logout: '&2Logged out successfully!' + reload: '&2Configuration and database have been reloaded correctly!' + usage_change_password: '&cUsage: /changepassword ' + accounts_owned_self: 'You own %count accounts:' + accounts_owned_other: 'The player %name has %count accounts:' + +# Session messages +session: + invalid_session: '&cYour IP has been changed and your session data has expired!' + valid_session: '&2Logged-in due to Session Reconnection.' + +# Error messages when joining +on_join_validation: + same_ip_online: 'A player with the same IP is already in game!' + same_nick_online: '&4The same username is already playing on the server!' + name_length: '&4Your username is either too short or too long!' + characters_in_name: '&4Your username contains illegal characters. Allowed chars: %valid_chars' + kick_full_server: '&4The server is full, try again later!' + country_banned: '&4Your country is banned from this server!' + not_owner_error: 'You are not the owner of this account. Please choose another name!' + invalid_name_case: 'You should join using username %valid, not %invalid.' + quick_command: 'You used a command too fast! Please, join the server again and wait more before using any command.' + +# Email +email: + add_email_request: '&3Please add your email to your account with the command: /email add ' + usage_email_add: '&cUsage: /email add ' + usage_email_change: '&cUsage: /email change ' + new_email_invalid: '&cInvalid new email, try again!' + old_email_invalid: '&cInvalid old email, try again!' + invalid: '&cInvalid email address, try again!' + added: '&2Email address successfully added to your account!' + add_not_allowed: '&cAdding email was not allowed.' + request_confirmation: '&cPlease confirm your email address!' + changed: '&2Email address changed correctly!' + change_not_allowed: '&cChanging email was not allowed.' + email_show: '&2Your current email address is: &f%email' + no_email_for_account: '&2You currently don''t have email address associated with this account.' + already_used: '&4The email address is already being used' + incomplete_settings: 'Error: not all required settings are set for sending emails. Please contact an admin.' + send_failure: 'The email could not be sent. Please contact an administrator.' + change_password_expired: 'You cannot change your password using this command anymore.' + email_cooldown_error: '&cAn email was already sent recently. You must wait %time before you can send a new one.' + +# Password recovery by email +recovery: + forgot_password_hint: '&3Forgot your password? Please use the command: /email recovery ' + command_usage: '&cUsage: /email recovery ' + email_sent: '&2Recovery email sent successfully! Please check your email inbox!' + code: + code_sent: 'A recovery code to reset your password has been sent to your email.' + incorrect: 'The recovery code is not correct! You have %count tries remaining.' + tries_exceeded: 'You have exceeded the maximum number attempts to enter the recovery code. Use "/email recovery [email]" to generate a new one.' + correct: 'Recovery code entered correctly!' + change_password: 'Please use the command /email setpassword to change your password immediately.' + +# Captcha +captcha: + usage_captcha: '&3To log in you have to solve a captcha code, please use the command: /captcha %captcha_code' + wrong_captcha: '&cWrong captcha, please type "/captcha %captcha_code" into the chat!' + valid_captcha: '&2Captcha code solved correctly!' + captcha_for_registration: 'To register you have to solve a captcha first, please use the command: /captcha %captcha_code' + register_captcha_valid: '&2Valid captcha! You may now register with /register' + +# Verification code +verification: + code_required: '&3This command is sensitive and requires an email verification! Check your inbox and follow the email''s instructions.' + command_usage: '&cUsage: /verification ' + incorrect_code: '&cIncorrect code, please type "/verification " into the chat, using the code you received by email' + success: '&2Your identity has been verified! You can now execute all commands within the current session!' + already_verified: '&2You can already execute every sensitive command within the current session!' + code_expired: '&3Your code has expired! Execute another sensitive command to get a new code!' + email_needed: '&3To verify your identity you need to link an email address with your account!!' + +# Time units +time: + second: 'second' + seconds: 'seconds' + minute: 'minute' + minutes: 'minutes' + hour: 'hour' + hours: 'hours' + day: 'day' + days: 'days' + +# Two-factor authentication +two_factor: + code_created: '&2Your secret code is %code. You can scan it from here %url' + confirmation_required: 'Please confirm your code with /2fa confirm ' + code_required: 'Please submit your two-factor authentication code with /2fa code ' + already_enabled: 'Two-factor authentication is already enabled for your account!' + enable_error_no_code: 'No 2fa key has been generated for you or it has expired. Please run /2fa add' + enable_success: 'Successfully enabled two-factor authentication for your account' + enable_error_wrong_code: 'Wrong code or code has expired. Please run /2fa add' + not_enabled_error: 'Two-factor authentication is not enabled for your account. Run /2fa add' + removed_success: 'Successfully removed two-factor auth from your account' + invalid_code: 'Invalid code!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aBedrock auto login success!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aYou are stuck in portal during login.' + fix_underground: '&aYou are stuck underground during login.' + cannot_fix_underground: '&aYou are stuck underground during login, but we cant fix it.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cYou have been disconnected due to doubled login.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_eo.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_eo.yml new file mode 100644 index 0000000000..c8623f35c1 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_eo.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cEn-ludo registriĝo estas malebligita!' + name_taken: '&cVi jam registris tiun uzantnomon!' + register_request: '&3Bonvolu registri al la servilo per la komando: /register ' + command_usage: '&cUzado: /register ' + reg_only: '&4Nur registritaj uzantoj povas aliĝi la servilon! Bonvolu viziti https://example.com registri vin mem!' + success: '&2Sukcese registris!' + kicked_admin_registered: 'Administranto ĵus registrita vin; bonvolu ensaluti denove' + +# Password errors on registration +password: + match_error: '&cLa pasvortoj ne kongruas, kontrolu ilin!' + name_in_password: '&cVi ne povas uzi vian nomon kiel pasvorto, bonvolu elekti alian...' + unsafe_password: '&cLa elektita pasvorto estas danĝere, bonvolu elekti alian...' + forbidden_characters: '&4Via pasvorto enhavas kontraŭleĝan karakteroj. Permesita signoj: %valid_chars' + wrong_length: '&cVia pasvorto estas tro mallonga aŭ tro longa! Bonvolu provi alian pasvorton!' + pwned_password: '&cVia elektita pasvorto ne estas sekura. Ĝi estis uzita %pwned_count fojojn jam! Bonvolu uzi fortan pasvorton...' + +# Login +login: + command_usage: '&cUzado: /login ' + wrong_password: '&cErara pasvorto!' + success: '&2Sukcesa ensaluto!' + login_request: '&cBonvolu ensaluti per la komando: /login ' + timeout_error: '&4Salutnomo tempolimo superis, vi estis piedbatita el la servilo, bonvolu provi denove!' + +# Errors +error: + denied_command: '&cPor uzi ĉi komando vi devas esti legalizita!' + denied_chat: '&cPor babili vi devas esti legalizita!' + unregistered_user: '&cTiu uzanto ne estas registrita!' + not_logged_in: '&cVi ne estas ensalutita!' + no_permission: '&4Vi ne havas la permeson por fari ĉi tiun funkcion!' + unexpected_error: '&4Neatendita eraro, bonvolu kontakti administranto!' + max_registration: 'Vi superis la maksimuman nombron de enregistroj (%reg_count/%max_acc %reg_names) pro via ligo!' + logged_in: '&cVi jam estas ensalutinta!' + kick_for_vip: '&3VIP ludanto aliĝis al la servilo kiam ĝi pleniĝis!' + kick_unresolved_hostname: '&cEraro okazis: neatingebla ludanta gastiga nomo!' + tempban_max_logins: '&cVi estis portempe malpermesita por ne ensaluti tro multajn fojojn.' + +# AntiBot +antibot: + kick_antibot: 'KontraŭRoboto protekto modon estas ŝaltita! Vi devas atendi kelkajn minutojn antaŭ kunigi al la servilo.' + auto_enabled: '&4[KontraŭRobotoServo] KontraŭRoboto ŝaltita pro la grandega nombro de konektoj!' + auto_disabled: '&2[KontraŭRobotoServo] KontraŭRoboto malebligita post %m minutoj!' + +# Unregister +unregister: + success: '&cSukcese neregistritajn!' + command_usage: '&cUzado: /unregister ' + +# Other messages +misc: + account_not_activated: '&cVia konto ne aktivigis tamen, bonvolu kontroli viajn retpoŝtojn!' + not_activated: '&cKonto ne aktivigita, bonvolu registriĝi kaj aktivigi ĝin antaŭ ol provi denove.' + password_changed: '&2Pasvorto sukcese ŝanĝita!' + logout: '&2Elsalutita sukcese!' + reload: '&2Agordo kaj datumbazo estis larditaj korekte!' + usage_change_password: '&cUzado: /changepassword ' + accounts_owned_self: 'Vi posedas %count kontoj:' + accounts_owned_other: 'La ludanto %name havas %count kontojn::' + +# Session messages +session: + valid_session: '&2Ensalutantojn pro Sesio Rekonektas.' + invalid_session: '&cVia IP estis ŝanĝita kaj via seanco datumoj finiĝis!' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Ludanto kun la sama IP jam estas en ludo!' + same_nick_online: '&4La sama uzantnomo estas jam ludas sur la servilo!' + name_length: '&4Via uzantnomo estas aŭ tro mallonga aŭ tro longa!' + characters_in_name: '&4Via uzantnomo enhavas kontraŭleĝan karakteroj. Permesita signoj: %valid_chars' + kick_full_server: '&4La servilo estas plena, reprovi poste!' + country_banned: '&4Via lando estas malpermesitaj de tiu servilo!' + not_owner_error: 'Vi ne estas la posedanto de tiu konto. Bonvolu elekti alian nomon!' + invalid_name_case: 'Vi devus aliĝi uzante uzantnomon %valid, ne %invalid.' + quick_command: 'Vi uzis komandon tro rapide! Bonvolu, re-aliĝi al la servilo kaj atendi pli longe antaŭ ol uzi iun ajn komandon.' + +# Email +email: + add_email_request: '&3Bonvolu aldoni vian retpoŝtan vian konton kun la komando: /email add ' + usage_email_add: '&cUzado: /email add ' + usage_email_change: '&cUzado: /email change ' + new_email_invalid: '&cNevalida nova retpoŝta, provu denove!' + old_email_invalid: '&cNevalida malnovaj retpoŝto, provu denove!' + invalid: '&cNevalida retadreso, provu denove!' + added: '&2Retpoŝtadreso sukcese aldonitaj al via konto!' + add_not_allowed: '&cAldoni retpoŝton ne estis permesita.' + request_confirmation: '&cBonvolu konfirmi vian retadreson!' + changed: '&2Retpoŝtadreso ŝanĝis ĝuste!' + change_not_allowed: '&cŜanĝi retpoŝton ne estis permesita.' + email_show: '&2Via nuna retadreso estas: &f%email' + no_email_for_account: '&2Vi aktuale ne havas retadreson asociita kun ĉi tiu konto.' + already_used: '&4La retpoŝto jam estas uzata' + incomplete_settings: 'Eraro: ne ĉiuj postulata agordoj estas metita por sendi retpoŝtojn. Bonvolu kontakti administranto.' + send_failure: 'La retpoŝto ne estis sendita. Bonvolu kontakti administranto.' + change_password_expired: 'Vi ne povas ŝanĝi vian pasvorton per tiu ĉi komando plu.' + email_cooldown_error: '&cRetmesaĝon jam sendita lastatempe. Vi devas atendi %time antaŭ vi povas sendi novan.' + +# Password recovery by email +recovery: + forgot_password_hint: '&3Ĉu vi forgesis vian pasvorton? Bonvolu uzi la komando: /email recovery ' + command_usage: '&cUzado: /email recovery ' + email_sent: '&2Reakiro retpoŝto sendita sukcese! Bonvolu kontroli vian retpoŝton enirkesto!' + code: + code_sent: 'Rekorda kodo restarigi vian pasvorton sendis al via retpoŝto.' + incorrect: 'La reakiro kodo estas ne korekti! Vi havas %count provoj restas.' + tries_exceeded: 'Vi superis la maksimuman nombron provas eniri la reakiro kodo. Uzo "/email recovery [retpoŝto]" por generi novan.' + correct: 'Reakiro kodo eniris ĝuste!' + change_password: 'Bonvolu uzi la komando /email setpassword ŝanĝi vian pasvorton tuj.' + +# Captcha +captcha: + usage_captcha: '&3Ensaluti vi devas solvi captcha kodo, bonvolu uzi la komando: /captcha %captcha_code' + wrong_captcha: '&cMalĝusta captcha, bonvolu tajpi "/captcha %captcha_code" en la babilejo!' + valid_captcha: '&2Captcha kodo solvita ĝuste!' + captcha_for_registration: 'Por registri vi devas unue solvi kapĉon, bonvolu uzi la komandon: /captcha %captcha_code' + register_captcha_valid: '&2Valida kapĉo! Vi nun povas registri per /register' + +# Verification code +verification: + code_required: '&3Tiu ĉi komando estas sentema kaj postulas retpoŝtan kontrolon! Kontrolu vian leterkeston kaj sekvu la instrukciojn en la retpoŝto.' + command_usage: '&cUzado: /verification ' + incorrect_code: '&cMalĝusta kodo, bonvolu tajpi "/verification " en la babilejo, uzante la kodon, kiun vi ricevis per retpoŝto' + success: '&2Via identeco estis kontrolita! Vi nun povas ekzekuti ĉiujn komandojn dum la aktuala sesio!' + already_verified: '&2Vi jam povas ekzekuti ĉiujn sentemajn komandojn dum la aktuala sesio!' + code_expired: '&3Via kodo eksvalidiĝis! Ekzekutu alian senteman komandon por ricevi novan kodon!' + email_needed: '&3Por kontroli vian identecon vi devas ligi retpoŝtan adreson kun via konto!' + +# Time units +time: + second: 'sekundo' + seconds: 'sekundoj' + minute: 'minuto' + minutes: 'minutoj' + hour: 'horo' + hours: 'horoj' + day: 'tago' + days: 'tagoj' + +# Two-factor authentication +two_factor: + code_created: '&2Via sekreta kodo estas %code. Vi povas skani ĝin de tie %url' + confirmation_required: 'Bonvolu konfirmi vian kodon per /2fa confirm ' + code_required: 'Bonvolu sendi vian du-faktoran aŭtentikigan kodon per /2fa code ' + already_enabled: 'Du-faktora aŭtentikigo jam estas ebligita por via konto!' + enable_error_no_code: 'Neniu 2fa ŝlosilo estis generita por vi aŭ ĝi eksvalidiĝis. Bonvolu kuri /2fa add' + enable_success: 'Sukcese ebligis du-faktoran aŭtentikigon por via konto' + enable_error_wrong_code: 'Malĝusta kodo aŭ kodo eksvalidiĝis. Bonvolu kuri /2fa add' + not_enabled_error: 'Du-faktora aŭtentikigo ne estas ebligita por via konto. Kuru /2fa add' + removed_success: 'Sukcese forigis du-faktoran aŭtentikigon de via konto' + invalid_code: 'Nevalida kodo!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aSukcesa Bedrock-aŭtomata ensaluto!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aVi estas blokita en portalo dum ensaluto.' + fix_underground: '&aVi estas blokita subtere dum ensaluto.' + cannot_fix_underground: '&aVi estas blokita subtere dum ensaluto, sed ni ne povas ripari ĝin.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cVi estis malkonektita pro duobla ensaluto.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_es.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_es.yml new file mode 100644 index 0000000000..fbded288d6 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_es.yml @@ -0,0 +1,174 @@ +# This file must be in ANSI if win, or UTF-8 if linux. +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cEl registro está desactivado' + name_taken: '&cUsuario ya registrado' + register_request: '&cPor favor, regístrate con "/register ' + command_usage: '&cUso: /register Contraseña ConfirmarContraseña' + reg_only: '&f¡Sólo para jugadores registrados! Por favor visita https://www.example.com/ para registrarte' + success: '&c¡Registrado correctamente!' + kicked_admin_registered: 'Un administrador te acaba de registrar; entra en la cuenta de nuevo' + +# Password errors on registration +password: + match_error: '&fLas contraseñas no son iguales' + name_in_password: '&cNo puedes utilizar tu nombre como contraseña. Por favor, elija otra...' + unsafe_password: '&cLa contraseña elegida no es segura, por favor elija otra...' + forbidden_characters: '&cTu contraseña tiene carácteres no admitidos, los cuales son: %valid_chars' + wrong_length: '&fTu contraseña es muy larga o muy corta' + pwned_password: '&cLa contraseña elegida no es segura. ¡Se ha usado %pwned_count veces ya! Por favor, use una contraseña fuerte...' + +# Login +login: + command_usage: '&cUso: /login contraseña' + wrong_password: '&cContraseña incorrecta' + success: '&c¡Sesión iniciada!' + login_request: '&cInicia sesión con "/login contraseña"' + timeout_error: '&fTiempo de espera para inicio de sesión excedido' + +# Errors +error: + denied_command: '&c¡Para utilizar este comando debes iniciar sesión!' + denied_chat: '&c¡Para poder hablar en el chat debes iniciar sesión!' + unregistered_user: '&cUsuario no registrado' + not_logged_in: '&c¡No has iniciado sesión!' + no_permission: '&cNo tienes permiso' + unexpected_error: '&fHa ocurrido un error. Por favor contacta al administrador.' + max_registration: '&fHas excedido la cantidad máxima de registros para tu cuenta' + logged_in: '&c¡Ya has iniciado sesión!' + kick_for_vip: '&c¡Un jugador VIP ha ingresado al servidor lleno!' + kick_unresolved_hostname: '&cSe produjo un error: nombre de host del jugador no resuelto!' + tempban_max_logins: '&cHas sido expulsado temporalmente por intentar iniciar sesión demasiadas veces.' + +# AntiBot +antibot: + kick_antibot: '¡El modo de protección AntiBot está habilitado! Tienes que esperar varios minutos antes de entrar en el servidor.' + auto_enabled: '[AuthMe] AntiBotMod activado automáticamente debido a conexiones masivas!' + auto_disabled: '[AuthMe] AntiBotMod desactivado automáticamente después de %m minutos. Esperamos que haya terminado' + +# Unregister +unregister: + success: '&c¡Cuenta eliminada del registro!' + command_usage: '&cUso: /unregister contraseña' + +# Other messages +misc: + account_not_activated: '&fTu cuenta no está activada aún, ¡revisa tu correo!' + not_activated: '&cCuenta no activada, por favor regístrese y actívela antes de intentarlo de nuevo.' + password_changed: '&c¡Contraseña cambiada!' + logout: '&cDesconectado correctamente.' + reload: '&fLa configuración y la base de datos han sido recargados' + usage_change_password: '&fUso: /changepw contraseñaActual contraseñaNueva' + accounts_owned_self: 'Eres propietario de %count cuentas:' + accounts_owned_other: 'El jugador %name tiene %count cuentas:' + +# Session messages +session: + valid_session: '&cInicio de sesión' + invalid_session: '&fLos datos de sesión no corresponden. Por favor espera a terminar la sesión.' + +# Error messages when joining +on_join_validation: + same_ip_online: '¡Un jugador con la misma IP ya está en el juego!' + same_nick_online: '&fYa hay un usuario con ese nick conectado (posible error)' + name_length: '&cTu nombre de usuario es muy largo o muy corto.' + characters_in_name: '&cTu usuario tiene carácteres no admitidos, los cuales son: %valid_chars' + kick_full_server: '&c¡El servidor está lleno, lo sentimos!' + country_banned: '¡Tu país ha sido baneado de este servidor!' + not_owner_error: 'No eres el propietario de esta cuenta. ¡Por favor, elije otro nombre!' + invalid_name_case: 'Solo puedes unirte mediante el nombre de usuario %valid, no %invalid.' + quick_command: 'Has usado el comando demasiado rápido! Porfavor, entra al servidor de nuevo y espera un poco antes de usar cualquier comando.' + +# Email +email: + add_email_request: '&cPor favor agrega tu e-mail con: /email add tuEmail confirmarEmail' + usage_email_add: '&fUso: /email add ' + usage_email_change: '&fUso: /email change ' + new_email_invalid: '[AuthMe] Nuevo email inválido!' + old_email_invalid: '[AuthMe] Email anterior inválido!' + invalid: '[AuthMe] Email inválido' + added: '[AuthMe] Email agregado !' + add_not_allowed: '&cNo se permite añadir un Email' + request_confirmation: '[AuthMe] Confirma tu Email !' + changed: '[AuthMe] Email cambiado !' + change_not_allowed: '&cNo se permite el cambio de Email' + email_show: '&2Tu dirección de E-Mail actual es: &f%email' + no_email_for_account: '&2No tienes ningun E-Mail asociado en esta cuenta.' + already_used: '&4La dirección Email ya está siendo usada' + incomplete_settings: 'Error: no todos los ajustes necesarios se han configurado para poder enviar correos. Por favor, contacta con un administrador.' + send_failure: 'No se ha podido enviar el correo electrónico. Por favor, contacta con un administrador.' + change_password_expired: 'No puedes cambiar la contraseña utilizando este comando.' + email_cooldown_error: '&cEl correo ha sido enviado recientemente. Debes esperar %time antes de volver a enviar uno nuevo.' + +# Password recovery by email +recovery: + forgot_password_hint: '&c¿Olvidaste tu contraseña? Por favor usa /email recovery ' + command_usage: '&fUso: /email recovery ' + email_sent: '[AuthMe] Correo de recuperación enviado !' + code: + code_sent: 'El código de recuperación para recuperar tu contraseña se ha enviado a tu correo.' + incorrect: '¡El código de recuperación no es correcto! Usa "/email recovery [email]" para generar uno nuevo' + tries_exceeded: 'Has excedido el número máximo de intentos para introducir el código de recuperación. Escribe "/email recovery [tuEmail]" para generar uno nuevo.' + correct: '¡Código de recuperación introducido correctamente!' + change_password: 'Por favor usa el comando "/email setpassword " para cambiar tu contraseña inmediatamente.' + +# Captcha +captcha: + usage_captcha: '&cUso: /captcha %captcha_code' + wrong_captcha: '&cCaptcha incorrecto, por favor usa: /captcha %captcha_code' + valid_captcha: '&c¡Captcha ingresado correctamente!' + captcha_for_registration: 'Para registrarse primero debes resolver el captcha, por favor usa el comando: /captcha %captcha_code' + register_captcha_valid: '&2¡Captcha validado! Ahora puedes registrarte usando /register' + +# Verification code +verification: + code_required: '&3¡Este comando es privado y requiere una verificación por correo electrónico! Revisa tu bandeja de entrada y sigue las instrucciones del correo electrónico.' + command_usage: '&cUso: /verification ' + incorrect_code: '&cCódigo incorrecto, por favor escribe "/verification " en el chat, utilizando el código que has recibido por correo electrónico.' + success: '&2Tu identidad ha sido verificada! Ahora puedes ejecutar todos los comandos dentro de la sesión actual.' + already_verified: '&2¡Ya puedes ejecutar todos los comandos de seguridad dentro de la sesión actual!' + code_expired: '&3Tu código ha expirado! Ejecuta otra vez el comando de seguridad para obtener un nuevo código!' + email_needed: '&3¡Para verificar tu identidad necesitas añadir tu correo electrónico a tu cuenta!' + +# Time units +time: + second: 'segundo' + seconds: 'segundos' + minute: 'minuto' + minutes: 'minutos' + hour: 'hora' + hours: 'horas' + day: 'día' + days: 'días' + +# Two-factor authentication +two_factor: + code_created: '&2Tu código secreto es %code. Lo puedes escanear desde aquí %url' + confirmation_required: 'Por favor, confirma tu código con /2fa confirm ' + code_required: 'Por favor, envía tu código de atenticación de dos factores con /2fa code ' + already_enabled: '¡La autenticación de dos factores ha sido habilitada para tu cuenta!' + enable_error_no_code: 'No se ha generado ninguna clave o código 2fa o ha expirado. Por favor usa /2fa add' + enable_success: 'Se ha habilitado correctamente la autenticación de dos factores para tu cuenta' + enable_error_wrong_code: 'El código es incorrecto o ha expirado. Por favor usa /2fa add' + not_enabled_error: 'La autenticación de dos factores no está habilitada para tu cuenta. Por favor usa /2fa add' + removed_success: 'Se ha eliminado correctamente la autenticación de dos factores de tu cuenta' + invalid_code: '¡Código incorrecto!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&a¡Inicio de sesión automático de Bedrock exitoso!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aEstás atascado en el portal durante el inicio de sesión.' + fix_underground: '&aEstás atascado bajo tierra durante el inicio de sesión.' + cannot_fix_underground: '&aEstás atascado bajo tierra durante el inicio de sesión, pero no podemos solucionarlo.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cHas sido desconectado debido a un inicio de sesión doble.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_et.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_et.yml new file mode 100644 index 0000000000..8f940ed56b --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_et.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cMängusisene registreerimine on välja lülitatud!' + name_taken: '&cSee kasutaja on juba registreeritud!' + register_request: '&3Palun registreeri käsklusega: /register ' + command_usage: '&cKasutus: /register ' + reg_only: '&4Vaid registreeritud mängijad saavad serveriga liituda! Enda kasutaja registreerimiseks külasta https://example.com!' + success: '&2Edukalt registreeritud!' + kicked_admin_registered: 'Administraator registreeris su kasutaja, palun logi uuesti sisse.' + +# Password errors on registration +password: + match_error: '&cParoolid ei kattu, palun proovi uuesti!' + name_in_password: '&cSa ei saa oma kasutajanime paroolina kasutada, palun vali mõni teine parool.' + unsafe_password: '&cSee parool ei ole turvaline, palun vali mõni teine parool.' + forbidden_characters: '&4Sinu parool sisaldab keelatud tähemärke. Lubatud tähemärgid: %valid_chars' + wrong_length: '&cSinu parool on liiga pikk või lühike, palun vali mõni teine parool.' + pwned_password: '&cTeie valitud parool ei ole turvaline. Seda on kasutatud juba %pwned_count korda! Palun kasutage tugevat parooli...' + +# Login +login: + command_usage: '&cKasutus: /login ' + wrong_password: '&cVale parool!' + success: '&2Edukalt sisselogitud!' + login_request: '&cPalun logi sisse kasutades käsklust: /login ' + timeout_error: '&4Sisselogimiseks antud aeg on läbi ning sind on serverist välja visatud, palun proovi uuesti!' + +# Errors +error: + denied_command: '&cSelle käskluse kasutamiseks pead olema sisselogitud!' + denied_chat: '&cVestlemiseks pead olema sisselogitud!' + unregistered_user: '&cSee kasutaja ei ole registreeritud!' + not_logged_in: '&cSa ei ole sisselogitud!' + no_permission: '&4Sul puudub selle käskluse kasutamiseks luba.' + unexpected_error: '&4Esines ootamatu tõrge, palun teavita administraatorit!' + max_registration: '&cSinu IP-aadressile on registreeritud liiga palju kasutajaid! (%reg_count/%max_acc %reg_names)' + logged_in: '&cSa oled juba sisselogitud!' + kick_for_vip: '&3VIP-mängija liitus serveriga ajal, mil see oli täis!' + kick_unresolved_hostname: '&cEsines tõrge: mängija hostinimi on lahendamata!' + tempban_max_logins: '&cSind on ajutiselt serverist blokeeritud, kuna sisestasid mitu korda vale parooli.' + +# AntiBot +antibot: + kick_antibot: 'AntiBot-kaitse sisse lülitatud! Pead ootama mõne minuti enne kui serveriga liituda saad.' + auto_enabled: '&4[AntiBotTeenus] AntiBot sisselülitatud!' + auto_disabled: '&2[AntiBotTeenus] AntiBot välja lülitatud peale %m minutit!' + +# Unregister +unregister: + success: '&cKasutaja edukalt kustutatud!' + command_usage: '&cKasutus: /unregister ' + +# Other messages +misc: + account_not_activated: '&cSinu konto ei ole veel aktiveeritud, kontrolli oma meili!' + not_activated: '&cKonto ei ole aktiveeritud, palun registreerige ja aktiveerige see enne uuesti proovimist.' + password_changed: '&2Parool edukalt vahetatud!' + logout: '&2Edukalt välja logitud!' + reload: '&2Seadistused ning andmebaas on edukalt taaslaaditud!' + usage_change_password: '&cKasutus: /changepassword ' + accounts_owned_self: 'Sa omad %count kontot:' + accounts_owned_other: 'Mängijal %name on %count kontot:' + +# Session messages +session: + valid_session: '&2Sisse logitud sessiooni jätkumise tõttu.' + invalid_session: '&cSinu IP-aadress muutus, seega sinu sessioon aegus!' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Sama IP-aadressiga mängija juba mängib!' + same_nick_online: '&4Sama kasutaja on juba serveriga ühendatud!' + name_length: '&4Sinu kasutajanimi on liiga pikk või liiga lühike!' + characters_in_name: '&4Sinu kasutajanimi sisaldab keelatud tähemärke. Lubatud tähemärgid: %valid_chars' + country_banned: '&4Sinu riigist ei ole võimalik sellesse serverisse ühenduda!' + not_owner_error: 'Sa ei ole selle konto omanik. Vali teine nimi!' + kick_full_server: '&4Server on täis, proovi hiljem uuesti!' + invalid_name_case: 'Sa peaksid liituma nimega %valid, mitte nimega %invalid.' + quick_command: 'Sa kasutasid käsklust liiga kiiresti! Palun liitu serveriga uuesti ning oota enne mõne käskluse kasutamist kauem.' + +# Email +email: + add_email_request: '&3Palun seo oma kasutajaga meiliaadress kasutades käsklust: /email add ' + usage_email_add: '&cKasutus: /email add ' + usage_email_change: '&cKasutus: /email change ' + new_email_invalid: '&cUus meiliaadress on sobimatu, proovi uuesti!' + old_email_invalid: '&cVana meiliaadress on sobimatu, proovi uuesti!' + invalid: '&cSobimatu meiliaadress, proovi uuesti!' + added: '&2Meiliaadress edukalt lisatud!' + add_not_allowed: '&cMeiliaadressi lisamine ei ole lubatud.' + request_confirmation: '&cPalun kinnita oma meiliaadress!' + changed: '&2Meiliaadress edukalt muudetud!' + change_not_allowed: '&cMeiliaadressi muutmine ei ole lubatud.' + email_show: '&2Sinu praegune meiliaadress on: &f%email' + no_email_for_account: '&2Selle kasutajaga ei ole seotud ühtegi meiliaadressi.' + already_used: '&4See meiliaadress on juba kasutuses!' + incomplete_settings: 'Viga: meili saatmiseks pole kõik vajalikud seaded seadistatud. Teata sellest administraatorit.' + send_failure: 'Meili ei õnnestunud saata. Teata sellest administraatorit.' + change_password_expired: 'Selle käsklusega ei saa sa enam parooli muuta.' + email_cooldown_error: '&cMeil on juba saadetud. Sa pead ootama %time enne kui saad küsida uue saatmist.' + +# Password recovery by email +recovery: + forgot_password_hint: '&3Unustasid oma parooli? Kasuta käsklust: /email recovery ' + command_usage: '&cKasutus: /email recovery ' + email_sent: '&2Konto taastamiseks vajalik meil saadetud! Vaata oma postkasti.' + code: + code_sent: 'Konto taastamise kood on saadetud!' + incorrect: 'Kood on vale! Sul on %count katset jäänud.' + tries_exceeded: 'Sul on katsed otsas. Kasuta käsklust "/email recovery [email]" uue koodi saamiseks.' + correct: 'Kood õigesti sisestatud!' + change_password: 'Palun kasuta parooli muutmiseks käsklust /email setpassword .' + +# Captcha +captcha: + usage_captcha: '&3Sisselogimiseks lahenda robotilõks käsklusega: /captcha %captcha_code' + wrong_captcha: '&cVale robotilõks, kasuta käsklust "/captcha %captcha_code"!' + valid_captcha: '&2Robotilõks lahendatud!' + captcha_for_registration: 'Registreerimiseks lahenda robotilõks kasutades käsklust: /captcha %captcha_code' + register_captcha_valid: '&2Robotilõks lahendatud! Võid nüüd registreerida kasutades käsklust /register' + +# Verification code +verification: + code_required: '&3See käsklus on ohtlik mistõttu saatsime sulle meili. Kontrolli oma meili ja järgi saadetud meili juhiseid.' + command_usage: '&cKasutus: /verification ' + incorrect_code: '&cVale kood, palun kasuta käsklust "/verification " koodiga, mille saatsime sulle meilile.' + success: '&2Sinu identiteet on kinnitatud! Sa saad nüüd praeguse sessiooni jal kasutada kõiki käsklusi.' + already_verified: '&2Sa juba saad kasutada kõiki ohtlikke käsklusi!' + code_expired: '&3Kood on aegunud! Kasuta mõnda ohtlikku käsklust, et saada uus kood!' + email_needed: '&3Konto kinnitamiseks pead siduma oma kontoga enda meiliaadressi!' + +# Time units +time: + second: 'sekund' + seconds: 'sekundit' + minute: 'minut' + minutes: 'minutit' + hour: 'tund' + hours: 'tundi' + day: 'päev' + days: 'päeva' + +# Two-factor authentication +two_factor: + code_created: '&2Sinu privaatne kood on %code. Sa saad selle skännida aadressil %url' + confirmation_required: 'Palun kinnita oma kaheastmeline autentimise kood käsklusega /2fa confirm ' + code_required: 'Palun sisesta kaheastmeline autentimise kood kasutades /2fa code ' + already_enabled: 'Kaheastmeline autentimine on juba sisselülitatud!' + enable_error_no_code: '2FA võtit ei ole genereeritud või on see aegunud. Kasuta käsklust /2fa add' + enable_success: 'Kaheastmeline autentimine edukalt sisselülitatud!' + enable_error_wrong_code: 'Vale kood või kood on aegunud. Kasuta käsklust /2fa add' + not_enabled_error: 'Kaheastmeline autentimine ei ole su kontol sisse lülitatud. Kasuta käsklust /2fa add' + removed_success: 'Sinu kontolt on edukalt eemaldatud kaheastmeline autentimine.' + invalid_code: 'Vale kood!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aBedrocki automaatne sisselogimine õnnestus!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aOlete sisselogimise ajal portaalis kinni.' + fix_underground: '&aOlete sisselogimise ajal maa all kinni.' + cannot_fix_underground: '&aOlete sisselogimise ajal maa all kinni, kuid me ei saa seda parandada.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cTeid on ühendatud lahti kahekordse sisselogimise tõttu.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_eu.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_eu.yml new file mode 100644 index 0000000000..8d581be6c7 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_eu.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cIzen ematea itxita dago!' + name_taken: '&cDagoeneko badago erabiltzaile izen hori duen norbait.' + register_request: '&cMesedez erabili "/register " izena emateko' + command_usage: '&cErabilera: /register ' + reg_only: '&fIzena eman duten jokalariak bakarrik sartu daitezke! Mesedez, eman izena https://example.com webgunean' + success: '&cEskerrik asko izena emateagatik!' + kicked_admin_registered: 'Administratzaile batek izena eman dizu, mesedez irten eta sartu zerbitzaritik.' + +# Password errors on registration +password: + match_error: '&fBi pasahitzak ez datoz bat' + name_in_password: '&cPasahitza eta erabiltzaile izena ezin dira berdinak izan. Mesedez, aukeratu beste pasahitz bat...' + unsafe_password: '&cAukeratutako pasahitza ez da segurua.Mesedez, aukeratu beste bat...' + forbidden_characters: '&4Pasahitzak ondorengo karaktereak bakarrik izan ditzake: %valid_chars' + wrong_length: '&fZure pasahitza motzegia edo luzeegia da' + pwned_password: '&cAukeratutako pasahitza ez da segurua. %pwned_count aldiz erabili da dagoeneko! Mesedez, erabili pasahitz sendo bat...' + +# Login +login: + command_usage: '&cErabilera: /login pasahitza' + wrong_password: '&cPasahitz okerra' + success: '&cSaioa hasi duzu!' + login_request: '&cMesedez erabili "/login pasahitza" saioa hasteko' + timeout_error: '&fDenbora gehiegi egon zara saioa hasi gabe.' + +# Errors +error: + denied_command: '&cHori egiteko ezinbestekoa da saioa hastea!' + denied_chat: '&cTxatean hitz egiteko ezinbestekoa da saioa hastea!' + unregistered_user: '&cErabiltzaileak ez du izena eman!' + not_logged_in: '&cEz duzu saioa hasi!' + no_permission: '&cEz daukazu baimenik' + unexpected_error: '&fUstekabeko errore bat gertatu da. Mesedez jarri harremanetan administratzaile batekin.' + max_registration: '&fKonexioko gehienezko erabiltzaile kopurua gainditu duzu (%reg_count/%max_acc %reg_names)' + logged_in: '&cDagoeneko saioa hasita duzu!' + kick_for_vip: '&cVIP erabiltzaile bati lekua egiteko kanporatua izan zara!' + kick_unresolved_hostname: '&cErrore bat geratu da: ezin izan da erabiltzailearen ostalari izena lortu!' + tempban_max_logins: '&cDenbora baterako kanporatua izan zara, pasahitza behin baino gehiagotan gaizki sartzeagatik.' + +# AntiBot +antibot: + kick_antibot: 'AntiBot babesa aktibatuta dago! Minutu batzuk itxaron beharko dituzu berriro sartu aurretik.' + auto_enabled: '&4[AntiBotZerbitzua] AntiBot babesa aktibatu da konexio kopurua handia delako!' + auto_disabled: '&2[AntiBotZerbitzua] AntiBot babesa desaktibatu da %m minutuz martxan egon ondoren!' + +# Unregister +unregister: + success: '&cZure kontua ezabatu duzu!' + command_usage: '&cErabilera: /unregister ' + +# Other messages +misc: + account_not_activated: '&fZure kontua aktibatu gabe dago. Mesedez, berretsi zure posta elektronikoa!' + not_activated: '&cKontua ez dago aktibatuta, mesedez erregistratu eta aktibatu berriro saiatu aurretik.' + password_changed: '&cPasahitza ondo aldatu duzu!' + logout: '&cSaioa itxi duzu' + reload: '&fEzarpenak eta datu-basea berrabiarazi dira' + usage_change_password: '&fErabilera: /changepassword ' + accounts_owned_self: '%count kontu dituzu:' + accounts_owned_other: '%name erabiltzaileak %count kontu ditu:' + +# Session messages +session: + valid_session: '&cSesioa mantendu eta beraz ez daukazu saioa hasi beharrik.' + invalid_session: '&cZure IP helbidea aldatu da, eta horregatik zure sesioa iraungi da!' + +# Error messages when joining +on_join_validation: + same_ip_online: 'IP helbide bera duen beste erabiltzaile bat dago zerbitzarian!' + same_nick_online: '&fErabiltzaile izen bera duen erabailtzaile bat dago zerbitzarian' + name_length: '&cZure erabiltzaile izena motzegia edo luzeegia da' + characters_in_name: '&cZure erabiltzaileak debekatutako karaktereak ditu. Ondorengoak bakarrik onartzen ditugu: %valid_chars' + kick_full_server: '&cZerbitzaria beteta dago. Sentitzen dugu!' + country_banned: 'Zure herrialdetik ezin zara zerbitzari honetan sartu' + not_owner_error: 'Kontu hau ez da zurea! Erabili beste bat!' + invalid_name_case: '%valid erabiltzailea erabili beharko duzu, ez %invalid.' + quick_command: 'Komandoa azkarregi exekutatu duzu! Mesdez, sartu zerbitzarian berriro eta itxaron pixka bat ezer idatzi aurretik.' + +# Email +email: + add_email_request: '&cMesedez, sartu zure posta elektroniko helbidea : /email add ' + usage_email_add: '&fErabilera: /email add ' + usage_email_change: '&fErabilera: /email change ' + new_email_invalid: 'Helbide berria okerra da!' + old_email_invalid: 'Lehengo helbidea ez dator bat!' + invalid: 'Helbide okerra' + added: 'Helbidea ondo sartu duzu' + add_not_allowed: '&cEzin duzu posta helbiderik sartu' + request_confirmation: 'Berretsi zure posta helbidea!' + changed: 'Posta helbidea ondo aldatu duzu' + change_not_allowed: '&cEzin duzu posta helbidea aldatu' + email_show: '&2Zure posta helbidea ondorengoa da: &f%email' + no_email_for_account: '&2Ez daukazu posta helbiderik kontu honetara lotuta.' + already_used: '&4Posta helbide hori dagoeneko badarabil norbaitek' + incomplete_settings: 'Errorea: posta elektronikoak bidaltzeko ezparpen guztiak ez daude konfiguratu. Mesedez, jarri harremanetan administratzaile batekin.' + send_failure: 'Ezin izan da mezua bidali. Mesedez, jarri harremanetan administratzaile batekin.' + change_password_expired: 'Pasahitza aldatzeko denbora iraungi da.' + email_cooldown_error: '&cMezu bat bidali dizugu duela denbora gutxik. %time itxaron behar duzu berriro bidaltzeko eskatu aurretik.' + +# Password recovery by email +recovery: + forgot_password_hint: '&cPasahitza ahaztu duzu? Berreskuratzeko erabili /email recovery ' + command_usage: '&fErabili: /email recovery ' + email_sent: 'Berreskuratze mezua bidali dizugu. Mesedez begiratu sarrera ontzia!' + code: + code_sent: 'Pasahitza berreskuratzeko kode bat bidali dizugu zure posta elektronikora.' + incorrect: 'Berreskuratze kodea ez da zuzena! %count saiakera dituzu.' + tries_exceeded: 'Berreskuratze kodea sartzeko gehienezko saiakera kopurua gainditu duzu. Erabili "/email recovery [helbidea]" berri bat jasotzeko.' + correct: 'Kode zuzena!' + change_password: 'Mesedez, erabili "/email setpassword pasahitza aldatzeko.' + +# Captcha +captcha: + usage_captcha: '&3Sartzeko captcha asmatu beharko duzu. Mesedez erabaili /captcha %captcha_code' + wrong_captcha: '&cCaptacha okerra, mesedez, idatzi "/captcha %captcha_code" txatean!' + valid_captcha: '&2Captcha asmatu duzu!' + captcha_for_registration: 'Izena emateko captcha asmatu beharko duzu, mesedez erabili ondorengo komandoa: /captcha %captcha_code' + register_captcha_valid: '&2Captcha zuzena! Orain izena eman dezakezu /register erabilita' + +# Verification code +verification: + code_required: '&3Komando hori babestuta dago, eta horregatik eposta berrespena beharrazkoa da! Begiratu zure sarrera ontzia, eta jarraitu bertan adierazitako pausoak.' + command_usage: '&cErabilera: /verification ' + incorrect_code: '&cKode okerra, mesedez idatzi "/verification " txatean, postan jaso duzun kodea erabilita' + success: '&2Zure identitatea berretsi duzu! Orain komando babestuak erabiltzeko baimena daukazu sesioak irauten duen bitartean!' + already_verified: '&2Dagoeneko badaukazu komando babestuak erabiltzeko baimena sesio honek irauten duen bitartean!' + code_expired: '&3Kodea iraungi egin da! Exekutatu beste komando babestu bat kode berri bat lortzeko!' + email_needed: '&3Zure identitatea berresteko beharrezkoa da zure kontuan posta elektronikoa konfiguratuta izatea!!' + +# Time units +time: + second: 'segundu' + seconds: 'segundu' + minute: 'minutu' + minutes: 'minutu' + hour: 'ordu' + hours: 'ordu' + day: 'egun' + days: 'egun' + +# Two-factor authentication +two_factor: + code_created: '&2Zure kode sekretua %code da. Hemen eskaneatu dezakezu: %url' + confirmation_required: 'Mesedez, berretsi kodea ondorengoa erabilita: /2fa confirm ' + code_required: 'Mesedez, bidali zure bi faktoreko autentikazio kodea ondorengoa erabilita: /2fa code ' + already_enabled: 'Dagoeneko badaukazu bi faktoreko autentikazioa aktibatuta!' + enable_error_no_code: 'Ez duzu 2fa koderik sortu, edo iraungita dago. Mesedez, erabili /2fa add' + enable_success: '2 faktoreko autentikazioa aktibatu duzu' + enable_error_wrong_code: 'Kode okerra, edo iraungita dago. Mesedez erabili /2fa add' + not_enabled_error: 'Ez duzu 2 faktore autentikazioa konfiguratu. Erabaili /2fa add' + removed_success: '2 faktoreko autentikazioa desaktibatu duzu' + invalid_code: 'Kode okerra!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aBedrock automatikoki saioa hasi da!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aPortal batean trabatuta zaude saioa hasten ari zarela.' + fix_underground: '&aLur azpian trabatuta zaude saioa hasten ari zarela.' + cannot_fix_underground: '&aLur azpian trabatuta zaude saioa hasten ari zarela, baina ezin dugu konpondu.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cSistematik kanporatu zaitugu saio bikoitza egiteagatik.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_fi.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_fi.yml new file mode 100644 index 0000000000..8d349f77e0 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_fi.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cRekisteröinti on suljettu!' + name_taken: '&cPelaaja on jo rekisteröity' + register_request: '&cRekisteröidy palvelimellemme komennolla "/register "' + command_usage: '&cKäyttötapa: /register ' + reg_only: '&fMene sivustolle: https://example.com rekisteröityäksesi!' + success: '&cRekisteröidyit onnistuneesti!' + kicked_admin_registered: 'Ylläpitäjä rekisteröi sinut juuri; kirjaudu sisään uudelleen.' + +# Password errors on registration +password: + match_error: '&fSalasanat ei täsmää' + name_in_password: '&cEt voi käyttää nimeäsi salasanana, valitse toinen...' + unsafe_password: '&cValitsemasi salasana ei ole turvallinen, valitse toinen...' + forbidden_characters: '&4Salasanassasi on kiellettyjä merkkejä. Sallitut merkit: %valid_chars' + wrong_length: '&fSalasanasi on liian pitkä tai lyhyt.' + pwned_password: '&cValitsemasi salasana ei ole turvallinen. Sitä on käytetty %pwned_count kertaa jo! Käytä vahvaa salasanaa...' + +# Login +login: + command_usage: '&cKäyttötapa: /login salasana' + wrong_password: '&cVäärä salasana' + success: '&cKirjauduit onnistuneesti' + login_request: '&cKirjaudu palvelimmelle komennolla "/login salasana"' + timeout_error: '&fKirjautumisaika meni umpeen.' + +# Errors +error: + denied_command: '&cSinun on oltava todennettu käyttääksesi tätä komentoa!' + denied_chat: '&cSinun on oltava todennettu voidaksesi chattailla!' + unregistered_user: '&cSalasanat eivät täsmää' + not_logged_in: '&cEt ole kirjautunut sisään!' + no_permission: '&cEi oikeuksia' + unexpected_error: '&fVirhe: Ota yhteys palveluntarjoojaan!' + max_registration: '&fSinulla ei ole oikeuksia tehdä enempää pelaajatilejä!' + logged_in: '&cOlet jo kirjautunut!' + kick_for_vip: '&cVIP pelaaja liittyi täyteen palvelimeen!' + kick_unresolved_hostname: '&cTapahtui virhe: pelaajan verkkonimiä ei voitu ratkaista!' + tempban_max_logins: '&cSinut on tilapäisesti kielletty liian monen kirjautumisen epäonnistumisen vuoksi.' + +# AntiBot +antibot: + kick_antibot: 'Antibot-suojatila on käytössä! Sinun on odotettava muutama minuutti ennen kuin voit liittyä palvelimelle.' + auto_enabled: '&4[AntiBotService] Antibot otettu käyttöön suuren yhteyksien määrän vuoksi!' + auto_disabled: '&2[AntiBotService] Antibot poistettu käytöstä %m minuutin kuluttua!' + +# Unregister +unregister: + success: '&cPelaajatili poistettu onnistuneesti!' + command_usage: '&cKäyttötapa: /unregister password' + +# Other messages +misc: + account_not_activated: '&fKäyttäjäsi ei ole vahvistettu!' + not_activated: '&cTiliä ei ole aktivoitu, rekisteröidy ja aktivoi se ennen kuin yrität uudelleen.' + password_changed: '&cSalasana vaihdettu!!' + logout: '&cKirjauduit ulos palvelimelta.' + reload: '&fAsetukset uudelleenladattu' + usage_change_password: '&fKäyttötapa: /changepassword vanhaSalasana uusiSalasana' + accounts_owned_self: 'Omistat %count tiliä:' + accounts_owned_other: 'Pelaajalla %name on %count tiliä:' + +# Session messages +session: + valid_session: '&cIstunto jatkettu!' + invalid_session: '&fIstunto ei täsmää! Ole hyvä ja odota istunnon loppuun' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Sama IP-osoitteella oleva pelaaja on jo pelissä!' + same_nick_online: '&COlet jo palvelimella! &COdota käyttäjän aikakatkaisua tai ota yhteyttä palveluntarjoojaan.' + name_length: '&cPelaajanimesi on liian lyhyt tai pitkä' + characters_in_name: '&cPelaajanimesi sisältää luvattomia merkkejä. Hyväksytyt merkit: %valid_chars' + kick_full_server: '&cPalvelin on täynnä, Yritä pian uudelleen!' + country_banned: '&4Maasi on estetty tästä palvelimesta!' + not_owner_error: 'Et ole tämän tilin omistaja. Valitse toinen nimi!' + invalid_name_case: 'Sinun pitäisi liittyä käyttäen käyttäjänimeä %valid, ei %invalid.' + quick_command: 'Käytit komentoa liian nopeasti! Kirjaudu sisään uudelleen ja odota enemmän ennen minkään komennon käyttöä.' + +# Email +email: + add_email_request: '&cLisää sähköpostisi: /email add sähköpostisi sähköpostisiUudelleen' + usage_email_add: '&fKäyttötapa: /email add ' + usage_email_change: '&fKäyttötapa: /email change ' + new_email_invalid: '[AuthMe] Uusi sähköposti on väärä!' + old_email_invalid: '[AuthMe] Vanha sähköposti on väärä!' + invalid: '[AuthMe] Väärä sähköposti' + added: '[AuthMe] Sähköposti lisätty!' + add_not_allowed: '&cSähköpostin lisääminen ei ollut sallittua.' + request_confirmation: '[AuthMe] Vahvistuta sähköposti!' + changed: '[AuthMe] Sähköposti vaihdettu!' + change_not_allowed: '&cSähköpostin muuttaminen ei ollut sallittua.' + email_show: '&2Nykyinen sähköpostiosoitteesi on: &f%email' + no_email_for_account: '&2Sinulla ei tällä hetkellä ole liitettyä sähköpostiosoitetta tähän tiliin.' + already_used: '&4Sähköpostiosoite on jo käytössä' + incomplete_settings: 'Virhe: kaikki tarvittavat asetukset eivät ole asetettu sähköpostien lähettämistä varten. Ota yhteyttä ylläpitäjään.' + send_failure: 'Sähköpostia ei voitu lähettää. Ota yhteyttä järjestelmänvalvojaan.' + change_password_expired: 'Et voi enää vaihtaa salasanaa tällä komennolla.' + email_cooldown_error: '&cSähköpostia on jo lähetetty äskettäin. Sinun on odotettava %time ennen kuin voit lähettää uuden.' + +# Password recovery by email +recovery: + forgot_password_hint: '&cUnohtuiko salasana? Käytä komentoa: /email recovery ' + command_usage: '&fKäyttötapa: /email recovery ' + email_sent: '[AuthMe] Palautus sähköposti lähetetty!' + code: + code_sent: 'Salasanasi palauttamiseksi lähetetty palautuskoodi on lähetetty sähköpostiisi.' + incorrect: 'Palautuskoodi ei ole oikea! Sinulla on %count yritystä jäljellä.' + tries_exceeded: 'Olet ylittänyt enimmäisyritysten määrän palautuskoodin syöttämisessä. Käytä "/email recovery [email]" luodaksesi uuden.' + correct: 'Palautuskoodi syötetty oikein!' + change_password: 'Käytä komentoa /email setpassword vaihtaaksesi salasanasi välittömästi.' + +# Captcha +captcha: + usage_captcha: '&cKäyttötapa: /captcha %captcha_code' + wrong_captcha: '&cVäärä varmistus, käytä : /captcha %captcha_code' + valid_captcha: '&cSinun varmistus onnistui.!' + captcha_for_registration: 'Rekisteröityäksesi sinun on ensin ratkaistava captcha, käytä komentoa: /captcha %captcha_code' + register_captcha_valid: '&2Validi captcha! Voit nyt rekisteröityä käyttäen komentoa /register' + +# Verification code +verification: + code_required: '&3Tämä komento on herkkä ja vaatii sähköpostivahvistuksen! Tarkista sähköpostisi ja seuraa sähköpostin ohjeita.' + command_usage: '&cKäyttö: /verification ' + incorrect_code: '&cVirheellinen koodi, kirjoita "/verification " chatiin, käyttäen koodia, jonka sait sähköpostitse' + success: '&2Henkilöllisyytesi on varmennettu! Voit nyt suorittaa kaikki komennot tämän istunnon aikana!' + already_verified: '&2Voit jo suorittaa jokaisen herkän komennon tämän istunnon aikana!' + code_expired: '&3Koodisi on vanhentunut! Suorita toinen herkkä komento saadaksesi uuden koodin!' + email_needed: '&3Vahvistaaksesi henkilöllisyytesi sinun on liitettävä sähköpostiosoite tilillesi!!' + +# Time units +time: + second: 'sekunti' + seconds: 'sekuntia' + minute: 'minuutti' + minutes: 'minuuttia' + hour: 'tunti' + hours: 'tuntia' + day: 'päivä' + days: 'päivää' + +# Two-factor authentication +two_factor: + code_created: '&2Salainen koodisi on %code. Voit skannata sen täältä %url' + confirmation_required: 'Vahvista koodisi komennolla /2fa confirm ' + code_required: 'Lähetä kaksivaiheisen todennuksen koodisi komennolla /2fa code ' + already_enabled: 'Kaksivaiheinen todennus on jo käytössä tililläsi!' + enable_error_no_code: 'Sinulle ei ole luotu kaksivaiheisen todennuksen avainta tai se on vanhentunut. Suorita komento /2fa add' + enable_success: 'Kaksivaiheinen todennus onnistuneesti käytössä tililläsi' + enable_error_wrong_code: 'Väärä koodi tai koodi on vanhentunut. Suorita komento /2fa add' + not_enabled_error: 'Kaksivaiheista todennusta ei ole käytössä tililläsi. Suorita komento /2fa add' + removed_success: 'Kaksivaiheinen todennus poistettu tililtäsi onnistuneesti' + invalid_code: 'Virheellinen koodi!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aBedrock-automaattinen sisäänkirjautuminen onnistui!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aOlet jumissa portaalissa sisäänkirjautumisen aikana.' + fix_underground: '&aOlet jumissa maan alla sisäänkirjautumisen aikana.' + cannot_fix_underground: '&aOlet jumissa maan alla sisäänkirjautumisen aikana, mutta emme voi korjata sitä.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cSinut on katkaistu kaksoiskirjautumisen vuoksi.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_fr.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_fr.yml new file mode 100644 index 0000000000..7fbf2e0a55 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_fr.yml @@ -0,0 +1,176 @@ +# Traduction par: André & Twonox + +# Pour afficher une apostrophe, vous devez en mettre deux consécutivement (ex: «J''ai» au lieu de «J'ai») +# Liste des tags globaux: +# %nl% - Permet de passer à la ligne. +# %username% - Affiche le pseudo du joueur recevant le message. +# %displayname% - Affiche le pseudo, avec couleurs, du joueur recevant le message. + +# Enregistrement +registration: + disabled: '&cL''inscription est désactivée.' + name_taken: '&cUtilisateur déjà inscrit.' + register_request: '&cPour vous inscrire, utilisez "/register "' + command_usage: '&cUsage: /register ' + reg_only: 'Seul les joueurs enregistrés sont admis!%nl%Veuillez vous rendre sur https://www.example.com pour plus d''infos.' + success: '&aInscription effectuée !' + kicked_admin_registered: 'Un admin vient de vous inscrire, veuillez vous reconnecter.' + +# Erreur de mot de passe lors de l'enregistrement +password: + match_error: '&cLe mot de passe de confirmation ne correspond pas.' + name_in_password: '&cVous ne pouvez pas utiliser votre pseudo comme mot de passe.' + unsafe_password: '&cCe mot de passe n''est pas accepté, choisissez-en un autre.' + forbidden_characters: '&cVotre mot de passe contient des caractères non autorisés. Caractères permis : %valid_chars' + wrong_length: '&cVotre mot de passe est trop court ou trop long !' + pwned_password: '&cLe mot de passe choisi n''est pas sécurisé. Il a déjà été utilisé %pwned_count fois ! Veuillez utiliser un mot de passe fort...' + +# Identification +login: + command_usage: '&cUsage: /login ' + wrong_password: '&cMauvais mot de passe !' + success: '&aIdentification effectuée !' + login_request: '&cPour vous identifier, utilisez "/login "' + timeout_error: 'Vous avez été expulsé car vous êtes trop lent pour vous enregistrer/identifier !' + +# Erreurs +error: + denied_command: '&cVous devez être connecté pour pouvoir utiliser cette commande.' + denied_chat: '&cVous devez être connecté pour pouvoir écrire dans le chat.' + unregistered_user: '&cUtilisateur non-inscrit.' + not_logged_in: '&cUtilisateur non connecté !' + no_permission: '&cVous n''êtes pas autorisé à utiliser cette commande.' + unexpected_error: '&cUne erreur est apparue, veuillez contacter un administrateur.' + max_registration: 'Vous avez atteint la limite d''inscription !%nl%&cVous avez %reg_count sur %max_acc : %reg_names' + logged_in: '&aVous êtes déjà connecté.' + kick_for_vip: 'Un joueur VIP a rejoint le serveur à votre place (serveur plein).' + kick_unresolved_hostname: '&cUne erreur est apparue : nom d''hôte non identifié !' + tempban_max_logins: '&cVous êtes temporairement banni suite à plusieurs échecs de connexions !' + +# AntiBot +antibot: + kick_antibot: 'L''AntiBot est activé, veuillez attendre %m minutes avant de joindre le serveur.' + auto_enabled: 'L''AntiBot a été activé automatiquement à cause de nombreuses connexions !' + auto_disabled: 'L''AntiBot a été désactivé automatiquement après %m minutes, espérons que l''invasion se soit arrêtée !' + +# Dé-enregistrement +unregister: + success: '&aCompte supprimé !' + command_usage: '&cPour supprimer votre compte, utilisez "/unregister "' + +# Autres messages +misc: + account_not_activated: '&fCe compte n''est pas actif, consultez vos mails !' + not_activated: '&cCompte non activé, veuillez vous inscrire et l''activer avant de réessayer.' + password_changed: '&aMot de passe changé avec succès !' + logout: '&cVous avez été déconnecté !' + reload: '&aAuthMe a été relancé avec succès.' + usage_change_password: '&cPour changer de mot de passe, utilisez "/changepassword "' + accounts_owned_self: 'Vous avez %count comptes:' + accounts_owned_other: 'Le joueur %name a %count comptes:' + +# Session +session: + valid_session: '&aVous avez été automatiquement connecté !' + invalid_session: 'Session expirée suite à un changement d''IP.' + +# Erreurs lors d'une tentative connexion +on_join_validation: + same_ip_online: 'Un joueur avec la même adresse IP joue déjà !' + same_nick_online: 'Un joueur ayant le même pseudo est déjà connecté.' + name_length: 'Votre pseudo est trop long ou trop court.' + characters_in_name: 'Caractères de pseudo autorisés: %valid_chars' + kick_full_server: '&cLe serveur est actuellement plein, désolé !' + country_banned: 'Votre pays est banni de ce serveur.' + not_owner_error: 'Vous n''êtes pas le propriétaire de ce compte. Veuillez utiliser un autre pseudo !' + invalid_name_case: 'Veuillez vous connecter avec "%valid" et non pas avec "%invalid".' + quick_command: '&cUtilisation trop rapide de commande! Veuillez vous reconnecter et attendre un peu avant d''exécuter une commande.' + +# Email +email: + add_email_request: '&cLiez votre email à votre compte en faisant "/email add "' + usage_email_add: '&fUsage: /email add ' + usage_email_change: '&fUsage: /email change ' + new_email_invalid: '&cNouvel email invalide !' + old_email_invalid: '&cAncien email invalide !' + invalid: '&cL''email inscrit est invalide !' + added: '&aEmail enregistré. En cas de perte de MDP, faites "/email recover "' + add_not_allowed: '&cVous n''êtes pas autorisé à ajouter une adresse mail.' + request_confirmation: '&cLa confirmation de l''email est manquante ou éronnée.' + changed: '&aVotre email a été mis à jour.' + change_not_allowed: '&cVous n''êtes pas autorisé à modifier l''adresse mail.' + email_show: '&fL''email enregistré pour votre compte est: %email' + no_email_for_account: '&c&oVous n''avez aucun email enregistré sur votre compte.' + already_used: '&cCet email est déjà utilisé !' + incomplete_settings: '&cErreur : Tous les paramètres requis ne sont pas présent pour l''envoi de mail, veuillez contacter un admin.' + send_failure: '&cLe mail n''a pas pu être envoyé. Veuillez contacter un admin.' + change_password_expired: 'Vous ne pouvez pas changer votre mot de passe avec cette commande.' + email_cooldown_error: '&cUn mail de récupération a déjà été envoyé récemment. Veuillez attendre %time pour le demander de nouveau.' + +# Récupération de mot de passe par mail +recovery: + forgot_password_hint: '&cVous avez oublié votre Mot de Passe? Utilisez "/email recovery "' + command_usage: '&fUsage: /email recovery ' + email_sent: '&aMail de récupération envoyé !' + code: + code_sent: 'Un code de récupération a été envoyé à votre email afin de réinitialiser votre mot de passe.' + incorrect: '&cLe code de réinitialisation est incorrect! Il vous reste %count% essai(s).' + tries_exceeded: 'Vous avez atteint le nombre maximum d''essais pour rentrer le code.%nl%Refaites "/email recovery " pour en régénérer à nouveau.' + correct: '&aCode de réinitialisation correct !' + change_password: 'Veuillez faire "/email setpassword " pour changer votre mot de passe directement.' + +# Captcha +captcha: + usage_captcha: '&cTrop de tentatives de connexion ont échoué, faites: /captcha %captcha_code' + wrong_captcha: '&cCaptcha incorrect, écrivez de nouveau: /captcha %captcha_code' + valid_captcha: '&aCaptcha validé! Vous pouvez maintenant réessayer de vous connecter.' + captcha_for_registration: 'Avant de vous inscrire, veuillez rentrer un captcha en faisant "/captcha %captcha_code"' + register_captcha_valid: '&aCaptcha validé! Vous pouvez maintenant vous inscrire.' + +# Code de vérification +verification: + code_required: '&cCette commande est sensible, elle nécessite donc une confirmation par email.%nl%&cVeuillez suivre les instructions qui viennent de vous être envoyées par email.' + command_usage: '&cUsage: /verification ' + incorrect_code: '&cCode incorrect !%nl%&cVeuillez taper "/verification " dans le chat en utilisant le code reçu par mail.' + success: '&aVotre identité a bien été vérifiée !%nl%&aVous pouvez désormais utiliser la commande souhaitée durant toute la session.' + already_verified: '&aVous êtes déjà autorisé à utiliser les commandes sensibles durant votre session actuelle.' + code_expired: '&cVotre code d''identification a expiré !%nl%&cVeuillez re-exécuter une commande sensible pour recevoir un nouveau code.' + email_needed: '&cAfin de vérifier votre identité, vous devez avoir un email lié à votre compte.%nl%&cPour cela, faites "/email add "' + +# Unités de temps +time: + second: 'seconde' + seconds: 'secondes' + minute: 'minute' + minutes: 'minutes' + hour: 'heure' + hours: 'heures' + day: 'jour' + days: 'jours' + +# Identification à deux facteurs +two_factor: + code_created: '&aVotre code secret est &2%code&a. Vous pouvez le scanner depuis &2%url' + confirmation_required: 'Veuillez confirmer votre code secret en écrivant "/2fa confirm "' + code_required: 'Veuillez indiquer votre code secret en écrivant "/2fa code "' + already_enabled: '&aL''authentification à double facteur est déjà active !' + enable_error_no_code: '&cAucun code secret n''a été généré ou bien celui-ci a expiré. Veuillez écrire "/2fa add"' + enable_success: '&aL''authentification à double facteur a été activé pour votre compte !' + enable_error_wrong_code: '&cLe code secret est faux ou bien celui-ci a expiré. Veuillez écrire "/2fa add"' + not_enabled_error: '&cL''authentification à double facteur n''est pas active sur votre compte. Faites "/2fa add" pour l''activer.' + removed_success: '&cL''authentification à double facteur a été désactivé pour votre compte !' + invalid_code: '&cCode secret invalide !' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aConnexion automatique Bedrock réussie !' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aVous êtes bloqué dans un portail lors de la connexion.' + fix_underground: '&aVous êtes bloqué sous terre lors de la connexion.' + cannot_fix_underground: '&aVous êtes bloqué sous terre lors de la connexion, mais nous ne pouvons pas le corriger.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cVous avez été déconnecté en raison d''une double connexion.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_gl.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_gl.yml new file mode 100644 index 0000000000..8a7a7f3031 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_gl.yml @@ -0,0 +1,172 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cO rexistro está deshabilitado' + name_taken: '&cEse nome de usuario xa está rexistrado' + register_request: '&cPor favor, rexístrate con "/register "' + command_usage: '&cUso: /register contrasinal confirmarContrasinal' + reg_only: '&fSó xogadores rexistrados! Por favor, visita https://example.com para rexistrarte' + success: '&cRexistrado con éxito!' + kicked_admin_registered: 'Un administrador acaba de rexistrarte; por favor, volve a iniciar sesión.' + +# Password errors on registration +password: + match_error: '&fO contrasinal non coincide' + name_in_password: '&cNon podes usar o teu nome como contrasinal, por favor, escolle outro...' + unsafe_password: '&cO contrasinal escollido non é seguro, por favor, escolle outro...' + forbidden_characters: '&4O teu contrasinal contén caracteres non permitidos. Caracteres permitidos: %valid_chars' + wrong_length: '&fO teu contrasinal non alcanza a lonxitude mínima ou excede a lonxitude máxima' + pwned_password: '&cO contrasinal elixido non é seguro. Foi usado %pwned_count veces xa! Por favor, use un contrasinal forte...' + +# Login +login: + command_usage: '&cUso: /login ' + wrong_password: '&cContrasinal equivocado' + success: '&cIdentificación con éxito!' + login_request: '&cPor favor, identifícate con "/login "' + timeout_error: '&fRematou o tempo da autentificación' + +# Errors +error: + denied_command: '&cPara usar este comando debes estar autenticado!' + denied_chat: '&cPara chatear debes estar autenticado!' + unregistered_user: '&cEse nome de usuario non está rexistrado' + not_logged_in: '&cNon te identificaches!' + no_permission: '&cNon tes o permiso' + unexpected_error: '&fOcurriu un erro; contacta cun administrador' + max_registration: '&fExcediches o máximo de rexistros para a túa Conta' + logged_in: '&cXa estás identificado!' + kick_for_vip: '&cUn xogador VIP uniuse ao servidor cheo!' + kick_unresolved_hostname: '&cProduciuse un erro: nome do xogador non resolto!' + tempban_max_logins: '&cEstás temporalmente expulsado por fallar ao acceder en demasiadas ocasións.' + +# AntiBot +antibot: + kick_antibot: 'O modo de protección AntiBot está activado! Tes que agardar uns minutos antes de unirte ao servidor.' + auto_enabled: '[AuthMe] AntiBotMod conectouse automáticamente debido a conexións masivas!' + auto_disabled: '[AuthMe] AntiBotMod desactivouse automáticamente despois de %m minutos, esperemos que a invasión se detivera' + +# Unregister +unregister: + success: '&cFeito! Xa non estás rexistrado!' + command_usage: '&cUso: /unregister ' + +# Other messages +misc: + account_not_activated: '&fA túa conta aínda non está activada, comproba a túa bandexa de correo!!' + not_activated: '&cConta non activada, por favor rexístrese e actívea antes de tentalo de novo.' + password_changed: '&cCambiouse o contrasinal!' + logout: '&cSesión pechada con éxito' + reload: '&fRecargáronse a configuración e a base de datos' + usage_change_password: '&fUso: /changepassword ' + accounts_owned_self: 'Tes %count contas:' + accounts_owned_other: 'O xogador %name ten %count contas:' + +# Session messages +session: + valid_session: '&cIdentificado mediante a sesión' + invalid_session: '&fOs datos de sesión non corresponden, por favor, espere a que remate a sesión' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Un xogador coa mesma IP xa está en xogo!' + same_nick_online: '&fXa está xogando alguén co mesmo nome' + name_length: '&cO teu nome é demasiado curto ou demasiado longo' + characters_in_name: '&cO teu nome contén caracteres ilegais. Caracteres permitidos: %valid_chars' + kick_full_server: '&cO servidor está actualmente cheo, sentímolo!' + country_banned: '&4O teu país está prohibido neste servidor!' + not_owner_error: 'Non es o dono desta conta. Por favor, escolle outro nome!' + invalid_name_case: 'Deberías unirte usando o nome de usuario %valid, non %invalid.' + quick_command: 'Usaches un comando moi rápido! Por favor, úneste ao servidor de novo e agarda máis antes de usar calquera comando.' + +# Email +email: + add_email_request: '&cPor favor, engade o teu correo electrónico con: /email add ' + usage_email_add: '&fUso: /email add ' + usage_email_change: '&fUso: /email change ' + new_email_invalid: '[AuthMe] O novo correo non é válido!' + old_email_invalid: '[AuthMe] O correo vello non é válido!' + invalid: '[AuthMe] Correo non válido' + added: '[AuthMe] Correo engadido!' + add_not_allowed: '&cEngadir o correo electrónico non estaba permitido.' + request_confirmation: '[AuthMe] Confirma o teu correo!' + changed: '[AuthMe] Cambiouse o correo!' + email_show: '&2O teu enderezo de correo electrónico actual é: &f%email' + no_email_for_account: '&2Actualmente non tes ningún enderezo de correo electrónico asociado con esta conta.' + already_used: '&4O enderezo de correo electrónico xa está a ser usado' + incomplete_settings: 'Erro: non todos os axustes necesarios están configurados para enviar correos electrónicos. Por favor, contacta cun administrador.' + send_failure: 'O correo electrónico non puido ser enviado. Por favor, contacta cun administrador.' + change_password_expired: 'Non podes cambiar o teu contrasinal usando este comando máis.' + email_cooldown_error: '&cUn correo electrónico xa foi enviado recentemente. Debes agardar %time antes de poder enviar un novo.' + +# Password recovery by email +recovery: + forgot_password_hint: '&cOlvidaches o contrasinal? Por favor, usa /email recovery ' + command_usage: '&fUso: /email recovery ' + email_sent: '[AuthMe] Enviouse o correo de confirmación!' + code: + code_sent: 'Enviouse un código de recuperación para restablecer o teu contrasinal ao teu correo electrónico.' + incorrect: 'O código de recuperación non é correcto! Tes %count intentos restantes.' + tries_exceeded: 'Excedeches o número máximo de intentos para ingresar o código de recuperación. Usa "/email recovery [email]" para xerar un novo.' + correct: 'O código de recuperación foi ingresado correctamente!' + change_password: 'Usa o comando /email setpassword para cambiar o teu contrasinal inmediatamente.' + +# Captcha +captcha: + usage_captcha: '&cNecesitas escribir un captcha, por favor escribe: /captcha %captcha_code' + wrong_captcha: '&cCaptcha equivocado, por favor usa: /captcha %captcha_code' + valid_captcha: '&cO teu captcha é válido !' + captcha_for_registration: 'Para rexistrarte debes resolver un captcha primeiro, por favor, usa o comando: /captcha %captcha_code' + register_captcha_valid: '&2Captcha válido! Agora podes rexistrarte con /register' + +# Verification code +verification: + code_required: '&3Este comando é sensible e require unha verificación por correo electrónico! Comproba a túa bandeixa de entrada e segue as instrucións do correo electrónico.' + command_usage: '&cUso: /verification ' + incorrect_code: '&cCódigo incorrecto, por favor, escribe "/verification " no chat, usando o código que recibiches por correo electrónico' + success: '&2A túa identidade foi verificada! Agora podes executar todos os comandos dentro da sesión actual!' + already_verified: '&2Xa podes executar todos os comandos sensibles dentro da sesión actual!' + code_expired: '&3O teu código caducou! Executa outro comando sensible para obter un novo código!' + email_needed: '&3Para verificar a túa identidade debes vincular un enderezo de correo electrónico á túa conta!!' + +# Time units +time: + second: 'segundo' + seconds: 'segundos' + minute: 'minuto' + minutes: 'minutos' + hour: 'hora' + hours: 'horas' + day: 'día' + days: 'días' + +# Two-factor authentication +two_factor: + code_created: '&2O teu código secreto é %code. Podes escanealo desde aquí %url' + confirmation_required: 'Por favor, confirma o teu código con /2fa confirm ' + code_required: 'Por favor, envía o teu código de autenticación en dous pasos con /2fa code ' + already_enabled: 'A autenticación en dous pasos xa está activada para a túa conta!' + enable_error_no_code: 'Non se xerou ningún clave 2fa para ti ou caducou. Por favor, executa /2fa add' + enable_success: 'Autenticación en dous pasos activada con éxito para a túa conta' + enable_error_wrong_code: 'Código incorrecto ou caducado. Por favor, executa /2fa add' + not_enabled_error: 'A autenticación en dous pasos non está activada para a túa conta. Executa /2fa add' + removed_success: 'Autenticación en dous pasos eliminada con éxito da túa conta' + invalid_code: 'Código incorrecto!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aInicio de sesión automático de Bedrock exitoso!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aEstá atrapado no portal durante o inicio de sesión.' + fix_underground: '&aEstá atrapado baixo terra durante o inicio de sesión.' + cannot_fix_underground: '&aEstá atrapado baixo terra durante o inicio de sesión, pero non podemos arranxalo.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cFoi desconectado debido a un inicio de sesión dobre.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_hu.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_hu.yml new file mode 100644 index 0000000000..215a0660f8 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_hu.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cA regisztráció letiltva!' + name_taken: '&cEz a játékosnév már regisztrálva van!' + register_request: '&cKérlek, regisztrálj be a következő paranccsal: "&7/register &c".' + command_usage: '&cHasználat: "&7/register &c".' + reg_only: '&4Csak a regisztrált játékosok tudnak csatlakozni a szerverhez!' + success: '&aA regisztráció sikeres!' + kicked_admin_registered: 'Adminisztrátor által regisztrálva lettél. Kérlek, lépj be újra a szerverbe!' + +# Password errors on registration +password: + match_error: '&cA két jelszó nem egyezik!' + name_in_password: '&cNem használhatod a felhasználóneved jelszónak, kérlek, válassz másikat...' + unsafe_password: '&cA választott jelszó nem biztonságos, kérlek, válassz másikat...' + forbidden_characters: '&4A választott jelszó nem engedélyezett karaktereket tartalmaz. Engedélyezett karakterek: %valid_chars' + wrong_length: 'A jelszavad nem éri el a minimális hosszúságot!' + pwned_password: '&cA választott jelszavad nem biztonságos. Már %pwned_count alkalommal használták! Kérlek használj erős jelszót...' + +# Login +login: + command_usage: '&cBejelentkezés: "&7/login &c".' + wrong_password: '&4A jelszó helytelen!' + success: '&aSikeresen beléptél!' + login_request: '&cKérlek, jelentkezz be: "&7/login &c"!' + timeout_error: 'Bejelentkezési időtúllépés!' + +# Errors +error: + denied_command: '&cAmíg nem vagy bejelentkezve, nem használhatod ezt a parancsot!' + denied_chat: '&cAmíg nem vagy bejelentkezve, nem használhatod a csevegőt!' + unregistered_user: '&cEz a felhasználó nincs regisztrálva!' + not_logged_in: '&cNem vagy bejelentkezve!' + no_permission: '&cNincs jogosultságod a használatára!' + unexpected_error: '&cHiba lépett fel! Lépj kapcsolatba a szerver tulajával!' + max_registration: '&cElérted a maximálisan beregisztrálható karakterek számát. (%reg_count/%max_acc %reg_names)' + logged_in: '&cMár be vagy jelentkezve!' + kick_for_vip: '&3VIP játékos csatlakozott a szerverhez!' + kick_unresolved_hostname: '&cHiba történt: feloldatlan játékos hosztnév!' + tempban_max_logins: '&cIdeiglenesen ki lettél tiltva, mert túl sok alkalommal rontottad el a jelszavad!' + +# AntiBot +antibot: + kick_antibot: 'Az AntiBot védelem bekapcsolva! Kérlek, várj pár percet mielőtt csatlakozol.' + auto_enabled: '&4[AntiBot] Az AntiBot védelem bekapcsolt, mert a megszabott időn belül több felhasználó csatlakozott!' + auto_disabled: '&2[AntiBot] Az AntiBot kikapcsol %m perc múlva!' + +# Unregister +unregister: + success: '&cA regisztráció sikeresen törölve!' + command_usage: '&cHasználat: "&7/unregister &c"' + +# Other messages +misc: + account_not_activated: '&cA felhasználód aktiválása még nem történt meg, ellenőrizd a megadott emailed!' + not_activated: '&cA fiók nincs aktiválva, kérlek regisztrálj és aktiváld azt mielőtt újra megpróbálkoznál.' + password_changed: '&cA jelszó sikeresen megváltoztatva!' + logout: '&cSikeresen kijelentkeztél!' + reload: 'Beállítások és az adatbázis újratöltve!' + usage_change_password: 'Használat: "/changepassword <új jelszó>".' + accounts_owned_self: '%count db regisztrációd van:' + accounts_owned_other: 'A %name nevű játékosnak, %count db regisztrációja van:' + +# Session messages +session: + valid_session: '&2A megadott időkereten belül csatlakoztál vissza, így a rendszer automatikusan beléptetett.' + invalid_session: '&cAz IP címed megváltozott, ezért a visszacsatlakozási időkereted lejárt.' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Már valaki csatlakozott a szerverhez ezzel az IP címmel!' + same_nick_online: 'Ezzel a játékosnévvel már játszanak a szerveren.' + name_length: '&4A felhasználóneved túl hosszú, vagy túl rövid! Kérlek, válassz másikat!' + characters_in_name: '&4A felhasználóneved nem engedélyezett karaktereket tartalmaz. Engedélyezett karakterek: %valid_chars' + kick_full_server: '&4A szerver megtelt, próbálj csatlakozni később!' + country_banned: '&4Az országod a tiltólistán van ezen a szerveren!' + not_owner_error: 'Ez nem a te felhasználód. Kérlek, válassz másik nevet!' + invalid_name_case: '%valid a felhasználó neved nem? Akkor ne %invalid névvel próbálj feljönni.' + quick_command: 'Túl gyorsan használtad a parancsot! Kérjük, csatlakoz a szerverhez, és várj, amíg bármilyen parancsot használsz.' + +# Email +email: + add_email_request: '&3Kérlek, rendeld hozzá a felhasználódhoz az email címedet "&7/email add &3".' + usage_email_add: '&cHasználat: "&7/email add &c".' + usage_email_change: '&cHasználat: "&7/email change <új email>&c".' + new_email_invalid: '&cHibás az új email cím, próbáld újra!' + old_email_invalid: '&cHibás a régi email cím, próbáld újra!' + invalid: '&cHibás az email cím, próbáld újra!' + added: '&2Az email címed rögzítése sikeresen megtörtént!' + add_not_allowed: '&cAz email hozzáadása nem engedélyezett' + request_confirmation: '&cKérlek, ellenőrízd az email címedet!' + changed: '&2Az email cím cseréje sikeresen megtörtént!' + change_not_allowed: '&cAz emailek módosítása nem engedélyezett' + email_show: '&2A jelenlegi emailed a következő: &f%email' + no_email_for_account: '&2Ehhez a felhasználóhoz jelenleg még nincs email hozzárendelve.' + already_used: '&4Ez az email cím már használatban van!' + incomplete_settings: 'Hiba: nem lett beállítva az összes szükséges beállítás az email küldéshez. Vedd fel a kapcsolatot egy adminnal.' + send_failure: 'Nem sikerült elküldeni az emailt. Lépj kapcsolatba egy adminnal.' + change_password_expired: 'Ezzel a paranccsal már nem módosíthatja jelszavát.' + email_cooldown_error: '&cEgy emailt már kiküldtünk. Következő email küldése előtt várnod kell: %time.' + +# Password recovery by email +recovery: + forgot_password_hint: '&3Ha elfelejtetted a jelszavad, használd az "&7/email recovery &3".' + command_usage: '&cHasználat: "&7/email recovery &c".' + email_sent: '&2A jelszó visszaállításhoz szükséges emailt elküldtük! Ellenőrizd a leveleidet!' + code: + code_sent: 'A jelszavad visszaállításához szükséges kódot sikeresen elküldtük az email címedre!' + incorrect: 'A visszaállító kód helytelen volt! Még %count lehetőséged maradt.' + tries_exceeded: 'Elérted a próbálkozások maximális számát. Használd a következő parancsot: "/email recovery [email címed]" egy új generálásához.' + correct: 'A visszaállító kód helyes!' + change_password: 'Használd a következő parancsot: "/email setpassword <új jelszó>", hogy azonnal megváltoztasd a jelszavad.' + +# Captcha +captcha: + usage_captcha: '&3A bejelentkezéshez CAPTCHA szükséges, kérlek, használd a következő parancsot: "&7/captcha %captcha_code&3".' + wrong_captcha: '&cHibás CAPTCHA, kérlek, írd be a következő parancsot: "&7/captcha %captcha_code&c"!' + valid_captcha: '&2A CAPTCHA sikeresen feloldva!' + captcha_for_registration: 'A regisztrációhoz meg kell oldanod a captcha-t, kérjük, használd a parancsot: /captcha %captcha_code' + register_captcha_valid: '&2Érvényes captcha! Most regisztrálhatsz a /register paranccsal.' + +# Verification code +verification: + code_required: '&3Ez a parancs érzékeny, és emailes igazolást igényel! Ellenőrizze a bejövő postafiókot, és kövesse az email utasításait.' + command_usage: '&cHasználat: /verification ' + incorrect_code: '&cHelytelen kód, írd be "/verification " be a chatbe, az emailben kapott kód használatával' + success: '&2Az Ön személyazonosságát ellenőrizték! Mostantól végrehajthatja az összes parancsot az aktuális munkamenetben!' + already_verified: '&2Már minden érzékeny parancsot végrehajthat az aktuális munkameneten belül!' + code_expired: '&3A kód lejárt! Végezzen el egy másik érzékeny parancsot, hogy új kódot kapjon!' + email_needed: '&3A személyazonosságának igazolásához email címet kell csatolnia fiókjához!' + +# Time units +time: + second: 'másodperc' + seconds: 'másodperc' + minute: 'perc' + minutes: 'perc' + hour: 'óra' + hours: 'óra' + day: 'nap' + days: 'nap' + +# Two-factor authentication +two_factor: + code_created: '&2A titkos kódod a következő: %code. Vagy skenneld be a következő oldalról: %url' + confirmation_required: 'Kérjük, erősítsd meg a kódot /2fa confirm ' + code_required: 'Kérjük, küldd el a kétütemű hitelesítési kódot /2fa code ' + already_enabled: 'Kétszámjegyű hitelesítés már engedélyezve van a fiókodban!' + enable_error_no_code: 'Nem hoztad létre a 2fa kulcsot számodra, vagy lejárt. Kérlek, futtasd a /2fa add' + enable_success: 'Sikeresen engedélyezted a fiók kétütemű hitelesítését' + enable_error_wrong_code: 'Hibás kód vagy a kód lejárt. Futtasd a /2fa add' + not_enabled_error: 'Kétszámjegyű hitelesítés nincs engedélyezve a fiókodban. Futtasd a /2fa add' + removed_success: 'Sikeresen eltávolítottad a fiók két számjegyű hitelesítőjét' + invalid_code: 'Érvénytelen kód!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aBedrock automatikus bejelentkezés sikeres!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aBeragadtál a portálban a bejelentkezés közben.' + fix_underground: '&aBeragadtál a föld alatt a bejelentkezés közben.' + cannot_fix_underground: '&aBeragadtál a föld alatt a bejelentkezés közben, de nem tudjuk megjavítani.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cKét bejelentkezés miatt lecsatlakoztattak.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_id.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_id.yml new file mode 100644 index 0000000000..bf46218ff1 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_id.yml @@ -0,0 +1,172 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cRegister dalam game tidak diaktifkan!' + name_taken: '&cKamu telah mendaftarkan username ini!' + register_request: '&3Silahkan mendaftar ke server menggunakan perintah "/register "' + command_usage: '&cPenggunaan: /register ' + reg_only: '&4Hanya pengguna terdaftar yang bisa bergabung! Silahkan kunjungi https://example.com untuk mendaftar!' + success: '&2Register berhasil!' + kicked_admin_registered: 'Administrator sudah meregistrasi kamu; dimohon untuk login kembali' + +# Password errors on registration +password: + match_error: '&cPassword tidak cocok, silahkan periksa dan ulangi kembali!' + name_in_password: '&cKamu tidak bisa menggunakan namamu sebagai password, silahkan coba yang lain...' + unsafe_password: '&cPassword yang kamu pilih tidak aman, silahkan coba yang lain...' + forbidden_characters: '&4Password kamu memiliki karakter illegal. Karakter yang diperbolehkan: %valid_chars' + wrong_length: '&cPassword kamu terlalu panjang/pendek! Silahkan pilih yang lain!' + +# Login +login: + command_usage: '&cPenggunaan: /login ' + wrong_password: '&cPassword salah!' + success: '&2Login berhasil!' + login_request: '&cSilahkan login menggunakan perintah "/login "' + timeout_error: '&4Jangka waktu login telah habis, kamu dikeluarkan dari server. Silahkan coba lagi!' + +# Errors +error: + denied_command: '&cUntuk menggunakan perintah ini, kamu harus terautentikasi!' + denied_chat: '&cUntuk mengobrol, kamu harus terautentikasi!' + unregistered_user: '&cUser ini belum terdaftar!' + not_logged_in: '&cKamu belum login!' + no_permission: '&4Kamu tidak mempunyai izin melakukan ini!' + unexpected_error: '&4Terjadi kesalahan tak dikenal, silahkan hubungi Administrator!' + max_registration: '&Kamu telah mencapai batas maksimum pendaftaran di server ini!' + logged_in: '&cKamu telah login!' + kick_for_vip: '&3Player VIP mencoba masuk pada saat server sedang penuh!' + kick_unresolved_hostname: '&cTerjadi kesalahan: nama host pemain tidak dapat dipecahkan!' + tempban_max_logins: '&cKamu untuk sementara diblokir karena terlalu sering salah saat login.' + +# AntiBot +antibot: + kick_antibot: 'Proteksi AntiBot diaktifkan! Kamu harus menunggu beberapa menit sebelum masuk server.' + auto_enabled: '&4[AntiBotService] AntiBot diaktifkan dikarenakan banyak koneksi yg diterima!' + auto_disabled: '&2[AntiBotService] AntiBot dimatikan setelah %m menit!' + +# Unregister +unregister: + success: '&cUnregister berhasil!' + command_usage: '&cPenggunaan: /unregister ' + +# Other messages +misc: + account_not_activated: '&cAkunmu belum diaktifkan, silahkan periksa email kamu!' + not_activated: '&cAkun belum diaktifkan, silakan daftar dan aktivasi sebelum mencoba lagi.' + password_changed: '&2Berhasil mengubah password!' + logout: '&2Berhasil logout!' + reload: '&2Konfigurasi dan database telah dimuat ulang!' + usage_change_password: '&cPenggunaan: /changepassword ' + accounts_owned_self: 'Kamu memiliki %count akun:' + accounts_owned_other: 'Pengguna akun %name memiliki %count akun:' + +# Session messages +session: + valid_session: '&2Otomatis login, karena sesi masih terhubung.' + invalid_session: '&cIP kamu telah berubah, dan sesi kamu telah berakhir!' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Seorang pemain dengan IP yang sama sudah didalam permainan!' + same_nick_online: '&4Username yg sama telah bermain di server ini!' + name_length: '&4Username kamu terlalu panjang atau terlalu pendek!' + characters_in_name: '&4Username kamu mengandung karakter illegal. Karakter yg diizinkan: %valid_chars' + kick_full_server: '&4Server sedang penuh, silahkan coba lagi nanti!' + country_banned: '&4Negara kamu diblokir dari server ini!' + not_owner_error: 'Kamu bukan pemilik dari akun ini. Tolong pilih nama lain!' + invalid_name_case: 'Kamu seharusnya masuk menggunakan username %valid, bukan %invalid.' + quick_command: 'Kamu menggunakan perintah terlalu cepat! Tolong masuk kembali ke server dan tunggu sebentar sebelum menggunakan perintah lagi.' + +# Email +email: + add_email_request: '&3Silahkan tambahkan email ke akunmu menggunakan perintah "/email add "' + usage_email_add: '&cPenggunaan: /email add ' + usage_email_change: '&cPenggunaan: /email change ' + new_email_invalid: '&cEmail baru tidak valid, coba lagi!' + old_email_invalid: '&cEmail lama tidak valid, coba lagi!' + invalid: '&cAlamat email tidak valid, coba lagi!' + added: '&2Berhasil menambahkan alamat email ke akunmu!' + add_not_allowed: '&cMenambah email tidak diperbolehkan' + request_confirmation: '&cSilahkan konfirmasi alamat email kamu!' + changed: '&2Alamat email telah diubah dengan benar!' + change_not_allowed: '&cMengubah email tidak diperbolehkan' + email_show: '&2Emailmu saat ini: &f%email' + no_email_for_account: '&2Kamu tidak memiliki alamat email terkait dengan akun ini.' + already_used: '&4Alamat email sudah terpakai' + incomplete_settings: 'Error: tidak semua syarat setelan disetel untuk mengirim email. Tolong kontak Administrator.' + send_failure: 'Email tidak dapat dikirim. Tolong kontak Administrator.' + change_password_expired: 'Kamu tidak dapat mengubah password menggunakan perintah ini lagi.' + email_cooldown_error: '&cSebuah email telah dikirim beberapa waktu lalu. Kamu harus menunggu %time sebelum kamu mengirim yang baru.' + +# Password recovery by email +recovery: + forgot_password_hint: '&3Lupa password? silahkan gunakan command "/email recovery "' + command_usage: '&cPenggunaan: /email recovery ' + email_sent: '&2Email pemulihan akun telah dikirim! Silahkan periksa kotak masuk emailmu!' + code: + code_sent: 'Sebuah kode pemulihan untuk mengatur ulang passwordmu telah terkirim ke emailmu.' + incorrect: 'Kode pemulihan salah! Kamu memiliki %count kali kesempatan tersisa.' + tries_exceeded: 'Kamu telah mencapai batas maksimal untuk memasukkan kode pemulihan. Gunakan "/email recovery [email]" membuat yang baru.' + correct: 'Kode pemulihan berhasil dimasukkan!' + change_password: 'Tolong gunakan perintah /email setpassword untuk mengubah passwordmu segera.' + +# Captcha +captcha: + usage_captcha: '&3Kamu harus menyelesaikan kode captcha untuk login, silahkan gunakan perintah "/captcha %captcha_code"' + wrong_captcha: '&cCaptcha salah, gunakan perintah "/captcha %captcha_code" pada komentar!' + valid_captcha: '&2Kode captcha terselesaikan!' + captcha_for_registration: 'Untuk meregistrasi, kamu harus menyelesaikan captcha terlebih dahulu, tolong gunakan perintah: /captcha %captcha_code' + register_captcha_valid: '&2Captcha terselesaikan! Kini kamu dapat mendaftar dengan /register' + +# Verification code +verification: + code_required: '&3Perintah ini sensitif dan memerlukan verifikasi email! Periksa kotak masuk Anda dan ikuti petunjuk email.' + command_usage: '&cPenggunaan: /verification ' + incorrect_code: '&cKode salah, ketik "/verification " di chat, menggunakan kode yang Anda terima melalui email' + success: '&2Identitas Anda telah diverifikasi! Anda sekarang dapat menjalankan semua perintah dalam sesi saat ini!' + already_verified: '&2Anda sudah dapat menjalankan setiap perintah sensitif dalam sesi saat ini!' + code_expired: '&3Kode Anda telah kedaluwarsa! Jalankan perintah sensitif lain untuk mendapatkan kode baru!' + email_needed: '&3Untuk memverifikasi identitas Anda, Anda perlu menyambungkan alamat email dengan akun Anda!!' + +# Time units +time: + second: 'detik' + seconds: 'detik' + minute: 'menit' + minutes: 'menit' + hour: 'jam' + hours: 'jam' + day: 'hari' + days: 'hari' + +# Two-factor authentication +two_factor: + code_created: '&2Kode rahasiamu adalah %code. Kamu dapat memindainya di %url' + confirmation_required: 'Tolong konfirmasi kodemu dengan /2fa confirm ' + code_required: 'Mohon kirimkan kode dari autentikasi dua langkah dengan /2fa code ' + already_enabled: 'Autentikasi dua langkah sudah diaktifkan untuk akunmu!' + enable_error_no_code: 'Tidak ada kunci autentikasi dua langkah atau sudah kadaluarsa. Tolong jalankan /2fa add' + enable_success: 'Sukses mengaktifkan autentikasi dua langkah untuk akunmu' + enable_error_wrong_code: 'Kode salah atau kode sudah kadaluarsa. Tolong jalankan /2fa add' + not_enabled_error: 'Autentikasi dua langkah tidak diaktifkan untuk akunmu. Jalankan /2fa add' + removed_success: 'Sukses menghapus autentikasi dua langkah dari akunmu' + invalid_code: 'Kode tidak valid!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aLogin otomatis Bedrock berhasil!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aAnda terjebak di portal selama proses login.' + fix_underground: '&aAnda terjebak di bawah tanah selama proses login.' + cannot_fix_underground: '&aAnda terjebak di bawah tanah selama proses login, tetapi kami tidak dapat memperbaikinya.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cAnda telah terputus karena login ganda.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_it.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_it.yml new file mode 100644 index 0000000000..53e8afa52c --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_it.yml @@ -0,0 +1,174 @@ +# Lingua Italiana creata da Maxetto. +# Tag globali disponibili: +# %nl% - Vai a capo. +# %username% - Sostituisce il nome del giocatore che riceve il messaggio. +# %displayname% - Sostituisce il nickname (e i colori) del giocatore che riceve il messaggio. + +# Registration +registration: + disabled: '&cLa registrazione tramite i comandi di gioco è disabilitata.' + name_taken: '&cHai già eseguito la registrazione!' + register_request: '&3Per favore, esegui la registrazione con il comando: /register ' + command_usage: '&cUtilizzo: /register ' + reg_only: '&4Puoi giocare in questo server solo dopo aver eseguito la registrazione attraverso il sito web! Per favore, vai su https://esempio.it per procedere!' + success: '&2Registrato correttamente!' + kicked_admin_registered: 'Un amministratore ti ha appena registrato, per favore rientra nel server' + +# Password errors on registration +password: + match_error: '&cLe password non corrispondono!' + name_in_password: '&cNon puoi usare il tuo nome utente come password, per favore scegline un''altra...' + unsafe_password: '&cLa password che hai inserito non è sicura, per favore scegline un''altra...' + forbidden_characters: '&4La tua password contiene caratteri non consentiti. I caratteri consentiti sono: %valid_chars' + wrong_length: '&cLa password che hai inserito è troppo corta o troppo lunga, per favore scegline un''altra...' + pwned_password: '&cLa password scelta non è sicura. È stata già utilizzata %pwned_count volte! Si prega di utilizzare una password sicura...' + +# Login +login: + command_usage: '&cUtilizzo: /login ' + wrong_password: '&cPassword non corretta!' + success: '&2Autenticazione eseguita correttamente!' + login_request: '&cPer favore, esegui l''autenticazione con il comando: /login ' + timeout_error: '&4Tempo scaduto per eseguire l''autenticazione, sei stato espulso dal server, per favore riprova!' + +# Errors +error: + denied_command: '&cPer poter usare questo comando devi essere autenticato!' + denied_chat: '&cPer poter scrivere messaggi in chat devi essere autenticato!' + unregistered_user: '&cL''utente non ha ancora eseguito la registrazione.' + not_logged_in: '&cNon hai ancora eseguito l''autenticazione!' + no_permission: '&4Non hai il permesso di eseguire questa operazione.' + unexpected_error: '&4Qualcosa è andato storto, riporta questo errore ad un amministratore!' + max_registration: '&cHai raggiunto il numero massimo di registrazioni (%reg_count/%max_acc %reg_names) per questo indirizzo IP!' + logged_in: '&cHai già eseguito l''autenticazione!' + kick_for_vip: '&3Un giocatore VIP è entrato mentre il server era pieno e ha preso il tuo posto!' + kick_unresolved_hostname: '&cQualcosa è andato storto: hostname del giocatore irrisolvibile!' + tempban_max_logins: '&cSei stato temporaneamente bandito per aver fallito l''autenticazione troppe volte.' + +# AntiBot +antibot: + kick_antibot: 'Il servizio di AntiBot è attualmente attivo! Devi aspettare qualche minuto prima di poter entrare nel server.' + auto_enabled: '&4Il servizio di AntiBot è stato automaticamente abilitato a seguito delle numerose connessioni!' + auto_disabled: '&2Il servizio di AntiBot è stato automaticamente disabilitato dopo %m minuti!' + +# Unregister +unregister: + success: '&2Sei stato correttamente rimosso dal database!' + command_usage: '&cUtilizzo: /unregister ' + +# Other messages +misc: + account_not_activated: '&cIl tuo account non è stato ancora verificato, controlla fra le tue email per scoprire come attivarlo!' + not_activated: '&cAccount non attivato, si prega di registrarsi e attivarlo prima di riprovare.' + password_changed: '&2Password cambiata correttamente!' + logout: '&2Disconnessione avvenuta correttamente!' + reload: '&2La configurazione e il database sono stati ricaricati correttamente!' + usage_change_password: '&cUtilizzo: /changepassword ' + accounts_owned_self: 'Possiedi %count account:' + accounts_owned_other: 'Il giocatore %name possiede %count account:' + +# Session messages +session: + valid_session: '&2Autenticato automaticamente attraverso la precedente sessione!' + invalid_session: '&cIl tuo indirizzo IP è cambiato e la tua sessione è stata terminata!' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Un giocatore con il tuo stesso IP è già connesso sul server!' + same_nick_online: '&4Un giocatore con il tuo stesso nome utente è già connesso sul server!' + name_length: '&4Il tuo nome utente è troppo corto o troppo lungo!' + characters_in_name: '&4Il tuo nome utente contiene caratteri non consentiti. I caratteri consentiti sono: %valid_chars' + kick_full_server: '&4Il server è attualmente pieno, riprova più tardi!' + country_banned: '&4Il tuo paese è bandito da questo server!' + not_owner_error: 'Non sei il proprietario di questo account. Per favore scegli un altro nome!' + invalid_name_case: 'Dovresti entrare con questo nome utente "%valid", al posto di "%invalid".' + quick_command: 'Hai usato un comando troppo velocemente dal tuo accesso! Per favore, rientra nel server e aspetta un po'' di più prima di usare un qualsiasi comando.' + +# Email +email: + add_email_request: '&3Per poter recuperare la password in futuro, aggiungi un indirizzo email al tuo account con il comando: /email add ' + usage_email_add: '&cUtilizzo: /email add ' + usage_email_change: '&cUtilizzo: /email change ' + new_email_invalid: '&cIl nuovo indirizzo email inserito non è valido, riprova!' + old_email_invalid: '&cIl vecchio indirizzo email inserito non è valido, riprova!' + invalid: '&cL''indirizzo email inserito non è valido, riprova!' + added: '&2Indirizzo email aggiunto correttamente al tuo account!' + add_not_allowed: '&cNon hai il permesso di aggiungere un indirizzo email' + request_confirmation: '&cPer favore, conferma il tuo indirizzo email!' + changed: '&2Indirizzo email cambiato correttamente!' + change_not_allowed: '&cNon hai il permesso di cambiare l''indirizzo email' + email_show: '&2Il tuo indirizzo email al momento è: &f%email' + no_email_for_account: '&2Al momento non hai nessun indirizzo email associato al tuo account.' + already_used: '&4L''indirizzo email inserito è già in uso' + incomplete_settings: 'Errore: non tutte le impostazioni richieste per inviare le email sono state impostate. Per favore contatta un amministratore.' + send_failure: 'Non è stato possibile inviare l''email di recupero. Per favore contatta un amministratore.' + change_password_expired: 'Non puoi più cambiare la tua password con questo comando.' + email_cooldown_error: '&cUna email di recupero ti è già stata inviata recentemente. Devi attendere %time prima di poterne richiedere una nuova.' + +# Password recovery by email +recovery: + forgot_password_hint: '&3Hai dimenticato la tua password? Puoi recuperarla usando il comando: /email recovery ' + command_usage: '&cUtilizzo: /email recovery ' + email_sent: '&2Una email di recupero è stata appena inviata al tuo indirizzo email!' + code: + code_sent: 'Una email contenente il codice di recupero per reimpostare la tua password è stata appena inviata al tuo indirizzo email.' + incorrect: 'Il codice di recupero inserito non è corretto! Hai altri %count tentativi rimanenti.' + tries_exceeded: 'Hai superato il numero massimo di tentativi per inserire il codice di recupero. Scrivi "/email recovery [email]" per generarne uno nuovo.' + correct: 'Codice di recupero inserito correttamente!' + change_password: 'Per favore usa il comando "/email setpassword " per cambiare immediatamente la tua password.' + +# Captcha +captcha: + usage_captcha: '&3Per poterti autenticare devi risolvere un captcha, per favore scrivi: /captcha %captcha_code' + wrong_captcha: '&cCaptcha sbagliato, per favore riprova scrivendo "/captcha %captcha_code" in chat!' + valid_captcha: '&2Il captcha inserito è valido!' + captcha_for_registration: 'Per poterti registrare devi prima risolvere un captcha, per favore scrivi: /captcha %captcha_code' + register_captcha_valid: '&2Il captcha inserito è valido! Ora puoi eseguire la registrazione con: /register ' + +# Verification code +verification: + code_required: '&3Questo comando va a modificare dati sensibili e richiede una verifica tramite email! Controlla la tua posta in arrivo e segui le istruzioni nell''email.' + command_usage: '&cUtilizzo: /verification ' + incorrect_code: '&cCodice sbagliato, per favore riprova scrivendo "/verification " in chat, usando il codice che hai ricevuto tramite email' + success: '&2La tua identità è stata verificata! Ora puoi eseguire tutti i comandi che modificano dati sensibili per questa sessione!' + already_verified: '&2Puoi già eseguire tutti i comandi che modificano dati sensibili per questa sessione!' + code_expired: '&3Il tuo codice è scaduto! Esegui nuovamente un comando che modifica dati sensibili per ricevere uno nuovo codice!' + email_needed: '&3Per verificare la tua identità devi collegare un indirizzo email al tuo account!' + +# Time units +time: + second: 'secondo' + seconds: 'secondi' + minute: 'minuto' + minutes: 'minuti' + hour: 'ora' + hours: 'ore' + day: 'giorno' + days: 'giorni' + +# Two-factor authentication +two_factor: + code_created: '&2Il tuo codice segreto è: &f%code%%nl%&2Puoi anche scannerizzare il codice QR da qui: &f%url' + confirmation_required: 'Per favore conferma il tuo codice con: /2fa confirm ' + code_required: 'Per favore inserisci il tuo codice per l''autenticazione a 2 fattori con: /2fa code ' + already_enabled: 'Hai già abilitato l''autenticazione a 2 fattori!' + enable_error_no_code: 'Non hai ancora generato un codice per l''autenticazione a 2 fattori oppure il tuo codice è scaduto. Per favore scrivi: /2fa add' + enable_success: 'Autenticazione a 2 fattori abilitata correttamente' + enable_error_wrong_code: 'Hai inserito un codice sbagliato o scaduto. Per favore scrivi: /2fa add' + not_enabled_error: 'L''autenticazione a 2 fattori non è ancora abilitata per il tuo account. Scrivi: /2fa add' + removed_success: 'Autenticazione a 2 fattori rimossa correttamente' + invalid_code: 'Il codice inserito non è valido, riprova!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aAccesso automatico Bedrock riuscito!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aSei bloccato nel portale durante il login.' + fix_underground: '&aSei bloccato sottoterra durante il login.' + cannot_fix_underground: '&aSei bloccato sottoterra durante il login, ma non possiamo risolverlo.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cSei stato disconnesso a causa di un login doppio.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_ja.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_ja.yml new file mode 100644 index 0000000000..ac846a25a3 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_ja.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cゲーム内での登録は無効になっています!' + name_taken: '&cこのユーザー名はすでに登録されています!' + register_request: '&3サーバーに登録するには、次のコマンドを使用してください: /register <パスワード> <パスワードの確認>' + command_usage: '&c使用方法: /register <パスワード> <パスワードの確認>' + reg_only: '&4登録済みのユーザーのみサーバーに参加できます! 自分自身を登録するには、https://example.com にアクセスしてください!' + success: '&2登録が完了しました!' + kicked_admin_registered: '管理者があなたを登録しました。再度ログインしてください。' + +# Password errors on registration +password: + match_error: '&cパスワードが一致しません。もう一度確認してください!' + name_in_password: '&cパスワードには自分の名前を使用することはできません。別のパスワードを選択してください...' + unsafe_password: '&c選択したパスワードは安全ではありません。別のパスワードを選択してください...' + forbidden_characters: '&4パスワードに不正な文字が含まれています。許可されている文字: %valid_chars' + wrong_length: '&cパスワードが短すぎるか長すぎます!別のパスワードを試してください!' + pwned_password: '&c選択されたパスワードは安全ではありません。すでに %pwned_count 回使用されています!強力なパスワードを使用してください...' + +# Login +login: + command_usage: '&c使用方法: /login <パスワード>' + wrong_password: '&cパスワードが間違っています!' + success: '&2ログインが成功しました!' + login_request: '&c次のコマンドを使用してログインしてください: /login <パスワード>' + timeout_error: '&4ログインのタイムアウトが発生しました。サーバーからキックされました。もう一度試してください!' + +# Errors +error: + denied_command: '&cこのコマンドを使用するには認証が必要です!' + denied_chat: '&cチャットするには認証が必要です!' + unregistered_user: '&cこのユーザーは登録されていません!' + not_logged_in: '&cログインしていません!' + no_permission: '&4この操作を実行する権限がありません!' + unexpected_error: '&4予期しないエラーが発生しました。管理者に連絡してください!' + max_registration: '&c接続ごとの登録数が最大値を超えています(%reg_count/%max_acc %reg_names)!' + logged_in: '&cすでにログイン済みです!' + kick_for_vip: '&3VIPプレイヤーがサーバーが満員の状態で参加しました!' + kick_unresolved_hostname: '&cエラーが発生しました:解決できないプレイヤーのホスト名!' + tempban_max_logins: '&cログインに失敗した回数が多すぎるため、一時的にアクセスが制限されています。' + +# AntiBot +antibot: + kick_antibot: 'AntiBot保護モードが有効です!サーバーに参加するまでにしばらくお待ちください。' + auto_enabled: '&4[AntiBotService] 接続数が非常に多いため、AntiBotが有効になりました!' + auto_disabled: '&2[AntiBotService] %m 分後にAntiBotが無効になりました!' + +# Unregister +unregister: + success: '&c登録が正常に解除されました!' + command_usage: '&c使用方法: /unregister <パスワード>' + +# Other messages +misc: + account_not_activated: '&cアカウントはまだ有効化されていません。メールを確認してください!' + not_activated: '&cアカウントは有効化されていません。再試行する前に登録してアクティブ化してください。' + password_changed: '&2パスワードが正常に変更されました!' + logout: '&2正常にログアウトしました!' + reload: '&2設定とデータベースが正常に再読み込みされました!' + usage_change_password: '&c使用方法: /changepassword <旧パスワード> <新パスワード>' + accounts_owned_self: '所持しているアカウント数:%count 個' + accounts_owned_other: 'プレイヤー %name のアカウント数:%count 個' + +# Session messages +session: + valid_session: '&2セッションの再接続によるログインです。' + invalid_session: '&cIPアドレスが変更され、セッションのデータが期限切れです!' + +# Error messages when joining +on_join_validation: + same_ip_online: '同じIPアドレスを持つプレイヤーが既にゲーム内にいます!' + same_nick_online: '&4同じユーザー名のプレイヤーが既にサーバーでプレイしています!' + name_length: '&4ユーザー名が短すぎるか長すぎます!' + characters_in_name: '&4ユーザー名に無効な文字が含まれています。許可される文字:%valid_chars' + kick_full_server: '&4サーバーが満員です。後でもう一度お試しください!' + country_banned: '&4このサーバーへのアクセスは、お使いの国から制限されています!' + not_owner_error: 'このアカウントの所有者ではありません。別の名前を選択してください!' + invalid_name_case: '正しいユーザー名は %valid です。%invalid ではなく、このユーザー名で参加してください。' + quick_command: 'コマンドを速すぎる速度で使用しました!もう一度サーバーに参加してから、コマンドを使用する前にしばらくお待ちください。' + +# Email +email: + add_email_request: '&3コマンド「/email add <あなたのメールアドレス> <確認用メールアドレス>」を使用して、アカウントにメールアドレスを追加してください。' + usage_email_add: '&c使用方法:/email add <メールアドレス> <メールアドレスの確認>' + usage_email_change: '&c使用方法:/email change <古いメールアドレス> <新しいメールアドレス>' + new_email_invalid: '&c無効な新しいメールアドレスです。もう一度やり直してください!' + old_email_invalid: '&c無効な古いメールアドレスです。もう一度やり直してください!' + invalid: '&c無効なメールアドレスです。もう一度やり直してください!' + added: '&2メールアドレスがアカウントに正常に追加されました!' + add_not_allowed: '&cメールアドレスの追加は許可されていません。' + request_confirmation: '&cメールアドレスを確認してください!' + changed: '&2メールアドレスが正しく変更されました!' + change_not_allowed: '&cメールアドレスの変更は許可されていません。' + email_show: '&2現在のメールアドレスは:%email' + no_email_for_account: '&2現在、このアカウントに関連付けられたメールアドレスはありません。' + already_used: '&4そのメールアドレスは既に使用されています' + incomplete_settings: 'エラー:メールの送信に必要なすべての設定が設定されていません。管理者に連絡してください。' + send_failure: 'メールを送信できませんでした。管理者に連絡してください。' + change_password_expired: 'このコマンドを使用してパスワードを変更することはできません。' + email_cooldown_error: '&c最近すでにメールが送信されています。新しいメールを送信する前に、%time 待つ必要があります。' + +# Password recovery by email +recovery: + forgot_password_hint: '&3パスワードを忘れましたか?次のコマンドを使用してください:/email recovery <あなたのメールアドレス>' + command_usage: '&c使用方法:/email recovery <メールアドレス>' + email_sent: '&2パスワードの回復メールが正常に送信されました!メールの受信トレイを確認してください!' + code: + code_sent: 'パスワードをリセットするための回復コードがメールで送信されました。' + incorrect: '回復コードが正しくありません!残りの試行回数:%count' + tries_exceeded: '回復コードの入力試行回数が上限を超えました。新しいコードを生成するには、"/email recovery [メールアドレス]" を実行してください。' + correct: '回復コードが正しく入力されました!' + change_password: '即座にパスワードを変更するには、コマンド「/email setpassword <新しいパスワード>」を使用してください。' + +# Captcha +captcha: + usage_captcha: '&3ログインするには、Captchaコードを解決する必要があります。次のコマンドを使用してください:/captcha %captcha_code' + wrong_captcha: '&cCaptchaコードが間違っています。チャットに「/captcha %captcha_code」と入力してください!' + valid_captcha: '&2Captchaコードが正しく解決されました!' + captcha_for_registration: '登録するには、まずCaptchaを解決する必要があります。次のコマンドを使用してください:/captcha %captcha_code' + register_captcha_valid: '&2有効なCaptchaです!/register を使用して登録できます' + +# Verification code +verification: + code_required: '&3このコマンドはセンシティブな操作であり、メールの認証が必要です!受信トレイを確認し、メールの指示に従ってください。' + command_usage: '&c使用方法:/verification <コード>' + incorrect_code: '&cコードが正しくありません。メールで受け取ったコードを使用して、「/verification <コード>」とチャットに入力してください。' + success: '&2身元が確認されました!現在のセッション内ですべてのコマンドを実行できます!' + already_verified: '&2現在のセッションでは、既にすべてのセンシティブなコマンドを実行できます!' + code_expired: '&3コードの有効期限が切れています!新しいコードを取得するには、別のセンシティブなコマンドを実行してください!' + email_needed: '&3アカウントにはメールアドレスのリンクが必要です。身元を確認するためにはメールアドレスを関連付けてください!' + +# Time units +time: + second: '秒' + seconds: '秒' + minute: '分' + minutes: '分' + hour: '時間' + hours: '時間' + day: '日' + days: '日' + +# Two-factor authentication +two_factor: + code_created: '&2秘密コードは %code です。こちらからスキャンできます:%url' + confirmation_required: 'コードを確認するには、/2fa confirm <コード> を使用してください' + code_required: '二要素認証コードを提出するには、/2fa code <コード> を使用してください' + already_enabled: 'アカウントで既に二要素認証が有効になっています!' + enable_error_no_code: '2要素認証キーが生成されていないか、期限が切れています。/2fa add を実行してください' + enable_success: 'アカウントでの二要素認証が正常に有効になりました' + enable_error_wrong_code: 'コードが間違っているか、期限が切れています。/2fa add を実行してください' + not_enabled_error: 'アカウントでは二要素認証が有効になっていません。/2fa add を実行してください' + removed_success: 'アカウントから二要素認証が正常に削除されました' + invalid_code: '無効なコードです!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aBedrock 自動ログイン成功!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aログイン中にポータルに閉じ込められました。' + fix_underground: '&aログイン中に地下に閉じ込められました。' + cannot_fix_underground: '&aログイン中に地下に閉じ込められましたが、修正できません。' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&c二重ログインのため、切断されました。' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_ko.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_ko.yml new file mode 100644 index 0000000000..6354fdf4b2 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_ko.yml @@ -0,0 +1,175 @@ +#Translated by Kirito (kds123321@naver.com), Spectre (me@ptr.kr), Adeuran(adeuran@tistory.com) +#14.05.2017 Thanks for use +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&c현재 회원 가입이 비활성화 되어 있습니다!' + name_taken: '&c이미 이 닉네임으로 회원 가입이 되어 있습니다!' + register_request: '&3다음 명령어로 서버에 가입해주세요: /register <비밀번호> <비밀번호 확인>' + command_usage: '&c사용법: /register <비밀번호> <비밀번호 확인>' + reg_only: '&4등록된 유저만 서버에 접속할 수 있습니다! 서버 홈페이지에 방문하여 가입해 주세요!' + success: '&2회원 가입이 완료되었습니다!' + kicked_admin_registered: '관리자가 방금 이 닉네임을 등록했습니다. 다시 로그인 해주세요' + +# Password errors on registration +password: + match_error: '&c비밀번호가 일치하지 않습니다, 다시 확인해주세요!' + name_in_password: '&c자신의 닉네임을 비밀번호로 사용할 수 없습니다, 다른 비밀번호를 사용하세요...' + unsafe_password: '&c이 비밀번호는 안전하지 않습니다, 다른 비밀번호를 사용하세요...' + forbidden_characters: '&4비밀번호에 잘못된 문자가 있습니다. 허용된 문자: %valid_chars' + wrong_length: '&c비밀번호가 너무 짧거나 너무 깁니다!' + pwned_password: '&c선택한 비밀번호가 안전하지 않습니다. 이미 %pwned_count 번 사용되었습니다! 강력한 비밀번호를 사용하세요...' + +# Login +login: + command_usage: '&c사용법: /login <비밀번호>' + wrong_password: '&c비밀번호가 잘못되었습니다!' + success: '&2로그인 되었습니다!' + login_request: '&c다음 명령어로 로그인 해주세요: /login <비밀번호>' + timeout_error: '&4로그인 시간이 초과 되어 서버에서 추방당했습니다. 다시 시도하세요!' + +# Errors +error: + denied_command: '&c이 명령어를 사용하려면 로그인해야 합니다!' + denied_chat: '&c채팅을 하려면 로그인해야 합니다!' + unregistered_user: '&c이 유저는 등록되지 않았습니다!' + not_logged_in: '&c로그인이 되어있지 않습니다!' + no_permission: '&4이 작업을 수행할 수 있는 권한이 없습니다!' + unexpected_error: '&4예기치 않은 오류가 발생했습니다, 관리자에게 알려주세요!' + max_registration: '&c당신은 가입할 수 있는 계정 한도를 초과했습니다 (%reg_count/%max_acc %reg_names)!' + logged_in: '&c이미 로그인되어 있습니다!' + kick_for_vip: '&3서버가 꽉 차있을 때는 VIP 플레이어만 접속이 가능합니다!' + kick_unresolved_hostname: '&c오류 발생: 확인되지 않은 플레이어 호스트 이름!' + tempban_max_logins: '&c너무 많이 로그인에 실패하여 잠시 서버에서 차단되었습니다.' + +# AntiBot +antibot: + kick_antibot: 'AntiBot 보호 모드가 활성화 되었습니다! 서버에 접속하려면 몇 분 기다려야 합니다.' + auto_enabled: '&4[AntiBotService] 엄청나게 많은 연결이 감지 되어 AntiBot이 활성화 되었습니다!' + auto_disabled: '&2[AntiBotService] %m 분 후에 AntiBot이 비활성화 됩니다!' + +# Unregister +unregister: + success: '&c회원 탈퇴가 완료되었습니다!' + command_usage: '&c사용법: /unregister <비밀번호>' + +# Other messages +misc: + account_not_activated: '&c계정이 아직 활성화되지 않았습니다. 이메일을 확인해보세요!' + not_activated: '&c계정이 활성화되지 않았습니다. 다시 시도하기 전에 등록하고 활성화하세요.' + password_changed: '&2비밀번호가 변경되었습니다!' + logout: '&2로그아웃 되었습니다!' + reload: '&2설정과 데이터 베이스가 새로고침 되었습니다!' + usage_change_password: '&c사용법: /changepassword <예전 비밀번호> <새 비밀번호>' + accounts_owned_self: '%count 개의 계정을 소유하고 있습니다.' + accounts_owned_other: '플레이어 %name 는 %count 개의 계정을 소유하고 있습니다:' + +# Session messages +session: + valid_session: '&2세션 재 연결로 인해 로그인 되었습니다.' + invalid_session: '&cIP가 변경되어 세션이 만료되었습니다!' + +# Error messages when joining +on_join_validation: + same_ip_online: '똑같은 IP가 이미 이 서버에 접속해 있습니다!' + same_nick_online: '&4똑같은 닉네임이 이미 이 서버에 접속해 있습니다!' + name_length: '&4닉네임이 너무 짧거나 너무 깁니다!' + characters_in_name: '&4닉네임에 잘못된 문자가 있습니다. 허용된 문자: %valid_chars' + kick_full_server: '&4서버가 꽉 찼습니다. 나중에 다시 접속해보세요!' + country_banned: '&4당신의 국가에서는 이 서버를 이용하실 수 없습니다!' + not_owner_error: '이 계정의 소유자가 아닙니다. 다른 닉네임을 선택하세요!' + invalid_name_case: '%invalid가 아닌, %valid 사용하여 접속해야 합니다.' + quick_command: '명령어를 너무 빠르게 입력하고 있습니다! 서버에 다시 접속한 후 조금만 기다려주시기 바랍니다.' + +# Email +email: + add_email_request: '&3다음 명령어로 계정에 이메일 주소를 추가하세요: /email add <이메일 주소> <이메일 주소 확인>' + usage_email_add: '&c사용법: /email add <이메일 주소> <이메일 주소 확인>' + usage_email_change: '&c사용법: /email change <예전 이메일 주소> <새 이메일 주소>' + new_email_invalid: '&c새 이메일 주소가 잘못되었습니다. 다시 시도해보세요!' + old_email_invalid: '&c예전 이메일 주소가 잘못되었습니다. 다시 시도해보세요!' + invalid: '&c이메일 주소가 잘못되었습니다. 다시 시도해보세요!' + added: '&2계정에 이메일 주소를 추가했습니다!' + add_not_allowed: '&c이메일 주소의 추가가 제한된 상태입니다.' + request_confirmation: '&c이메일 주소를 확인해주세요!' + changed: '&2이메일 주소가 변경되었습니다!' + change_not_allowed: '&c이메일 주소의 변경이 제한된 상태입니다.' + email_show: '&2현재 이메일 주소: &f%email' + no_email_for_account: '&2현재 이 계정과 연결된 이메일 주소가 없습니다.' + already_used: '&4이메일 주소가 이미 사용 중입니다.' + incomplete_settings: '오류: 메일을 보내기 위해 필요한 설정이 되어 있지 않습니다. 관리자에게 알려주세요.' + send_failure: '이메일을 보낼 수 없습니다. 관리자에게 알려주세요.' + change_password_expired: '더 이상 이 명령어를 통해 비밀번호를 변경할 수 없습니다.' + email_cooldown_error: '&c이메일을 이미 발송했습니다. %time 후에 다시 발송할 수 있습니다.' + +# Password recovery by email +recovery: + forgot_password_hint: '&3비밀번호를 잊으셨나요? 이 명령어를 사용해보세요: /email recovery <이메일 주소>' + command_usage: '&c사용법: /email recovery <이메일 주소>' + email_sent: '&2복구 이메일을 보냈습니다! 메일함을 확인해보세요!' + code: + code_sent: '비밀번호 재설정을 위한 복구 코드가 이메일로 전송되었습니다.' + incorrect: '복구 코드가 올바르지 않습니다! "/email recovery [이메일 주소]"를 이용하여 새로 생성하세요.' + tries_exceeded: '잘못된 복구 코드를 너무 많이 입력했습니다. "/email recovery [이메일 주소]"를 통해 새로 생성하세요.' + correct: '복구 코드가 정상적으로 입력되었습니다!' + change_password: '비밀번호를 변경하려면 /email setpassword <새 비밀번호>를 입력해주세요.' + +# Captcha +captcha: + usage_captcha: '&3로그인 하려면 CAPTCHA 코드를 입력해야 합니다. 이 명령어를 사용하세요: /captcha %captcha_code' + wrong_captcha: '&c잘못된 CAPTCHA 코드 입니다. "/captcha %captcha_code" 형태로 입력해주세요!' + valid_captcha: '&2CAPTCHA 코드가 확인되었습니다!' + captcha_for_registration: '회원 가입을 하기 위해서는 먼저 CAPTCHA 코드를 입력해야합니다. 이 명령어를 이 명령어를 사용하세요: /captcha %captcha_code' + register_captcha_valid: '&2올바른 CAPTCHA 코드입니다! 이제 /register 명령어를 이용하여 회원 가입할 수 있습니다.' + +# Verification code +verification: + code_required: '&3이 명령어는 매우 민감하게 작동되며, 이메일 인증을 필요로 합니다. 이메일을 확인하고 지시에 따르십시오.' + command_usage: '&c사용법: /verification <인증 코드>' + incorrect_code: '&c코드가 올바르지 않습니다. "/verification <인증 코드>" 형태로 입력해주세요.' + success: '&2신원이 확인되었습니다. 귀하는 이 세션이 만료되기 전까지 모든 명령어를 사용할 수 있습니다.' + already_verified: '&2이 인증 코드는 이미 사용되었습니다!' + code_expired: '&3이 인증 코드는 만료되었습니다! 새 인증 코드를 발급받아주세요.' + email_needed: '&3귀하의 신원을 확인하기 위해서는 귀하의 계정과 이메일 주소가 연결되어 있어야 합니다.' + +# Time units +time: + second: '초' + seconds: '초' + minute: '분' + minutes: '분' + hour: '시간' + hours: '시간' + day: '일' + days: '일' + +# Two-factor authentication +two_factor: + code_created: '&2당신의 2단계 인증 코드는 %code 입니다. %url 에서 스캔할 수 있습니다' + confirmation_required: '/2fa confirm 명령어를 통해 귀하의 코드를 확인해 주시기 바랍니다.' + code_required: '/2fa code 명령어를 통해 2단계 인증을 진행해주세요.' + already_enabled: '2단계 인증 기능을 이미 활성화하셨습니다!' + enable_error_no_code: '2단계 인증 키가 생성되지 않았거나 만료되었습니다. /2fa add 명령어를 통해 새로 생성해주세요.' + enable_success: '2단계 인증 기능을 성공적으로 활성화하였습니다.' + enable_error_wrong_code: '잘못되었거나 만료된 코드입니다. /2fa add 명령어를 통해 새로 생성해주세요.' + not_enabled_error: '2단계 인증 기능을 활성화하시지 않았습니다. /2fa add 명령어를 통해 활성화해주세요.' + removed_success: '2단계 인증 기능을 성공적으로 비활성화하였습니다.' + invalid_code: '올바르지 않은 인증 코드입니다!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aBedrock 자동 로그인 성공!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&a로그인 중에 포탈에 갇혔습니다.' + fix_underground: '&a로그인 중에 지하에 갇혔습니다.' + cannot_fix_underground: '&a로그인 중에 지하에 갇혔지만, 수정할 수 없습니다.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&c중복 로그인으로 인해 연결이 종료되었습니다.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_lt.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_lt.yml new file mode 100644 index 0000000000..b09bbb64d7 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_lt.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&6Registracija yra išjungta' + name_taken: '&cVartotojo vardas jau užregistruotas' + register_request: '&ePrašome prisiregistruoti: /register slaptažodis pakartotiSlaptažodį' + command_usage: '&eNaudojimas: /register slaptažodis pakartotiSlaptažodį' + reg_only: '&cTik prisiregistravusiems žaidėjams: apsilankykite: https://example.com tam, kad užsiregistruoti.' + success: '&aSėkmingai prisiregistravote.' + kicked_admin_registered: 'Administatorius Jus užregistravo. Prisijunkite iš naujo' + +# Password errors on registration +password: + match_error: '&cSlaptažodžiai nesutampa' + name_in_password: '&cJūs negalite naudoti savo vardo slaptažodyje' + unsafe_password: '&cŠį Slaptažodį lengva nulaužti, pasirinkite kitą slaptažodį' + forbidden_characters: '&4Jūsų slaptažodis turi netinkamų simbolių. Leidžiami simboliai: %valid_chars' + wrong_length: '&cJūsų pasirinktas slaptažodis per ilgas arba per trumpas.' + pwned_password: '&cJūsų pasirinktas slaptažodis nėra saugus. Jis buvo naudotas %pwned_count kartų! Prašome naudoti stiprų slaptažodį...' + +# Login +login: + command_usage: '&eKomandos panaudojimas: /login slaptažodis' + wrong_password: '&cNeteisingas Slaptažosdis' + success: '&aSėkmingai prisijungėte' + login_request: '&ePrašome prisijungti: /login slaptažodis' + timeout_error: '&cNespėjote prisijungti' + +# Errors +error: + denied_command: '&cKad galetumėte naudoti šią komandą turite būti prisijungę!' + denied_chat: '&cKad galetumėte kalbėti Jūs turite būti prisijungę!' + unregistered_user: '&cVartotojas neprisiregistravęs' + not_logged_in: '&cJūs neprisijungę!' + no_permission: '&cNėra leidimo' + unexpected_error: '&cAtsirado klaida, praneškite adminstratoriui.' + max_registration: '&cJūs pasiekėte maksimalų registracijų skaičių.' + logged_in: '&cTu jau prisijungęs!' + kick_for_vip: '&cRėmėjas prisijungė į pilną serverį!' + kick_unresolved_hostname: '&cĮvyko klaida su žaidejo adresu!' + tempban_max_logins: '&cJūs laikinai užblokuotas, nes kelis kartus neteisingai suvedėte slaptažodį.' + +# AntiBot +antibot: + kick_antibot: 'AntiBot prevencija įjungta! Palaukite prieš prisijungiant.' + auto_enabled: '&4[AntiBotService] AntiBot prevencija pajungta dėl didelio kiekio prisijungimų!' + auto_disabled: '&2[AntiBotService] AntiBot bus išjungtas po %m minučių!' + +# Unregister +unregister: + success: '&aSėkmingai išsiregistravote!' + command_usage: '&ePanaikinti registraciją: "/unregister slaptažodis"' + +# Other messages +misc: + account_not_activated: '&aJūsų vartotojas nėra patvirtintas, pasitikrinkite el.paštą.' + not_activated: '&cPaskyra neaktyvuota, prašome užsiregistruoti ir aktyvuoti prieš bandant dar kartą.' + password_changed: '&aSlaptažodis pakeistas' + logout: '&aSėkmingai atsijungėte' + reload: '&aNustatymai ir duomenų bazė buvo perkrauta.' + usage_change_password: '&ePanaudojimas: /changepassword senasSlaptažodis naujasSlaptažodis' + accounts_owned_self: 'Jūs turite %count paskyrą(-s):' + accounts_owned_other: 'Žaidejas %name turi %count paskyrą(-s):' + +# Session messages +session: + valid_session: '&aAutomatinis sesijos prisijungimas' + invalid_session: '&cSesijos laikai nesutampa. Prašome palaukti kol sesija baigsis.' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Žaidejas su tuo pačiu IP adresu jau yra žaidime!' + same_nick_online: '&cKažkas šituo vardu jau žaidžia.' + name_length: '&cJūsų vardas yra per ilgas arba per trumpas.' + characters_in_name: '&cJūsų varde yra neledziamų simbolių. Leidžiami: %valid_chars' + kick_full_server: '&cServeris yra pilnas, atsiprašome.' + country_banned: '&4Jūsų šalis yra užblokuota šiame serveryje!' + not_owner_error: 'J0s nesate šios paskyros savininkas, pasirinkite kitą vardą!' + invalid_name_case: 'Turėtumėte prisijungti su vardu %valid, o ne su: %invalid.' + quick_command: 'Jūs panaudojote komandą per greitai! Prisijunkite iš naujo ir šiek tiek palaukite prieš naudojant komandas.' + +# Email +email: + add_email_request: '&ePrašome jūsų pridėti savo el.paštą : /email add ' + usage_email_add: '&cNaudojimas: /email add ' + usage_email_change: '&cNaudojimas: /email change ' + new_email_invalid: '&cNeteisingas el.paštas, bandykite iš naujo!' + old_email_invalid: '&cNeteisingas senas el.paštas, bandykite iš naujo!' + invalid: '&cNeteisingas el.paštas, bandykite iš naujo!' + added: '&2El.paštas sėkmingai pridėtas!' + add_not_allowed: '&cNaujo el.pašto pridejimas nėra galimas' + request_confirmation: '&cPatvirtinkite savo el.paštą!' + changed: '&2El.paštą pakeistas sėkmingai!' + change_not_allowed: '&cEl.pašto keitimas nėra galimas' + email_show: '&2Jūsų dabartinis el.pašto adresas: &f%email' + no_email_for_account: '&2Šiuo metu Jūs neturite pridėję jokio el.pašto adreso.' + already_used: '&4Jis el.pašto adresas jau yra naudojamas' + incomplete_settings: 'Klaida: Ne visi nustatymai yra nustatyti laiško siuntimui. Susikietite su administratoriumi.' + send_failure: 'El.pašto laiškas nebuvo išsiųstas. Susikietite su administratoriumi.' + change_password_expired: 'Jūs nebegalite pakeisti savo slaptažodzio naudojant šią komandą.' + email_cooldown_error: '&cEl.pašto laiškas jau buvo išsiųstas. Palaukite %time prieš šiunčiant naują.' + +# Password recovery by email +recovery: + forgot_password_hint: '&cPamiršote savo slaptažodį? Rašykite: /email recovery el.paštas' + command_usage: '&cNaudojimas: /email recovery el.paštas' + email_sent: '&2Laiškas į Jūsų el.pašto adresą buvo išsiųstas!' + code: + code_sent: 'Kodas slaptažodžio atstatymui buvo išsiųstas į Jūsų el.paštą.' + incorrect: 'Kodas neteisingas! Jums liko %count bandymai(-as).' + tries_exceeded: 'Jūs išnaudojote visus bandymus. Naudokite "/email recovery el.paštas", kad gauti naują kodą.' + correct: 'Kodas įvestas sėkmingai!' + change_password: 'Naudokite /email setpassword , kad pasikeistumėte slaptažodį.' + +# Captcha +captcha: + usage_captcha: '&cPanaudojimas: /captcha %captcha_code' + wrong_captcha: '&cNeteisinga captcha, naudokite : /captcha %captcha_code' + valid_captcha: '&cJūsų captcha teisinga!' + captcha_for_registration: 'Kad prisiregistruotumėte turite įvygdyti captchą. Rašykite: /captcha %captcha_code' + register_captcha_valid: '&2Captcha teisinga! Galite naudoti /register' + +# Verification code +verification: + code_required: '&3Kad galėtumėte naudoti šią komandą turite patvirtinti savo el.pašto adresą! Sekite instrukcijas savo el.pašte.' + command_usage: '&cNaudojimas: /verification ' + incorrect_code: '&cNeteisingas kodas, naudokite "/verification " įvesdami kodą gautą savo el.pašte' + success: '&2Jūsų paskyra patvirtinta! Jūs galite naudoti visas komandas!' + already_verified: '&2Jūs jau esate patvirtinę savo paskyrą ir galite naudoti visas komandas!' + code_expired: '&3Jūsų kodo galiojimas baigėsi! Panaudokite komandą iš naujo, kad gautumėte naują kodą!' + email_needed: '&3Kad patvirtinti savo paskyra turite pridėti el.pašto adresą!' + +# Time units +time: + second: 'sekundę' + seconds: 'sekundes' + minute: 'minutę' + minutes: 'minutes' + hour: 'valandą' + hours: 'valandas' + day: 'dieną' + days: 'dienas' + +# Two-factor authentication +two_factor: + code_created: '&2Jūsų slaptas kodas yra %code. Jį galite nuskenuoti čia: %url' + confirmation_required: 'Patvirtinkite savo kodą su: /2fa confirm ' + code_required: 'Patvirkinkite savo kodą su: /2fa code ' + already_enabled: 'Jūs jau turite dviejų faktorių autentifikaciją!' + enable_error_no_code: 'Jūs neturite dviejų faktorių autentifikacijos arba ji pasibaigė. Rašykite /2fa add' + enable_success: 'Dviejų faktorių autentifikacija sėkmingai įjungta' + enable_error_wrong_code: 'Neteisingas arba pasibaigęs kodas. Rašykite /2fa add' + not_enabled_error: 'Dviejų faktorių autentifikavimas nėra įjungtas ant jūsų paskyros. Rašykite /2fa add' + removed_success: 'Dviejų faktorių autentifikavimas sėkmingai pašalintas iš jūsų paskyros.' + invalid_code: 'Neteisingas kodas!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aBedrock automatinis prisijungimas sėkmingas!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aJūs užstrigote portale prisijungimo metu.' + fix_underground: '&aJūs užstrigote po žeme prisijungimo metu.' + cannot_fix_underground: '&aJūs užstrigote po žeme prisijungimo metu, bet mes negalime to pataisyti.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cJūs buvote atjungtas dėl dvigubo prisijungimo.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_nl.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_nl.yml new file mode 100644 index 0000000000..42c3207c93 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_nl.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cRegistratie is uitgeschakeld!' + name_taken: '&cJe hebt deze gebruikersnaam al geregistreerd!' + register_request: '&cRegistreer met het commando: /register ' + command_usage: '&cGebruik: /register ' + reg_only: 'Alleen voor geregistreerde spelers! Bezoek https://example.com om te registreren!' + success: '&cSuccesvol geregistreerd!' + kicked_admin_registered: 'Een administrator heeft je net geregistreerd; log alsjeblieft opnieuw in.' + +# Password errors on registration +password: + match_error: 'Jouw wachtwoorden komen niet overeen, controleer ze opnieuw!' + name_in_password: '&fJe kunt je gebruikersnaam niet als wachtwoord gebruiken, kies een ander wachtwoord...' + unsafe_password: '&fDit wachtwoord is onveilig, kies een ander wachtwoord...' + forbidden_characters: '&cJouw wachtwoord bevat ongeldige tekens. Toegestane karakters zijn: %valid_chars' + wrong_length: 'Jouw gekozen wachtwoord voldoet niet aan de minimum of maximum lengte, kies een ander wachtwoord...' + pwned_password: '&cHet gekozen wachtwoord is niet veilig. Het is al %pwned_count keer gebruikt! Gebruik alstublieft een sterk wachtwoord...' + +# Login +login: + command_usage: '&cGebruik: /login ' + wrong_password: '&cFout wachtwoord' + success: '&cSuccesvol ingelogd!' + login_request: '&cLog in met: /login ' + timeout_error: 'Login time-out: het duurde te lang tot je inlogde.' + +# Errors +error: + denied_command: '&cJe moet ingelogd zijn om dit commando te gebruiken!' + denied_chat: '&cJe moet ingelogd zijn om te kunnen chatten!' + unregistered_user: '&cDeze gebruikersnaam is niet geregistreerd!' + not_logged_in: '&cNiet ingelogd!' + no_permission: '&cJe hebt geen rechten om deze actie uit te voeren!' + unexpected_error: 'Er is een onverwachte fout opgetreden, neem contact op met een administrator!' + max_registration: 'Je hebt het maximum aantal registraties overschreden (%reg_count/%max_acc: %reg_names).' + logged_in: '&cJe bent al ingelogd!' + kick_for_vip: '&cEen VIP-gebruiker heeft ingelogd toen de server vol was!' + kick_unresolved_hostname: '&cEr heeft een fout plaatsgevonden: hostname van de speler kon niet gevonden worden!' + tempban_max_logins: '&cJe bent tijdelijk gebanned omdat het inloggen te vaak mislukt is.' + +# AntiBot +antibot: + kick_antibot: 'AntiBot is aangezet! Wacht alsjeblieft enkele minuten voor je je met de server verbindt.' + auto_enabled: '[AuthMe] AntiBotMod automatisch aangezet vanwege te veel verbindingen!' + auto_disabled: '[AuthMe] AntiBotMod automatisch uitgezet na %m minuten!' + +# Unregister +unregister: + success: '&cSuccesvol afgemeld!' + command_usage: '&cGebruik: /unregister [wachtwoord]' + +# Other messages +misc: + account_not_activated: 'Je account is nog niet geactiveerd, controleer je mailbox!' + not_activated: '&cAccount niet geactiveerd, registreer en activeer het alstublieft voordat u het opnieuw probeert.' + password_changed: '&cWachtwoord succesvol aangepast!' + logout: '&2Je bent succesvol uitgelogd!' + reload: '&2De configuratie en database zijn succesvol herladen!' + usage_change_password: '&cGebruik: /changepassword ' + accounts_owned_self: 'Je bezit %count accounts:' + accounts_owned_other: 'De speler %name heeft %count accounts:' + +# Session messages +session: + valid_session: '&2Ingelogd wegens sessie-herverbinding.' + invalid_session: '&cJouw IP-adres is veranderd en je sessie is verlopen!' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Een speler met hetzelfde IP-adres is al online!' + same_nick_online: '&4Er is al iemand met jouw gebruikersnaam online.' + name_length: '&4Jouw gebruikersnaam is te kort of te lang!' + characters_in_name: '&4Jouw gebruikersnaam bevat ongeldige tekens. Toegestane karakters zijn: %valid_chars' + kick_full_server: '&4De server is vol, probeer het later opnieuw!' + country_banned: '&4Jouw land is gebanned op deze server!' + not_owner_error: 'Jij bent niet de eigenaar van dit account. Kies alsjeblieft een andere naam!' + invalid_name_case: 'Verbind je alsjeblieft als %valid, niet als %invalid.' + quick_command: 'Je voerde te snel een commando uit! Verbind alsjeblieft opnieuw met de server en wacht langer voor het gebruiken van een commando.' + +# Email +email: + add_email_request: '&3Voeg jouw e-mailadres alsjeblieft toe met: /email add ' + usage_email_add: '&cGebruik: /email add ' + usage_email_change: '&cGebruik: /email change ' + new_email_invalid: '&cOngeldig nieuw e-mailadres, probeer het opnieuw!' + old_email_invalid: '&cOngeldig oud e-mailadres, probeer het opnieuw!' + invalid: '&cOngeldig E-mailadres, probeer het opnieuw!' + added: '&2Het e-mailadres is succesvol toegevoegd aan je account!' + add_not_allowed: '&cEen e-mailadres toevoegen is niet toegestaan' + request_confirmation: '&cVerifiëer je e-mailadres alsjeblieft!' + changed: '&2Het e-mailadres is succesvol veranderd!' + change_not_allowed: '&cEen e-mailadres wijzigen is niet toegestaan' + email_show: '&2Jouw huidige e-mailadres is: %email' + no_email_for_account: '&2Je hebt nog geen e-mailadres toegevoegd aan dit account.' + already_used: '&4Dit e-mailadres wordt al gebruikt' + incomplete_settings: 'Fout; er moeten nog enkele opties ingevuld worden om mails te kunnen sturen. Neem contact op met een administrator.' + send_failure: 'De e-mail kon niet verzonden worden. Neem contact op met een administrator.' + change_password_expired: 'Je kunt je wachtwoord niet meer veranderen met dit commando.' + email_cooldown_error: '&cEr is recent al een e-mail verzonden. Je moet %time wachten voordat je een nieuw bericht kunt versturen.' + +# Password recovery by email +recovery: + forgot_password_hint: '&3Wachtwoord vergeten? Gebruik alsjeblieft het commando: /email recovery ' + command_usage: '&cGebruik: /email recovery ' + email_sent: '&2Een herstel e-mail is verzonden! Check alsjeblieft je mailbox!' + code: + code_sent: 'Een herstelcode voor je wachtwoord is naar je mailbox gestuurd.' + incorrect: 'De herstelcode is niet correct! Je kunt het nog %count keer proberen.' + tries_exceeded: 'Je hebt het maximum aantal pogingen om een herstel code in te vullen bereikt. Gebruik "/email recovery [e-mail]" om een nieuwe code te krijgen' + correct: 'De herstelcode is correct!' + change_password: 'Gebruik alsjeblieft het commando /email setpassword om je wachtwoord direct te veranderen.' + +# Captcha +captcha: + usage_captcha: '&3Om in te loggen moet je een captcha-code oplossen, gebruik het commando: /captcha %captcha_code' + wrong_captcha: '&cVerkeerde captcha-code, typ alsjeblieft "/captcha %captcha_code" in de chat!' + valid_captcha: '&2De captcha-code is geldig!' + captcha_for_registration: 'Om je te registreren moet je eerst een captcha oplossen. Gebruik alsjeblieft het volgende commando: /captcha %captcha_code' + register_captcha_valid: 'Valide puzzel! Je mag je nu registreren met /register' + +# Verification code +verification: + code_required: '&3Dit commando is gevoelig en vereist een e-mail verificatie! Bekijk je inbox en volg de opgegeven instructies.' + command_usage: '&cGebruik: /verification ' + incorrect_code: '&cIncorrecte code, type alsjeblieft "/verification " in de chat met de code die je hebt ontvangen in je email' + success: '&2Je identiteit is vastgesteld! Je kan nu alle commandos uitvoeren tijdens deze sessie!' + already_verified: '&2Je kan momenteel alle gevoelige commandos al uitvoeren!' + code_expired: '&3Je code is verlopen! Voer een nieuw gevoelig commando uit om een nieuwe code te ontvangen!' + email_needed: '&3Om je identiteit vast te stellen moet je een e-mailadres verbinden aan je account!!' + +# Time units +time: + second: 'seconde' + seconds: 'seconden' + minute: 'minuut' + minutes: 'minuten' + hour: 'uur' + hours: 'uren' + day: 'dag' + days: 'dagen' + +# Two-factor authentication +two_factor: + code_created: '&2Je geheime code is %code. Je kunt hem scannen op %url' + confirmation_required: 'Verifieer alsjeblieft je code met /2fa confirm ' + code_required: 'Stuur alsjeblieft je twee-factor authenticatie code met /2fa code ' + already_enabled: 'Twee-factor authenticatie is al aangezet voor jouw account!' + enable_error_no_code: 'Geen 2fa-sleutel is voor jou gegenereerd. Of hij is verlopen. Voer alsjeblieft "/2fa add" uit' + enable_success: 'Je hebt successvol twee-factor authenticatie ingeschakelt voor jou account' + enable_error_wrong_code: 'Foutieve, of verlopen code. Voer alsjeblieft "/2fa add" uit.' + not_enabled_error: 'Twee-factor authenticatie is uitgeschakeld voor jou account. Voer "/2fa add" uit' + removed_success: 'Twee-factor authenticatie is met succes van jouw account verwijderd.' + invalid_code: 'Ongeldige code!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aBedrock automatisch inloggen gelukt!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aU zit vast in een portal tijdens het inloggen.' + fix_underground: '&aU zit vast onder de grond tijdens het inloggen.' + cannot_fix_underground: '&aU zit vast onder de grond tijdens het inloggen, maar we kunnen het niet repareren.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cU bent losgekoppeld vanwege een dubbele inlog.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_pl.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_pl.yml new file mode 100644 index 0000000000..e263df569e --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_pl.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&4Rejestracja jest wyłączona.' + name_taken: '&4Gracz już jest zarejestrowany.' + register_request: '&2Proszę się zarejestrować przy użyciu &6/register ' + command_usage: '&4Użycie: /register ' + reg_only: '&fTylko zarejestrowani użytkownicy mają do tego dostęp!' + success: '&aPomyślnie zarejestrowany!' + kicked_admin_registered: 'Administrator zarejestrował Ciebie, możesz się zalogować.' + +# Password errors on registration +password: + match_error: '&fHasło niepoprawne!' + name_in_password: '&cNie możesz używać nicku jako hasła, wybierz inne...' + unsafe_password: '&cTwoje hasło nie jest bezpieczne, wybierz inne...' + forbidden_characters: '&4W twoim haśle występują niedozwolone znaki, dozwolone znaki to: %valid_chars' + wrong_length: '&fTwoje hasło jest za krótkie lub za długie! Spróbuj ponownie...' + pwned_password: '&cTwoje wybrane hasło nie jest bezpieczne. Zostało już użyte %pwned_count razy! Proszę użyj silnego hasła...' + +# Login +login: + command_usage: '&cUżycie: /login hasło' + wrong_password: '&cNiepoprawne hasło.' + success: '&aHasło zaakceptowane!' + login_request: '&2Proszę się zalogować przy użyciu &6/login ' + timeout_error: '&cUpłynął limit czasu zalogowania' + +# Errors +error: + denied_command: '&cAby użyć tej komendy musisz się zalogować!' + denied_chat: '&cAby pisać na chacie musisz się zalogować!' + unregistered_user: '&fGracz nie jest zarejestrowany.' + not_logged_in: '&4Nie jesteś zalogowany!' + no_permission: '&4Nie posiadasz wymaganych uprawnień.' + unexpected_error: '&fWystąpił błąd, prosimy skontaktować się z administracją serwera.' + max_registration: '&cPrzekroczyłeś limit zarejestrowanych kont na serwerze &8(&e%reg_count/%max_acc %reg_names&8) &cdla twojego połączenia.' + logged_in: '&fJesteś już zalogowany!' + kick_for_vip: '&cGracz VIP dołączył do gry!' + kick_unresolved_hostname: '&cWystąpił błąd: nierozwiązana nazwa hosta gracza!' + tempban_max_logins: '&cZostałeś tymczasowo zbanowany za dużą liczbę nieudanych logowań!' + +# AntiBot +antibot: + kick_antibot: '&cAntyBot został włączony, musisz poczekać minutę przed dołączeniem do serwera.' + auto_enabled: '&4[AntiBot] &aAntyBot włączony z powodu dużej liczby połączeń!' + auto_disabled: '&2[AntiBot] &aAntyBot zostanie wyłączony za &7%m &aminut!' + +# Unregister +unregister: + success: '&4Pomyślnie wyrejestrowany!' + command_usage: '&cUżycie: /unregister hasło' + +# Other messages +misc: + account_not_activated: '&fTwoje konto nie zostało aktywowane! Sprawdź maila.' + not_activated: '&cKonto nieaktywowane, proszę zarejestruj się i aktywuj konto przed ponowną próbą.' + password_changed: '&fHasło zostało zmienione!' + logout: '&cPomyślnie wylogowany' + reload: '&fKonfiguracja bazy danych została przeładowana.' + usage_change_password: '&fUżycie: /changepassword ' + accounts_owned_self: '&7Posiadasz %count kont:' + accounts_owned_other: '&7Gracz %name posiada %count kont:' + +# Session messages +session: + valid_session: '&aZalogowano automatycznie z powodu sesji logowania.' + invalid_session: '&fSesja logowania zakończona!' + +# Error messages when joining +on_join_validation: + same_ip_online: '&cGracz z takim samym adresem ip jest aktualnie w grze!' + same_nick_online: '&fTen nick już gra na serwerze!' + name_length: '&cTwoje konto ma za długa bądź za krotką nazwę.' + characters_in_name: '&cTwoje konto ma w nazwie niedozwolone znaki. Dozwolone znaki: %valid_chars' + kick_full_server: '&cSerwer jest teraz zapełniony, przepraszamy!' + country_banned: '&4Ten kraj jest zbanowany na tym serwerze' + not_owner_error: '&cNie jesteś właścicielem tego konta, wybierz inny nick!' + invalid_name_case: '&cPowinieneś dołączyć do serwera z nicku %valid, a nie %invalid.' + quick_command: '&cUżyłeś komendy zbyt szybko! Ponownie dołącz do serwera i poczekaj chwilę, zanim użyjesz dowolnej komendy.' + +# Email +email: + add_email_request: '&cProszę dodać swój e-mail: /email add ' + usage_email_add: '&fWpisz: /email add ' + usage_email_change: '&fWpisz: /email change ' + new_email_invalid: '[AuthMe] Nowy e-mail niepoprawny!' + old_email_invalid: '[AuthMe] Stary e-mail niepoprawny!' + invalid: '[AuthMe] Nieprawidłowy adres e-mail.' + added: '[AuthMe] E-mail został dodany do Twojego konta!' + add_not_allowed: '&cMożliwość dodania adresu e-mail jest wyłączona.' + request_confirmation: '[AuthMe] Potwierdź swój adres e-mail!' + changed: '[AuthMe] E-mail został zmieniony!' + change_not_allowed: '&cMożliwość zmiany adresu e-mail jest wyłączona.' + email_show: '&2Twój aktualny adres e-mail to: &f%email' + no_email_for_account: '&2Nie posiadasz adresu e-mail przypisanego do tego konta.' + already_used: '&4Ten adres e-mail jest aktualnie używany!' + incomplete_settings: 'Błąd: Nie wszystkie opcje odpowiedzialne za wysyłanie e-maili zostały skonfigurowane. Skontaktuj się z administracją.' + send_failure: 'Nie można wysłać e-maila. Skontaktuj się z administracją.' + change_password_expired: 'Nie zmienisz już hasła przy użyciu tej komendy.' + email_cooldown_error: '&cE-mail został wysłany, musisz poczekać %time przed wysłaniem następnego.' + +# Password recovery by email +recovery: + forgot_password_hint: '&cZapomniałeś hasła? Proszę użyj komendy /email recovery ' + command_usage: '&fWpisz: /email recovery ' + email_sent: '[AuthMe] E-mail z odzyskaniem wysłany!' + code: + code_sent: 'Kod odzyskiwania hasła został wysłany na adres e-mail przypisany do konta.' + incorrect: '&cKod odzyskiwania hasła jest błędny! &4Pozostałe próby: %count.' + tries_exceeded: 'Osiągnięto limit prób wpisania kodu odzyskiwania. Wpisz /email recovery [e-mail] aby wygenerować nowy kod.' + correct: '&aKod odzyskiwania został wpisany pomyślnie!' + change_password: 'Wpisz komendę /email setpassword aby zmienić hasło do konta.' + +# Captcha +captcha: + usage_captcha: '&cWpisz: /captcha %captcha_code' + wrong_captcha: '&cZły kod, proszę wpisać: /captcha %captcha_code' + valid_captcha: '&cTwój kod jest nieprawidłowy!' + captcha_for_registration: '&cAby się zarejestrować, musisz przepisać kod captacha. Użyj komendy: /captcha %captcha_code' + register_captcha_valid: '&2Prawidłowy kod captacha! Teraz możesz się zarejestrować komendą /register' + +# Verification code +verification: + code_required: '&3Ta komenda wymaga weryfikacji przez e-mail! Sprawdź swoją skrzynkę odbiorczą i postępuj zgodnie z instrukcjami w wiadomości.' + command_usage: '&cUżycie: /verification ' + incorrect_code: '&cNieprawidłowy kod z e-maila, wpisz komende "/verification ". W miejscu wpisz swój kod z emaila.' + success: '&2Twoja tożsamość została zweryfikowana! Możesz teraz wykonywać wszystkie komendy w bieżącej sesji!' + already_verified: '&2Możesz już wykonać każdą komende w bieżącej sesji!' + code_expired: '&3Twój kod wygasł! Wykonaj ponownie komende, aby uzyskać nowy kod!' + email_needed: '&3Aby zweryfikować swoją tożsamość, musisz połączyć adres e-mail z kontem!' + +# Time units +time: + second: 'sekundy' + seconds: 'sekund' + minute: 'minuty' + minutes: 'minut' + hour: 'godziny' + hours: 'godzin' + day: 'dzień' + days: 'dni' + +# Two-factor authentication +two_factor: + code_created: '&2Twój sekretny kod to %code. Możesz zeskanować go tutaj: %url' + confirmation_required: 'Musisz potwierdzić swój kod komendą /2fa confirm ' + code_required: 'Wpisz swój kod weryfikacji dwuetapowej przy pomocy komendy /2fa code ' + already_enabled: '&aWeryfikacja dwuetapowa jest już włączona dla Twojego konta.' + enable_error_no_code: '&cKod weryfikacji dwuetapowej nie został dla Ciebie wygenerowany lub wygasł. Wpisz komende /2fa add' + enable_success: '&aWeryfikacja dwuetapowa została włączona dla Twojego konta.' + enable_error_wrong_code: '&cWpisany kod jest nieprawidłowy lub wygasły. Wpisz ponownie /2fa add' + not_enabled_error: 'Weryfikacja dwuetapowa nie jest włączona dla twojego konta. Wpisz komende /2fa add' + removed_success: '&aPomyślnie usunięto weryfikacje dwuetapową z Twojego konta.' + invalid_code: '&cWpisany kod jest nieprawidłowy, spróbuj jeszcze raz.' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aAutomatyczne logowanie na Bedrocku udane!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aUtknąłeś w portalu podczas logowania.' + fix_underground: '&aUtknąłeś pod ziemią podczas logowania.' + cannot_fix_underground: '&aUtknąłeś pod ziemią podczas logowania, ale nie możemy tego naprawić.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cZostałeś rozłączony z powodu podwójnego logowania.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_pt.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_pt.yml new file mode 100644 index 0000000000..d8352e5102 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_pt.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cRegisto de novos utilizadores desactivado' + name_taken: '&cUtilizador já registado' + register_request: '&cPor favor registe-se com "/register "' + command_usage: '&cUse: /register ' + reg_only: '&fApenas jogadores registados podem entrar no servidor! Visite https://example.com para se registar' + success: '&cRegistado com sucesso!' + kicked_admin_registered: 'Um administrador registou-te, por favor entre novamente' + +# Password errors on registration +password: + match_error: '&fAs passwords não coincidem' + name_in_password: '&cNão pode o usar seu nome como senha, por favor, escolha outra ...' + unsafe_password: '&cA senha escolhida não é segura, por favor, escolha outra ...' + forbidden_characters: '&4Sua senha contém caracteres ilegais. Caracteres permitidos: %valid_chars' + wrong_length: '&fPassword demasiado curta ou longa! Por favor escolhe outra outra!' + pwned_password: '&cA senha escolhida não é segura. Ela foi usada %pwned_count vezes! Por favor, use uma senha forte...' + +# Login +login: + command_usage: '&cUse: /login ' + wrong_password: '&cPassword errada!' + success: '&bAutenticado com sucesso!' + login_request: '&cIdentifique-se com "/login "' + timeout_error: '&fExcedeu o tempo para autenticação' + +# Errors +error: + denied_command: '&cPara utilizar este comando é necessário estar logado!' + denied_chat: '&cPara usar o chat deve estar logado!' + unregistered_user: '&cUsername não registado' + not_logged_in: '&cNão autenticado!' + no_permission: '&cSem Permissões' + unexpected_error: '&fOcorreu um erro; Por favor contacte um administrador' + max_registration: '&cAtingiu o numero máximo de %reg_count contas registas, maximo de contas %max_acc' + logged_in: '&cJá se encontra autenticado!' + kick_for_vip: '&cUm jogador VIP entrou no servidor cheio!' + kick_unresolved_hostname: '&cOcorreu um erro: nome do servidor do jogador não resolvido!' + tempban_max_logins: '&cVocê foi temporariamente banido por falhar muitas vezes o login.' + +# AntiBot +antibot: + kick_antibot: 'Modo de protecção anti-Bot está habilitado! Tem que espere alguns minutos antes de entrar no servidor.' + auto_enabled: '[AuthMe] AntiBotMod activado automaticamente devido a um aumento anormal de tentativas de ligação!' + auto_disabled: '[AuthMe] AntiBotMod desactivado automaticamente após %m minutos, esperamos que a invasão tenha parado' + +# Unregister +unregister: + success: '&cRegisto eliminado com sucesso!' + command_usage: '&cUse: /unregister ' + +# Other messages +misc: + account_not_activated: '&fA sua conta não foi ainda activada, verifique o seu email onde irá receber indicações para activação de conta. ' + not_activated: '&cConta não ativada, por favor, registre-se e ative antes de tentar novamente.' + password_changed: '&cPassword alterada!' + logout: '&cSaida com sucesso' + reload: '&fConfiguração e base de dados foram recarregadas' + usage_change_password: '&fUse: /changepassword ' + accounts_owned_self: 'Você possui %count contas:' + accounts_owned_other: 'O jogador %name possui %count contas:' + +# Session messages +session: + valid_session: '&cSessão válida' + invalid_session: '&fDados de sessão não correspondem. Por favor aguarde o fim da sessão' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Um jogador com o mesmo IP já está em jogo!' + same_nick_online: '&fO mesmo nickname já se encontra a jogar no servidor' + name_length: '&cO seu nick é demasiado curto ou muito longo.' + characters_in_name: '&cO seu nickname contém caracteres não permitidos. Permitido: %valid_chars' + kick_full_server: '&cO servidor está actualmente cheio, lamentamos!' + country_banned: 'O seu país está banido deste servidor' + not_owner_error: 'Não é o proprietário da conta. Por favor, escolha outro nome!' + invalid_name_case: 'Deve se juntar usando nome de usuário %valid, não %invalid.' + quick_command: 'Você usou o comando demasiado rapido por favor re-entre no servidor e aguarde antes de digitar qualquer comando.' + +# Email +email: + add_email_request: '&cPor favor adicione o seu email com : /email add ' + usage_email_add: '&fUse: /email add ' + usage_email_change: '&fUse: /email change ' + new_email_invalid: 'Novo email inválido!' + old_email_invalid: 'Email antigo inválido!' + invalid: 'Email inválido!' + added: 'Email adicionado com sucesso!' + add_not_allowed: '&cAdicionar e-mail não é permitido' + request_confirmation: 'Confirme o seu email!' + changed: 'Email alterado com sucesso!' + change_not_allowed: '&cAlterar e-mail não é permitido' + email_show: '&2O seu endereço de email atual é &f%email' + no_email_for_account: '&2Você atualmente não tem um endereço de email associado a essa conta.' + already_used: '&4O endereço de e-mail já está sendo usado' + incomplete_settings: 'Erro: nem todas as definições necessarias para enviar email foram preenchidas. Por favor contate um administrador.' + send_failure: 'Não foi possivel enviar o email. Por favor contate um administrador.' + change_password_expired: 'Você não pode mais alterar a sua password usando este comando.' + email_cooldown_error: '&cUm email já foi enviado recentemente.Por favor, espere %time antes de enviar novamente' + +# Password recovery by email +recovery: + forgot_password_hint: '&cPerdeu a sua password? Para a recuperar escreva /email recovery ' + command_usage: '&fUse: /email recovery ' + email_sent: 'Nova palavra-passe enviada para o seu email!' + code: + code_sent: 'O codigo para redefinir a senha foi enviado para o seu e-mail.' + incorrect: 'O codigo de recuperação está incorreto! Use "/email recovery [email]" para gerar um novo' + tries_exceeded: 'Você excedeu o numero maximo de tentativas para introduzir o codigo de recuperação. Use "/email recovery [email]" para gerar um novo.' + correct: 'O codigo de recuperação foi introduzido corretamente!' + change_password: 'Por favor use o comando /email setpassword para mudar a password imediatamente.' + +# Captcha +captcha: + usage_captcha: '&cPrecisa digitar um captcha, escreva: /captcha %captcha_code' + wrong_captcha: '&cCaptcha errado, por favor escreva: /captcha %captcha_code' + valid_captcha: '&cO seu captcha é válido!' + captcha_for_registration: 'Para se registar tem de resolver o captcha primeiro, por favor use: /captcha %captcha_code' + register_captcha_valid: '&2Captcha Valido! Agora você pode te registar com /register' + +# Verification code +verification: + code_required: '&3Este codigo é sensivel e requer uma verificação por e-mail! Verifique na sua caixa de entrada e siga as instruções do e-mail.' + command_usage: '&cUso: /verification ' + incorrect_code: '&cCodigo incorreto, por favor digite "/verification " no chat, utilizando o codigo que recebeu no e-mail.' + success: '&2Sua identidade foi verificada! Agora você pode executar todos os comandos nesta sessão!' + already_verified: '&2Você já pode digitar todos os comandos sensiveis nesta sessão!' + code_expired: '&3Seu codigo expirou! Execute outro comando sensivel para obter um novo codigo!' + email_needed: '&3Para confirmar a sua identidade necessita de associar um endereço de e-mail!!' + +# Time units +time: + second: 'segundo' + seconds: 'segundos' + minute: 'minuto' + minutes: 'minutos' + hour: 'hora' + hours: 'horas' + day: 'dia' + days: 'dias' + +# Two-factor authentication +two_factor: + code_created: '&2O seu código secreto é o %code. Você pode verificá-lo a partir daqui %url' + confirmation_required: 'Por favor confirme seu codigo de 2 etapas com /2fa confirm ' + code_required: 'Por favor submita seu codigo de duas etapas com /2fa code ' + already_enabled: 'Autenticação de duas etapas já se encontra habilitada na sua conta!' + enable_error_no_code: 'Nenhuma chave 2fa foi gerada por você ou expirou. Por favor digite /2fa add' + enable_success: 'Autenticação de duas etapas habilitada com sucesso na sua conta' + enable_error_wrong_code: 'Codigo errado ou o codigo expirou. Por favor digite /2fa add' + not_enabled_error: 'Autenticação de duas etapas não está habilitada na sua conta. Digite /2fa add' + removed_success: 'Autenticação de duas etapas removida com sucesso da sua conta' + invalid_code: 'Codigo invalido!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aLogin automático no Bedrock bem-sucedido!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aVocê está preso no portal durante o login.' + fix_underground: '&aVocê está preso no subsolo durante o login.' + cannot_fix_underground: '&aVocê está preso no subsolo durante o login, mas não podemos consertar.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cVocê foi desconectado devido a um login duplicado.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_ro.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_ro.yml new file mode 100644 index 0000000000..dc8d3b1bcd --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_ro.yml @@ -0,0 +1,172 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cInregistrarea in joc nu este activata!' + name_taken: '&cCineva este inregistrat cu acest nume!' + register_request: '&3Te rugam sa te inregistrezi folosind comanda "/register "' + command_usage: '&cFoloseste comanda: /register ' + reg_only: '&4Doar jucatori inregistrati pot intra pe server! Te rugam foloseste https://example.com pentru a te inregistra!' + success: '&2Te-ai inregistrat cu succes!' + kicked_admin_registered: 'Un administrator tocmai te-a inregistrat, te rog autentifica-te din nou.' + +# Password errors on registration +password: + match_error: '&cParolele nu corespund, verifica-le din nou!' + name_in_password: '&c&cNu poti folosi numele ca si parola. Te rugam sa folosesti alta parola...' + unsafe_password: '&cParola aleasa nu este sigura. Te rugam sa folosesti alta parola...' + forbidden_characters: '&4Parola ta contine caractere nepermise. Caractere permise: %valid_chars' + wrong_length: '&cParola ta este prea scurta pentru a te inregistra! Te rugam incearca alta parola!' + pwned_password: '&cParola aleasă nu este sigură. A fost folosită de %pwned_count ori! Vă rugăm să utilizați o parolă puternică...' + +# Login +login: + command_usage: '&cFoloseste comanda "/login " pentru a te autentifica.' + wrong_password: '&cParola gresita!' + success: '&2Te-ai autentificat cu succes!' + login_request: '&cTe rugam sa te autentifici folosind comanda: /login ' + timeout_error: '&4A expirat timpul de autentificare si ai fost dat afara de server, te rugam incearca din nou!' + +# Errors +error: + denied_command: '&cPentru a utiliza aceasta comanda trebuie sa fi autentificat!' + denied_chat: '&cPentru a utiliza chat-ul trebuie sa fi autentificat!' + unregistered_user: '&cAcest jucator nu este inregistrat!' + not_logged_in: '&cNu esti autentificat!' + no_permission: '&4Nu ai permisiunea de a efectua aceasta actiune!' + unexpected_error: '&4A aparut o eroare, te rugam contacteaza un administrator!' + max_registration: '&cAi depasit numarul maxim de inregistrari (%reg_count /%max_acc %reg_names) pentru conexiunea dvs.!' + logged_in: '&cEsti deja autentificat!' + kick_for_vip: '&3Un VIP a intrat pe server cand era plin!' + kick_unresolved_hostname: '&cA aparut o eroare: nume gazda nerezolvat!' + tempban_max_logins: '&cAi fost banat temporar deoarece ai esuat sa te autentifici de prea multe ori.' + +# AntiBot +antibot: + kick_antibot: 'Protectia AntiBot este activata! Trebuie sa astepti cateva minute pentru a intra pe server.' + auto_enabled: '&4[Protectie AntiBot] AntiBot-ul a fost activat din cauza numarului mare de conexiuni!' + auto_disabled: '&2[Protectie AntiBot] AntiBot-ul a fost dezactivat dupa %m minute!' + +unregister: + success: '&cTi-ai sters contul cu succes!' + command_usage: '&cFoloseste comanda: /unregister ' + +# Other messages +misc: + account_not_activated: '&cContul tau nu este activat, te rugam verifica-ti email-ul!' + not_activated: '&cContul nu este activat, vă rugăm să vă înregistrați și să îl activați înainte de a încerca din nou.' + password_changed: '&2Parola a fost schimbata cu succes!' + logout: '&2Te-ai deconectat cu succes!' + reload: '&2Configuratiile si baza de date s-au reincarcat corect!' + usage_change_password: '&cFoloseste comanda: /changepassword ' + accounts_owned_self: 'Detii %count conturi:' + accounts_owned_other: 'Jucatorul %name are %count conturi:' + +# Session messages +session: + valid_session: '&2Conectat datorita reconectarii sesiunii.' + invalid_session: '&cIP-ul tau a fost schimbat si sesiunea ta a expirat!' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Un jucator cu acelasi IP este deja in joc!' + same_nick_online: '&4Acelasi nume apartine unui jucator care e deja pe server!' + name_length: '&4Numele tau este fie prea scurt, fie prea lung!' + characters_in_name: '&4Numele tau contine caractere ilegale. Caractere permise: %valid_chars' + kick_full_server: '&4Server-ul este plin, incearca mai tarziu!' + country_banned: '&4Tara ta este interzisa pe acest server!' + not_owner_error: 'Tu nu esti detinatorul acestui cont. Te rugam alege alt nume!' + invalid_name_case: 'Ar trebui sa intri cu numele %valid, nu %invalid' + quick_command: 'Ai folosit o comanda prea repede! Te rugam, intra din nou pe server si astepta mai mult inainte de a utiliza orice comanda.' + +# Email +email: + add_email_request: '&3Te rugam adaugati email-ul la contul tau folosind comanda "/email add "' + usage_email_add: '&cFoloseste comanda: /email add ' + usage_email_change: '&cFoloseste comanda: /email change ' + new_email_invalid: '&cNoul email este nevalid, incearca din nou!' + old_email_invalid: '&cEmail-ul vechi este nevalid, incearca din nou!' + invalid: '&cEmail-ul este nevalid, incearca din nou!' + added: '&2Email-ul a fost adaugat cu succes la contul tau!' + add_not_allowed: '&cAdaugarea email-ului nu a fost permisa.' + request_confirmation: '&cTe rugam sa confirmi adresa ta de email!' + changed: '&2Email-ul a fost schimbat cu succes!' + change_not_allowed: '&cModificarea email-ului nu a fost permisa.' + email_show: '&2Adresa ta curenta de email este: &f%email' + no_email_for_account: '&2Nu ai nici o adresa de email asociata cu acest cont.' + already_used: '&4Email-ul acesta este deja folosit de altcineva' + incomplete_settings: 'Eroare: Nu indeplinesti conditiile trimiterii unui email! Te rugam contacteaza un administrator.' + send_failure: 'Email-ul nu a putut fi trimis. Ta rugam contactatezi un administrator.' + change_password_expired: 'Nu mai iti poti schimba parola folosind aceasta comanda.' + email_cooldown_error: '&cAi primit deja un mail pentru schimbarea parolei. Trebuie sa astepti %time inainte de a trimite unul nou.' + +# Password recovery by email +recovery: + forgot_password_hint: '&3Ti-ai uitat parola? Te rugam foloseste comanda "/email recovery "' + command_usage: '&cFoloseste comanda: /email recovery ' + email_sent: '&2Email-ul de recuperarea a fost trimis cu succes! Te rugam sa verifici casuta de email!' + code: + code_sent: 'Un cod de recuperare a parolei a fost trimis catre email-ul tau.' + incorrect: 'Codul de recuperare nu este corect! Mai ai %count incercari ramase.' + tries_exceeded: 'Ai atins numarul maxim de incercari pentru introducerea codului de recuperare. Foloseste "/email recovery [email]" pentru a genera unul nou.' + correct: 'Cod de recuperare corect!' + change_password: 'Foloseste imediat comanda /email setpassword pentru a-ti schimba parola.' + +# Captcha +captcha: + usage_captcha: '&3Pentru a te autentifica, trebuie sa rezolvi un cod captcha, foloseste comanda: /captcha %captcha_code' + wrong_captcha: '&cCodul de verificare este gresit, te rugam foloseste comanda: /captcha %captcha_code' + valid_captcha: '&2Codul de verificare a fost scris corect!' + captcha_for_registration: 'Pentru a te inregistra, trebuie sa rezolvi mai intai un captcha, foloseste comanda: /captcha %captcha_code' + register_captcha_valid: '&2Captcha valid! Poti sa te inregistrezi acum cu /register' + +# Verification code +verification: + code_required: '&3Aceasta comanda este sensibila si necesita o verificare prin email! Verificati adresa de email si urmati instructiunile de pe email.' + command_usage: '&cFoloseste: /verification ' + incorrect_code: '&cCod incorect, te rugam sa foloseste "/verification " in chat, folosind codul pe care l-ai primit prin email' + success: '&2Identitatea ta a fost verificata! Acum poti executa toate comenzile in sesiunea curenta!' + already_verified: '&2Poti deja sa executi fiecare comanda sensibila in cadrul sesiunii curente!' + code_expired: '&3Codul tau a expirat! Executa o alta comanda sensibila pentru a obtine un cod nou!' + email_needed: '&3Pentru ati verifica identitatea, trebuie sa conectezi o adresa de email cu contul tau!!' + +# Time units +time: + second: 'secunda' + seconds: 'secunde' + minute: 'minut' + minutes: 'minute' + hour: 'ora' + hours: 'ore' + day: 'zi' + days: 'zile' + +# Two-factor authentication +two_factor: + code_created: '&2Codul tau secret este %code. Il poti scana de aici %url' + confirmation_required: 'Te rugam sa confirmi codul tau cu /2fa confirm ' + code_required: 'Te rugam sa trimiti codul tau de autentificare in doi pasi cu /2fa code ' + already_enabled: 'Autentificarea in doi pasi este deja activata pentru contul tau!' + enable_error_no_code: 'Nicio cheie 2fa nu a fost generata pentru tine sau a expirat. te rugam sa folosesti /2fa add' + enable_success: 'Activarea cu succes a autentificarii in doi pasi pentru contul tau' + enable_error_wrong_code: 'Cod gresit sau codul a expirat. Te rugam sa folosesti /2fa add' + not_enabled_error: 'Autentificarea in doi pasi nu este activata pentru contul tau. foloseste /2fa add' + removed_success: 'Eliminare cu succes a autentificarii in doi pasi de pe cont' + invalid_code: 'Cod invalid!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aAutentificare automată Bedrock reușită!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aSunteți blocat în portal în timpul autentificării.' + fix_underground: '&aSunteți blocat sub pământ în timpul autentificării.' + cannot_fix_underground: '&aSunteți blocat sub pământ în timpul autentificării, dar nu putem remedia.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cAți fost deconectat din cauza unei autentificări duble.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_ru.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_ru.yml new file mode 100644 index 0000000000..42ac6320e8 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_ru.yml @@ -0,0 +1,172 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cРегистрация отключена.' + name_taken: '&cИгрок с таким никнеймом уже зарегистрирован.' + register_request: '&3Регистрация: /reg <пароль> <повтор пароля>' + command_usage: '&cИспользование: /reg <пароль> <повтор пароля>' + reg_only: '&4Вход только для зарегистрированных! Посетите https://сайт_сервера.ru для регистрации.' + success: '&2Вы успешно зарегистрировались!' + kicked_admin_registered: 'Администратор зарегистрировал вас. Авторизуйтесь снова.' + +# Password errors on registration +password: + match_error: '&cПароли не совпадают.' + name_in_password: '&cНельзя использовать свой никнейм в качестве пароля.' + unsafe_password: '&cТакой пароль небезопасен.' + forbidden_characters: '&4Пароль содержит запрещённые символы. Разрешённые: %valid_chars' + wrong_length: '&cПароль слишком длинный/короткий.' + pwned_password: '&cВыбранный вами пароль небезопасен. Он уже был использован %pwned_count раз! Пожалуйста, используйте надежный пароль...' + +# Login +login: + command_usage: '&cИспользование: /login <пароль>' + wrong_password: '&cНеправильный пароль!' + success: '&2Вы успешно вошли!' + login_request: '&3Авторизация: /login <Пароль>' + timeout_error: '&4Время авторизации истекло.' + +# Errors +error: + denied_command: '&cНеобходимо авторизоваться для использования этой команды!' + denied_chat: '&cНеобходимо авторизоваться, чтобы писать в чат!' + unregistered_user: '&cИгрок с таким именем не зарегистрирован.' + not_logged_in: '&cВы ещё не вошли!' + no_permission: '&4Недостаточно прав.' + unexpected_error: '&cПроизошла ошибка. Свяжитесь с администратором.' + max_registration: '&cПревышено максимальное количество регистраций на сервере! (%reg_count/%max_acc %reg_names)' + logged_in: '&cВы уже авторизированы!' + kick_for_vip: '&3VIP-игрок зашёл на переполненный сервер.' + kick_unresolved_hostname: '&cПроизошла ошибка: неразрешенное имя узла игрока!' + tempban_max_logins: '&cВы временно заблокированы из-за большого количества неудачных попыток авторизоваться.' + +# AntiBot +antibot: + kick_antibot: 'Сработала защита против ботов! Необходимо подождать перед следующим входом на сервер.' + auto_enabled: '&4[AuthMe] AntiBot-режим включился из-за большого количества входов!' + auto_disabled: '&2[AuthMe] AntiBot-режим отключился спустя %m мин.' + +unregister: + success: '&cУчётная запись успешно удалена!' + command_usage: '&cИспользование: /unregister <пароль>' + +# Other messages +misc: + account_not_activated: '&cВаша уч. запись ещё не активирована. Проверьте электронную почту!' + not_activated: '&cАккаунт не активирован, пожалуйста, зарегистрируйтесь и активируйте его перед повторной попыткой.' + password_changed: '&2Ваш пароль изменён!' + logout: '&2Успешно вышли из системы!' + reload: '&6Конфигурация и база данных перезагружены.' + usage_change_password: '&cИспользование: /changepassword <пароль> <новый пароль>' + accounts_owned_self: 'У вас %count уч. записей:' + accounts_owned_other: 'У игрока %name %count уч. записей:' + +# Session messages +session: + valid_session: '&2Вы автоматически авторизовались!' + invalid_session: '&cСессия некорректна. Дождитесь, пока она закончится.' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Игрок с данным IP-адресом уже играет на сервере!' + same_nick_online: '&4Игрок с данным никнеймом уже играет на сервере!' + name_length: '&4Ваш никнейм слишком длинный/короткий.' + characters_in_name: '&4Ваш никнейм содержит запрещённые символы. Разрешённые: %valid_chars' + kick_full_server: '&4Сервер полон. Попробуйте зайти позже!' + country_banned: '&4Вход с IP-адресов вашей страны запрещён на этом сервере.' + not_owner_error: 'Вы не являетесь владельцем данной уч. записи. Выберите себе другой никнейм!' + invalid_name_case: 'Неверный никнейм! Зайдите под никнеймом %valid, а не %invalid.' + quick_command: 'Вы вводили команды слишком часто! Пожалуйста, переподключитесь и вводите команды медленнее.' + +# Email +email: + add_email_request: '&3Добавьте электронную почту: /email add <эл. почта> <повтор эл. почты>' + usage_email_add: '&cИспользование: /email add <эл. почта> <повтор эл. почты>' + usage_email_change: '&cИспользование: /email change <эл. почта> <новая эл. почта>' + new_email_invalid: '&cНедействительная новая электронная почта!' + old_email_invalid: '&cНедействительная старая электронная почта!' + invalid: '&cНедействительный адрес электронной почты!' + added: '&2Электронная почта успешно добавлена!' + add_not_allowed: '&cДобавление электронной почты не было разрешено.' + request_confirmation: '&cПодтвердите свою электронную почту!' + changed: '&2Адрес электронной почты изменён!' + change_not_allowed: '&cИзменение электронной почты не было разрешено.' + email_show: '&2Текущий адрес электронной почты — &f%email' + no_email_for_account: '&2К вашей уч. записи не привязана электронная почта.' + already_used: '&4Эта электронная почта уже используется.' + incomplete_settings: 'Ошибка: не все необходимые параметры установлены для отправки электронной почты. Свяжитесь с администратором.' + send_failure: 'Письмо не может быть отправлено. Свяжитесь в администратором.' + change_password_expired: 'Больше нельзя сменить свой пароль, используя эту команду.' + email_cooldown_error: '&cПисьмо было отправлено недавно. Подождите %time, прежде чем отправить новое.' + +# Password recovery by email +recovery: + forgot_password_hint: '&Забыли пароль? Используйте «/email recovery <эл. почта>».' + command_usage: '&cИспользование: /email recovery <эл. почта>' + email_sent: '&2Письмо с инструкциями для восстановления было отправлено на вашу электронную почту!' + code: + code_sent: 'Код восстановления для сброса пароля был отправлен на электронную почту.' + incorrect: 'Неверный код восстановления! Попыток осталось: %count.' + tries_exceeded: 'Вы слишком много раз неверно ввели код восстановления. Используйте «/email recovery [эл. почта]», чтобы получить новый код.' + correct: 'Код восстановления введён верно!' + change_password: 'Используйте «/email setpassword <новый пароль>», чтобы сменить свой пароль.' + +# Captcha +captcha: + usage_captcha: '&3Необходимо ввести текст с каптчи. Используйте «/captcha %captcha_code»' + wrong_captcha: '&cНеверно! Используйте «/captcha %captcha_code».' + valid_captcha: '&2Вы успешно решили каптчу!' + captcha_for_registration: 'Чтобы зарегистрироваться, решите каптчу используя команду: «/captcha %captcha_code»' + register_captcha_valid: '&2Вы успешно решили каптчу! Теперь вы можете зарегистрироваться командой «/register»' + +# Verification code +verification: + code_required: '&3Эта команда чувствительна и требует подтверждения электронной почты! Проверьте свою почту и следуйте инструкциям в письме.' + command_usage: '&cИспользование: /verification <код>' + incorrect_code: '&cНеверный код, используйте «/verification <код>», подставив код из полученного письма.' + success: '&2Ваша личность подтверждена! Теперь можно выполнять все чувствительные команды в текущем сеансе!' + already_verified: '&2Вы уже можете выполнять все чувствительные команды в текущем сеансе!' + code_expired: '&3Срок действия кода истёк! Выполните чувствительную команду, чтобы получить новый код!' + email_needed: '&3Чтобы подтвердить вашу личность, необходимо привязать электронную почту к учётной записи!!' + +# Time units +time: + second: 'с.' + seconds: 'с.' + minute: 'мин.' + minutes: 'мин.' + hour: 'ч.' + hours: 'ч.' + day: 'дн.' + days: 'дн.' + +# Two-factor authentication +two_factor: + code_created: '&2Ваш секретный код — %code. Просканируйте его здесь: %url' + confirmation_required: 'Пожалуйста, подтвердите ваш код с помощью /2fa confirm <код>' + code_required: 'Пожалуйста, введите ваш код двухфакторной аутентификации используя команду /2fa code <код>' + already_enabled: 'Двухфакторная аутентификация уже активирована для вашего аккаунта!' + enable_error_no_code: 'Код двухфакторной аутентификации не был сгенерирован или истек. Пожалуйста, введите /2fa add' + enable_success: 'Двухфакторная аутентификация для вашего аккаунта успешно подключена' + enable_error_wrong_code: 'Срок действия кода истек или код неверный. Введите /2fa add' + not_enabled_error: 'Двухфакторная аутентификация не включена для вашего аккаунта. Введите /2fa add' + removed_success: 'Двухфакторная аутентификация успешно удалена с вашего аккаунта!' + invalid_code: 'Неверный код!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aВы автоматически авторизовались потому что вы играете с Bedrock!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aВы застряли в портале во время авторизации.' + fix_underground: '&aВы застряли под землей во время авторизации.' + cannot_fix_underground: '&aВы застряли под землей во время авторизации, но мы не можем это исправить.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cВы были отключены из-за двойного входа.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_si.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_si.yml new file mode 100644 index 0000000000..d046e4805d --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_si.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cRegistracija v igri je onemogočena!' + name_taken: '&cTo uporabniško ime ste ze registrirali!' + register_request: '&3Registrirajte se z ukazom "/register "' + command_usage: '&cUporaba: /register ' + reg_only: '&4Samo registrirani uporabniki se lahko povezejo! Obiscite https://example.com , da se registrirate!' + success: '&2Uspešno registriran!' + kicked_admin_registered: 'Administrator vas je registriral; prosimo, da se prijavite.' + +# Password errors on registration +password: + match_error: '&cGesli se ne ujemata, ponovno ju preverite!' + name_in_password: '&cSvoje uporabniško ime ne morete uporabiti kot geslo, izberite drugo...' + unsafe_password: '&cIzbrano geslo ni varno, izberite drugo...' + forbidden_characters: '&4Vaše geslo vsebuje nedovoljene znake. Dovoljeni znaki: %valid_chars' + wrong_length: '&cVaše geslo je prekratko ali predolgo! Poskusite z drugim!' + pwned_password: '&cIzbrano geslo ni varno. Uporabljeno je bilo že %pwned_count krat! Prosimo, uporabite močno geslo...' + +# Login +login: + command_usage: '&cUporaba: /login ' + wrong_password: '&cNapačno geslo!' + success: '&2Uspešna prijava!' + login_request: '&cPrijavi se z ukazom "/login "' + timeout_error: '&4Časovna omejitev prijave prekoračena, vrzeni ste bili s strežnika, poskusite ponovno!' + +# Errors +error: + denied_command: '&cZa uporabo ukazov se je potrebno prijaviti!' + denied_chat: '&cZa pogovor se je potrebno prijaviti!' + unregistered_user: '&cNi mogoče najti zahtevanega uporabnika v podatkovni bazi!' + not_logged_in: '&cNiste prijavljeni!' + no_permission: '&4Nimate dovoljenja za izvedbo tega dejanja!' + unexpected_error: '&4Prišlo je do nepričakovane napake, prosim kontaktirajte administratorja!' + max_registration: '&cPresegli ste največjo stevilo registracij (%reg_count/%max_acc %reg_names) za vašo povezavo!' + logged_in: '&cSte že povezani!' + kick_for_vip: '&3VIP igralec se je pridruzil serverju, ko je bil poln!' + kick_unresolved_hostname: '&cPrišlo je do napake: ime gostitelja igralca ni razrešeno!' + tempban_max_logins: '&cBil si začasno izločen zaradi preveč neuspešnih prijav.' + +# AntiBot +antibot: + kick_antibot: 'Počakajte nekaj minut preden se povezete na strežnik.' + auto_enabled: '&4[AntiBotService] AntiBot je bil aktiviran zaradi velikega števila prijav!' + auto_disabled: '&2[AntiBotService] AntiBot je bil deaktiviran po %m minut!' + +# Unregister +unregister: + success: '&cUsprešno deregistriran!' + command_usage: '&cUporaba: /unregister ' + +# Other messages +misc: + account_not_activated: '&cVas račun se ni aktiviran, preverite e-mail!' + not_activated: '&cRačun ni aktiviran, prosimo, registrirajte se in ga aktivirajte, preden poskusite znova.' + password_changed: '&2Geslo uspesno spremenjeno!' + logout: '&2Odjavljeni uspesno!' + reload: '&2Konfiguracija in baza podatkov sta bila uspesno osvezena!' + usage_change_password: '&cUporaba: /changepassword ' + accounts_owned_self: 'You own %count accounts:' + accounts_owned_other: 'The player %name has %count accounts:' + +# Session messages +session: + valid_session: '&2Uspešna povezava.' + invalid_session: '&cVas IP je bil spremenjen in vasa seja je potekla!' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Igralec z enakim IP-jem kot vi je že v igri.' + same_nick_online: '&4Uporabnik z enakim imenom ze igra!' + name_length: '&4Vaše uporabniško ime je prekratko ali predolgo!' + characters_in_name: '&4Vaše uporabniško ime vsebuje nedovoljene znake. Dovoljeni znaki: %valid_chars' + kick_full_server: '&4Streznik je trenutno poln!' + country_banned: '&4Vaša država je prepovedana na strežniku!' + not_owner_error: 'Niste lastnik tega uporabniškega računa. Izberite drugo uporabnisko ime!' + invalid_name_case: 'Povežite se z uporabo uporabniskega imena %valid in ne %invalid.' + quick_command: 'Komando ste uporabili prehitro! Prosimo, da se ponovno povežete in počakate pred ponovno uporabo komand.' + +# Email +email: + add_email_request: '&3Dodajte email vašemu računu z ukazom "/email add "' + usage_email_add: '&cUporaba: /email add ' + usage_email_change: '&cUporaba: /email change ' + new_email_invalid: '&cNeveljaven nov email, poskusite ponovno!' + old_email_invalid: '&cNeveljaven star email, poskusite ponovno!' + invalid: '&cNapačni email!' + added: '&2Email uspešno dodan!' + add_not_allowed: '&cDodajanje emailov ni dovoljeno!' + request_confirmation: '&cPotrdite vaš email naslov.' + changed: '&2Email uspešno spremenjen!' + change_not_allowed: '&cSpreminjanje emailov ni dovoljeno.' + email_show: '&2Vaš trenuten email: &f%email' + no_email_for_account: '&2Trenutno nimate povezanega emaila.' + already_used: '&4Ta email naslov je že v uporabi!' + incomplete_settings: 'Napaka: Administrator ni nastavil vseh nastavitev za pošiljanje emailov. Prosimo, da ga obvestite.' + send_failure: 'Emaila ni bilo mogoče poslati. Prosimo obvestite administratorja.' + change_password_expired: 'Prosim uporabite novi ukaz.' + email_cooldown_error: '&cSporočilo je bilo že poslano. Pocakajte %time preden zahtevate novega!' + +# Password recovery by email +recovery: + forgot_password_hint: '&3Ste pozabili vaše geslo? Uporabite ukaz "/email recovery "' + command_usage: '&cUporaba: /email recovery ' + email_sent: '&2Email za obnovitev uspešno poslan! Preverite prejeta email sporočila! Preverite tudi Spam/Vsiljeno pošto!' + code: + code_sent: 'Koda za ponastavitev gesla je bila poslana na vaš email.' + incorrect: 'Koda je nepravilna! Uporabite /email recovery [Email], da pridobite novo kodo.' + tries_exceeded: 'Prekoračili ste število poskusov! Uporabite /email recovery [Email], da pridobite novo kodo.' + correct: 'Uspešno vnesena koda!' + change_password: 'Prosim uporabite /email setpassword za nastavitev novega gesla.' + +# Captcha +captcha: + usage_captcha: '&3Da se prijavite rešite captcha kodo, uporabite ukaz "/captcha %captcha_code"' + wrong_captcha: '&cNapačna captcha, vpišite "/captcha %captcha_code" v chat!' + valid_captcha: '&2Captcha pravilno rešena!' + captcha_for_registration: 'Za registracijo morate prvo rešiti captcha. Uporabite: /captcha %captcha_code' + register_captcha_valid: '&2Pravilna captcha! Sedaj se lahko registrirate z /register' + +# Verification code +verification: + code_required: '&3Ta ukaz je lahko tvegan in zahteva preverjanje preko emaila. Preverite email za dodatna navodila.' + command_usage: '&cUporabite: /verification ' + incorrect_code: '&cIncorrect code, please type "/verification " into the chat, using the code you received by email' + success: '&2Your identity has been verified! You can now execute all commands within the current session!' + already_verified: '&2You can already execute every sensitive command within the current session!' + code_expired: '&3Your code has expired! Execute another sensitive command to get a new code!' + email_needed: '&3To verify your identity you need to link an email address with your account!' + +# Time units +time: + second: 'sekunda' + seconds: 'sekund' + minute: 'minuta' + minutes: 'minut' + hour: 'ur' + hours: 'ure' + day: 'dan' + days: 'dni' + +# Two-factor authentication +two_factor: + code_created: '&2Vasa skrivna koda je %code. Lahko je skenirate tu %url!' + confirmation_required: 'Prosimo, da potrdite svojo dvo stopično kodo z /2fa confirm ' + code_required: 'Prosimo, da pošljete svojo dvo stopično kodo z /2fa code ' + already_enabled: 'Dvo stopična prijava je že vključena za vaš račun!' + enable_error_no_code: 'Nobeden dvo stopični ključ ni bil generiran za vaš račun ali pa je potekel. Uporabite /2fa add' + enable_success: 'Usprešno ste vključili dvo stopično prijavo za vaš račun.' + enable_error_wrong_code: 'Napačna koda ali pa je potekla. Uporabite /2fa add' + not_enabled_error: 'Dvo stopična prijava ni vključena za vaš račun. Uporabite /2fa add' + removed_success: 'Usprešno ste odstranili dvo stopično prijavo za vaš račun.' + invalid_code: 'Nepravilna koda!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aSamodejno prijavljanje v Bedrocku uspešno!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aMed prijavo ste obtičali v portalu.' + fix_underground: '&aMed prijavo ste obtičali pod zemljo.' + cannot_fix_underground: '&aMed prijavo ste obtičali pod zemljo, vendar tega ne moremo popraviti.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cBili ste odklopljeni zaradi podvojenega prijave.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_sk.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_sk.yml new file mode 100644 index 0000000000..fd40f0deb6 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_sk.yml @@ -0,0 +1,179 @@ +# Slovak translate by: Judzi 2.2.2013 # +# Next Translation & Correction by: # +# Thymue 7.8.2017 # +# in future there can be more translators # +# if they are not listed here # +# check Translators on GitHub Wiki. # +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cRegistrácia nie je povolená.' + name_taken: '&cZadané meno je už zaregistrované.' + register_request: '&cZaregistruj sa príkazom "/register ".' + command_usage: '&cPoužitie: /register ' + reg_only: '&fIba zaregistrovaný hráči sa môžu pripojiť na tento server! Navštív https://example.com pre registráciu.' + success: '&cBol si úspešne zaregistrovaný.' + kicked_admin_registered: 'Admin ťa zaregistroval. Prosím, prihlás sa znovu.' + +# Password errors on registration +password: + match_error: '&fHeslá sa nezhodujú.' + name_in_password: '&cNemôžeš použiť tvoje meno ako heslo. Prosím, zvoľ si iné...' + unsafe_password: '&cTvoje heslo nieje bezpečné. Prosím, zvoľ si iné...' + forbidden_characters: '&4Tvoje heslo obsahuje zakázané znaky. Povolené znaky: %valid_chars' + wrong_length: '&fHeslo je veľmi krátke alebo veľmi dlhé.' + pwned_password: '&cVaše zvolené heslo nie je bezpečné. Bolo použité %pwned_count krát! Prosím, použite silné heslo...' + +# Login +login: + command_usage: '&cPoužitie: /login ' + wrong_password: '&cZadal si zlé heslo.' + success: '&cBol si úspešne prihlásený!' + login_request: '&cPrihlás sa príkazom "/login ".' + timeout_error: '&fVypršal čas na prihlásenie, pripoj sa a skús to znovu.' + +# Errors +error: + denied_command: '&cPre použitie tohto príkazu sa musíš prihlásiť!' + denied_chat: '&cMusíš byť prihlásený ak chceš použiť chat!' + unregistered_user: '&cZadané meno nie je zaregistrované!' + not_logged_in: '&cEšte nie si prihlásený!' + no_permission: '&cNemáš dostatočné práva na vykonanie tejto činnosti.' + unexpected_error: '&fNastala chyba, prosím kontaktuj Administrátora.' + max_registration: '&fPrekročil si maximum registrovaných účtov(%reg_count/%max_acc|%reg_names).' + logged_in: '&cAktuálne si už prihlásený!' + kick_for_vip: '&3Uvoľnil si miesto pre VIP hráča!' + kick_unresolved_hostname: '&cDošlo k chybe: nerozpoznaný hostname hráča!' + tempban_max_logins: '&cBol si dočasne zabanovaný za opakované zadanie zlého hesla.' + +# AntiBot +antibot: + kick_antibot: 'AntiBot je zapnutý! Musíš počkať niekoľko minút pred znovupripojením sa na server.' + auto_enabled: '&4[AntiBotService] AntiBot bol zapnutý kôli masívnym pokusom o pripojenie!' + auto_disabled: '&2[AntiBotService] AntiBot bol vypnutý po %m minútach!' + +# Unregister +unregister: + success: '&cÚčet bol vymazaný!' + command_usage: '&cPoužitie: /unregister heslo' + +# Other messages +misc: + account_not_activated: '&fTvoj účet nie je aktivovaný. Prezri si svoj e-mail!' + not_activated: '&cÚčet nie je aktivovaný, prosím, zaregistrujte sa a aktivujte ho pred pokusom o prihlásenie znova.' + password_changed: '&cHeslo zmenené!' + logout: '&cBol si úspešne odhlásený.' + reload: '&fZnovu načítanie konfigurácie a databázy bolo úspešné.' + usage_change_password: '&fPoužitie: /changepassword ' + accounts_owned_self: 'Vlastníš tieto účty(%count): ' + accounts_owned_other: 'Hráč %name vlastní tieto účty(%count): ' + +# Session messages +session: + valid_session: '&cAutomatické prihlásenie z dôvodu pokračovania relácie.' + invalid_session: '&fTvoja IP sa zmenila a tvoje prihlásenie(relácia) vypršalo(/a).' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Hráč s tvojou IP už hrá na tomto serveri!' + same_nick_online: '&fHráč s týmto nickom už hrá!' + name_length: '&cTvoje meno je veľmi krátke alebo veľmi dlhé.' + characters_in_name: '&cTvoje meno obsahuje zakázané znaky. Povolené znaky: %valid_chars' + kick_full_server: '&4Server je plný, skús to znovu neskôr!' + country_banned: '&4Tvoja krajina je zabanovaná na tomto serveri!' + not_owner_error: 'Nie si majiteľom tohto účtu. Prosím zvoľ si iné meno!' + invalid_name_case: 'Mal by si sa pripojiť s nickom %valid, nie %invalid - pozor na veľké a malé písmená.' + quick_command: 'Príkaz ste použili príliš rýchlo! Prosím, znovu sa pripojte na server a počkajte dlhšie pred použitím akéhokoľvek príkazu.' + +# Email +email: + add_email_request: '&cPridaj svoj e-mail príkazom "/email add ".' + usage_email_add: '&cPoužitie: /email add ' + usage_email_change: '&cPoužitie: /email change ' + new_email_invalid: '&cNeplatný nový email, skús to znovu!' + old_email_invalid: '&cNeplatný starý email, skús to znovu!' + invalid: '&cNeplatná emailová adresa, skús to znovu!' + added: '&2Emailová adresa bola úspešne pridaná k tvojmu účtu!' + add_not_allowed: '&cPridanie emailu nebolo povolené.' + request_confirmation: '&cProsím potvrď svoju emailovú adresu!' + changed: '&2Emailová adresa bola úspešne zmenená!' + change_not_allowed: '&cZmena emailu nebola povolená.' + email_show: '&2Tvoja súčastná emailová adresa je: &f%email' + no_email_for_account: '&2Momentálne nemáš emailovú adresu spojenú s týmto účtom.' + already_used: '&4Túto emailovú adresu už niekto používa.' + incomplete_settings: 'Chyba: nie všetky potrebné nastavenia sú nastavené pre posielanie emailov. Prosím kontaktuj Administrátora.' + send_failure: 'Email nemohol byť poslaný. Prosím kontaktuj Administrátora.' + change_password_expired: 'Už nemôžeš zmeniť svoje heslo týmto príkazom.' + email_cooldown_error: '&cEmail bol nedávno poslaný. Musíš počkať %time predtým ako ti pošleme nový.' + +# Password recovery by email +recovery: + forgot_password_hint: '&cZabudol si heslo? Použi príkaz /email recovery ' + command_usage: '&cPoužitie: /email recovery ' + email_sent: '&2Email na obnovenie bol úspešne odoslaný! Prosím skontroluj si svoju emailovú schránku!' + code: + code_sent: 'Kód na obnovenie účtu bol poslaný na tvoj e-mail.' + incorrect: 'Nesprávny kód! Zostávajúce pokusy: %count.' + tries_exceeded: 'Prekročil si maximálny počet pokusov o zadanie kódu pre obnovenie účtu. Použi "/email recovery [email]" pre vygenerovanie nového kódu.' + correct: 'Správny kód!' + change_password: 'Prosím hneď použi príkaz /email setpassword pre zmenenie tvojeho hesla.' + +# Captcha +captcha: + usage_captcha: '&3Pre prihlásenie musíš vyriešiť captcha kód, prosím použi príkaz: /captcha %captcha_code' + wrong_captcha: '&cNesprávny kód captcha, prosím napíš "/captcha %captcha_code" do chatu!' + valid_captcha: '&2Správne si vyriešil captcha kód!' + captcha_for_registration: 'Ak sa chcete zaregistrovať, musíte najskôr vyriešiť captcha, prosím, použite príkaz: /captcha %captcha_code' + register_captcha_valid: '&2Platná captcha! Teraz sa môžete zaregistrovať pomocou /register' + +# Verification code +verification: + code_required: '&3Tento príkaz je citlivý a vyžaduje overenie emailom! Skontrolujte svoju schránku a postupujte podľa pokynov v emaile.' + command_usage: '&cPoužitie: /verification ' + incorrect_code: '&cNesprávny kód, prosím, zadajte "/verification " do chatu, pomocou kódu, ktorý ste dostali emailom' + success: '&2Vaša identita bola overená! Teraz môžete vykonávať všetky príkazy v rámci aktuálnej relácie!' + already_verified: '&2Už môžete vykonávať každý citlivý príkaz v rámci aktuálnej relácie!' + code_expired: '&3Váš kód vypršal! Vykonajte ďalší citlivý príkaz na získanie nového kódu!' + email_needed: '&3Na overenie vašej identity potrebujete prepojiť emailovú adresu so svojím účtom!!' + +# Time units +time: + second: 'sek.' + seconds: 'sek.' + minute: 'min.' + minutes: 'min.' + hour: 'hod.' + hours: 'hod.' + day: 'd.' + days: 'd.' + +# Two-factor authentication +two_factor: + code_created: '&2Tvoj tajný kód je %code. Môžeš ho oskenovať tu: %url' + confirmation_required: 'Prosím, potvrďte svoj kód pomocou /2fa confirm ' + code_required: 'Prosím, zadajte svoj dvojfaktorový autentifikačný kód pomocou /2fa code ' + already_enabled: 'Dvojfaktorová autentifikácia je už pre váš účet povolená!' + enable_error_no_code: 'Nebolo pre vás vygenerované žiadne 2fa kľúč alebo vypršal jeho platnosť. Prosím, použite príkaz /2fa add' + enable_success: 'Dvojfaktorová autentifikácia bola úspešne povolená pre váš účet' + enable_error_wrong_code: 'Nesprávny kód alebo kód vypršal. Prosím, použite príkaz /2fa add' + not_enabled_error: 'Dvojfaktorová autentifikácia nie je pre váš účet povolená. Použite príkaz /2fa add' + removed_success: 'Dvojfaktorová autentifikácia bola úspešne odstránená z vášho účtu' + invalid_code: 'Neplatný kód!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aAutomatické prihlásenie do Bedrocku úspešné!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aPočas prihlasovania ste uviazli v portáli.' + fix_underground: '&aPočas prihlasovania ste uviazli pod zemou.' + cannot_fix_underground: '&aPočas prihlasovania ste uviazli pod zemou, ale nemôžeme to opraviť.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cBoli ste odpojení kvôli zdvojenému prihláseniu.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_sr.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_sr.yml new file mode 100644 index 0000000000..e143f6b21a --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_sr.yml @@ -0,0 +1,173 @@ +# Lista globalnih tagova: +# %nl% - Nova linija. +# %username% - Zamenjuje ime igrača kome se šalje poruka. +# %displayname% - Zamenjuje nadimak (i boje) igrača kome se šalje poruka. + +# Registration +registration: + disabled: '&cRegistracija u igri je isključena!' + name_taken: '&cKorisnik je već registrovan!' + register_request: '&3Molimo Vas, registrujte se na server komandom: /register ' + command_usage: '&cUpotreba: /register ' + reg_only: '&4Samo registrovani igrači mogu ući na server! Molimo Vas posetite https://example.com da biste se registrovali!' + success: '&2Uspešno registrovani!' + kicked_admin_registered: 'Admin vas je upravo registrovao; molimo Vas uđite ponovo' + +# Password errors on registration +password: + match_error: '&cLozinke se nisu složile, proverite ih ponovo!' + name_in_password: '&cNe možete koristiti svoje ime za lozinku, molimo vas da izaberete drugu...' + unsafe_password: '&cIzabrana lozinka nije bezbedna, molimo vas da izaberete drugu...' + forbidden_characters: '&4Vaša lozinka sadrži nedozvoljene karaktere. Dozvoljeni karakteri: %valid_chars' + wrong_length: '&cVaša lozinka je prekratka ili predugačka! Molimo Vas da probate drugu!' + pwned_password: '&cVaša izabrana lozinka nije sigurna. Već je korišćena %pwned_count puta! Molimo koristite jaku lozinku...' + +# Login +login: + command_usage: '&cUpotreba: /login ' + wrong_password: '&cPogrešna lozinka!' + success: '&2Uspešno ste se ulogovali!' + login_request: '&cMolimo Vas, ulogujte se komandom: /login ' + timeout_error: '&4Vreme za login isteklo, izbačeni ste sa servera, molimo Vas da pokušate ponovo!' + +# Errors +error: + denied_command: '&cDa biste koristili komande morate se autentifikovati!' + denied_chat: '&cDa biste koristili čet morate se autentifikovati!' + unregistered_user: '&cKorisnik nije registrovan!' + not_logged_in: '&cNiste ulogovani!' + no_permission: '&4Nemate dovoljno dozvola da uradite to!' + unexpected_error: '&4Pojavila se neočekivana greška, molimo Vas kontaktirajte administratora!' + max_registration: '&cDostigli ste maksimalan broj registracija (%reg_count/%max_acc %reg_names) za vaše povezivanje!' + logged_in: '&cVeć ste ulogovani!' + kick_for_vip: '&3VIP igrač je ušao na server dok je bio pun!' + kick_unresolved_hostname: '&cDošlo je do greške: nerešeno ime domaćina igrača!' + tempban_max_logins: '&cPrivremeno ste banovani zbog previše pogrešnih pokušaja ulogovanja.' + +# AntiBot +antibot: + kick_antibot: 'AntiBot mod zaštite je aktiviran! Morate sačekati par minuta pre povezivanja na server.' + auto_enabled: '&4[AntiBotSlužba] AntiBot je aktiviran zbog prevelikog broja povezivanja!' + auto_disabled: '&2[AntiBotSlužba] AntiBot je isključen posle %m minut(a)!' + +# Unregister +unregister: + success: '&cUspešno odregistrovani!' + command_usage: '&cUpotreba: /unregister ' + +# Other messages +misc: + account_not_activated: '&cVaš nalog još uvek nije aktiviran, molimo Vas proverite svoj email!' + not_activated: '&cNalog nije aktiviran, molimo registrujte se i aktivirajte pre nego što pokušate ponovo.' + password_changed: '&2Lozinka uspešno promenjena!' + logout: '&2Uspešno ste se odlogovali!' + reload: '&2Konfiguracija i databaza su uspešno osveženi!' + usage_change_password: '&cUpotreba: /changepassword ' + accounts_owned_self: 'Vi imate %count naloga:' + accounts_owned_other: 'Igrač %name ima %count naloga:' + +# Session messages +session: + valid_session: '&2Ulogovani ste zbog ponovnog povezivanja sesije.' + invalid_session: '&cVaš IP je promenjen i vaši podaci o sesiji su istekli!' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Igrač sa istim IP-em je već u igri!' + same_nick_online: '&4Isto korisničko ime već igra na serveru!' + name_length: '&4Vaše korisničko ime je prekratko ili predugačko!' + characters_in_name: '&4Vaše korisničko ime sadrži nedozvoljene karaktere. Dozvoljeni karakteri: %valid_chars' + kick_full_server: '&4Server je pun, probajte ponovo kasnije!' + country_banned: '&4Vaša država je banovana sa ovog servera!' + not_owner_error: 'Ne posedujete ovaj nalog. Molimo Vas izaberite drugo ime!' + invalid_name_case: 'Morate ući sa korisničkim imenom %valid, umesto %invalid.' + quick_command: 'Iskoristili ste komandu previše brzo! Molimo Vas, uđite opet na server i sačekajte malo pre korišćenja komandi.' + +# Email +email: + add_email_request: '&3Molimo Vas dodajte email adresu na vaš nalog komandom: /email add ' + usage_email_add: '&cUpotreba: /email add ' + usage_email_change: '&cUpotreba: /email change ' + new_email_invalid: '&cNevažeći email, pokušajte ponovo!' + old_email_invalid: '&cNevažeći stari email, pokušajte ponovo!' + invalid: '&cNevažeći email, pokušajte ponovo!' + added: '&2Email adresa je uspešno dodata na vaš nalog!' + add_not_allowed: '&cDodavanje emaila nije dozvoljeno' + request_confirmation: '&cMolimo Vas podvrdite svoju email adresu!' + changed: '&2Email adresa uspešno promenjena!' + change_not_allowed: '&cPromena emaila nije dozvoljena' + email_show: '&2Vaša email adresa je: &f%email' + no_email_for_account: '&2Trenutno nemate email adresu povezanu sa svojim nalogom.' + already_used: '&4Email adresa je već u upotrebi' + incomplete_settings: 'Greška: nisu postavljena potrebna podešavanja za slanje emaila. Molimo Vas da kontaktirate admina.' + send_failure: 'Email se nije mogao poslati. Molimo Vas da kontaktirate administratora.' + change_password_expired: 'Ne možete više promeniti svoju lozinku koristeći ovu komandu.' + email_cooldown_error: '&cEmail je već poslat. Morate sačekati %time pre nego što možete poslati drugi.' + +# Password recovery by email +recovery: + forgot_password_hint: '&3Zaboravili ste lozinku? Molimo Vas ukucajte komandu: /email recovery ' + command_usage: '&cUpotreba: /email recovery ' + email_sent: '&2Email za povratak je poslat uspešno! Molimo Vas proverite inbox svog emaila!' + code: + code_sent: 'Povratni kod za resetovanje vaše lozinke je poslat na vaš email.' + incorrect: 'Povratni kod nije tačan! Imate još %count pokušaja.' + tries_exceeded: 'Dostigli ste maksimalni broj pokušaja povratka sa kodom. Koristite "/email recovery [email]" da generišite nov.' + correct: 'Povratni kod uspešno unesen!' + change_password: 'Molimo Vas iskoristite komandu /email setpassword da odmah promenite svoju lozinku.' + +# Captcha +captcha: + usage_captcha: '&3Da biste se ulogovali morate rešiti captcha kod, molimo Vas iskoristite komandu: /captcha %captcha_code' + wrong_captcha: '&cPogrešna captcha, molimo Vas kucajte "/captcha %captcha_code" u četu!' + valid_captcha: '&2Captcha kod uspešno unesen!' + captcha_for_registration: 'Da biste se registrovali morate rešiti captcha kod, molimo Vas iskoristite komandu: /captcha %captcha_code' + register_captcha_valid: '&2Ispravna captcha! Sada se možete registrovati koristeći /register' + +# Verification code +verification: + code_required: '&3Ova komanda je osetljiva i zahteva verifikaciju emaila! Molimo Vas proverite svoj inbox i pratite instrukcije u emailu.' + command_usage: '&cUpotreba: /verification ' + incorrect_code: '&cNeispravan kod, molimo Vas unesite "/verification " u čet, koristeći kod koji ste dobili u emailu' + success: '&2Vaš identitet je verifikovan! Sada možete koristiti sve komande u trenutnoj sesiji!' + already_verified: '&2Već možete koristiti sve osetljive komande u trenutnoj sesiji!' + code_expired: '&3Vaš kod je istekao! Iskoristite drugu osetljivu komandu da dobijete kod!' + email_needed: '&3Da biste verifikovali svoj identitet morate da povežete svoju email adresu sa svojim nalogom!!' + +# Time units +time: + second: 'sekund' + seconds: 'sekundi' + minute: 'minut' + minutes: 'minuta' + hour: 'čas' + hours: 'časova' + day: 'dan' + days: 'dana' + +# Two-factor authentication +two_factor: + code_created: '&2Vaš tajni kod je %code. Možete ga skenirati sa %url' + confirmation_required: 'Molimo Vas potvrdite svoj kod koristeći /2fa confirm ' + code_required: 'Molimo Vas unesite svoj autentifikacioni kod dva-faktora koristeći /2fa code ' + already_enabled: 'Autentifikacioni dupli-faktor je već aktiviran za vaš nalog!' + enable_error_no_code: 'Nijedan 2fa ključ nije generisan za vas ili je istekao. Molimo Vas kucajte /2fa add' + enable_success: 'Uspešno ste aktivirali dvo-faktornu autentifikaciju za vaš nalog' + enable_error_wrong_code: 'Pogrešan kod ili je kod istekao. Molimo Vas kucajte /2fa add' + not_enabled_error: 'Dvo-faktorna autentifikacija nije aktivirana za vaš nalog. Kucajte /2fa add' + removed_success: 'Uspešno ste uklonili dvo-faktornu autentifikaciju sa vašeg naloga' + invalid_code: 'Nevažeći kod!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aBedrock automatsko prijavljivanje uspešno!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aZaglavljeni ste u portalu tokom prijavljivanja.' + fix_underground: '&aZaglavljeni ste pod zemljom tokom prijavljivanja.' + cannot_fix_underground: '&aZaglavljeni ste pod zemljom tokom prijavljivanja, ali ne možemo to popraviti.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cPrekinuti ste zbog duplog prijavljivanja.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_tr.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_tr.yml new file mode 100644 index 0000000000..b9d12bf95f --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_tr.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cOyun icin kayit olma kapatildi!' + name_taken: '&cSenin adinda daha once birisi kaydolmus!' + register_request: '&3Lutfen kayit komutunu kullanin "/register "' + command_usage: '&cKullanim: /register ' + reg_only: '&4Sunucuya kayit sadece internet uzerinden yapilmakta! Lutfen https://ornek.com sitesini kayit icin ziyaret edin!' + success: '&2Basariyla kaydoldun!' + kicked_admin_registered: 'Bir yetkili seni kayit etti; tekrardan giris yap' + +# Password errors on registration +password: + match_error: '&cSifre eslesmiyor, tekrar deneyin!' + name_in_password: '&cSifrenize adinizi koyamazsiniz, lutfen farkli bir sifre secin...' + unsafe_password: '&cSectiginiz sifre guvenli degil, lutfen farkli bir sifre secin...' + forbidden_characters: '&4Sifrenizde izin verilmeyen karakterler bulunmakta. Izin verilen karakterler: %valid_chars' + wrong_length: '&cSenin sifren ya cok kisa yada cok uzun! Lutfen farkli birsey dene!' + pwned_password: '&cSeçtiğiniz şifre güvenli değil. Zaten %pwned_count kez kullanılmış! Lütfen güçlü bir şifre kullanın...' + +# Login +login: + command_usage: '&cKullanim: /login ' + wrong_password: '&cYanlis sifre!' + success: '&2Giris basarili!' + login_request: '&cLutfen giris komutunu kullanin "/login "' + timeout_error: '&4Giris izni icin verilen zaman suresini astigin icin sunucudan atildin, tekrar deneyin!' + +# Errors +error: + denied_command: '&cSuanda bu komutu kullanamazsin!' + denied_chat: '&cSuanda sohbeti kullanamazsin!' + unregistered_user: '&cBu oyuncu kayitli degil!' + not_logged_in: '&cGiris yapmadin!' + no_permission: '&4Bunu yapmak icin iznin yok!' + unexpected_error: '&4Beklenmedik bir hata olustu, yetkili ile iletisime gecin!' + max_registration: '&cSen maksimum kayit sinirini astin (%reg_count/%max_acc %reg_names)!' + logged_in: '&cZaten giris yaptin!' + kick_for_vip: '&3Bir VIP oyuna giris yaptigi icin atildin!' + kick_unresolved_hostname: '&cBir hata olustu: cozumlenemeyen oyuncu bilgisayar adi!' + tempban_max_logins: '&cBir cok kez yanlis giris yaptiginiz icin gecici olarak banlandiniz.' + +# AntiBot +antibot: + kick_antibot: 'AntiBot koruma modu aktif! Birkac dakika sonra tekrar girmeyi deneyin.' + auto_enabled: '&4[AntiBotServis] Saldiri oldugu icin AntiBot aktif edildi!' + auto_disabled: '&2[AntiBotServis] AntiBot, %m dakika sonra deaktif edilecek!' + +# Unregister +unregister: + success: '&cKayit basariyla kaldirildi!' + command_usage: '&cKullanim: /unregister ' + +# Other messages +misc: + account_not_activated: '&cHeabiniz henuz aktif edilmemis, e-postanizi kontrol edin!' + not_activated: '&cHesap aktif değil, lütfen tekrar denemeden önce kaydolun ve aktif hale getirin.' + password_changed: '&2Sifre basariyla degistirildi!' + logout: '&2Basariyla cikis yaptin!' + reload: '&2Ayarlar ve veritabani yenilendi!' + usage_change_password: '&cKullanim: /changepassword ' + accounts_owned_self: 'Sen %count hesaba sahipsin:' + accounts_owned_other: 'Oyuncu %name %count hesaba sahip:' + +# Session messages +session: + valid_session: '&2Oturuma girisiniz otomatikmen yapilmistir.' + invalid_session: '&cIP adresin degistirildi ve oturum suren doldu!' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Oyunda sizin ipnizden giren biri bulunmakta!' + same_nick_online: '&4Senin isminde bir oyuncu suncuda bulunmakta!' + name_length: '&4Senin ismin ya cok kisa yada cok uzun!' + characters_in_name: '&4Senin isminde uygunsuz karakterler bulunmakta. Izin verilen karakterler: %valid_chars' + kick_full_server: '&4Sunucu suanda dolu, daha sonra tekrar deneyin!' + country_banned: '&4Senin bolgen sunucudan yasaklandi!' + not_owner_error: 'Bu hesabin sahibi degilsin. Lutfen farkli bir isim sec!' + invalid_name_case: 'Oyuna %valid isminde katilmalisin. %invalid ismini kullanarak katilamazsin.' + quick_command: 'Bu komutu cok hizli kullandin! Lutfen, sunucuya tekrar gir ve herhangi bir komut kullanmadan once biraz bekle.' + +# Email +email: + add_email_request: '&3Lutfen hesabinize eposta adresinizi komut ile ekleyin "/email add "' + usage_email_add: '&cKullanim: /email add ' + usage_email_change: '&cKullanim: /email change ' + new_email_invalid: '&cGecersiz yeni eposta, tekrar deneyin!' + old_email_invalid: '&cGecersiz eski eposta, tekrar deneyin!' + invalid: '&cGecersiz eposta, tekrar deneyin!' + added: '&2Eposta basariyla kullaniciniza eklendi!' + add_not_allowed: '&cE-posta eklenmesine izin verilmedi!' + request_confirmation: '&cLutfen tekrar epostanizi giriniz!' + changed: '&2Epostaniz basariyla degistirildi!' + change_not_allowed: '&cEposta degistirilmesine izin verilmedi!' + email_show: '&2Suanki eposta adresin: &f%email' + no_email_for_account: '&2Bu hesapla iliskili bir eposta bulunmuyor.' + already_used: '&4Eposta adresi zaten kullaniliyor.' + incomplete_settings: 'Hata: Gonderilen epostada bazi ayarlar tamamlanmis degil. Yetkili ile iletisime gec.' + send_failure: 'Eposta gonderilemedi. Yetkili ile iletisime gec.' + change_password_expired: 'Artik bu komutu kullanarak sifrenizi degistiremezsiniz.' + email_cooldown_error: '&cKisa bir sure once eposta gonderildi. Yeni bir eposta almak icin %time beklemelisin.' + +# Password recovery by email +recovery: + forgot_password_hint: '&3Sifreni mi unuttun ? Komut kullanarak ogrenebilirsin "/email recovery "' + command_usage: '&cKullanim: /email recovery ' + email_sent: '&2Sifreniz epostaniza gonderildi! Lutfen eposta kutunuzu kontrol edin!' + code: + code_sent: 'Sifre sifirlama kodu eposta adresinize gonderildi.' + incorrect: 'Kod dogru degil! Kullanim "/email recovery [eposta]" ile yeni bir kod olustur' + tries_exceeded: 'Kurtarma kodu icin girilen maksimum sayisi astiniz. "/email recovery [email]" komutunu kullanarak yeni bir tane olusturabilirsiniz.' + correct: 'Kurtarma kodu dogru sekilde girildi!' + change_password: 'Lutfen sifrenizi degistirmek icin /email setpassword komutunu kullanin.' + +# Captcha +captcha: + usage_captcha: '&3Giris yapmak icin guvenlik kodunu komut yazarak girin "/captcha %captcha_code"' + wrong_captcha: '&cYanlis guvenlik kodu, kullanim sekli "/captcha %captcha_code" sohbete yazin!' + valid_captcha: '&2Guvenlik kodu dogrulandi!' + captcha_for_registration: 'Kayit olmak icin once bir captcha cozmeniz gerekiyor, lutfen bu komutu kullan: /captcha %captcha_code' + register_captcha_valid: '&2Gecerli captcha! /register ile kayit olabilirsiniz' + +# Verification code +verification: + code_required: '&3Bu komut hassas ve eposta dogrulamasi gerektiriyor! Gelen kutunuzu kontrol edin ve epostalarin talimatlarina uyun.' + command_usage: '&Kullanim: /verification ' + incorrect_code: '&cYanlis kod, lutfen email ile aldiginiz kodu kullanarak, chate "/verification " yazin' + success: '&2Kimliginiz dogrulandi! Simdi mevcut oturumdaki butun komutlari calistirabilirsiniz!' + already_verified: '&2Mevcut oturumda her hassas komutu zaten calistirabilirsiniz!' + code_expired: '&3Kodunuzun suresi doldu! Diger hassas komutlari calistirmak icin yeni bir kod alin!' + email_needed: '&3Kimliginizi dogrulamak icin hesabiniza bir email adresi baglamis olmaniz gerekir!!' + +# Time units +time: + second: 'saniye' + seconds: 'saniye' + minute: 'dakika' + minutes: 'dakika' + hour: 'saat' + hours: 'saat' + day: 'gun' + days: 'gun' + +# Two-factor authentication +two_factor: + code_created: '&2Gizli kodunuz %code. Buradan test edebilirsin, %url' + confirmation_required: 'Lutfen kodunuzu /2fa confirm komutu ile dogrulayin' + code_required: 'Lutfen iki-faktorlu dogrulama kodunuzu /2fa code komutu ile gonderin' + already_enabled: 'Iki-faktorlu dogrulama zaten hesabinizda aktif durumda!' + enable_error_no_code: 'Sizin icin 2fa anahtari olusturulmamis ya da suresi dolmus. Lutfen /2fa add komutunu calistirin' + enable_success: 'Iki-faktorlu kimlik dogrulama hesabiniz icin basariyla aktif edildi' + enable_error_wrong_code: 'Yanlis kod veya kodun suresi dolmus. Lutfen /2fa add komutunu calistirin' + not_enabled_error: 'Iki-faktorlu kimlik dogrulama kodu hesabiniz icin aktif edilmemis. /2fa add komutunu calistirin' + removed_success: 'Iki-faktorlu dogrulama hesabinizdan basariyla kaldirilmistir' + invalid_code: 'Gecersiz kod!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aBedrock otomatik giriş başarılı!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aGiriş sırasında portalda sıkıştınız.' + fix_underground: '&aGiriş sırasında yeraltında sıkıştınız.' + cannot_fix_underground: '&aGiriş sırasında yeraltında sıkıştınız, ancak bunu düzeltemiyoruz.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cÇifte giriş nedeniyle bağlantınız kesildi.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_uk.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_uk.yml new file mode 100644 index 0000000000..b16bbb98d2 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_uk.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cВнутрішньоігрову реєстрацію зараз вимкнено.' + name_taken: '&cТакий нікнейм вже зареєстровано.' + register_request: '&3Перш ніж почати гру, вам потрібно зареєструвати свій нікнейм!%nl%&3Для цього просто введіть команду "/register <пароль> <повторПароля>"' + command_usage: '&cСинтаксис: /register <пароль> <повторПароля>' + reg_only: '&4Лише зареєстровані гравці можуть підключатись до сервера!%nl%&4Будь ласка, відвідайте https://example.com для реєстрації.' + success: '&2Реєстрація пройшла успішно!' + kicked_admin_registered: 'Адміністратор вас зареєстрував; Будь ласка, авторизуйтесь знову!' + +# Password errors on registration +password: + match_error: '&cПаролі не співпадають!' + name_in_password: '&cНе можна використовувати свій нікнейм у якості пароля! Будь ласка, виберіть щось інакше...' + unsafe_password: '&cЦей пароль надто простий! Будь ласка, придумайте інакший...' + forbidden_characters: '&4Ваш пароль містить недопустимі символи. Підберіть інакший...%nl%&4(Reg-ex: %valid_chars)' + wrong_length: '&cВаш пароль надто короткий або надто довгий! Спробуйте інакший...' + pwned_password: '&cВаш вибраний пароль небезпечний. Він вже використовувався %pwned_count разів! Будь ласка, використовуйте надійний пароль...' + +# Login +login: + command_usage: '&cСинтаксис: /login <пароль>' + wrong_password: '&cНевірний пароль!' + success: '&2Успішна авторизація!' + login_request: '&cДля авторизації, введіть команду "/login <пароль>"' + timeout_error: '&4Час для авторизації сплинув. Будь ласка, спробуйте ще раз!' + +# Errors +error: + denied_command: '&cДля використання цієї команди потрібна авторизація.' + denied_chat: '&cДля доступу до чату потрібна авторизація.' + unregistered_user: '&cЦей гравець не є зареєстрованим.' + not_logged_in: '&cВи не авторизовані!' + no_permission: '&4У вас недостатньо прав, щоб застосувати цю команду!' + unexpected_error: '&4[AuthMe] Помилка. Будь ласка, повідомте адміністратора!' + max_registration: '&cВичерпано ліміт реєстрацій (%reg_count/%max_acc %reg_names) для вашого підключення!' + logged_in: '&cВи вже авторизовані!' + kick_for_vip: '&3Вас кікнуто, внаслідок того, що VIP гравець зайшов на сервер коли небуло вільних місць.' + kick_unresolved_hostname: '&cЗнайдена помилка: невирішене ім''я вузла гравця!' + tempban_max_logins: '&cВаш IP тимчасово заблоковано, із‒за багатократного введення хибного пароля.' + +# AntiBot +antibot: + kick_antibot: 'На сервер здійснено DDoS атаку. Будь ласка, зачекайте декілька хвилин доки активність спаде.' + auto_enabled: '&4[AntiBotService] Ненормативне число з’єднань. Активовано антибот систему!' + auto_disabled: '&2[AntiBotService] Антибот систему деактивовано після %m хв. активності.' + +# Unregister +unregister: + success: '&cДані про реєстрацію успішно видалено' + command_usage: '&cСинтаксис: /unregister <пароль>' + +# Other messages +misc: + account_not_activated: '&cВаш акаунт ще не активовано. Будь ласка, провірте свою електронну пошту!' + not_activated: '&cАкаунт не активовано, будь ласка, зареєструйтесь і активуйте його перед повторною спробою.' + password_changed: '&2Пароль успішно змінено!' + logout: '&2Ви вийшли зі свого акаунта!' + reload: '&2Конфігурації та базу даних було успішно перезавантажено!' + usage_change_password: '&cСинтаксис: /changepassword <старийПароль> <новийПароль>' + accounts_owned_self: 'Кількість ваших твінк‒акаунтів: %count:' + accounts_owned_other: 'Кількість твінк‒акаунтів гравця %name: %count' + +# Session messages +session: + valid_session: '&2Сесію відновлено.' + invalid_session: '&cСесію було розірвано внаслідок зміни IP.' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Перевищено ліміт на авторизацію з одного IP.' + same_nick_online: '&4Хтось з таким ніком зараз вже сидить на сервері!' + name_length: '&4Ваш нікнейм надто короткий або надто довгий!' + characters_in_name: '&4Ваш нікнейм містить недопустимі символи! Reg-ex: %valid_chars' + kick_full_server: '&4Сервер переповнено! Доведеться зачекати доки хтось вийде.' + country_banned: '&4Ваша країна заборонена на цьому сервері!' + not_owner_error: 'Цей акаунт вам не належить! Будь ласка, оберіть інакший нікнейм!' + invalid_name_case: 'Регістр у вашому нікнеймі відрізняється від регістру при реєстрації.%nl%Поточний регістр: &c%invalid&f. Валідний регістр: &a%valid&f.%nl%Будь ласка, перезайдіть з валідним регістром!' + quick_command: 'Ви занадто швидко використовували команду! Будь ласка, приєднайтесь знову до сервера і почекайте, перш ніж використовувати будь-яку команду.' + +# Email +email: + add_email_request: '&3Не забудьте прив’язати електронну пошту до свого акаунта, за допомогою команди "/email add "' + usage_email_add: '&cСинтаксис: /email add ' + usage_email_change: '&cСинтаксис: /email change <старий e-mail> <новий e-mail>' + new_email_invalid: '&cНекоректний формат.' + old_email_invalid: '&cСтарий e-mail, що прив’язано до вашого акаунта, відрізняється від введеного вами.' + invalid: '&cФормат вказаного e-mail’у є некоректним, або його домен внесено до блеклисту.' + added: '&2Електронну пошту успішно прив’язано до вашого акаунта.' + add_not_allowed: '&cДобавлення електронної пошти заборонено' + request_confirmation: '&cАдреси не співпадають.' + changed: '&2E-mail успішно змінено.' + change_not_allowed: '&cЗмiнення пошти заборонено' + email_show: '&2Ваша нинiшня адреса електронної пошти: &f%email' + no_email_for_account: '&2Наразі у вас немає адреси електронної пошти, пов’язаної з цим акаунтом.' + already_used: '&4До цієї електронної пошти прив’язано забагато акаунтів!' + incomplete_settings: '&4Не всі необхідні налаштування є встановленими, щоб надсилати електронну пошту. Будь ласка, повідомте адміністратора!' + send_failure: 'Не вдалося надіслати лист. Зверніться до адміністратора.' + change_password_expired: 'Ви більше не можете змінювати свій пароль, використовуючи цю команду.' + email_cooldown_error: '&cНещодавно вже було надіслано електронний лист. Заждиiть ще %time перш нiж вiдправляти ще листа.' + +# Password recovery by email +recovery: + forgot_password_hint: 'Забули пароль? Можете скористатись командою &9/email recovery &f<&9ваш e-mail&f>' + command_usage: '&cСинтаксис: /email recovery ' + email_sent: '&2Лист для відновлення доступу надіслано. Будь ласка, провірте свою пошту!' + code: + code_sent: 'На вашу адресу електронної пошти надіслано код відновлення для скидання пароля.' + incorrect: 'Код відновлення невірний! У вас залишилось ще %count спроб.' + tries_exceeded: 'Ви перевищили максимальну кількість спроб, щоб ввести код відновлення. Використовуйте "/email recovery [email]" для створення нового запросу.' + correct: 'Код відновлення введено правильно!' + change_password: 'Будь ласка, використовуйте команду /email setpassword <НовийПароль> щоб негайно змінити свій пароль.' + +# Captcha +captcha: + usage_captcha: '&3Для продовження доведеться ввести капчу — "/captcha %captcha_code"' + wrong_captcha: '&cНевірно введена капча! Спробуйте ще раз — "/captcha %captcha_code"' + valid_captcha: '&2Капчу прийнято.' + captcha_for_registration: 'Для того, щоб зареєструвати, ви повинні спочатку вирішити капчу, скористайтеся командою: /captcha %captcha_code' + register_captcha_valid: '&2Ви можете зареєструватися використовуя: /register' + +# Verification code +verification: + code_required: '&3Ця команда вимагає підтвердження електронною поштою! Перевірте свою пошту та дотримуйтесь вказівок у електронному листi.' + command_usage: '&cВикористання: /verification ' + incorrect_code: '&cНеправильний код, введіть "/verification <код>" у чаті, використовуючи код, отриманий електронною поштою' + success: '&2Ваша особа підтверджена! Тепер ви можете виконати всі команди протягом нинiшнього сеансу!' + already_verified: '&2Ви вже можете виконати кожну команду протягом нинiшнього сеансу!' + code_expired: '&3Ваш код закінчився! Виконайте ще одну команду, щоб отримати новий код!' + email_needed: '&3Щоб підтвердити свою особу, вам потрібно зв’язати електронну адресу зі своїм акаунтом!!' + +# Time units +time: + second: 'секунда' + seconds: 'секунд' + minute: 'хвилина' + minutes: 'хвилин' + hour: 'година' + hours: 'годин' + day: 'день' + days: 'днiв' + +# Two-factor authentication +two_factor: + code_created: '&2Ваш секретний код — %code %nl%&2Можете зкопіювати його за цим посиланням — %url' + confirmation_required: 'Підтвердьте свій код за допомогою / 2fa confirm <код>' + code_required: 'Будь ласка, надішліть свій двофакторний код аутентифікації використовуючи: /2fa code ' + already_enabled: 'Для вашого акаунту вже включена двофакторна аутентифікація!' + enable_error_no_code: 'Для вас не створено жодного ключа двухфакторної аутентифiкацii або термін його дії закінчився. Будь ласка, біжи /2fa add' + enable_success: 'Двофакторна автентифікація для вашого акаунта успішно включена' + enable_error_wrong_code: 'Неправильний код або код минув. Будь ласка, використовуйте: /2fa add' + not_enabled_error: 'Двофакторна аутентифікація не включена для вашого акаунту. Використовуйте: /2fa add' + removed_success: 'Двофакторну авторизацію успішно видалено з вашого акаунту' + invalid_code: 'Невірний код!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aАвтоматичний вхід Bedrock успішний!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aВи застрягли в порталі під час входу.' + fix_underground: '&aВи застрягли під землею під час входу.' + cannot_fix_underground: '&aВи застрягли під землею під час входу, але ми не можемо це виправити.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cВас відключено через подвійний вхід.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_vn.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_vn.yml new file mode 100644 index 0000000000..788e5eec87 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_vn.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&cKhông cho phép đăng ký tài khoản trong máy chủ!' + name_taken: '&cTài khoản này đã được đăng ký!' + register_request: '&2Xin vui lòng đăng ký tài khoản với lệnh "/register "' + command_usage: '&cSử dụng: /register ' + reg_only: '&4Chỉ có thành viên mới có thể tham gia máy chủ, vui lòng truy cập trang web https://example.com để đăng ký thành viên!' + success: '&2Đăng ký thành công!' + kicked_admin_registered: 'Một quản trị viên đã đăng ký cho bạn; vui lòng đăng nhập lại' + +# Password errors on registration +password: + match_error: '&cMật khẩu không đúng, vui lòng kiểm tra lại!' + name_in_password: '&cBạn không thể đặt mật khẩu bằng tên của mình, vui lòng đặt lại...' + unsafe_password: '&cMật khẩu của bạn vừa đặt không an toàn, vui lòng đặt lại...' + forbidden_characters: '&4Mật khẩu của bạn chứa ký tự không hợp lệ. Các ký tự cho phép: %valid_chars' + wrong_length: '&cMật khẩu của bạn đặt quá dài hoặc quá ngắn, vui lòng đặt lại!' + pwned_password: '&cMật khẩu bạn chọn không an toàn. Nó đã được sử dụng %pwned_count lần! Vui lòng sử dụng mật khẩu mạnh...' + +# Login +login: + command_usage: '&cSử dụng: /login ' + wrong_password: '&cSai mật khẩu!' + success: '&2Đăng nhập thành công!' + login_request: '&cXin vui lòng đăng nhập bằng lệnh "/login "' + timeout_error: '&4Thời gian đăng nhập đã hết, bạn đã bị văng khỏi máy chủ. Xin vui lòng thử lại!' + +# Errors +error: + denied_command: '&cBạn phải đăng nhập trước rồi mới có thể dùng lệnh này!' + denied_chat: '&cBạn phải đăng nhập trước rồi mới có thể chat!' + unregistered_user: '&cNgười dùng này chưa được đăng ký!' + not_logged_in: '&cBạn chưa đăng nhập!' + no_permission: '&4Bạn không có quyền dùng cập lệnh này!' + unexpected_error: '&4Lỗi! Vui lòng liên hệ quản trị viên.' + max_registration: '&cBạn đã vượt quá giới hạn tối đa đăng ký tài khoản (%reg_count/%max_acc %reg_names) trên đường truyền của bạn!' + logged_in: '&cBạn đã đăng nhập rồi!' + kick_for_vip: '&eChỉ có thành viên VIP mới được tham gia khi máy chủ đầy!' + kick_unresolved_hostname: '&cLỗi đã xảy ra: Không thể phân giải hostname của người chơi!' + tempban_max_logins: '&cBạn đã bị chặn tạm thời do đăng nhập sai quá nhiều lần.' + +# AntiBot +antibot: + kick_antibot: 'Chế độ AntiBot đã được kích hoạt! Bạn phải đợi vài phút trước khi tham gia vào máy chủ.' + auto_enabled: '&4[AntiBotService] AntiBot đã được kích hoạt do số lượng lớn kết nối đến máy chủ!' + auto_disabled: '&2[AntiBotService] AntiBot đã được tắt sau %m phút!' + +# Unregister +unregister: + success: '&cHủy đăng ký thành công!' + command_usage: '&cSử dụng: /unregister ' + +# Other messages +misc: + account_not_activated: '&cTài khoản của bạn chưa được kích hoạt, vui lòng kiểm tra email!' + not_activated: '&cTài khoản chưa được kích hoạt, vui lòng đăng ký và kích hoạt trước khi thử lại.' + password_changed: '&2Thay đổi mật khẩu thành công!' + logout: '&2Bạn đã đăng xuất!' + reload: '&2Cấu hình và cơ sở dử liệu đã được tải lại thành công!' + usage_change_password: '&cSử dụng: /changepassword ' + accounts_owned_self: 'Bạn sở hữu %count tài khoản:' + accounts_owned_other: 'Người chơi %name có %count tài khoản:' + +# Session messages +session: + valid_session: '&2Phiên đăng nhập đã được kết nối trở lại.' + invalid_session: '&cIP của bạn đã bị thay đổi và phiên đăng nhập của bạn đã hết hạn!' + +# Error messages when joining +on_join_validation: + same_ip_online: 'Một người chơi với cùng địa chỉ IP đã kết nối vào máy chủ!' + same_nick_online: '&4Tài khoản đang được sử dụng trên máy chủ!' + name_length: '&4Tên đăng nhập của bạn quá ngắn hoặc quá dài!' + characters_in_name: '&4Tên nhân vật có chứa ký tự không hợp lệ. Các ký tự được cho phép: %valid_chars' + kick_full_server: '&4Máy chủ quá tải, vui lòng thử lại sau!' + country_banned: '&4Quốc gia của bạn bị cấm tham gia máy chủ này!' + not_owner_error: 'Bạn không phải là chủ sở hữu tài khoản này, hãy chọn tên khác!' + invalid_name_case: 'Bạn nên vào máy chủ với tên đăng nhập là %valid, không phải là %invalid.' + quick_command: 'Bạn đang xài lệnh quá nhanh. Hãy thoát máy chủ và chờ một lúc trước khi sử dụng lệnh.' + +# Email +email: + add_email_request: '&eVui lòng thêm email của bạn với lệnh "/email add "' + usage_email_add: '&cSử dụng: /email add ' + usage_email_change: '&cSử dụng: /email change ' + new_email_invalid: '&cEmail mới không hợp lệ, vui lòng thử lại!' + old_email_invalid: '&cEmail cũ không hợp lệ, vui lòng thử lại!' + invalid: '&cĐại chỉ email không hợp lệ, vui lòng thử lại!' + added: '&2Địa chỉ email đã được thêm vào tài khoản của bạn.' + add_not_allowed: '&cKhông được phép thêm địa chỉ email!' + request_confirmation: '&cVui lòng xác nhận địa chỉ email của bạn!' + changed: '&2Địa chỉ email đã thay đổi!' + change_not_allowed: '&cKhông được phép thay đổi địa chỉ email!' + email_show: '&2Địa chỉ email hiện tại của bạn là: &f%email' + no_email_for_account: '&2Hiện tại bạn chưa liên kết bất kỳ email nào với tài khoản này.' + already_used: '&4Địa chỉ email đã được sử dụng!' + incomplete_settings: 'Lỗi: các thiết lập để gửi thư không được cài đặt đúng cách. Vui lòng liên hệ với quản trị viên để báo lỗi.' + send_failure: 'Không thể gửi thư. Vui lòng liên hệ với ban quản trị.' + change_password_expired: '&cBạn không thể thay đổi mật khẩu bằng lệnh này nữa.' + email_cooldown_error: '&cMột email đã được gửi gần đây. Bạn phải chờ %time trước khi có thể gửi một email mới.' + +# Password recovery by email +recovery: + forgot_password_hint: '&aBạn quên mật khẩu? Vui lòng gõ lệnh "/email recovery "' + command_usage: '&cSử dụng: /email recovery ' + email_sent: '&2Email khôi phục đã được gửi thành công! Vui lòng kiểm tra hộp thư đến trong email của bạn.' + code: + code_sent: 'Một mã khôi phục mật khẩu đã được gửi đến địa chỉ email của bạn.' + incorrect: 'Mã khôi phục không đúng! Dùng lệnh /email recovery [email] để tạo một mã mới' + tries_exceeded: 'Bạn đã vượt quá số lần tối đa cho phép nhập mã khôi phục. Hãy sử dụng lệnh "/email recovery [email]" để tạo một mã mới.' + correct: 'Mã khôi phục đã được nhập chính xác!' + change_password: 'Hãy sử dụng lệnh "/email setpassword " để đổi mật khẩu của bạn ngay lập tức.' + +# Captcha +captcha: + usage_captcha: '&eĐể đăng nhập, hãy nhập mã Captcha, Vui lòng gõ lệnh "/captcha %captcha_code"' + wrong_captcha: '&cSai mã captcha, Vui lòng gõ lệnh "/captcha %captcha_code"!' + valid_captcha: '&2Đã xác minh captcha!' + captcha_for_registration: 'Để đăng ký, hãy nhập mã Captcha trước. Vui lòng gõ lệnh "/captcha %captcha_code"' + register_captcha_valid: '&2Đã xác minh captcha! Bây giờ bạn có thể đăng ký với lệnh "/register"' + +# Verification code +verification: + code_required: '&3Lệnh này nhạy cảm và yêu cầu xác minh email! Vui lòng iểm tra hộp thư đến của bạn và làm theo hướng dẫn trong email.' + command_usage: '&cLệnh: /verification ' + incorrect_code: '&cMã xác minh không chính xác, vui lòng nhập "/verify " với mã bạn nhận được qua email.' + success: '&2Xác minh thành công! Bạn đã có thể sử dụng các lệnh trong phiên đăng nhập này.' + already_verified: '&2Bạn đã có thể thực hiện mọi lệnh nhạy cảm trong phiên hiện tại!' + code_expired: '&3Mã xác minh đã hết han! Hãy sử dụng một lệnh nhạy cảm để lấy mã mới.' + email_needed: '&3Để xác định danh tính của bạn, bạn cần kết nối tài khoản này với 1 email!' + +# Time units +time: + second: 'giây' + seconds: 'giây' + minute: 'phút' + minutes: 'phút' + hour: 'giờ' + hours: 'giờ' + day: 'ngày' + days: 'ngày' + +# Two-factor authentication +two_factor: + code_created: '&2Mã bí mật của bạn là %code. Bạn có thể quét nó tại đây %url' + confirmation_required: 'Hãy xác thực mã của bạn bằng lệnh /2fa confirm ' + code_required: 'Hãy nhập mã xác thực 2 lớp của bạn bằng lệnh /2fa code ' + already_enabled: 'Xác thực 2 lớp đã được kích hoạt trên tài khoản của bạn!' + enable_error_no_code: 'Không có mã xác thực nào đã được tạo cho tài khoản của bạn hoặc nó đã hết hạn. Hãy sử dụng lệnh /2fa add' + enable_success: 'Đã thành công kích hoạt xác thực 2 lớp cho tài khoản của bạn!' + enable_error_wrong_code: 'Mã xác thực bị sai hoặc đã bị hết hạn. Hãy sử dụng lệnh /2fa add' + not_enabled_error: 'Xác thực 2 lớp không được kích hoạt trên tài khoản của bạn. Hãy sử dụng lệnh /2fa add' + removed_success: 'Đã thành công tắt xác thực 2 lớp khỏi tài khoản của bạn' + invalid_code: 'Mã xác thực không hợp lệ!' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: '&aĐăng nhập tự động Bedrock thành công!' + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&aBạn bị kẹt trong cổng khi đăng nhập.' + fix_underground: '&aBạn bị kẹt dưới lòng đất khi đăng nhập.' + cannot_fix_underground: '&aBạn bị kẹt dưới lòng đất khi đăng nhập, nhưng chúng tôi không thể khắc phục điều này.' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&cBạn đã bị ngắt kết nối do đăng nhập đôi.' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_zhcn.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_zhcn.yml new file mode 100644 index 0000000000..53ad84933d --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_zhcn.yml @@ -0,0 +1,181 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&c注册已被禁止' + name_taken: '&c此用户已经在此服务器注册过' + register_request: '&b请输入“&a/reg <密码> <重复密码>&b”以注册' + command_usage: '&c正确用法:“/reg <密码> <重复密码>”' + reg_only: '&c只允许注册过的玩家进服!' + success: '&a*** 已成功注册 ***' + kicked_admin_registered: '&a*** 管理员刚刚注册了您; 请重新登录 ***' + +# Password errors on registration +password: + match_error: '&c密码不相同' + name_in_password: '&c您不能使用您的名字作为密码。 ' + unsafe_password: '&c您不能使用安全性过低的密码。 ' + forbidden_characters: '&4您的密码包含了非法字符.可使用的字符: %valid_chars' + wrong_length: '&4您的密码没有达到要求!' + pwned_password: '&c你使用的密码并不安全。它已经被使用了 %pwned_count 次! 请使用一个更强大的密码...' + +# Login +login: + command_usage: '&c正确用法:“/l <密码>”' + wrong_password: '&c*** 密码错误 ***' + success: '&a*** 已成功登录 ***' + login_request: '&c请输入“/l <密码>”以登录' + timeout_error: '给您登录的时间已经过了' + +# Errors +error: + denied_command: '&7您需要先通过验证才能使用该命令!' + denied_chat: '&7您需要先通过验证才能聊天!' + unregistered_user: '&c此用户名还未注册过' + not_logged_in: '&c您还未登录!' + no_permission: '&c没有权限' + unexpected_error: '&4发现错误,请联系管理员' + max_registration: '&c该地址已无法注册,请联系管理员进行注册.' + logged_in: '&c您已经登陆过了!' + kick_for_vip: '&c一个VIP玩家加入了已满的服务器!' + kick_unresolved_hostname: '&c发生了一个错误: 无法解析玩家的主机名' + tempban_max_logins: '&c由于您登录失败次数过多,已被暂时禁止登录。' + +# AntiBot +antibot: + kick_antibot: '连接异常,请稍后加入' + auto_enabled: '&c由于发生大量异常连接,本服将禁止连接.' + auto_disabled: '&a异常连接减少,本服将在 &a%m &a分钟后自动开放连接.' + +# Unregister +unregister: + success: '&a*** 已成功注销 ***' + command_usage: '&c正确用法:“/unregister <密码>”' + +# Other messages +misc: + account_not_activated: |- + &a一封包含密码的邮件已发送至您的收件箱. + &a请在十分钟内完成登录,否则将注销此账户. + not_activated: '&c账户未激活,请注册激活后再次尝试.' + password_changed: '&a*** 密码已修改 ***' + logout: '&a*** 已成功登出 ***' + reload: '&a配置以及数据已经重新加载完毕' + usage_change_password: '&a正确用法:“/changepassword 旧密码 新密码”' + accounts_owned_self: '您拥有 %count 个账户:' + accounts_owned_other: '玩家 %name 拥有 %count 个账户:' + +# Session messages +session: + valid_session: '' + invalid_session: '&c*** 请重新登录 ***' + +# Error messages when joining +on_join_validation: + same_ip_online: '已有一个同IP玩家在游戏中了!' + same_nick_online: '&a同样的用户名现在在线且已经登录了!' + name_length: '&c您的用户名太短或者太长了' + characters_in_name: '&c您的用户名不符合标准.' + kick_full_server: '&c抱歉,服务器已满!' + country_banned: |- + &6[&b&lAccount Security System&6] + &c为保证您的游玩体验,请使用中国境内网络连接. + &cTo ensure your play experience,please use the Internet connection within China. + not_owner_error: |- + &6[&b&lAccount Security System&6] + &c请勿尝试登陆系统账户,系统账户受安全系统保护. + &c如果您并不知情,请更换您的用户名重新加入该服务器. + invalid_name_case: '&c您应该使用 %valid 登录服务器,当前名字: %invalid .' + quick_command: '&c您发送命令的速度太快了,请重新加入服务器等待一会后再使用命令' + +# Email +email: + add_email_request: '' + usage_email_add: '&a用法: /email add <邮箱> <确认邮箱> ' + usage_email_change: '&a用法: /email change <旧邮箱> <新邮箱> ' + new_email_invalid: '&c新邮箱无效!' + old_email_invalid: '&c旧邮箱无效!' + invalid: '&c无效的邮箱' + added: '&a*** 邮箱已添加 ***' + add_not_allowed: '&c服务器不允许添加电子邮箱' + request_confirmation: '&c确认您的邮箱' + changed: '&a*** 邮箱已修改 ***' + change_not_allowed: '&c服务器不允许修改邮箱地址' + email_show: '&a该账户使用的电子邮箱为: &a%email' + no_email_for_account: '&c当前并没有任何邮箱与该账号绑定' + already_used: '&c邮箱已被使用' + incomplete_settings: '&c错误: 必要设置未设定完成,请联系管理员' + send_failure: '&c邮件已被作废,请检查您的邮箱是否正常工作.' + change_password_expired: '&c您不能使用此命令更改密码' + email_cooldown_error: '&c您需要等待 %time 后才能再次请求发送' + +# Password recovery by email +recovery: + forgot_password_hint: '&c忘了您的密码?请输入:“/email recovery <您的邮箱>”' + command_usage: '&a用法: /email recovery <邮箱>' + email_sent: '&a找回密码邮件已发送!' + code: + code_sent: '&a*** 已发送验证邮件 ***' + incorrect: '&a验证码不正确! 使用 /email recovery [邮箱] 以生成新的验证码' + tries_exceeded: '&a您已经达到输入验证码次数的最大允许次数.' + correct: '&a*** 验证通过 ***' + change_password: '&c请使用 /email setpassword <新密码> 立即设置新的密码' + +# Captcha +captcha: + usage_captcha: '&7请输入 /captcha %captcha_code 来验证操作.' + wrong_captcha: '&c错误的验证码.' + valid_captcha: '&a*** 验证通过 ***' + captcha_for_registration: '&7请输入 /captcha %captcha_code 来验证操作.' + register_captcha_valid: '&a验证通过, 现在可以使用 /register 注册啦!' + +# Verification code +verification: + code_required: '&a*** 已发送验证邮件 ***' + command_usage: '&c使用方法:/verification <验证码>' + incorrect_code: '&c错误的验证码.' + success: '&a*** 验证通过 ***' + already_verified: '&a您已经通过验证' + code_expired: '&c验证码已失效' + email_needed: '&c邮箱未绑定' + +# Time units +time: + second: '秒' + seconds: '秒' + minute: '分' + minutes: '分' + hour: '时' + hours: '时' + day: '天' + days: '天' + +# Two-factor authentication +two_factor: + code_created: '&7您正在激活双重验证, 请打开 &a%url &7扫描二维码' + confirmation_required: '&7请输入“/totp confirm <验证码>”来确认激活双重验证' + code_required: '&c请输入“/totp code <验证码>”来提交验证码' + already_enabled: '&a双重验证已启用' + enable_error_no_code: '&c验证码丢失' + enable_success: '&a已成功启用双重验证' + enable_error_wrong_code: '&c验证码错误或者已经过期,请重新执行“/totp add”' + not_enabled_error: '&c双重验证未在您的账号上启用,请使用“/totp add”来启用' + removed_success: '&c双重验证已从您的账号上禁用' + invalid_code: '&c无效的验证码' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: "&a基岩版自动登录完成" + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&a你在登录时卡在了地狱门, 现已修正' + fix_underground: '&a你被埋住了, 坐标已修正, 下次下线之前请小心!' + cannot_fix_underground: '&a你被埋住了, 坐标无法修正, 只好送你去了最高点, 自求多福吧少年~' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&a已修复幽灵玩家, 请重新进入' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_zhhk.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_zhhk.yml new file mode 100644 index 0000000000..42a96a8835 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_zhhk.yml @@ -0,0 +1,176 @@ +# Translator: lifehome # +# Last modif: 1541690611 UTC # +# -------------------------------------------- # +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&8[&6用戶系統&8] &c本伺服器已停止新玩家註冊。' + name_taken: '&8[&6用戶系統&8] &c此用戶名已經註冊過了。' + register_request: '&8[&6用戶系統&8] &c請使用這個指令來註冊:《 &f/register <密碼> <重覆密碼>&c 》' + command_usage: '&8[&6用戶系統&8] &f用法:《 /register <密碼> <重覆密碼> 》' + reg_only: '&8[&6用戶系統&8] &f限已註冊會員,請先到本服網站進行註冊。' + success: '&8[&6用戶系統&8] &b你成功註冊了。' + kicked_admin_registered: '&8[&6用戶系統&8] &b管理員已替你完成註冊,請重新登入。' + +# Password errors on registration +password: + match_error: '&8[&6用戶系統&8] &f密碼不符合。' + name_in_password: '&8[&6用戶系統&8] &c這個密碼太不安全了 !' + unsafe_password: '&8[&6用戶系統&8] &c這個密碼太不安全了 !' + forbidden_characters: '&8[&6用戶系統&8] &4密碼字符只能含有這些喔:%valid_chars' + wrong_length: '&8[&6用戶系統&8] &f嗯... 你的密碼並不符合規定長度。' + pwned_password: '&8[&6用戶系統&8] &c你使用的密碼並不安全。它已經被使用了 %pwned_count 次! 請使用一個更強大的密碼...' + +# Login +login: + command_usage: '&8[&6用戶系統&8] &f用法:《 /login <密碼> 》' + wrong_password: '&8[&6用戶系統&8] &c你輸入了錯誤的密碼。' + success: '&8[&6用戶系統&8] &a你成功登入了。' + login_request: '&8[&6用戶系統&8] &c請使用這個指令來登入:《 &f/login <密碼>&c 》' + timeout_error: '&8[&6用戶系統&8] &f登入逾時。' + +# Errors +error: + denied_command: '&8[&6用戶系統&8] &c請先登入以便使用此指令。' + denied_chat: '&8[&6用戶系統&8] &c請先登入以便與其他玩家聊天。' + unregistered_user: '&8[&6用戶系統&8] &c此用戶名沒有已登記資料。' + not_logged_in: '&8[&6用戶系統&8] &c你還沒有登入 !' + no_permission: '&8[&6用戶系統&8] &b嗯~你想幹甚麼?' + unexpected_error: '&8[&6用戶系統&8] &f發生錯誤,請與管理員聯絡。' + max_registration: '&8[&6用戶系統&8] &f你的IP地址已達到註冊數上限。 &7(info: %reg_count/%max_acc %reg_names)' + logged_in: '&8[&6用戶系統&8] &c你已經登入過了。' + kick_for_vip: '&8[&6用戶系統&8] &c喔 !因為有VIP玩家登入了伺服器。' + kick_unresolved_hostname: '&8[&6用戶系統&8] &c發生了一個錯誤: 無法解析玩家的主機名' + tempban_max_logins: '&8[&6用戶系統&8] &c因為多次登入失敗,你已被暫時封禁。' + +# AntiBot +antibot: + kick_antibot: '&8[&6用戶系統&8] &c伺服器錯誤 !請稍候再嘗試登入吧。 &7(err: kick_due2_bot)' + auto_enabled: '&8[&6用戶系統&8] &3防止機械人程序已因應現時大量不尋常連線而啟用。' + auto_disabled: '&8[&6用戶系統&8] &3不正常連接數已減少,防止機械人程序將於 %m 分鐘後停止。' + +# Unregister +unregister: + success: '&8[&6用戶系統&8] &c已成功刪除會員註冊記錄。' + command_usage: '&8[&6用戶系統&8] &f用法:《 /unregister <密碼> 》' + +# Other messages +misc: + account_not_activated: '&8[&6用戶系統&8] &f你的帳戶還沒有經過電郵驗證 !' + not_activated: '&8[&6用戶系統&8] &c賬戶未激活,請註冊激活後再次嘗試.' + password_changed: '&8[&6用戶系統&8] &c你成功更換了你的密碼 !' + logout: '&8[&6用戶系統&8] &b你成功登出了。' + reload: '&8[&6用戶系統&8] &b登入系統設定及資料庫重新載入完畢。' + usage_change_password: '&8[&6用戶系統&8] &f用法:《 /changepassword <舊密碼> <新密碼> 》' + accounts_owned_self: '你擁有 %count 個帳戶:' + accounts_owned_other: '玩家《%name》擁有 %count 個帳戶:' + +# Session messages +session: + valid_session: '&8[&6用戶系統&8] &b嗨 ! 歡迎回來喔~' + invalid_session: '&8[&6用戶系統&8] &f登入階段資料已損壞,請等待登入階段結束。' + +# Error messages when joining +on_join_validation: + same_ip_online: '&8[&6用戶系統&8] &c你正使用的 IP 位址已被其他玩家佔用。' + same_nick_online: '&8[&6用戶系統&8] &f同名玩家已在遊玩。' + name_length: '&8[&6用戶系統&8] &c你的用戶名不符合規定長度。' + characters_in_name: '&8[&6用戶系統&8] &c用戶名稱錯誤 ! 登入系統只接受以下字符:%valid_chars' + kick_full_server: '&c抱歉 ! 因為伺服器滿人了,所以你目前未能登入伺服器。' + country_banned: '&8[&6用戶系統&8] &c抱歉 !&4本伺服器已停止對你的國家提供遊戲服務。' + not_owner_error: '&8[&6用戶系統&8] &4警告 !&c你並不是此帳戶持有人,請立即登出。' + invalid_name_case: '&8[&6用戶系統&8] &4警告 !&c你應該使用「%valid」而並非「%invalid」登入遊戲。' + quick_command: '&8[&6用戶系統&8] &4警告 !&c你使用指令的速度太快了,請重新登入並稍等一會才再次使用指令。' + +# Email +email: + add_email_request: '&8[&6用戶系統&8] &b請為你的帳戶立即添加電郵地址:《 /email add <電郵地址> <重覆電郵地址> 》' + usage_email_add: '&8[&6用戶系統&8] &f用法:《 /email add <電郵> <重覆電郵> 》' + usage_email_change: '&8[&6用戶系統&8] &f用法:《 /email change <舊電郵> <新電郵> 》' + new_email_invalid: '&8[&6用戶系統&8] &c你所填寫的新電郵地址並不正確。' + old_email_invalid: '&8[&6用戶系統&8] &c你所填寫的舊電郵地址並不正確。' + invalid: '&8[&6用戶系統&8] &c你所填寫的電郵地址並不正確。' + added: '&8[&6用戶系統&8] &a已新增你的電郵地址。' + add_not_allowed: '&8[&6用戶系統&8] &c你不能新增電郵地址到你的帳戶。' + request_confirmation: '&8[&6用戶系統&8] &5請重覆輸入你的電郵地址。' + changed: '&8[&6用戶系統&8] &a你的電郵地址已更改。' + change_not_allowed: '&8[&6用戶系統&8] &c你不能更改你的電郵地址。' + email_show: '&8[&6用戶系統&8] &2你所使用的電郵地址為: &f%email' + no_email_for_account: '&8[&6用戶系統&8] &2你並未有綁定電郵地址到此帳戶。' + already_used: '&8[&6用戶系統&8] &4這個電郵地址已被使用。' + incomplete_settings: '&8[&6用戶系統&8] &c電郵系統錯誤,請聯絡伺服器管理員。 &7(err: mailconfig_incomplete)' + send_failure: '&8[&6用戶系統&8] &c電郵系統錯誤,請聯絡伺服器管理員。 &7(err: smtperr)' + change_password_expired: '&8[&6用戶系統&8] &c此指令已過期,請重新辦理。' + email_cooldown_error: '&8[&6用戶系統&8] &c你最近已經辦理過重寄郵件,請等待 %time 後再嘗試吧。' + +# Password recovery by email +recovery: + forgot_password_hint: '&8[&6用戶系統&8] &b忘記密碼?請使用 /email recovery <電郵地址> 來更新密碼。' + command_usage: '&8[&6用戶系統&8] &f用法:《 /email recovery <電郵> 》' + email_sent: '&8[&6用戶系統&8] &a忘記密碼信件已寄出,請查收。' + code: + code_sent: '&8[&6用戶系統&8] &b帳戶驗證碼已發送到你的郵箱,請查收。' + incorrect: '&8[&6用戶系統&8] &c帳戶驗證碼無效。 &7(你尚餘 %count 次嘗試機會)' + tries_exceeded: '&8[&6用戶系統&8] &c此驗證碼已因多次嘗試後失效,請使用《 &f/email recovery <電郵地址>&c 》重新辦理。' + correct: '&8[&6用戶系統&8] &a帳戶驗證碼輸入正確。' + change_password: '&8[&6用戶系統&8] &c請立即使用《 &f/email setpassword <新密碼>&c 》指令,以重設你的帳戶密碼。' + +# Captcha +captcha: + usage_captcha: '&8[&6用戶系統&8] &f用法:《 /captcha %captcha_code 》' + wrong_captcha: '&8[&6用戶系統&8] &c你所輸入的驗證碼無效,請使用 《 &f/captcha %captcha_code&c 》 再次輸入。' + valid_captcha: '&8[&6用戶系統&8] &c你所輸入的驗證碼無效 !' + captcha_for_registration: '&8[&6用戶系統&8] &2要完成玩家註冊程序,請先執行驗証指令:《 &f/captcha %captcha_code&2 》' + register_captcha_valid: '&8[&6用戶系統&8] &2驗證成功 !你現在可以使用指令《 &f/register&2 》進行註冊了~' + +# Verification code +verification: + code_required: '&8[&6用戶系統&8] &e這個高級魔法指令需要再一次進行電郵驗證方可使用,請查收電郵並按信件內容進行驗證。' + command_usage: '&8[&6用戶系統&8] &f用法:《 /verification <驗證碼> 》' + incorrect_code: '&8[&6用戶系統&8] &c錯誤的驗證碼,請使用指令《 &f/verification <驗證碼>&c 》再次嘗試驗證。' + success: '&8[&6用戶系統&8] &2身份驗證成功 !你現在可以在目前的登入階段執行所有等級的指令了 !' + already_verified: '&8[&6用戶系統&8] &2你已經爲目前的登入階段成功通過電郵身份驗證了,毋須再次驗證。' + code_expired: '&8[&6用戶系統&8] &c你的驗證碼已經過期,請執行另一個高等魔法指令以觸發新的身份驗證挑戰。' + email_needed: '&8[&6用戶系統&8] &c嗯... 你的帳戶沒有已經連結的電郵地址,不能使用電郵驗證功能。' + +# Time units +time: + second: '秒' + seconds: '秒' + minute: '分' + minutes: '分' + hour: '小時' + hours: '小時' + day: '日' + days: '日' + +# Two-factor authentication +two_factor: + code_created: '&8[&6用戶系統&8] &b你的登入金鑰為&9〔 &c%code&9 〕&b,掃描連結為:%nl%&c %url' + confirmation_required: '&8[&6用戶系統&8] &b請使用指令《 &f/2fa confirm <驗證碼>&b 》以確認你的身份。' + code_required: '&8[&6用戶系統&8] &b請使用指令《 &f/2fa code <驗證碼>&b 》以驗證你的帳戶。' + already_enabled: '&8[&6用戶系統&8] &2嗯...這個帳戶已經啓用了兩步驗證功能,毋須再次啓用。' + enable_error_no_code: '&8[&6用戶系統&8] &c無效的登入金鑰 ! &f你可以使用指令《 /2fa add 》再次嘗試啓用此功能。' + enable_success: '&8[&6用戶系統&8] &2你已成功啓用兩步驗證功能 !' + enable_error_wrong_code: '&8[&6用戶系統&8] &c無效的兩步驗證碼 ! &f你可以使用指令《 /2fa add 》再次嘗試啓用此功能。' + not_enabled_error: '&8[&6用戶系統&8] &c你的帳戶尚未啓用兩步驗證功能 ! &f你可以使用指令《 /2fa add 》以啓用此功能。' + removed_success: '&8[&6用戶系統&8] &2你已成功關閉兩步驗證功能;&c為保障帳戶安全,請儘快於可行的情況下重新啟用本功能。' + invalid_code: '&8[&6用戶系統&8] &c無效的兩步驗證碼 !' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: "&8[&6用戶系統&8] &a基岩版自動登錄完成" + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&8[&6用戶系統&8] &a你在登錄時卡在了地獄門, 現已修正' + fix_underground: '&8[&6用戶系統&8] &a你被埋住了, 坐標已修正, 下次下線之前請小心!' + cannot_fix_underground: '&8[&6用戶系統&8] &a你被埋住了, 坐標無法修正, 只好送你去了最高點, 自求多福吧少年~' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&8[&6用戶系統&8] &a已修復幽靈玩家, 請重新進入' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_zhmc.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_zhmc.yml new file mode 100644 index 0000000000..a0613cb550 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_zhmc.yml @@ -0,0 +1,173 @@ +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&c遊戲內註冊已停用!' + name_taken: '&c您已經註冊此用戶名!' + register_request: '&3[請先注冊] 請按T , 然後輸入 "/register [你的密碼] [重覆確認你的密碼]" 來注冊。' + command_usage: '&c使用方法: 輸入"/register [你的密碼] [重覆確認你的密碼]"' + reg_only: '&4只有註冊用戶才能加入服務器! 請訪問https://example.com註冊!' + success: '&2已成功註冊!' + kicked_admin_registered: '管理員剛剛註冊了您; 請重新登錄。' + +# Password errors on registration +password: + match_error: '&密碼錯誤!' + name_in_password: '&c你不能使用你的用戶名作密碼,請 choose another one...' + unsafe_password: '&c所選的你的密碼並不安全的,請選擇另一個...' + forbidden_characters: '&4您的密碼含有非法字符。允許的字符:%valid_chars' + wrong_length: '&c你的密碼太短或太長!請嘗試另一個!' + pwned_password: '&c你使用的密碼並不安全。它已經被使用了 %pwned_count 次! 請使用一個更強大的密碼...' + +# Login +login: + command_usage: '&b使用方法: 輸入"/login [你的密碼]" 來登入' + wrong_password: '&c密碼錯誤!' + success: '&2你已成功登入!' + login_request: '&c [請先登入] 請按T , 然後輸入 "/login [你的密碼]" 。' + timeout_error: '&4超過登錄超時,您已從伺服器中踢出,請重試!' + +# Errors +error: + denied_command: '&c你必須得到權限來使用此指令!' + denied_chat: '&c你必須得到權限來使用聊天功能!' + unregistered_user: '&c此用戶尚未注冊!' + not_logged_in: '&c你尚未登入!' + no_permission: '&4您沒有執行此操作的權限!' + unexpected_error: '&4發生錯誤!請聯繫伺服器管理員!' + max_registration: '&c您已超過註冊的最大數量(%reg_count/%max_acc %reg_names)!' + logged_in: '&c您已經登錄!' + kick_for_vip: '&3一名VIP玩家在服務器已滿時已加入伺服器!' + kick_unresolved_hostname: '&c發生了一個錯誤: 無法解析玩家的主機名' + tempban_max_logins: '&c由於登錄失敗次數過多,您已被暫時禁止。' + +# AntiBot +antibot: + kick_antibot: '伺服器正在啟用AntiBot保護模式! 您必須等待幾分鐘才能加入服務器。' + auto_enabled: '&4[AntiBotService] 伺服器由於連接數量龐大而啟用AntiBot!' + auto_disabled: '&2[AntiBotService] AntiBot將在%m分鐘後禁用!' + +# Unregister +unregister: + success: '&c帳戶已刪除!' + command_usage: '&c使用方法: "/unregister <你的密碼>"' + +# Other messages +misc: + account_not_activated: '&c你的帳戶未激活,請確認電郵!' + not_activated: '&c賬戶未激活,請註冊激活後再次嘗試.' + password_changed: '&2密碼已更變!' + logout: '&2已成功註銷!' + reload: '&2伺服器已正確地被重新加載配置和數據庫!' + usage_change_password: '&c使用方法: "/changepassword [舊密碼] [新密碼]"' + accounts_owned_self: '您擁有 %count 個帳戶:' + accounts_owned_other: '玩家 %name 擁有 %count 個帳戶:' + +# Session messages +session: + valid_session: '&2由於會話重新連接而登錄.' + invalid_session: '&c您的IP已更改,並且您的會話數據已過期!' + +# Error messages when joining +on_join_validation: + same_ip_online: '一位同一IP的玩家已在遊戲中!' + same_nick_online: '&4伺服器上已經在使用相同的用戶名!' + name_length: '&4你的暱稱太短或太長!' + characters_in_name: '&4您的暱稱含有非法字符。允許的字符:%valid_chars' + kick_full_server: '&4服務器已滿,請稍後再試!' + country_banned: '&4您的國家/地區已被禁止使用此伺服器!' + not_owner_error: '您不是此帳戶的所有者。 請選擇其他名稱!' + invalid_name_case: '您應該使用用戶名 %valid 而不是 %invalid 來加入。' + quick_command: '&c您發送命令的速度太快了,請重新加入伺服器等待一會後再使用命令' + +# Email +email: + add_email_request: '&3請使用命令: /email add [你的電郵地址] [重覆確認你的電郵地址] 將您的電子郵件添加到您的帳戶"' + usage_email_add: '&c使用方法: "/email add [電郵地址] [confirmEmail]"' + usage_email_change: '&c使用方法: "/email change [舊電郵地址] [新電郵地址]"' + new_email_invalid: '&c新電子郵件地址無效,請重試!' + old_email_invalid: '&c舊電子郵件地址無效,請重試!' + invalid: '&c電子郵件地址無效,請重試!' + added: '&2電子郵件地址已成功添加到您的帳戶!' + add_not_allowed: '&c伺服器不允許添加電子郵箱' + request_confirmation: '&c請確認你的電郵地址!' + changed: '&2已正確地更改電子郵件地址!' + change_not_allowed: '&c伺服器不允許修改郵箱地址' + email_show: '&a該賬戶使用的電子郵箱為: &a%email' + no_email_for_account: '&c當前並沒有任何郵箱與該賬戶綁定' + already_used: '&4此電子郵件地址已被使用' + incomplete_settings: '缺少必要的配置來為發送電子郵件。請聯繫管理員。' + send_failure: '&c郵件已被作廢,請檢查您的郵箱是否正常工作.' + change_password_expired: '&c您不能使用此命令更改密碼' + email_cooldown_error: '&c您需要等待 %time 後才能再次請求發送' + +# Password recovery by email +recovery: + forgot_password_hint: '&3忘記密碼了嗎? 請使用命令: "/email recovery [你的電郵地址]"' + command_usage: '&c使用方法: "/email recovery [電郵地址]"' + email_sent: '&2帳戶恢復電子郵件已成功發送! 請檢查您的電子郵件收件箱!' + code: + code_sent: '已將重設密碼的恢復代碼發送到您的電子郵件。' + incorrect: '恢復代碼錯誤!使用指令: "/email recovery [電郵地址]" 生成新的一個恢復代碼。' + tries_exceeded: '&a您已經達到輸入驗證碼次數的最大允許次數.' + correct: '&a*** 驗證通過 ***' + change_password: '&c請使用 /email setpassword <新密碼> 立即設置新的密碼' + +# Captcha +captcha: + usage_captcha: '&3T要登錄您必須使用captcha驗證碼,請使用命令: "/captcha %captcha_code"' + wrong_captcha: '&c驗證碼錯誤!請按T在聊天中輸入 "/captcha %captcha_code"' + valid_captcha: '&2驗證碼正確!' + captcha_for_registration: '&7請輸入 /captcha %captcha_code 來驗證操作.' + register_captcha_valid: '&a驗證通過, 現在可以使用 /register 註冊啦!' + +# Verification code +verification: + code_required: '&a*** 已發送驗證郵件 ***' + command_usage: '&c使用方法:/verification <驗證碼>' + incorrect_code: '&c錯誤的驗證碼.' + success: '&a*** 驗證通過 ***' + already_verified: '&a您已經通過驗證' + code_expired: '&c驗證碼已失效' + email_needed: '&c郵箱未綁定' + +# Time units +time: + second: '秒' + seconds: '秒' + minute: '分' + minutes: '分' + hour: '時' + hours: '時' + day: '天' + days: '天' + +# Two-factor authentication +two_factor: + code_created: '&2您的密碼是 %code。您可以從這裡掃描 %url' + confirmation_required: '&7請輸入“/totp confirm <驗證碼>”來確認啟動雙重驗證' + code_required: '&c請輸入“/totp code <驗證碼>”來提交驗證碼' + already_enabled: '&a雙重驗證已啟用' + enable_error_no_code: '&c驗證碼丟失' + enable_success: '&a已成功啟用雙重驗證' + enable_error_wrong_code: '&c驗證碼錯誤或者已經過期,請重新執行“/totp add”' + not_enabled_error: '&c雙重驗證未在您的賬號上啟用,請使用“/totp add”來啟用' + removed_success: '&c雙重驗證已從您的賬號上禁用' + invalid_code: '&c無效的驗證碼' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: "&a基岩版自動登錄完成" + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&a你在登錄時卡在了地獄門, 現已修正' + fix_underground: '&a你被埋住了, 坐標已修正, 下次下線之前請小心!' + cannot_fix_underground: '&a你被埋住了, 坐標無法修正, 只好送你去了最高點, 自求多福吧少年~' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&a已修復幽靈玩家, 請重新進入' diff --git a/plugin/platform-bukkit/src/main/resources/messages/messages_zhtw.yml b/plugin/platform-bukkit/src/main/resources/messages/messages_zhtw.yml new file mode 100644 index 0000000000..a1eb1e0798 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/messages/messages_zhtw.yml @@ -0,0 +1,175 @@ +# Translators: MineWolf50, lifehome, haer0248 # +# -------------------------------------------- # +# List of global tags: +# %nl% - Goes to new line. +# %username% - Replaces the username of the player receiving the message. +# %displayname% - Replaces the nickname (and colors) of the player receiving the message. + +# Registration +registration: + disabled: '&b【AuthMe】&6已關閉註冊功能。' + name_taken: '&b【AuthMe】&6這個帳號已經被註冊過了!' + register_request: '&b【AuthMe】&6請使用 "&c/register <密碼> <確認密碼>" 來註冊。' + command_usage: '&b【AuthMe】&6用法: &c"/register <密碼> <確認密碼>"' + reg_only: '&b【AuthMe】&6請到下列網站:「 https://example.tw 」進行註冊。' + success: '&b【AuthMe】&6您已成功註冊!' + kicked_admin_registered: '&b【AuthMe】&6管理員已協助您註冊,請重新登入。' + +# Password errors on registration +password: + match_error: '&b【AuthMe】&6兩次輸入的密碼不一致!' + name_in_password: '&b【AuthMe】&6您不可以用您的 ID (遊戲名稱) 來當作密碼!' + unsafe_password: '&b【AuthMe】&6您不可以使用這個不安全的密碼!' + forbidden_characters: '&b【AuthMe】&c密碼包含非法字符,可使用:%valid_chars' + wrong_length: '&b【AuthMe】&6您的密碼 超過最大字數 / 小於最小字數' + pwned_password: '&b【AuthMe】&c你使用的密碼並不安全。它已經被使用了 %pwned_count 次! 請使用一個更強大的密碼...' + +# Login +login: + command_usage: '&b【AuthMe】&6用法: &c"/login <密碼>"' + wrong_password: '&b【AuthMe】&6密碼錯誤!' + success: '&b【AuthMe】&6密碼正確,您已成功登入!' + login_request: '&b【AuthMe】&6請使用 &c"/login <密碼>" &6來登入。' + timeout_error: '&b【AuthMe】&6超過登入時間,請稍後再試一次。' + +# Errors +error: + denied_command: '&b【AuthMe】&c使用指令之前必須通過驗證!' + denied_chat: '&b【AuthMe】&c說話之前必須通過驗證!' + unregistered_user: '&b【AuthMe】&6這個帳號還沒有註冊過。' + not_logged_in: '&b【AuthMe】&6您還沒有登入!' + no_permission: '&b【AuthMe】&6您沒有使用該指令的權限。' + unexpected_error: '&b【AuthMe】&6發生錯誤,請聯繫管理員' + max_registration: '&b【AuthMe】&6您的 IP 位置所註冊的帳號數量已經達到最大限制。' + logged_in: '&b【AuthMe】&6您已經登入了!' + kick_for_vip: '&b【AuthMe】&6您已經被請出。&c原因:有 VIP 玩家登入伺服器' + kick_unresolved_hostname: '&b【AuthMe】&6無法解析玩家主機名稱。' + tempban_max_logins: '&b【AuthMe】&c您已被暫時封鎖IP位置,因為您登入失敗太多次。' + +# AntiBot +antibot: + kick_antibot: '&b【AuthMe】&cAntiBotMod 正在啟用中,請稍後再嘗試登入吧!' + auto_enabled: '&b【AuthMe】&6AntiBotMod 已自動啟用!' + auto_disabled: '&b【AuthMe】&6AntiBotMod 將於 &c%m &6分鐘後自動關閉' + +# Unregister +unregister: + success: '&b【AuthMe】&6您已經成功註銷。' + command_usage: '&b【AuthMe】&6用法:&c"/unregister <密碼>"' + +# Other messages +misc: + account_not_activated: '&b【AuthMe】&6您的帳號還沒有經過驗證!檢查看看您的電子郵件 (Email) 吧!' + not_activated: '&b【AuthMe】&c賬戶未激活,請註冊激活後再次嘗試.' + password_changed: '&b【AuthMe】&6密碼變更成功!' + logout: '&b【AuthMe】&6您已成功登出。' + reload: '&b【AuthMe】&6已重新讀取設定檔及資料庫。' + usage_change_password: '&b【AuthMe】&6用法:&c"/changepassword <舊密碼> <新密碼>"' + accounts_owned_self: '&b【AuthMe】&6您擁有 %count 個帳號:' + accounts_owned_other: '&b【AuthMe】&6玩家 %name 擁有 %count 個帳號:' + +# Session messages +session: + valid_session: '&b【AuthMe】&6您已經成功登入!' + invalid_session: '&b【AuthMe】&6Session驗證不相符!' + +# Error messages when joining +on_join_validation: + same_ip_online: '&b【AuthMe】&6相同IP玩家在線上!' + same_nick_online: '&b【AuthMe】&6有同樣帳號的玩家在線上!' + name_length: '&b【AuthMe】&6您的暱稱 太長 / 太短 了!' + characters_in_name: '&b【AuthMe】&6暱稱裡能使用的字符為: %valid_chars' + kick_full_server: '&b【AuthMe】&6伺服器已經滿了,請等等再試一次。' + country_banned: '&b【AuthMe】&6您所在的地區無法進入此伺服器。' + not_owner_error: '&b【AuthMe】&4警告!&c您並不是此帳戶持有人,請立即登出。' + invalid_name_case: '&b【AuthMe】&4警告!&c您應該使用「%valid」而並非「%invalid」登入遊戲。' + quick_command: '&b【AuthMe】&4指令使用過快,請加入伺服器後稍等一下再使用指令。' + +# Email +email: + add_email_request: '&b【AuthMe】&6請使用 &c"/email add <電子郵件> <再次輸入電子郵件>" &6來新增電子郵件' + usage_email_add: '&b【AuthMe】&6用法: &c"/email add <電子郵件> <再次輸入電子郵件>"' + usage_email_change: '&b【AuthMe】&6用法: &c"/email change <舊的電子郵件> <新的電子郵件>"' + new_email_invalid: '&b【AuthMe】&6新的電子郵件無效!' + old_email_invalid: '&b【AuthMe】&6舊的電子郵件無效!' + invalid: '&b【AuthMe】&6無效的電子郵件!' + added: '&b【AuthMe】&6已新增電子郵件!' + add_not_allowed: '&b【AuthMe】&c不允許新增電子郵件' + request_confirmation: '&b【AuthMe】&6請驗證您的電子郵件!' + changed: '&b【AuthMe】&6電子郵件已變更!' + change_not_allowed: '&b【AuthMe】&c不允許變更電子郵件' + email_show: '&b【AuthMe】&2目前的電子郵件:&f%email' + no_email_for_account: '&b【AuthMe】&2您目前沒有設定電子郵件。' + already_used: '&b【AuthMe】&4這個電子郵件已被使用。' + incomplete_settings: '&b【AuthMe】&4因為電子郵件設定不完整導致無法傳送,請聯絡管理員。' + send_failure: '&b【AuthMe】&4無法傳送電子郵件,請聯絡管理員。' + change_password_expired: '&b【AuthMe】&6您現在不能使用這個指令變更密碼了。' + email_cooldown_error: '&b【AuthMe】&c電子郵件已經寄出了,您只能在 %time 後才能傳送。' + +# Password recovery by email +recovery: + forgot_password_hint: '&b【AuthMe】&6忘記密碼了嗎?使用 &c"/email recovery <電子郵件>"' + command_usage: '&b【AuthMe】&6用法: &c"/email recovery <電子郵件>"' + email_sent: '&b【AuthMe】&6已經送出重設密碼要求至您的電子郵件,請查收。' + code: + code_sent: '&b【AuthMe】&6忘記密碼的恢復密碼電子郵件已傳送至您的信箱中。' + incorrect: '&b【AuthMe】&6恢復密碼錯誤!您剩餘 %count 次嘗試機會。' + tries_exceeded: '&b【AuthMe】&6恢復密碼過多次數錯誤。使用 "/email recovery [電子郵件]" 取得新的恢復密碼。' + correct: '&b【AuthMe】&6恢復密碼正確!' + change_password: '&b【AuthMe】&6請使用 "/email setpassword <新密碼>" 變更您的密碼。' + +# Captcha +captcha: + usage_captcha: '&b【AuthMe】&6請用 &c"/captcha %captcha_code" &6來輸入您的驗證碼。' + wrong_captcha: '&b【AuthMe】&6錯誤的驗證碼,請使用 "/captcha %captcha_code" 再試一次。' + valid_captcha: '&b【AuthMe】&6驗證碼無效。' + captcha_for_registration: '&b【AuthMe】&6註冊前必須先提供驗證碼,使用 /captcha %captcha_code 來驗證。' + register_captcha_valid: '&b【AuthMe】&2驗證已通過,現在可以使用 /register 來進行註冊了。' + +# Verification code +verification: + code_required: '&b【AuthMe】&3敏感指令,需要電子郵件驗證後才能執行,請檢查電子郵件。' + command_usage: '&b【AuthMe】&c用法:/verification <驗證碼>' + incorrect_code: '&b【AuthMe】&c驗證碼錯誤,請在聊天室使用 "/verification <驗證碼>" 電子郵件收到的驗證碼' + success: '&b【AuthMe】&2身分已驗證,您現在可以使用所有指令!' + already_verified: '&b【AuthMe】&2您已經可以使用所有指令!' + code_expired: '&b【AuthMe】&3驗證碼已過期,請使用其他敏感指令來取得新的驗證碼!' + email_needed: '&b【AuthMe】&3若需要身分驗證,請先新增電子郵件!' + +# Time units +time: + second: '秒' + seconds: '秒' + minute: '分' + minutes: '分' + hour: '時' + hours: '時' + day: '天' + days: '天' + +# Two-factor authentication +two_factor: + code_created: '&b【AuthMe】&b您的登入金鑰為&9「%c%code&9」&b,掃描連結為:&c %url' + confirmation_required: '&b【AuthMe】&6請使用 /2fa confirm <驗證碼> 來確認雙重驗證。' + code_required: '&b【AuthMe】&c請使用 /2fa code <驗證碼> 來完成驗證。' + already_enabled: '&b【AuthMe】&c雙重驗證已經開啟。' + enable_error_no_code: '&b【AuthMe】&6雙重驗證代碼不存在或失效,使用 /2fa add 來新增。' + enable_success: '&b【AuthMe】&6雙重驗證已開啟!' + enable_error_wrong_code: '&b【AuthMe】&6雙重驗證代碼錯誤或失效,使用 /2fa add 來新增。' + not_enabled_error: '&b【AuthMe】&6雙重驗證尚未開啟,使用 /2fa add 來開啟。' + removed_success: '&b【AuthMe】&6雙重驗證已成功移除!' + invalid_code: '&b【AuthMe】&c驗證碼錯誤。' + +# 3rd party features: Bedrock Auto Login +bedrock_auto_login: + success: "&b【AuthMe】&a基岩版自動登錄完成" + +# 3rd party features: Login Location Fix +login_location_fix: + fix_portal: '&b【AuthMe】&a你在登錄時卡在了地獄門, 現已修正' + fix_underground: '&b【AuthMe】&a你被埋住了, 坐標已修正, 下次下線之前請小心!' + cannot_fix_underground: '&b【AuthMe】&a你被埋住了, 坐標無法修正, 只好送你去了最高點, 自求多福吧少年~' + +# 3rd party features: Double Login Fix +double_login_fix: + fix_message: '&b【AuthMe】&a已修復幽靈玩家, 請重新進入' diff --git a/plugin/platform-bukkit/src/main/resources/new_email.html b/plugin/platform-bukkit/src/main/resources/new_email.html new file mode 100644 index 0000000000..74a1a087be --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/new_email.html @@ -0,0 +1,127 @@ +
+ +
+ + + + + + +
+ + + + + + + + + + + + +
+

账户激活邮件

+
+ + + + + + +
+

Minecraft ·

+
+ + + + + + + + + + + + + + + + + + +
+ 您的账户初始密码为 +
+
+
已将地址()进行记录. +
+
请妥善保存,在新地址上进行登录时,需提供该密码. +
若非必要,请勿更换密码,否则将对您的账户安全构成威胁. +
账户所绑定的邮箱地址已被永久存储,需要更换请联系管理员. +
+
更换密码: /changepassword [新密码] +
+
+
账户将在激活后生效 +
欢迎您的加入~! +
+ +
+
+
+
+ + + + + + +
+

© 2024 HomoCraft. All rights reserved.

+ wdsj.in +
+
+
+
+
diff --git a/plugin/platform-bukkit/src/main/resources/otheraccounts.yml b/plugin/platform-bukkit/src/main/resources/otheraccounts.yml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/plugin/platform-bukkit/src/main/resources/players.yml b/plugin/platform-bukkit/src/main/resources/players.yml new file mode 100644 index 0000000000..cf746f52db --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/players.yml @@ -0,0 +1 @@ +players: [] \ No newline at end of file diff --git a/plugin/platform-bukkit/src/main/resources/plugin.yml b/plugin/platform-bukkit/src/main/resources/plugin.yml new file mode 100644 index 0000000000..6414af78ec --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/plugin.yml @@ -0,0 +1,316 @@ +name: AuthMe +authors: [sgdc3, games647, Hex3l, krusic22, DGun Otto] +website: https://github.com/HaHaWTH/AuthMeReReloaded/ +description: A fork of AuthMeReloaded that contains bug fixes +main: fr.xephi.authme.AuthMe +folia-supported: true +version: 5.6.0-FORK-b50 +api-version: 1.13 +softdepend: + - Vault + - LuckPerms + - PermissionsEx + - bPermissions + - zPermissions + - Multiverse-Core + - Essentials + - EssentialsSpawn + - ProtocolLib + - floodgate +commands: + authme: + description: AuthMe op commands + usage: /authme register|unregister|forcelogin|password|lastlogin|accounts|email|setemail|getip|totp|disabletotp|spawn|setspawn|firstspawn|setfirstspawn|purge|purgeplayer|backup|resetpos|purgebannedplayers|switchantibot|reload|version|converter|messages|recent|debug + email: + description: Add email or recover password + usage: /email show|add|change|recover|code|setpassword + login: + description: Login command + usage: /login + aliases: + - l + logout: + description: Logout command + usage: /logout + register: + description: Register an account + usage: /register [password] [verifyPassword] + aliases: + - reg + unregister: + description: Unregister an account + usage: /unregister + aliases: + - unreg + changepassword: + description: Change password of an account + usage: /changepassword + aliases: + - changepass + - cp + totp: + description: TOTP commands + usage: /totp code|add|confirm|remove + aliases: + - 2fa + captcha: + description: Captcha command + usage: /captcha + verification: + description: Verification command + usage: /verification +permissions: + authme.admin.*: + description: Gives access to all admin commands + children: + authme.admin.accounts: true + authme.admin.antibotmessages: true + authme.admin.backup: true + authme.admin.changemail: true + authme.admin.changepassword: true + authme.admin.converter: true + authme.admin.firstspawn: true + authme.admin.forcelogin: true + authme.admin.getemail: true + authme.admin.getip: true + authme.admin.lastlogin: true + authme.admin.purge: true + authme.admin.purgebannedplayers: true + authme.admin.purgelastpos: true + authme.admin.purgeplayer: true + authme.admin.register: true + authme.admin.reload: true + authme.admin.seeotheraccounts: true + authme.admin.seerecent: true + authme.admin.setfirstspawn: true + authme.admin.setspawn: true + authme.admin.spawn: true + authme.admin.switchantibot: true + authme.admin.totpdisable: true + authme.admin.totpviewstatus: true + authme.admin.unregister: true + authme.admin.updatemessages: true + authme.admin.accounts: + description: Administrator command to see all accounts associated with a user. + default: op + authme.admin.antibotmessages: + description: Permission to see Antibot messages. + default: op + authme.admin.backup: + description: Allows to use the backup command. + default: op + authme.admin.changemail: + description: Administrator command to set or change the email address of a user. + default: op + authme.admin.changepassword: + description: Administrator command to change the password of a user. + default: op + authme.admin.converter: + description: Administrator command to convert old or other data to AuthMe data. + default: op + authme.admin.firstspawn: + description: Administrator command to teleport to the first AuthMe spawn. + default: op + authme.admin.forcelogin: + description: Administrator command to force-login an existing user. + default: op + authme.admin.getemail: + description: Administrator command to get the email address of a user, if set. + default: op + authme.admin.getip: + description: Administrator command to get the last known IP of a user. + default: op + authme.admin.lastlogin: + description: Administrator command to see the last login date and time of a user. + default: op + authme.admin.purge: + description: Administrator command to purge old user data. + default: op + authme.admin.purgebannedplayers: + description: Administrator command to purge all data associated with banned players. + default: op + authme.admin.purgelastpos: + description: Administrator command to purge the last position of a user. + default: op + authme.admin.purgeplayer: + description: Administrator command to purge a given player. + default: op + authme.admin.register: + description: Administrator command to register a new user. + default: op + authme.admin.reload: + description: Administrator command to reload the plugin configuration. + default: op + authme.admin.seeotheraccounts: + description: Permission to see the other accounts of the players that log in. + default: op + authme.admin.seerecent: + description: Administrator command to see the last recently logged in players. + default: op + authme.admin.setfirstspawn: + description: Administrator command to set the first AuthMe spawn. + default: op + authme.admin.setspawn: + description: Administrator command to set the AuthMe spawn. + default: op + authme.admin.spawn: + description: Administrator command to teleport to the AuthMe spawn. + default: op + authme.admin.switchantibot: + description: Administrator command to toggle the AntiBot protection status. + default: op + authme.admin.totpdisable: + description: Administrator command to disable the two-factor auth of a user. + default: op + authme.admin.totpviewstatus: + description: Administrator command to see whether a player has enabled two-factor + authentication. + default: op + authme.admin.unregister: + description: Administrator command to unregister an existing user. + default: op + authme.admin.updatemessages: + description: Permission to use the update messages command. + default: op + authme.allowchatbeforelogin: + description: Permission to send chat messages before being logged in. + default: false + authme.allowmultipleaccounts: + description: Permission to be able to register multiple accounts. + default: op + authme.bypassbungeesend: + description: Permission node to bypass BungeeCord server teleportation. + default: false + authme.bypassantibot: + description: Permission node to bypass AntiBot protection. + default: op + authme.bypasscountrycheck: + description: Permission to bypass the GeoIp country code check. + default: false + authme.bypassforcesurvival: + description: Permission for users to bypass force-survival mode. + default: op + authme.bypasspurge: + description: Permission to bypass the purging process. + default: false + authme.debug: + description: Gives access to /authme debug and all its sections + children: + authme.debug.command: true + authme.debug.country: true + authme.debug.db: true + authme.debug.group: true + authme.debug.limbo: true + authme.debug.mail: true + authme.debug.mysqldef: true + authme.debug.perm: true + authme.debug.spawn: true + authme.debug.stats: true + authme.debug.valid: true + authme.debug.command: + description: General permission to use the /authme debug command. + default: op + authme.debug.country: + description: Permission to use the country lookup section. + default: op + authme.debug.db: + description: Permission to view data from the database. + default: op + authme.debug.group: + description: Permission to view permission groups. + default: op + authme.debug.limbo: + description: Permission to use the limbo data viewer. + default: op + authme.debug.mail: + description: Permission to use the test email sender. + default: op + authme.debug.mysqldef: + description: Permission to change nullable status of MySQL columns. + default: op + authme.debug.perm: + description: Permission to use the permission checker. + default: op + authme.debug.spawn: + description: Permission to view spawn information. + default: op + authme.debug.stats: + description: Permission to use the stats section. + default: op + authme.debug.valid: + description: Permission to use sample validation. + default: op + authme.player.*: + description: Gives access to all player commands + children: + authme.player.canbeforced: true + authme.player.captcha: true + authme.player.changepassword: true + authme.player.email.add: true + authme.player.email.recover: true + authme.player.email.see: true + authme.player.login: true + authme.player.logout: true + authme.player.protection.quickcommandsprotection: true + authme.player.register: true + authme.player.security.verificationcode: true + authme.player.totpadd: true + authme.player.totpremove: true + authme.player.canbeforced: + description: Permission for users a login can be forced to. + default: true + authme.player.captcha: + description: Command permission to use captcha. + default: true + authme.player.changepassword: + description: Command permission to change the password. + default: true + authme.player.email: + description: Gives access to all email commands + children: + authme.player.email.add: true + authme.player.email.recover: true + authme.player.email.see: true + authme.player.email.add: + description: Command permission to add an email address. + default: true + authme.player.email.change: + description: Command permission to change the email address. + default: op + authme.player.email.recover: + description: Command permission to recover an account using its email address. + default: true + authme.player.email.see: + description: Command permission to see the own email address. + default: true + authme.player.login: + description: Command permission to login. + default: true + authme.player.logout: + description: Command permission to logout. + default: true + authme.player.protection.quickcommandsprotection: + description: Permission that enables on join quick commands checks for the player. + default: true + authme.player.register: + description: Command permission to register. + default: true + authme.player.security.verificationcode: + description: Permission to use the email verification codes feature. + default: true + authme.player.seeownaccounts: + description: Permission to use to see own other accounts. + default: true + authme.player.totpadd: + description: Permission to enable two-factor authentication. + default: true + authme.player.totpremove: + description: Permission to disable two-factor authentication. + default: true + authme.player.unregister: + description: Command permission to unregister. + default: op + authme.vip: + description: When the server is full and someone with this permission joins the + server, someone will be kicked. + default: false diff --git a/plugin/platform-bukkit/src/main/resources/recovery_code_email.html b/plugin/platform-bukkit/src/main/resources/recovery_code_email.html new file mode 100644 index 0000000000..c41c00c9bb --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/recovery_code_email.html @@ -0,0 +1,120 @@ +
+ +
+ + + + + + +
+ + + + + + + + + + + + +
+

代码验证邮件

+
+ + + + + + +
+

Minecraft ·

+
+ + + + + + + + + + + + + + + + + + +
+ 您正在申请的验证码为 +
+
+
使用指令: /email code 来完成验证过程. +
+
+
验证码将在小时后失效 +
+ +
+
+
+
+ + + + + + +
+

© 2024 HomoCraft. All rights reserved.

+ wdsj.in +
+
+
+
+
diff --git a/plugin/platform-bukkit/src/main/resources/shutdown.html b/plugin/platform-bukkit/src/main/resources/shutdown.html new file mode 100644 index 0000000000..2819ebfc07 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/shutdown.html @@ -0,0 +1,118 @@ +
+ +
+ + + + + + +
+ + + + + + + + + + + + +
+

服务器关闭通知

+
+ + + + + + +
+

Minecraft ·

+
+ + + + + + + + + + + + + + + +
+
紧急通知
+
服务器当前已被关闭 +
+
请及时检查服务器运行状态. +
+
+
+
IrisCraft Team +
+ +
+
+
+
+ + + + + + +
+

© 2024 HomoCraft. All rights reserved.

+ wdsj.in +
+
+
+
+
diff --git a/plugin/platform-bukkit/src/main/resources/spawn.yml b/plugin/platform-bukkit/src/main/resources/spawn.yml new file mode 100644 index 0000000000..5191803c0a --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/spawn.yml @@ -0,0 +1,14 @@ +spawn: + world: '' + x: '' + y: '' + z: '' + yaw: '' + pitch: '' +firstspawn: + world: '' + x: '' + y: '' + z: '' + yaw: '' + pitch: '' \ No newline at end of file diff --git a/plugin/platform-bukkit/src/main/resources/verification_code_email.html b/plugin/platform-bukkit/src/main/resources/verification_code_email.html new file mode 100644 index 0000000000..0e8d1ddd86 --- /dev/null +++ b/plugin/platform-bukkit/src/main/resources/verification_code_email.html @@ -0,0 +1,120 @@ +
+ +
+ + + + + + +
+ + + + + + + + + + + + +
+

代码验证邮件

+
+ + + + + + +
+

Minecraft ·

+
+ + + + + + + + + + + + + + + + + + +
+ 您正在申请的验证码为 +
+
+
使用指令: /verification 来完成验证过程. +
+
+
验证码将在30分钟后失效 +
+ +
+
+
+
+ + + + + + +
+

© 2024 HomoCraft. All rights reserved.

+ wdsj.in +
+
+
+
+
diff --git a/project/build.gradle.kts b/project/build.gradle.kts index 2a6624a73a..95b02754ac 100644 --- a/project/build.gradle.kts +++ b/project/build.gradle.kts @@ -1,8 +1,4 @@ - -description = "Fork of the first authentication plugin for the Bukkit API!" - repositories { - mavenCentral() } dependencies { diff --git a/project/module-configuration/build.gradle.kts b/project/module-configuration/build.gradle.kts new file mode 100644 index 0000000000..368454ff37 --- /dev/null +++ b/project/module-configuration/build.gradle.kts @@ -0,0 +1,22 @@ +/* + 代码来自 Taboolib:module-configuration + 链接 https://github.com/TabooLib/taboolib/blob/master/module/module-configuration + */ + +dependencies { + compileOnly(project(":project:module-util")) + implementation("org.yaml:snakeyaml:2.2") + implementation("com.electronwill.night-config:core:3.6.7") + implementation("com.electronwill.night-config:yaml:3.6.7") { + exclude("org.yaml", "snakeyaml") + } +} + +tasks { + shadowJar { + // NightConfig + relocate("com.electronwill.nightconfig", "com.electronwill.nightconfig_3_6_7") + // Snakeyaml + relocate("org.yaml.snakeyaml", "org.yaml.snakeyaml_2_2") + } +} \ No newline at end of file diff --git a/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/Comments.kt b/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/Comments.kt new file mode 100644 index 0000000000..35056c19b6 --- /dev/null +++ b/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/Comments.kt @@ -0,0 +1,12 @@ +package fr.xephi.authme.configruation + +/** + * Comments + * + * @author Taboolib + * @since 2024/7/10 20:04 + */ + +class Commented(val value: Any?, val comment: String) + +class CommentedList(val value: Any?, val comment: List) \ No newline at end of file diff --git a/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/ConfigFile.kt b/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/ConfigFile.kt new file mode 100644 index 0000000000..4073539352 --- /dev/null +++ b/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/ConfigFile.kt @@ -0,0 +1,103 @@ +package fr.xephi.authme.configruation + +/** + * ConfigFile + * + * @author Taboolib + * @since 2024/7/10 19:57 + */ +import com.electronwill.nightconfig.core.Config +import com.electronwill.nightconfig.core.file.FileNotFoundAction +import com.electronwill.nightconfig.core.io.ConfigParser +import com.electronwill.nightconfig.core.io.ParsingMode +import java.io.File +import java.io.InputStream +import java.io.Reader +import java.text.SimpleDateFormat + +open class ConfigFile(root: Config) : ConfigSection(root), Configuration { + + override var file: File? = null + + private val reloadCallback = ArrayList() + + override fun onReload(runnable: Runnable) { + reloadCallback.add(runnable) + } + + override fun saveToString(): String { + return toString() + } + + override fun saveToFile(file: File?) { + (file ?: this.file)?.writeText(saveToString()) ?: error("File not specified") + } + + override fun loadFromFile(file: File) { + this.file = file + try { + clear() + parser().parse(file, root, ParsingMode.REPLACE, FileNotFoundAction.THROW_ERROR) + } catch (ex: Exception) { + if (file.extension != "bak") { + file.copyTo( + File( + file.parent, + file.name + "_" + SimpleDateFormat("yyyyMMddHHmmss").format(System.currentTimeMillis()) + ".bak" + ) + ) + } + println("[warning] File: $file") + throw ex + } + reloadCallback.forEach { it.run() } + } + + override fun loadFromString(contents: String) { + try { + clear() + parser().parse(contents, root, ParsingMode.REPLACE) + } catch (t: Exception) { + println("[warning] Source: \n$contents") + throw t + } + reloadCallback.forEach { it.run() } + } + + override fun loadFromReader(reader: Reader) { + clear() + parser().parse(reader, root, ParsingMode.REPLACE) + reloadCallback.forEach { it.run() } + } + + override fun loadFromInputStream(inputStream: InputStream) { + clear() + parser().parse(inputStream, root, ParsingMode.REPLACE) + reloadCallback.forEach { it.run() } + } + + override fun reload() { + loadFromFile(file ?: return) + } + + override fun changeType(type: Type) { + val format = type.newFormat() + fun process(value: Any) { + when (value) { + is Map<*, *> -> value.forEach { process(it.value ?: return@forEach) } + is List<*> -> value.forEach { process(it ?: return@forEach) } + is Config -> { + val field = value::class.java.getField("configFormat") + field.isAccessible = true + field.set(value, format) + value.valueMap().forEach { process(it.value ?: return) } + } + } + } + process(root) + } + + private fun parser(): ConfigParser { + return root.configFormat().createParser() + } +} \ No newline at end of file diff --git a/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/ConfigSection.kt b/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/ConfigSection.kt new file mode 100644 index 0000000000..c84a63daa5 --- /dev/null +++ b/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/ConfigSection.kt @@ -0,0 +1,332 @@ +package fr.xephi.authme.configruation + +import com.electronwill.nightconfig.core.CommentedConfig +import com.electronwill.nightconfig.core.Config +import com.electronwill.nightconfig.core.EnumGetMethod +import org.tabooproject.reflex.Reflex.Companion.setProperty +import taboolib.common.util.decodeUnicode +import taboolib.common5.Coerce +import taboolib.library.configuration.ConfigurationSection +import taboolib.module.configuration.util.Commented +import taboolib.module.configuration.util.CommentedList + +/** + * ConfigSection + * + * @author Taboolib + * @since 2024/7/10 19:33 + */ +open class ConfigSection(var root: Config, override val name: String = "", override val parent: ConfigurationSection? = null) : ConfigurationSection { + + private val configType = Type.getType(root.configFormat()) + + override val primitiveConfig: Any + get() = root + + override val type: Type + get() = configType + + override fun getKeys(deep: Boolean): Set { + val keys = LinkedHashSet() + fun process(map: Map, parent: String = "") { + map.forEach { (k, v) -> + if (v is Config) { + if (deep) { + process(v.valueMap(), "$parent$k.") + } else { + keys += "$parent$k" + } + } else { + keys += "$parent$k" + } + } + } + process(root.valueMap()) + return keys + } + + override fun contains(path: String): Boolean { + return root.contains(path) + } + + override fun get(path: String): Any? { + return get(path, null) + } + + override fun get(path: String, def: Any?): Any? { + // 不知道为什么大家都喜欢用 getConfigurationSection("") + // 感觉都是一个师傅教的 + if (path.isEmpty()) { + return this + } + var name = path + var parent: ConfigurationSection? = null + if (path.contains('.')) { + name = path.substringAfterLast('.') + parent = getConfigurationSection(path.substringBeforeLast('.').substringAfterLast('.')) + } + return when (val value = root.getOrElse(path, def)) { + is Config -> ConfigSection(value, name, parent) + // 理论是无法获取到 Map 类型 + // 因为在 set 方法中 Map 会被转换为 Config 类型 + is Map<*, *> -> { + val subConfig = root.createSubConfig() + subConfig.setProperty("map", value) + ConfigSection(subConfig, name, parent) + } + else -> unwrap(value) + } + } + + override fun set(path: String, value: Any?) { + when { + value == null -> root.remove(path) + value is List<*> -> root.set(path, unwrap(value, this)) + value is Collection<*> && value !is List<*> -> set(path, value.toList()) + value is ConfigurationSection -> set(path, value.getConfig()) + value is Map<*, *> -> set(path, value.toConfig(this)) + value is Commented -> { + set(path, value.value) + setComment(path, value.comment) + } + value is CommentedList -> { + set(path, value.value) + setComments(path, value.comment) + } + else -> root.set(path, value) + } + } + + override fun getString(path: String): String? { + val value = get(path) ?: return null + return if (value is List<*>) value.joinToString("\n") else value.toString() + } + + override fun getString(path: String, def: String?): String? { + return getString(path) ?: def + } + + override fun isString(path: String): Boolean { + return get(path) is String + } + + override fun getInt(path: String): Int { + return Coerce.toInteger(get(path)) + } + + override fun getInt(path: String, def: Int): Int { + return Coerce.toInteger(get(path) ?: def) + } + + override fun isInt(path: String): Boolean { + val value = get(path) + return value is Long || value is Int + } + + override fun getBoolean(path: String): Boolean { + return Coerce.toBoolean(get(path)) + } + + override fun getBoolean(path: String, def: Boolean): Boolean { + return Coerce.toBoolean(get(path) ?: def) + } + + override fun isBoolean(path: String): Boolean { + return get(path) is Double + } + + override fun getDouble(path: String): Double { + return Coerce.toDouble(get(path)) + } + + override fun getDouble(path: String, def: Double): Double { + return Coerce.toDouble(get(path) ?: def) + } + + override fun isDouble(path: String): Boolean { + return get(path) is Double + } + + override fun getLong(path: String): Long { + return Coerce.toLong(get(path)) + } + + override fun getLong(path: String, def: Long): Long { + return Coerce.toLong(get(path) ?: def) + } + + override fun isLong(path: String): Boolean { + return get(path) is Long + } + + override fun getList(path: String): List<*>? { + return (get(path) as? List<*>)?.map { unwrap(it) }?.toList() + } + + override fun getList(path: String, def: List<*>?): List<*>? { + return get(path) as? List<*> ?: def + } + + override fun isList(path: String): Boolean { + return get(path) is List<*> + } + + override fun getStringList(path: String): List { + return getList(path)?.map { it.toString() }?.toList() ?: ArrayList() + } + + override fun getIntegerList(path: String): List { + return getList(path)?.map { Coerce.toInteger(it) }?.toList() ?: ArrayList() + } + + override fun getBooleanList(path: String): List { + return getList(path)?.map { Coerce.toBoolean(it) }?.toList() ?: ArrayList() + } + + override fun getDoubleList(path: String): List { + return getList(path)?.map { Coerce.toDouble(it) }?.toList() ?: ArrayList() + } + + override fun getFloatList(path: String): List { + return getList(path)?.map { Coerce.toFloat(it) }?.toList() ?: ArrayList() + } + + override fun getLongList(path: String): List { + return getList(path)?.map { Coerce.toLong(it) }?.toList() ?: ArrayList() + } + + override fun getByteList(path: String): List { + return getList(path)?.map { Coerce.toByte(it) }?.toList() ?: ArrayList() + } + + override fun getCharacterList(path: String): List { + return getList(path)?.map { Coerce.toChar(it) }?.toList() ?: ArrayList() + } + + override fun getShortList(path: String): List { + return getList(path)?.map { Coerce.toShort(it) }?.toList() ?: ArrayList() + } + + override fun getMapList(path: String): List> { + return getList(path)?.filterIsInstance>()?.toList() ?: ArrayList() + } + + override fun getConfigurationSection(path: String): ConfigurationSection? { + return get(path) as? ConfigurationSection + } + + override fun isConfigurationSection(path: String): Boolean { + return get(path) is ConfigurationSection + } + + override fun > getEnum(path: String, type: Class): T? { + return root.getEnum(path, type) + } + + override fun > getEnumList(path: String, type: Class): List { + return getStringList(path).mapNotNull { EnumGetMethod.NAME_IGNORECASE.get(it, type) } + } + + override fun createSection(path: String): ConfigurationSection { + val subConfig = root.createSubConfig() + set(path, subConfig) + var name = path + var parent: ConfigurationSection? = null + if (path.contains('.')) { + name = path.substringAfterLast('.') + parent = getConfigurationSection(path.substringBeforeLast('.').substringAfterLast('.')) + } + return ConfigSection(subConfig, name, parent) + } + + override fun toMap(): Map { + fun process(map: Map): Map { + val newMap = LinkedHashMap() + map.forEach { (k, v) -> newMap[k] = unwrap(v) } + return newMap + } + return process(root.valueMap()) + } + + override fun getComment(path: String): String? { + return (root as? CommentedConfig)?.getComment(path) + } + + override fun getComments(path: String): List { + return getComment(path)?.lines() ?: emptyList() + } + + override fun setComment(path: String, comment: String?) { + (root as? CommentedConfig)?.setComment(path, if (comment?.isBlank() == true) null else comment) + } + + override fun setComments(path: String, comments: List) { + return setComment(path, comments.joinToString("\n")) + } + + override fun addComments(path: String, comments: List) { + getComments(path).toMutableList().apply { + addAll(comments) + setComments(path, this) + } + } + + override fun getValues(deep: Boolean): Map { + return getKeys(deep).associateWith { get(it) } + } + + override fun toString(): String { + return root.configFormat().createWriter().writeToString(root) + } + + override fun clear() { + root.clear() + } + + companion object { + + private fun ConfigurationSection.getConfig(): Config { + return if (this is ConfigSection) root else error("Not supported") + } + + private fun Map<*, *>.toConfig(parent: ConfigSection): Config { + val section = ConfigSection(parent.root.createSubConfig()) + forEach { (k, v) -> section[k.toString()] = v } + return section.root + } + + /** + * 解包 + * 要么变为原始类型,要么变成 Map + */ + fun unwrap(v: Any?): Any? { + return when (v) { + "~", "null" -> null + "''", "\"\"" -> "" + else -> when (v) { + is ConfigSection -> v.toMap() + is ConfigurationSection -> unwrap(v.getConfig()) + is Config -> unwrap(v.valueMap()) + is Collection<*> -> v.map { unwrap(it) }.toList() + is Map<*, *> -> v.map { it.key to unwrap(it.value) }.toMap() + is String -> StringUtil.decodeUnicode(v) + else -> v + } + } + } + + fun unwrap(list: List<*>, parent: ConfigSection): List<*> { + fun process(value: Any?): Any? { + return when { + value is List<*> -> unwrap(value, parent) + value is Collection<*> && value !is List<*> -> value.toList() + value is ConfigurationSection -> value.getConfig() + value is Map<*, *> -> value.toConfig(parent) + else -> value + } + } + return list.map { process(it) } + } + } + +} \ No newline at end of file diff --git a/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/Configuration.kt b/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/Configuration.kt new file mode 100644 index 0000000000..11e6955664 --- /dev/null +++ b/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/Configuration.kt @@ -0,0 +1,217 @@ +package fr.xephi.authme.configruation + +import java.io.File +import java.io.InputStream +import java.io.Reader + +/** + * Configuration + * + * @author Taboolib + * @since 2024/7/10 19:30 + */ +interface Configuration : ConfigurationSection { + + /** + * 文件 + */ + var file: File? + + /** + * 保存为字符串 + */ + fun saveToString(): String + + /** + * 保存到文件 + * + * @param file 文件 + */ + fun saveToFile(file: File? = null) + + /** + * 从文件加载 + * + * @param file 文件 + */ + fun loadFromFile(file: File) + + /** + * 从字符串加载 + * + * @param contents 字符串 + */ + fun loadFromString(contents: String) + + /** + * 从 [Reader] 加载 + * + * @param reader 输入流 + */ + fun loadFromReader(reader: Reader) + + /** + * 从 [InputStream] 加载 + * + * @param inputStream 输入流 + */ + fun loadFromInputStream(inputStream: InputStream) + + /** + * 重载 + */ + fun reload() + + /** + * 注册重载回调 + * + * @param runnable 回调 + */ + fun onReload(runnable: Runnable) + + /** + * 变更类型 + * + * @param type 类型 + */ + fun changeType(type: Type) + + companion object { + + /** + * 识别可能的 [ConfigurationSection] 类型 + */ + fun parse(any: Any, type: Type = Type.YAML, concurrent: Boolean = true): ConfigurationSection { + val unwrapped = ConfigSection.unwrap(any) + if (unwrapped is Map<*, *>) { + return fromMap(unwrapped, type, concurrent) + } + return empty(type, concurrent) + } + + /** + * 创建空配置 + * + * @param type 类型 + * @param concurrent 是否支持并发 + * @return [Configuration] + */ + fun empty(type: Type = Type.YAML, concurrent: Boolean = true): Configuration { + return ConfigFile( + if (concurrent) type.newFormat().createConcurrentConfig() else type.newFormat() + .createConfig { LinkedHashMap() }) + } + + /** + * 从文件加载 + * + * @param file 文件 + * @param type 类型 + * @param concurrent 是否支持并发 + * @return [Configuration] + */ + fun loadFromFile(file: File, type: Type? = null, concurrent: Boolean = true): Configuration { + val format = (type ?: getTypeFromFile(file)).newFormat() + val configFile = + ConfigFile(if (concurrent) format.createConcurrentConfig() else format.createConfig { LinkedHashMap() }) + configFile.loadFromFile(file) + return configFile + } + + /** + * 从 [Reader] 加载 + * + * @param reader Reader + * @param type 类型 + * @param concurrent 是否支持并发 + * @return [Configuration] + */ + fun loadFromReader(reader: Reader, type: Type = Type.YAML, concurrent: Boolean = true): Configuration { + val format = type.newFormat() + val configFile = + ConfigFile(if (concurrent) format.createConcurrentConfig() else format.createConfig { LinkedHashMap() }) + configFile.loadFromReader(reader) + return configFile + } + + /** + * 从字符串加载 + * + * @param contents 字符串 + * @param type 类型 + * @param concurrent 是否支持并发 + * @return [Configuration] + */ + fun loadFromString(contents: String, type: Type = Type.YAML, concurrent: Boolean = true): Configuration { + val format = type.newFormat() + val configFile = + ConfigFile(if (concurrent) format.createConcurrentConfig() else format.createConfig { LinkedHashMap() }) + configFile.loadFromString(contents) + return configFile + } + + /** + * 从 [InputStream] 加载 + * + * @param inputStream 输入流 + * @param type 类型 + * @param concurrent 是否支持并发 + * @return [Configuration] + */ + fun loadFromInputStream( + inputStream: InputStream, + type: Type = Type.YAML, + concurrent: Boolean = true + ): Configuration { + val format = type.newFormat() + val configFile = + ConfigFile(if (concurrent) format.createConcurrentConfig() else format.createConfig { LinkedHashMap() }) + configFile.loadFromInputStream(inputStream) + return configFile + } + + /** + * 从 Map 加载 [ConfigurationSection] + * + * @param map [Map] + * @param type 类型 + * @param concurrent 是否支持并发 + * @return [ConfigurationSection] + */ + fun fromMap(map: Map<*, *>, type: Type = Type.YAML, concurrent: Boolean = true): ConfigurationSection { + val empty = empty(type, concurrent) + map.forEach { (k, v) -> empty[k.toString()] = v } + return empty + } + + /** + * 从文件获取类型 + * + * @param file 文件 + * @param def 默认类型 + * @return [Type] + */ + fun getTypeFromFile(file: File, def: Type = Type.YAML): Type { + return getTypeFromExtension(file.extension, def) + } + + /** + * 从文件扩展名获取类型 + * + * @param extension 扩展名 + * @param def 默认类型 + * @return [Type] + */ + fun getTypeFromExtension(extension: String, def: Type = Type.YAML): Type { + return when (extension) { + "yaml", "yml" -> Type.YAML +// "toml", "tml" -> Type.TOML +// "json" -> Type.JSON +// "conf" -> Type.HOCON + else -> def + } + } + + } + +} \ No newline at end of file diff --git a/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/ConfigurationSection.kt b/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/ConfigurationSection.kt new file mode 100644 index 0000000000..7184291b3f --- /dev/null +++ b/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/ConfigurationSection.kt @@ -0,0 +1,538 @@ +package fr.xephi.authme.configruation + +/** + * ConfigurationSection + * + * @author Bukkit, 坏黑 + * @since 2024/7/10 19:29 + */ +interface ConfigurationSection { + + /** 原始类型 */ + val primitiveConfig: Any + + /** 父节点 */ + val parent: ConfigurationSection? + + /** 节点名 */ + val name: String + + /** 节点类型 */ + val type: Type + + /** + * Gets a set containing all keys in this section. + * + * + * If deep is set to true, then this will contain all the keys within any + * child [ConfigurationSection]s (and their children, etc). These + * will be in a valid path notation for you to use. + * + * + * If deep is set to false, then this will contain only the keys of any + * direct children, and not their own children. + * + * @param deep Whether or not to get a deep list, as opposed to a shallow + * list. + * @return Set of keys contained within this ConfigurationSection. + */ + fun getKeys(deep: Boolean): Set + + /** + * Checks if this [ConfigurationSection] contains the given path. + * + * + * If the value for the requested path does not exist but a default value + * has been specified, this will return true. + * + * @param path Path to check for existence. + * @return True if this section contains the requested path, either via + * default or being set. + * @throws IllegalArgumentException Thrown when path is null. + */ + operator fun contains(path: String): Boolean + + /** + * Gets the requested Object by path. + * + * + * If the Object does not exist but a default value has been specified, + * this will return the default value. If the Object does not exist and no + * default value was specified, this will return null. + * + * @param path Path of the Object to get. + * @return Requested Object. + */ + operator fun get(path: String): Any? + + /** + * Gets the requested Object by path, returning a default value if not + * found. + * + * @param path Path of the Object to get. + * @param def The default value to return if the path is not found. + * @return Requested Object. + */ + operator fun get(path: String, def: Any?): Any? + + /** + * Sets the specified path to the given value. + * + * + * If value is null, the entry will be removed. Any existing entry will be + * replaced, regardless of what the new value is. + * + * @param path Path of the object to set. + * @param value New value to set the path to. + */ + operator fun set(path: String, value: Any?) + + /** + * Gets the requested String by path. + * + * + * If the String does not exist but a default value has been specified, + * this will return the default value. If the String does not exist and no + * default value was specified, this will return null. + * + * @param path Path of the String to get. + * @return Requested String. + */ + fun getString(path: String): String? + + /** + * Gets the requested String by path, returning a default value if not + * found. + * + * @param path Path of the String to get. + * @param def The default value to return if the path is not found or is + * not a String. + * @return Requested String. + */ + fun getString(path: String, def: String?): String? + + /** + * Checks if the specified path is a String. + * + * + * If the path exists but is not a String, this will return false. If the + * path does not exist, this will return false. If the path does not exist + * but a default value has been specified, this will check if that default + * value is a String and return appropriately. + * + * @param path Path of the String to check. + * @return Whether or not the specified path is a String. + */ + fun isString(path: String): Boolean + + /** + * Gets the requested int by path. + * + * + * If the int does not exist but a default value has been specified, this + * will return the default value. If the int does not exist and no default + * value was specified, this will return 0. + * + * @param path Path of the int to get. + * @return Requested int. + */ + fun getInt(path: String): Int + + /** + * Gets the requested int by path, returning a default value if not found. + * + * @param path Path of the int to get. + * @param def The default value to return if the path is not found or is + * not an int. + * @return Requested int. + */ + fun getInt(path: String, def: Int): Int + + /** + * Checks if the specified path is an int. + * + * + * If the path exists but is not a int, this will return false. If the + * path does not exist, this will return false. If the path does not exist + * but a default value has been specified, this will check if that default + * value is a int and return appropriately. + * + * @param path Path of the int to check. + * @return Whether or not the specified path is an int. + */ + fun isInt(path: String): Boolean + + /** + * Gets the requested boolean by path. + * + * + * If the boolean does not exist but a default value has been specified, + * this will return the default value. If the boolean does not exist and + * no default value was specified, this will return false. + * + * @param path Path of the boolean to get. + * @return Requested boolean. + */ + fun getBoolean(path: String): Boolean + + /** + * Gets the requested boolean by path, returning a default value if not + * found. + * + * @param path Path of the boolean to get. + * @param def The default value to return if the path is not found or is + * not a boolean. + * @return Requested boolean. + */ + fun getBoolean(path: String, def: Boolean): Boolean + + /** + * Checks if the specified path is a boolean. + * + * + * If the path exists but is not a boolean, this will return false. If the + * path does not exist, this will return false. If the path does not exist + * but a default value has been specified, this will check if that default + * value is a boolean and return appropriately. + * + * @param path Path of the boolean to check. + * @return Whether or not the specified path is a boolean. + */ + fun isBoolean(path: String): Boolean + + /** + * Gets the requested double by path. + * + * + * If the double does not exist but a default value has been specified, + * this will return the default value. If the double does not exist and no + * default value was specified, this will return 0. + * + * @param path Path of the double to get. + * @return Requested double. + */ + fun getDouble(path: String): Double + + /** + * Gets the requested double by path, returning a default value if not + * found. + * + * @param path Path of the double to get. + * @param def The default value to return if the path is not found or is + * not a double. + * @return Requested double. + */ + fun getDouble(path: String, def: Double): Double + + /** + * Checks if the specified path is a double. + * + * + * If the path exists but is not a double, this will return false. If the + * path does not exist, this will return false. If the path does not exist + * but a default value has been specified, this will check if that default + * value is a double and return appropriately. + * + * @param path Path of the double to check. + * @return Whether or not the specified path is a double. + */ + fun isDouble(path: String): Boolean + + /** + * Gets the requested long by path. + * + * + * If the long does not exist but a default value has been specified, this + * will return the default value. If the long does not exist and no + * default value was specified, this will return 0. + * + * @param path Path of the long to get. + * @return Requested long. + */ + fun getLong(path: String): Long + + /** + * Gets the requested long by path, returning a default value if not + * found. + * + * @param path Path of the long to get. + * @param def The default value to return if the path is not found or is + * not a long. + * @return Requested long. + */ + fun getLong(path: String, def: Long): Long + + /** + * Checks if the specified path is a long. + * + * + * If the path exists but is not a long, this will return false. If the + * path does not exist, this will return false. If the path does not exist + * but a default value has been specified, this will check if that default + * value is a long and return appropriately. + * + * @param path Path of the long to check. + * @return Whether or not the specified path is a long. + */ + fun isLong(path: String): Boolean + + /** + * Gets the requested List by path. + * + * + * If the List does not exist but a default value has been specified, this + * will return the default value. If the List does not exist and no + * default value was specified, this will return null. + * + * @param path Path of the List to get. + * @return Requested List. + */ + fun getList(path: String): List<*>? + + /** + * Gets the requested List by path, returning a default value if not + * found. + * + * @param path Path of the List to get. + * @param def The default value to return if the path is not found or is + * not a List. + * @return Requested List. + */ + fun getList(path: String, def: List<*>?): List<*>? + + /** + * Checks if the specified path is a List. + * + * + * If the path exists but is not a List, this will return false. If the + * path does not exist, this will return false. If the path does not exist + * but a default value has been specified, this will check if that default + * value is a List and return appropriately. + * + * @param path Path of the List to check. + * @return Whether or not the specified path is a List. + */ + fun isList(path: String): Boolean + + /** + * Gets the requested List of String by path. + * + * + * If the List does not exist but a default value has been specified, this + * will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + * + * This method will attempt to cast any values into a String if possible, + * but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of String. + */ + fun getStringList(path: String): List + + /** + * Gets the requested List of Integer by path. + * + * + * If the List does not exist but a default value has been specified, this + * will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + * + * This method will attempt to cast any values into a Integer if possible, + * but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Integer. + */ + fun getIntegerList(path: String): List + + /** + * Gets the requested List of Boolean by path. + * + * + * If the List does not exist but a default value has been specified, this + * will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + * + * This method will attempt to cast any values into a Boolean if possible, + * but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Boolean. + */ + fun getBooleanList(path: String): List + + /** + * Gets the requested List of Double by path. + * + * + * If the List does not exist but a default value has been specified, this + * will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + * + * This method will attempt to cast any values into a Double if possible, + * but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Double. + */ + fun getDoubleList(path: String): List + + /** + * Gets the requested List of Float by path. + * + * + * If the List does not exist but a default value has been specified, this + * will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + * + * This method will attempt to cast any values into a Float if possible, + * but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Float. + */ + fun getFloatList(path: String): List + + /** + * Gets the requested List of Long by path. + * + * + * If the List does not exist but a default value has been specified, this + * will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + * + * This method will attempt to cast any values into a Long if possible, + * but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Long. + */ + fun getLongList(path: String): List + + /** + * Gets the requested List of Byte by path. + * + * + * If the List does not exist but a default value has been specified, this + * will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + * + * This method will attempt to cast any values into a Byte if possible, + * but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Byte. + */ + fun getByteList(path: String): List + + /** + * Gets the requested List of Character by path. + * + * + * If the List does not exist but a default value has been specified, this + * will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + * + * This method will attempt to cast any values into a Character if + * possible, but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Character. + */ + fun getCharacterList(path: String): List + + /** + * Gets the requested List of Short by path. + * + * + * If the List does not exist but a default value has been specified, this + * will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + * + * This method will attempt to cast any values into a Short if possible, + * but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Short. + */ + fun getShortList(path: String): List + + /** + * Gets the requested List of Maps by path. + * + * + * If the List does not exist but a default value has been specified, this + * will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + * + * This method will attempt to cast any values into a Map if possible, but + * may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Maps. + */ + fun getMapList(path: String): List> + + /** + * Gets the requested ConfigurationSection by path. + * + * + * If the ConfigurationSection does not exist but a default value has been + * specified, this will return the default value. If the + * ConfigurationSection does not exist and no default value was specified, + * this will return null. + * + * @param path Path of the ConfigurationSection to get. + * @return Requested ConfigurationSection. + */ + fun getConfigurationSection(path: String): ConfigurationSection? + + /** + * Checks if the specified path is a ConfigurationSection. + * + * + * If the path exists but is not a ConfigurationSection, this will return + * false. If the path does not exist, this will return false. If the path + * does not exist but a default value has been specified, this will check + * if that default value is a ConfigurationSection and return + * appropriately. + * + * @param path Path of the ConfigurationSection to check. + * @return Whether or not the specified path is a ConfigurationSection. + */ + fun isConfigurationSection(path: String): Boolean + + fun > getEnum(path: String, type: Class): T? + + fun > getEnumList(path: String, type: Class): List + + fun createSection(path: String): ConfigurationSection + + fun toMap(): Map + + fun getComment(path: String): String? + + fun getComments(path: String): List + + fun setComment(path: String, comment: String?) + + fun setComments(path: String, comments: List) + + fun addComments(path: String, comments: List) + + fun getValues(deep: Boolean): Map + + fun clear() + +} \ No newline at end of file diff --git a/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/Type.kt b/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/Type.kt new file mode 100644 index 0000000000..eca5d1f729 --- /dev/null +++ b/project/module-configuration/src/main/kotlin/fr/xephi/authme/configruation/Type.kt @@ -0,0 +1,31 @@ +package fr.xephi.authme.configruation + +/** + * Type + * + * @author Taboolib + * @since 2024/7/10 19:31 + */ +enum class Type(private val format: () -> ConfigFormat) { + + YAML({ YamlFormat.INSTANCE }); + +// TOML({ TomlFormat.instance() }), +// +// JSON({ JsonFormat.emptyTolerantInstance() }), +// +// FAST_JSON({ JsonFormat.minimalEmptyTolerantInstance() }), +// +// HOCON({ HoconFormat.instance() }); + + fun newFormat(): ConfigFormat { + return format() + } + + companion object { + + fun getType(format: ConfigFormat<*>): Type { + return values().first { it.newFormat().javaClass == format.javaClass } + } + } +} \ No newline at end of file diff --git a/project/module-util/build.gradle.kts b/project/module-util/build.gradle.kts new file mode 100644 index 0000000000..7ab8afb61e --- /dev/null +++ b/project/module-util/build.gradle.kts @@ -0,0 +1,3 @@ +dependencies { + compileOnly("com.google.guava:guava:33.2.1-jre") +} \ No newline at end of file diff --git a/project/module-util/src/main/java/fr/xephi/authme/util/Coerce.java b/project/module-util/src/main/java/fr/xephi/authme/util/Coerce.java new file mode 100644 index 0000000000..529a32a25c --- /dev/null +++ b/project/module-util/src/main/java/fr/xephi/authme/util/Coerce.java @@ -0,0 +1,303 @@ +/* + * This file is part of Sponge, licensed under the MIT License (MIT). + * + * Copyright (c) SpongePowered + * Copyright (c) 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 org.spongepowered.common.data.builder; + +import com.google.common.primitives.Doubles; +import com.google.common.primitives.Ints; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Utility class for coercing unknown values to specific target types. + */ +public final class Coerce { + + private static final Pattern listPattern = Pattern.compile("^([\\(\\[\\{]?)(.+?)([\\)\\]\\}]?)$"); + + private static final String[] listPairings = {"([{", ")]}"}; + + /** + * No subclasses for you. + */ + private Coerce() {} + + /** + * Gets the given object as a {@link String}. + * + * @param obj The object to translate + * @return The string value, if available + */ + public static Optional asString(@Nullable Object obj) { + if (obj instanceof String) { + return Optional.of((String) obj); + } else if (obj == null) { + return Optional.empty(); + } else { + return Optional.of(obj.toString()); + } + } + + /** + * Gets the given object as a {@link Boolean}. + * + * @param obj The object to translate + * @return The boolean, if available + */ + public static Optional asBoolean(@Nullable Object obj) { + if (obj instanceof Boolean) { + return Optional.of((Boolean) obj); + } else if (obj instanceof Byte) { + return Optional.of((Byte) obj != 0); + } + return Optional.empty(); + } + + /** + * Gets the given object as a {@link Integer}. + * + *

Note that this does not translate numbers spelled out as strings.

+ * + * @param obj The object to translate + * @return The integer value, if available + */ + public static Optional asInteger(@Nullable Object obj) { + if (obj == null) { + // fail fast + return Optional.empty(); + } + if (obj instanceof Number) { + return Optional.of(((Number) obj).intValue()); + } + + try { + return Optional.ofNullable(Integer.valueOf(obj.toString())); + } catch (NumberFormatException | NullPointerException e) { + // do nothing + } + + final String strObj = Coerce.sanitiseNumber(obj); + final Integer iParsed = Ints.tryParse(strObj); + if (iParsed == null) { + final Double dParsed = Doubles.tryParse(strObj); + // try parsing as double now + return dParsed == null ? Optional.empty() : Optional.of(dParsed.intValue()); + } + return Optional.of(iParsed); + } + + /** + * Gets the given object as a {@link Double}. + * + *

Note that this does not translate numbers spelled out as strings.

+ * + * @param obj The object to translate + * @return The double value, if available + */ + public static Optional asDouble(@Nullable Object obj) { + if (obj == null) { + // fail fast + return Optional.empty(); + } + if (obj instanceof Number) { + return Optional.of(((Number) obj).doubleValue()); + } + + try { + return Optional.ofNullable(Double.valueOf(obj.toString())); + } catch (NumberFormatException | NullPointerException e) { + // do nothing + } + + final String strObj = Coerce.sanitiseNumber(obj); + final Double dParsed = Doubles.tryParse(strObj); + // try parsing as double now + return dParsed == null ? Optional.empty() : Optional.of(dParsed); + } + + /** + * Gets the given object as a {@link Float}. + * + *

Note that this does not translate numbers spelled out as strings.

+ * + * @param obj The object to translate + * @return The float value, if available + */ + public static Optional asFloat(@Nullable Object obj) { + if (obj == null) { + // fail fast + return Optional.empty(); + } + if (obj instanceof Number) { + return Optional.of(((Number) obj).floatValue()); + } + + try { + return Optional.ofNullable(Float.valueOf(obj.toString())); + } catch (NumberFormatException | NullPointerException e) { + // do nothing + } + + final String strObj = Coerce.sanitiseNumber(obj); + final Double dParsed = Doubles.tryParse(strObj); + return dParsed == null ? Optional.empty() : Optional.of(dParsed.floatValue()); + } + + /** + * Gets the given object as a {@link Short}. + * + *

Note that this does not translate numbers spelled out as strings.

+ * + * @param obj The object to translate + * @return The short value, if available + */ + public static Optional asShort(@Nullable Object obj) { + if (obj == null) { + // fail fast + return Optional.empty(); + } + if (obj instanceof Number) { + return Optional.of(((Number) obj).shortValue()); + } + + try { + return Optional.ofNullable(Short.parseShort(Coerce.sanitiseNumber(obj))); + } catch (NumberFormatException | NullPointerException e) { + // do nothing + } + return Optional.empty(); + } + + /** + * Gets the given object as a {@link Byte}. + * + *

Note that this does not translate numbers spelled out as strings.

+ * + * @param obj The object to translate + * @return The byte value, if available + */ + public static Optional asByte(@Nullable Object obj) { + if (obj == null) { + // fail fast + return Optional.empty(); + } + if (obj instanceof Number) { + return Optional.of(((Number) obj).byteValue()); + } + + try { + return Optional.ofNullable(Byte.parseByte(Coerce.sanitiseNumber(obj))); + } catch (NumberFormatException | NullPointerException e) { + // do nothing + } + return Optional.empty(); + } + + /** + * Gets the given object as a {@link Long}. + * + *

Note that this does not translate numbers spelled out as strings.

+ * + * @param obj The object to translate + * @return The long value, if available + */ + public static Optional asLong(@Nullable Object obj) { + if (obj == null) { + // fail fast + return Optional.empty(); + } + if (obj instanceof Number) { + return Optional.of(((Number) obj).longValue()); + } + + try { + return Optional.ofNullable(Long.parseLong(Coerce.sanitiseNumber(obj))); + } catch (NumberFormatException | NullPointerException e) { + // do nothing + } + return Optional.empty(); + } + + /** + * Gets the given object as a {@link Character}. + * + * @param obj The object to translate + * @return The character, if available + */ + public static Optional asChar(@Nullable Object obj) { + if (obj == null) { + return Optional.empty(); + } + if (obj instanceof Character) { + return Optional.of((Character) obj); + } + try { + return Optional.of(obj.toString().charAt(0)); + } catch (Exception e) { + // do nothing + } + return Optional.empty(); + } + + /** + * Sanitise a string containing a common representation of a number to make + * it parsable. Strips thousand-separating commas and trims later members + * of a comma-separated list. For example the string "(9.5, 10.6, 33.2)" + * will be sanitised to "9.5". + * + * @param obj Object to sanitise + * @return Sanitised number-format string to parse + */ + private static String sanitiseNumber(Object obj) { + String string = obj.toString().trim(); + if (string.length() < 1) { + return "0"; + } + + final Matcher candidate = Coerce.listPattern.matcher(string); + if (Coerce.listBracketsMatch(candidate)) { + string = candidate.group(2).trim(); + } + + final int decimal = string.indexOf('.'); + final int comma = string.indexOf(',', decimal); + if (decimal > -1 && comma > -1) { + return Coerce.sanitiseNumber(string.substring(0, comma)); + } + + if (string.indexOf('-', 1) != -1) { + return "0"; + } + + return string.replace(",", "").split(" ", 0)[0]; + } + + private static boolean listBracketsMatch(Matcher candidate) { + return candidate.matches() && Coerce.listPairings[0].indexOf(candidate.group(1)) == Coerce.listPairings[1].indexOf(candidate.group(3)); + } + +} \ No newline at end of file diff --git a/project/module-util/src/main/java/fr/xephi/authme/util/StringUtil.java b/project/module-util/src/main/java/fr/xephi/authme/util/StringUtil.java new file mode 100644 index 0000000000..1b65a904bf --- /dev/null +++ b/project/module-util/src/main/java/fr/xephi/authme/util/StringUtil.java @@ -0,0 +1,27 @@ +package fr.xephi.authme.util; + +/** + * StringUtil + * + * @author TheFloodDragon + * @since 2024/7/10 19:51 + */ +public final class StringUtil { + + private StringUtil() { + } + + /** + * 解码 Unicode + */ + public static String decodeUnicode(String str) { + String r = str; + int i = r.indexOf("\\u"); + if (i != -1) { + r = r.substring(0, i) + (char) Integer.parseInt(r.substring(i + 2, i + 6), 16) + r.substring(i + 6); + decodeUnicode(r); + } + return r; + } + +} \ No newline at end of file

8+!mA@~}>0t8bJeJ?XL)aL$HeF)xymvT0`=?5dAyQU@d}w5&Vf@9Rl%x1b<6Z z{j6Tf>#6?;F+TGj!i^AaAUxbqxbBOv70Jdz`g8xo)(E#pxGBPI5N?KWON5&#)Z4qXenQf8ThGaV-y5++i5bla_M}%z=?!@TM64mEj*p6fuA$s-_ z?uKv=gzd?97p~8{Q2Za^UP82UhWns=Ji-nLUqILqVT5pBgvTK4gzylAoe>_0unWSj z2>0W*`^&cd^-*^t5&v)2)*a!&2z!tpB;34iPm*3jo|8U8*c;&hgnbb9LwG1jUx}KQ zq5p^C|IL~QA{>nHaAqDsJ(7A9b&%5LYtjG1qlM_Jd3Y?s(Flhk9D#5c!V?hE|3mt} zzV?MDvYz2BwmJ#nsR-%+A^qPR%SdL9l1x1t33CWtgn5JogyR1QZHek{P=rMiM~K-U z4`G1NCoc)t<1M8BhvNTco)%UR-iEM>@O*?Z!ZQ&j2v0*u{}09g5vJ4zb&PCl_VaWS z@&6_{3*lIVXOo{J+`R6&BaV zJ+DM~4Z^F)#s7`th1Zf?N4=hU1HzjT-iYv~O#hCV$$w=gKag3uAHrJ@-kRy>W?Rk5 ztobi9@*jk^BYXnk9SHA7cqhVp5Yqp{yQO|TLksU^o%adRza0x7K=?4i2g$|%n@9Z! z3H?75|3~;ZbwZ1rClNl4@F|3o5Yqp{|4CH8UkfKQe~J)&Um|=4;j;+o|KT*&)0#QY zQN{n8W9CJa)hkX%xCG%#20C97 zkn&py=OBEW(RY+)hRtSK{2$?aLd=MLAK?OoA0Ye~;fIWVBvJh>zVH*0c~tR#gr8DB zQ`+>v&k=ruQ2Za^m(+z+@qdJ0D>d_ka1qI365a1h5w1qK4B>Kw-y&3d{vC6^mmK2& zKaz<5H~0BxguftMLB3MBzHb)(O0ud&=5Gl9Mz{vyT7=^N2>+0%o->4hl8FDC`A@hG z;lBvilhgn8{pavMA>|DuQ@2}rBa}O$+zRDwQQjEkEm7VC<;_rLFPAr!Onr?g)Bnr# zf9>JrtxyKaTeHq>BvXHaP|lEKg&fNEEVn^K4`2du=Fo*tM z-k;^J)NU=dI*_Eh5Ithc2cg^t<%7w4QpNvKK7`s^sd;BnK9r=d5PhvI_ec3Cln+Ds zaFhoyI*|FNu}uFji~pN5u{;Rnp(qb#bO=@aALV1H$0{}BsyvM3I3e06%O@aG4SpiZ z&!IdVo;fHM8RO#j#K;>$&5 zI+Cfc*JTgo3d%mpAVS;{l6^!Z|=a9 z$D=$M<;zf>i1Ovkzk+%tRW1HA1ZB1OkJ4*Uz6a%NSyuC5MXsmbKvhcsDRL9_W~y5M zM-jF7kJ8(yw^P*;K#JT+y^DIc(#%@5xRBy%@gJpXIUuEK{U4=j{U4P$K#r$v^jpJpga}jr^%lYZrV`%ALVC-Xy++E zkMb&%UqJaAl$HO_M|nERAEW#dGhe38puU3gYbd`eHUluYOS`_-4^3#s(~GX39-$westgz{pPzejlqbCyzOj(Uc?cr}I|Bdn*l-HvCJ9GY!96cW^|4H(f5aR&rQ2rO? z_2l$_^<6bNQu=?i!T-;UHbS&HqE?7nBVtapiA449q$2TuM4Pq9-vZIrh_)o(O1Qo+ z6p8;M0+s$BiT@+oR&w-FN82G9foOX~2O-)4(LRWFM6?^Coe;G{v@`R?|IM{2+J$6S zA^Lj`QF}ytBHEo?{J&YV_&=h(g=oKxIw0B~QAb3b5$(%pCq}Plnf@P%|C`x()D_Wz zh`KR)0Qn;(`XTCts1G9gf7DxYw5vq)|ERAJeVvW^BN~Y4 zFxECexOTkga1!zV=AImdXegpVh>k`?|Br?+`Vlkf{}KIP_jNQ3kurSoe?-Sirm6Wv zlHo$M>qaLbIup^!hL)F2-ty#HdBPp69iH{0qg zMAsua8_~sx&Ovk@BKm)HuH=~7&gWL+sPzBnLY6O*9J9}tAi5IKrR3wOmr?2e(G`+u z#?@8iS5vQ{UQ4}BX|uK)5Z#XGMntzDx{1-7C2DH8mE<-d`qvQA9f;)Vrzo zQ14aR97Xq&JRrpM)I+%PSws)xjGYlZg4&CS9z{GB(POAgL-aVJ?+{Huv=q@3h~7f< zB%+Cko{}2$XEzc3KbpjvCsU_TpOzfynrEm}sj5!#e?-qwpI6Gl3y9Q9zsB-(>Pys@ zsWYgrP+wJ=`GqDH%_Mmp(HjD#+F8^$5zW>_Wg>bT(PxO>LG&S_If&*WdY5VMNsfNk zAH7fVfeQ;=ZF>}`hw9fCE9;6%U@CH|D5;o z=^{irD*oT>*<}og|2KWR;U$ww*pj|3{^Di_FbXX^YC{sI)<43sf?wY{{Ihs9RIFp+af1{w&G1LiEV5Y=_E@ zsBBNZgK&L4t?Wc1{%^iNR%wUIo~Z1CN_$jxWpuX|(cMY*5TbjqvKJ~HP}!S&AL06X zTIon4{@>h(&ZyjkN*7d$sO*PI4^;L?Je2rkfgg1Q`M-hY z)Z?iqP*0=|r;ebWL_L{$3M!*eIhEy+O7&uisEj7bQS-tXLdE8h7L+zy(m|z+ii=7K z74d&me2JRT6_AMkn{%NOp%SA)|F2Yq>-!s(gqbyJotjb`@ItYkhsvL* zJdet!sJwv6EL2`Zu=6iK4K>QzasvRip>8}5&t)znpHkS zHY^zn)81=>HY^zv%30*P*%*D(g}C50!sd=fAQKdd^VYKuC2%A$nX@TcO$-)s4x;|IN8s-IQcAA$otR zTcDanbxTyYL6!br75_JL<0_b+5u$sux-F{PquPdiJK?4t@qbizq|*PZJF8p7sJ5lH zqwYf8mAV_XJ#}~L9@IUldr|kM?nCWBRsXl8>fD#wiP~AIJoOrV>S3r3 zLUjPDN1!^8(ZeNb+T=)*qgvz-Ms*mfL&%S&9z#8rI#g+M+v7-%7czZ2N>T4GfEzd4G^Br^YRk}9e-RAX}S|7QEtNm3zZAI6}1JF2IlIu_N_Q9TRQGnjK` zi>=NkIY)>-XRGI;dJC%Ok)KZ;N4)^mn^3(F)f+hgE<*KUj*3gDmr}=5FQZ;gy@Glr z^(yMs)N82MQq}*RsgZU)^#-MK=fA0_-rS;mEBE9!rOk8X4pi?)^-fgpK~?-8)w?BX zM#a4(_X!y~lH~_beGJtHS$>F0|F4Swqxz`Q=6U@%$potSKdMiv5UNj6CsNf#O_51T z&8n@{DTvhwc^dJas6K=0i>OXT^*L0hv4&@rnmJPSd6E}|Xa}oKM|CNx^#7{(KdLjR zugC?l`YQD`>P+hE)HkTJsBcndQ`LvRYAf~OuhMs@bExl9-$V6tROh1l399d-`XS*5 zazS69hVDnGeyo0FnccXbx&&t?Z-VMPR6j#?KB}Lp%Oxe%l7tltGb@&>0;=Ee>HC=lY5*@LSz^e$>eQzHSHI=)end({_)Roj#9aR&=K2pY*MEq2V7{#Xz=A9Rp%!*P+?KD>j=BqVSL$xm_SD@G@1Y8MTavvH zcSgK7;*N;-k(Q4;C^ctLye~;7A?j5m+6D2+i1%Z8e=6tyaW}b<7#~1AklLNvgL)A4 zU}{flFX|!G-qb$SL#cfcABngh;sJ>JlN_d09%@1Rc%UvLR;_x3;cA8a_$b6DARdHx z7~;W*k3l>H@zJt`zFLNT`kAu6eS9q9p_%!A%2xAdWadvoe4HvHK3<4gGheNBAD>9V z_5b4$h)>F_IZKwQR|)TrK}`RT>Hpei;!%jph({xK5a$rvi1Tb2@qgp1F|TW}_`f;d zV;6A=vBykbxc(Md%=v#D3ehu`I6|Bvt{_ej%lsd)_`jJ`#hm}g;{WEZX52u07UD6? zJdJufmHr>o|MfeFnEoHr{|z}8$sLH#L$W>M^AUfFcpTz;5nq7#I>Z+uz8vvIh%ZHa zG3&fUsksKl<4GuIC-+=gL#5Xc}6QkF& zd<#|lzu6|YBfbmq9prbCPi0yBAMrgc$bE=sA-*5+bi@xJei$+RKNkOQwjupL7XL^5 z81-?v9>o)=Pf(wvK1H2K{U3D_bux7d^=axe)Tz{I)Mu&BQJ+WrBH|a!#ct((x`6m4 z#4{1o|6}@p{0jF+t^YX{v0DFAEhsuwRx65MCx1g}vkl)w{2t=jh~Gi{7Nc)VRL{L* z&TV4O|MmOycrM~k5Oe+?f57|?sht1EGXHPZJdb?75IrA@KSTTn;suDmNBlYBMToyZ z{1sxE|07-~nR*@@e@*g@5OrCX=wign5HDeQsqkmTa}d-2W)!U;St-PfqF)jJhIkeE>K1$r$?rn+-Jy6blGcd-MEoD(zYwoS{5NyfNsfM> z75_u>uMmBWPBuW&3dx4TlZ}MyGc?(lWD_BJIip)hRR1z1*@|Rq zA$orjAlVj)%>R*Oh3g|qIR8(!6Qb|fBs(A(iDXA4J(28$q$84@k?fA7Es|Z4v||ms zNWT6>VX_-Zdm(0T_dv2Yl0C`y5^j!e9}?*cGuuq|MbZsPCnWnJ>C9*siR!hu6Z(H5 z{%`I_B?lnsf#g7Db{B4r;vkZPh3K_*lU_&$AvpxeVMux->5D|>|40s%96hg2`jPY( zqOU&503=5s8AyJ(a8v)0BuBN#9E{{RBtwuKi{xlVkCEs!X&EF#sl$ZmcbCcWNKQs_ z0{My5;nWe-la!kAoY4Oh`oB4rQAo~4G8##QB!|RBl1EZNVsTqrwl#gh`G4XF(eEe| z4@rPT{2xh)ye-S(|43y1-yBgDBn>20BsC=B|40&v>T@~a{6FFR-;BU9NX|e)|4&Yr zO#Kb&MEoDgSwc*!o`d8HBx8|WghcuOI3(vW=X}Z0SEb|vk_&~H`Y%Q@9*Ourl1qh~ z+AbrxT!_9)nOuqF1|(M@xfaRQjEes^_xw5%@%d(N-iYK@BsY=YOua>-`kOY%Z6vn~ zF>QD!Y6l^?3&}4??nW{L$vsFWA-NaH<4Ep9@*tA?xzz)*l^N|1kvvR&g!(A;F{RBt znSkUeBu|h(DO`J6GLhteLd-ce8Od`pvoUnKc;>{ou`zA`AF1T0G0C@b%ExY&#y!B1(L6j ze93)SDEpvYJ^7l1{;%g4$zmiwAX$RsTO{KDNR~;y>CNv*z87M~_K!$@M)DJR3;$16 zkkJ3lnEVwr<)W)l+W^UGB!40K4apx!)-aR)Z+d?%$)8G_Rhx%~9J5wJliQQn>bw+SVl7P(h{t z*RqnMd$!gFwLMYW4z+fuZI9YcsO`Ya9VJKq;-j`RiTH-xbC&(t1-165?aK0Q!u9pE zwmZolLiD*=+Y7bMsO^nfN7VLVw1Y(TD6Mh+U+W}9w{WcsYF$y=kD2=m*X>#BMsfi4 zK&tpZYCV)1Kd&8(+F7XeL~SH$y-*v3+99YNhFWjb`l3evuhIYYIH}S9YyG7Lb6f*Z zI|4QOe~tccGLPhI9VMBD3`Xrl)P|sT9BTCcn)p9z$5MwI+Ed|9bXSyBM|cs9i#Ssnls+{W22zzZt_< zqILsnSD|(-YF9IQjpS=TujvtceG76UYPX<9|F4PvH^_PSU@8hV^|7(v4*REchz)bP~ z=C)6v_6%whQJaj~{}`PlQT^FLZ3>C_fAf5qirRCi(f@1ofBjAM+Vjj5|8Ms4bc|6o zzl4U`lb4aIaXSNbbt1ol+V7~nirP}tUPJ9I)MlbK3pMe7)ZUO9%-Kr+ugw->TK;X+ z-bL*lX3i0A9PB-kxzzWmA1M1p?L+EE)Q_p3Q0GzSQ$MACMqNPtocaazOX@=ESJbbm z-=Mabg+-Z>`(#G$h}shMH1qdegv(G{iQ2cQEl2G;?vMCCYClkaq>BGHJ@#jk6++Ch z|AN|T)P5yjCEWPZZzSUX&A$Evb>+ruQCIH$C+f<^|62O`hT7N zuX~}sHR{`=z76Wzq7LR~sPupRSxmhR$#znYcHsIBsPBxr_&@493D@Uco%6U)!j|C?`d*E^!VKkD@VdM8FZQ@c?2 zlT1Aqs&^&nCPbfK^#f5q1oiHyAB=hrMh}vxX@{O9y@aScDzYcNQSXa7{l8BCH%ChU zuhaka+@L-HsmdIP`ViC)NBt<&k6;Z)wy13o$zUP<7qfgc>Zc=TH z=SyAuAN3Qd!>J=sKSxDTKMD1dSvVzg=ohG;N*zfZMIBAeQS(#_bsu#bbqDnVNl|HL zo%){k7kuhcJq=MW@o7K}sb$p9Ks`dehI$3{n6R2rBhA#1WR7k_SVw&f>M80C3H94j zRQ;~Dej4hhXP%V(l*iyVP(M=@P(O=$wm`K%a)4uzsxCX1<@2cLBUPhi9P0O>egW#Y zp?)FxMbwK?mmlz=ehKQAvM`={8TE4N71S$HzXtWIP`_F|RX@PVcJD5Qer>ax?1K7r z%(QdY`rWACiTYidE66(ULH%AyUbksxT5o3FPkjLO zg{VKs@gOMg3#c zUqgN7|Me#7ucQ73qqC^GA7``t7WHlFJJdPUcd74D=ThIND*snqsr+B5^8f#9XXXDq z>KByPDgRed<^M{R|0`AguT=TJQZ?$7D*tbrIh<=9)W1Ti&Ze)CD%<=9_2sB9Lj4ES z7o+|i>Pu7_>Ps{0u10+sxBa%ow%xK>p%WbqV-W64XP^l)rTu^>x|D_GZFAP4X}5 z|4CW(g;KRkPme&l5z@9uTOr*R>Bb5o-9)JjzqGX)cu3V_Go)K1-5jZ$k4U#rD(7G- z>p#dt;5JAzs*DusY37ALSXN6w=uO)2Dc65Uw`aMz{zJMWpYDWoXH}4g)YeXyk#Y%$ zluJOQTmm9(kCf{_qHqrk{q$&N(*INOe>IChI+Qw0 zW)$iV{?g;oC?h=qjiZsCh{i!kha(+@RCV+zNKax7C(E|_YMY))GE#`Xilw8GT1a!` zGXFQ%>(nOUl`fU}KT-#c?&@AWQWvR*bTv{R>BC4%NH0MeAUy+Vh_sGW?NT+nNR6}z zX(cyW6lp^hEYh>H(>5eLN2!z-sR3{<((|&5`m3^1q~nlYjPwGe7ZMK3E*ggPBBj~B@5y6Y z2I-|pZ$&yD>9t5NLwXg`%aLA*^os1zl`270J#JA)admd;G8V2;s>(>OLwaL&Q6A~_ zNN>n4id9)D(wmUp%%^H+&O>^O((EEt^KD4)L3%sVJJi$ch5I4B6Y1SZ@5(N^Q#}=x zhicw?kv@R*zU-nG`1F3IEWeHPL8K357k!pp^tMu@k04d>QKZw5K8AE6(#MfLg;Z7Y z1k=9FF8UVflS;FT*2rVA>XiQ>eH!T`q*IVi&MwXfS{964Dt+UzSc}pRy}o(LIRtHKenU&P4ipvp3(+J*X7v zn@Hbc56;$or~3=(J4lrY&p|p5>AOfjMEV}m_mR$(?$iA!o%n(7DWo4E{kYj*pXmN# zPt8aAInqy&E?|GD){~yneT4K2qzjRLDV@TeV%L17dj#n>NPj@O2&wAv#YmSl`)H}| z9i>QB3xBVA1nGCWUv$eO{SoO(q(3438R>GiKYKyCV1;gTq`x5jRT^JfewA){w)t;p zY>RXa8m*B2j&wcJKal=~bS=_9vx~cB7x&LD9+q94NBTF?b=k$$?BcQ6#aCq)t3mY- z8mhK`k^YxmJR!UI`RwA^*~RnG*boiX(aW-n*JPJ$oL$lejg8UR5{*sJ*bI%!rNS8c?Mh1;+ zcFFYYl6SI87G#(FfQG7kPc*heqa7OCqp=ejJD{;+cFEf8($?9f+hv#Tg~rZkw9PK< zo?SXHyYz(Y(jpqWpwS+UUD4Prd;4$MsjHRSWS7>_*d2{MvP&<>F1;?h^j_)HhT6O{ z8hfMB5siJ&=#X7HF}w7o?9w^erJtj*FB+Y)OQln?OV?(XsYC06#{OvRCj)ZX4%uZL zZr4 z!_gRuhBAE4{~MhDYgcb@{@;-Ke{-u5Xq#TxYghWNjEch+#xD52qTKYj8?SPrP65Pkh>L}*-rMg@&?(5Rv@2LF$% z>wub?XuEzE?A~_;dqorkY}lnKBA`-46dQ`zQE8jH+3colHd#SXtf*k`Akq{SMFl&8 zSP%g#pn@nWD1!Z;=O(MK|2cc^d2;8;WHRN>WHOt{4?$j)=1_VL6VLR&xA_rd^1@`P z(vi22H^`g9r%z#dn@mBNbgm;`L_S2`MczZ6^FMjc|DA!-`JnLG z9dZ6A|41Xx$Dpa&{y6gAB0mxN`N&T~eirgiAU^~7$;eMd{z=9&Mb66dY8sj8WUi(C z6!Om?FY`ah&lEm=AC!NV4Cnu|w5j=@*N}e!`InHN&CnOcKP%0b$;=_nCB8y@RiR9$ zNc^uO{}%FZ(0)_+biOV>kIdV`q$8I60^~nI{vG6%rY%JNedOPz&wJvN<@N_;773Hx z-D2dIBL5NjCBkQIXBnA~g-K`5^PeKG6y`JJmm~i7y)56G`a{zsm>PCN%Rq5Tu_XJOJg0|Q0~FR%ejpjn|76!{1+5J<&i`mK|I@JG zEc&!19wJOyC$+<%T?6fKXg#4F0j(pncF>N8b|kc8pdCg3qs6~NdM@XGwBv+H^I1EA zKGc7W`k(5a)(P4v&^klw0_{ZloWyum(>|HlRhYD7wQkT(h1Q*X58<=?;rL&Z@qbp< zS}$k=p!J4!Hncv_&V+Ub&+6OgEYAOEa@Y0v`$Ibq+Bx(*S9rBjQEJ8c#0!MUa_>TD zmqEJ-+8}5H8G5mVrvFmcE+KQNFj>vH9NJaTt{{J<@LA3bCUdngU3<~K7TOqSL!f!k zhC;KU4TF}4Hk_d|frBcl@yqJ00Yq5qH2EQQL3R)FS0a~N7wnEf|RqyB5u|Ll%@ zXbH3cS_Cbme?|PWoEQCv77LTr-Ws$~(5@ptQutJbwCl-?Zse(w@gTGtq1_H`EVNso z-9(?8#V5P^tz>Q!CaZPhpxp=U4)S*r?;?(ecDJlc)FxzqPtfjxcCT7?sK|!(>Mf@V zx}Tm8D6Gf-5VT3q9)_j_{}F~hDxvAWM777sOcW+7uP2~Qfi{`E=zl%Wr;-urO(4K+z7PM!f&4u6aw+<~-{FVbYw@4}{(dy68XjmW}v>$+T|7w1s{o z^h2N@4*gJu9wwm+rL3VJL2M^XT8s3fpdSnUX!6GhpXHM1KlI}pdA5iC4D=4rZ-(9x zdLQVWp!a~@8G0A!C(@t#pN@0%lgWtwLqCPsjo4jb{k~3x-V^$1rSW}q&Gfo%%hdxSSrWpEY=r=+iL;eQgv)VG2jOc$hn$>TC{xI}gp^t}t z8}vJ%-%g)#;*+iu)2aWu=zqNhO@Mwc^tGqaKBv(P_+{v7l- zq0fRo2m15SUxZHm*Jq380%HjNM^~{=?W!`0QGu|1kCxCar14-Z0w2*ayae zF!qJf9ERvWjQzzYyBE=a7%hZJ`wrtE7ze`;{fE&?_$>a`WZDRm&deBxz&HxVp)ihs zaTr4nm(VO`(SI063X_iHjiX^42ZJ@)I9B+y6b#XS7$*p$hG$}TfH4$CM;JX}bb@gT zjLtB+z@YvcCy8e|zBQ=-M%PB?c7t&$4AFlWJ%mrkoW^NnP8UXfPfS94!8i*>Zy0@H z^dWPGgr@b-p#B^E8Zl?XxCTaldY(f(mv~;oo}0lqpLjvT%L8EyP&N-QgmDp#fy9gJ z{2&;Y)a^?dbQz4xXB$&`di*CQDoj2MOwqXHvfXegms2}We9!erM`PtpH+ZMhf5BQWlR@gNN9zajcxPl@P1jE9BEVty3HL>Sb6gZiJ< z?Md_${m<548BfBP4Py$7nJ}ipm;qxNeWr^~mP=2Od0Ln({%2s!g7GZ*=Y-GNAjkiP z=zrbwMHp|wcnQX9FkYtr9O7K!D@5vlb}j0^@rL5-?eQ%b^I^=R=i9<(o(sslBTPCn zG~R`wWbi#0U%+@D#!?s`z*r1p5j{T?&(6zfe?(j&OqMgtV0;RL`fpJG(>Y0l`fpJG zGtcEPeuA+A##b;_GM+Cbo^(B%A^Hzv6>&BBYhio?V~y&9VSKAF7oGv*JK|d6_rxDy z{77RRalOKZejn5R8OBB!8yM#=5@(jSO=Nx*Cd-rGVQvTG512~W|AeVpx9C5Nzv*+M z*yjI;n+ucPk+~(ztznA(!)(%sr~aFw|5-gWw}-hi%pG6?=8p8=sgb|vKg?VsrYX!_ zVKyVbi|}bWP0@dty9+ao_hs&hU<%B=P%OgS8+HJ5ADH*T+!y9WF!zJm8Rq^l4~N+t z=D{!zfO!zi7L4aWi6?z7Gh32rB~022o2_9U0#o!KW?SL2yFQeR=zrbw2$;vgYzOmb zm`5`7C<#sH8_i?LQ2(#yg~@X1RG2+sQvXfrf7;5-Ui9qU$ny-C=fLa>^DLOuf3u&2rsE3pZ2I?a z#GDKB0+{EKKVSGP<^g0b6s9v#zGOiQl*}?=vTJ<;^K+P=lK)Kj ztd4y_M%qR8v|_G=wK>c$Vg3a3E12KG{2JyrFsc9MYVpkCT*Gs}6()TiG1tQU5$5;g ze-J*apX>&TTNj*u$sZPVC_QxU5UF9cZaRR+5=X1SbM^1t5)UCBN<55sI8hcy!DOas7|Q^*_qGgs|$@2i6<#+=&%gd$*@i# z(^VL?mdxsw8YFuVPlfe8tkY$;p zt~32%odZi2e>QAtA?v|1&-3Ya0dWAV3u#Wa#l*Y#leayY-gTxD$+SRt$`tO~41 zc;&2On|3Lz7*--om*2%%?&~^Ox4{|-Yb>l$u*Sf;9@gk=iKFt|)B@HGux^yhOfMm4 z-303vST_r!mO&~M@>Vg_T0ZM`9*(Q?cZe}j74BUPo%Vz^o;ZPcH>^)#-2>}sSogwu z64rg>?^h^G_^bzDJxJyu;=@F)|Fj;ZE$csNa0#e2k@h55Pt^Izl1p;kDRpKl52wN6 z`cG>H51*3I9cp26UuwEoHTOmvBrG^eH z5w&{Ingi=qSaV^$l3u-@hS$V7^M6Abu-=5V5Ej>eTJvBnfb}-4`DzKPxT#f|YAvfJ z>p!zqwbr{li|aq-^!L^BKQfD8EruoQKjk<1H&`FRTGG&AS<1j#3hN*HV_2UEud0DW zqSpT_{2bOQSYOorm%~!){}sQI_$BcxSYJ!3)EdZi8KkwE{5Qlk#BYh;DQxJl4AxqO zVoOv%5Pu}DgSDQ4ogE}9}fG7 zhIeMeZbv*)A&sM89}T+$>|}z3nfqgOTlVM-T)QbMYJ_WYuKkV+r9>i0Lrx8yl_9XTqQvdBf zw5k7gU)pC9`@udB_F1scfqgdY{)$v-kTtH7=5yt6;_2!xV4qL_3t$frvcodL?tj9* zNDN8Rz&bMs_LZp=pJ*hmaWx zdjySP#NkSuY2=BTLitHb4A`dF>DuyXsvv9`KiG}N|8@~}88*lNHpld1}N`xOnl<|KyKD5We zz6JJ88x8ZnQ+ej4_pu%Cqe80<-~W&96&qWGk9>^8^$Hplow;)*gwHu3;Rdd9RJ%K|EEug_B#4={GUE; z*+0YH2zvv08UNSg*+fRh|Mfil9fciX|AE35u>VA1GuSfzhyAzsq^$Nz;~>dCX35}OH= z-d$l=6!t)Y28IPajaKkeqk1Bfk%2f{fY zg@aH~{w+}`H2m=?3awB$7==SoXpKT!y0uZLf@mM2Ft_>LC>+Ma!zD;AbOZ|RXdH>c zl_(sALN^{BjlwZBjwK#PJf3(0u|2T^u_Lh)u`}^Rg)~k=p$mnZ6E&i)kcNSRNy8%ADW5Cdf`Ws>!zdI{cmM?#h5P7GLZM8<%XKTG;1dI4NUWf6 z6OD*iMIlxO?F5Ayjq8Xb>-;Dbt|v2^IHu0ufWnPr#wwIKTe;%R#9N5BDx`563b)f3 zN4%rX--*IqWX2OG)Ol4u?;&%q!iGgJ(Y`;u_l7@Ii+C`#QFurUDcMI*n2N%qC_K*F zf2?6aOBxeVn3UQL8&$1-0tGerR~7zA;uMAImz&%Ug=r`#emV+op)jLi(E=2nLg5({ zo~Gwa@nl`);j_f&h_g_5p2iEr*~Ax#FA-lR&LPevsz(5ItyhV!5nm_1L3~qTmS$ya zJc{JoD9l$R3JZAn4sjt0?}~HQy5B?Leexd=7ZE=sE>=k6BNUdf<@EMKI>&zEoh`g*Izp~DM$-}RRUlUi=6Y~w6HYlutvm*-M!ck)T9SYy0ur@t6 zS4sus2cD(c%Q_nCi9Zp4CT<}9LflB)MEsTb8}WDIAH+Y2e-Zx{bT%XYkGMH;3x&B= zjNjP`&h~Jckl&iPjpVblEpa<32=!BMF`OM#sGL~28O}~{c7+2t&EPboJe(Yyo#pmb zMmbG$Ely*m1}nygIedNQ=gr-aE^p?2%N*=9Lk`> z7|%;t?Q)JF*)G>qItVyN!RZd?XgDXrIR;J#ILDHw{yWFhJ^@bqES*d$$&SQMa5^hP z{Y0spli+lbL)A{5lj+b^i>N^rPFElIN2Cv*4U9y3zMX`Ayjt&N=E3&be^T6Q<953h8+PoIBtQ zfTPM+&HtzyzX;A?I0NBa0q0^kgOppn94~=$DNErp;^hj}kN0&Y91(xXPc~Rael?tH zgk%hGhQRUR422`|4u@TUGaSwc9*X{}3&GLqmowm$7{o5XvEbNn95@B>%&JFGY>CaS zGi5lQN<;3frMc77;t1f}21kwm$HJ+=xt{(JoGOhN&UJ7SI5l;cJA0uLSn?y`j7sec zWpd~w=n2dVJJ;JydBQC)Q7iuC!D!(?t(KJ&UiTY!I=Q( z9(vxbstt{M#eb0~Kb-sFOoH~UNVfc& zh9~MlPx7oOaHheTDsKP!OlQyxI8VWO9?sKno`o|L&NC|VT+_k19lvQ*|n=9A3s2+l$tzDsy;0=&zbNDX>l5f4^akF5=g z?NDrs;$bKr!q7t{^j&##hvMPHBZSHBTofz6#JkzJ?;z?w>2-Eu++FeoXj^Zh_y9uwJ86`bEh^GpZ<>Bcl zo{3^l6#Jmqi=n+GG)wInWcmt|zIiG3L$N=KXOTZ!_|9o+&mnWJFj>s!qj)Wf7od1K ziUUv_h~kCxxk!A{uVfT2CNqe53Gq@Q-~Xmhsl_W$9E{?XUHm97$%BFzGkVilb4y1;sHa zjzv-Ce^8XVQP1I<$lNSU`rfv9D~jV#l=&YNZx=qDi7MVf=1yUR_t58F@ySZ|eliaTleYTeLnuCq;=|-0Y2^7Bna7C}iIa#=D6H3yL2(I+3sHO@#djI{ zo`k0B1d1P!Sw#GhxS05n!t8x(aVd(Qpty|u$HHg%{3)5wgh_XwEPjFFdK8zVxEjS3 zD1L?FO8R^$KG_w&CbLSIEDygy@dp&wkpGtW9dRvD=6~w<@*|mbjToi>zoDq~ePw>{h~;qC!< zE4YB$1n#zQx2DfF;{VnH+S?ID|KX-F>`0sXpRR>)8{qB=H%DIdA8u1(GvY1^Gfi-J zBeT0O=?ZptPq;_H-3#u%a5?|u?jxaT4R`mW|Ng}0!~>+5S{(tm1>6H^90d0exGmwf zhT976!QycI1r4oEY*_dJ+%|CAHnf=`-#$9{{D$M_!aWqOI{h%Xhc_H?SHqGmb7!`1 zSQEo-2lvQ^b@$6hlMc2U+9=PX;T{L~7+&{Sh1oud?(t+!5GE~aw*%b2;C6(&5pE~A zKf@LMhkGKC`tNpudnH`%|KfIqdk$Rg|Kf807nl3LxZMB6<^C_O?EeDybhzBu#q9~V z7n$C0x$TSFr=jn84QFhEEBn7R^!|{c-2cVp{x2@q|GTpPOGAg**|K)`T)5o-MIt{R zuB`v(i38wf`@g`IzW~4;2v^qs!yQDtgvj;(Zhif~dpTTL|1a@p@mvLWFx=bVa{a%{ z_5Uu{|GPsN1K0n%!{9n_hr=zv9ib8rm+SvsuK#ys{Xd-zxLp75a{a$6>;D_h_$&=o z23)THce(!G<@$fO47UcC>;GM@|91npT=4IPjI;7j3~;M(Rng1he+$VVW81Zqq6O}=Gk{D-fqCJ`TB-|-9 zrb>|dy|M=GbTTvGK11Uv;?rn3JbaJ%KJf$MBDm^~RMlDucQKid;Ho;a1n$Rhmy%hgFs;3CKOys}FzUL}vOXvC z1#vmt6%8k`wyT7lbOqcm$$v%snz)L%8tyk~%Ig{aE&1;h(pU@kd${Xp{{Z*LlyB(X z7w&qJKM9lFJN4hC{(mpp2v;TScetYeaDP*n^&>9z-xd9@>*wDnH9=`Jl(sWlITB5yUMxgXs0ClkJ28(q;JYfd!e*1O4R=n^* zit=puZ=%#6{^KZ}gVGf!or}^yl+HtG07~cctPA9UGjv(fV z8c`=2L=&YlN)~OKSWrmAL8(Z?C6fcE~OWh84tPK%}}!+V%(~NP`XWF>VwialpaRu4u;-I zyo)%VIDvRK@gAbe%!g>)htmBt9w0ubFqSs_Mj?%LzH$~|=lzu{K7D^wY^gK$hqVxhv zb9u^alwOqBBokgj>E*gTCoK{3uL!ATL`$!s^fsB-QF?>Mo5Z(>^AyTlr9?F!r9~*E znfwl!g($s`(z__VCo`YCBIEo(Y!-(Y>WxWhF-pr(`iN&OL1}5do-8AylJOZzpQuw% z;>@$k2eChwNW}O;p_+O{X$4AaQCf-8YM%Hd@hgd&_$f_eS|p z8vCHUFOB_(`xBcJ4pH1QbXvBcwu#}iK=wkLKVb|iLESij1NWKJS>A)ZX^N<4+wjo6*ogLo?OG~(&R zp2S|n-U{pSpHa`xzB218#nBJti)fsM^4Ta~h;o0F&m(gV%I7LW{$L`W=Myg=4p1l) zxhx%dXHg!A@*tEiR!rLZ#87Vu%a@|8&b}VMr1sHzO?VvTNld?V0iqS< zCs3B`LU}UEPog{>HjR0pA#ST zt|#++zJBg(l;1=7MU>y9bDD?J1)w|!<+&)ohO&r1%CDy9=BCU*`SsLB`HeJAl;1)* z)unkTzg-WVkFw~$`l0-e%7I+V_9(xbGAzpXQC^Dj2Xt6e_xup$#biYPX)Fa386Y*!_ z29&A)<&7vS!QX`PuhMpu4p5U({vG8%RFc%yg;(!l%74LQUr=Tj;B5v^2A1$d|KW-F z=cYARZ!zFWtB2PF-uCcB|9Q9#ylvram&Tu!h_?fSb|i}a!vm4}?@|9f(SLYNiOq<+ z5O*bt{==jAdwbB{leiagZ{j}0eHG?*pGkXvc!$zx4(|YXZE3fFcc4lhyn}ey65hcy zT1gJbRa(PqBk5O#mA<3&4pF@P)Of%<4BoMHI~?8-@Q#5e`k*op-jVQ*lAIL#Xw@{7 z@ozo%j^kPE0=yI8wTIUUUI&sLB?k58D9gjnBu`99cwOK<2Jd8e5xlPO2EaQ7-nsC) z!RrUFJG@@>??F5jo{S>kolfkjFsmV6Z+K_I>qDMO?)8;W)=yR6$e#tTKRmVmpUqRX zeeWE_=So-Bi}E~pqW^SO>;J_K-i7cSco)GN3U461tKeM>?@D-s7*u&tBfHz#u{YOK*JWtW!=`;*@HaruaC2s1q zY}&_pqW@$*rCSl63$F~1<9~IV>OGz3sUT4;&xa@a4^PJbG%8{!t@f($Ccul~je*DU zzen-+MEv26tox6GcRiWW3jghKyc^)%2=6WijfHm;jho@!2JaSS^N<~c#CAJ8%Dy+Q z;SZ_d481c|SK8whssz)%n|Kerd*MAy`#$3R@E)M?AW`bMdd*Gy5qL`ZMQnwXs{1(n z&EZXi_cFXm@TSo13F2hplM2~_rowv$-ZYZag_H!(fcF#)b{U?uM78RG%(L)j!4v(j zx3%ZVzd)R=kcK=0z+;l6oz8*xE4;bzeu4K2JSv+fT>!k-;JprS9lST-eGl(Vc*|AH z@ZN$qPe!fY+r;_A1;lrV3yJR%Wl00P_lX}67ZE=sE{3Pl@DaRa@Rq<^s^XW`R+HN? zuRezNiF!AkEtyb#iuW1M`W)UDxjyPCAXK8t>a>FXE8(qy_a(el@Vquo?Tzp@NvP_5DtsjLeuMWr zgZ_Y@iu|AO{t_R_+rQy&CN|rSw9`fR!`}k_t`h2R34bg2P2o3zzXSZb{`=d&-GU6zl}Kbc@KVD zk@0kR;~xtDF!+b3hxPkP(|jcS2);^cANWTz!eiifhkq>m6X72R{{)i9OSGzr`t6lL zrUQJ@fB2nm)K=6w){uepec&5W5MVC9DVhp72kFPucgS3sB`%kB1$E-&>J& z<_!31l1KC({+Z$|MnCvxi4U`djG6*E2fmu3IT!xr@XxDzo)7;5_?N&R0DmC-3*lcR zC#t5wUJw4o@CQkwP^%D`NcfjBLh8TttyAGs|5d1JaJUh`hZ2&F205N69=UO!^HIe%88 z&z8`1M$vzX%*&1Z=fZyt{ww5P6+WE{^MDh@R!1W8~*$7=fhtJ zpYJ98cf>QDA=fp1>F)QGI1)uMK{V#=Ag)4FL{ja}@%pYV_W!?mT4g7WRzlHxj{O`!G z6`w5Ue;_08f3x{*e?9yS@P8uzv+(JRt}pZd@HaN{{1w4w@PC8p6J0Jjp z9qGT5_^02#3mVAC``>IfIB1GsR|L(-%lvX>D2=+y=H$yr9 zpXN`nADR8dKh1~W00ajiXhHtKMtn;$t%S+$t2KfS2-+ZMhoCKj!w|^)KY~NWCyQU^ z{}CL~h&d9$@d%D0e>73%{}IUhUj)Y~tlu@~{{xx-ujg<_1YHqyLU0lS&i@A|N@$jH z&i@CT|4&yt1g9YAfuI{>?k=9`*Mx#o$#DKZkokWEJ&C>OBV~u64}zfx&Ok5_L0<&t zA~+Ml*$DbE^epjAzXKWcCv%Q4=_;e(JOl#}aQ;8w{D1n-^x#5za{fP^)ekO4a3z94 z2rfe)^Zy7gm3Y+4DX}jnULj28e-(mj5ODrKkoo_5xwDM~LmGJwLr_LA9D#*k1OgpF zp0R1-lkR&S7-URgI;MARBPb#$kavX7>b6U!BusXX9)iaZ_y`_G5HK_(R)~=*6a-ab zOiYM1;&sH4#8E`~ryGsY2*%L3fp{ZvEb%7d&BR-Xw-Rq7-cB4xyo1QUbq9CR9#5P= zyqkCrk^8>{{QqxoKbZ%J4-)17zw%T6t_>dHeTn{OS{FQy;0Xj1$xjkKRjObz8S4K9 z7t@}KNR`Djgi8@jM|d2983@)RcnZM>2%bjpDuS5^W+Qk8!7K!#{|KIwII|l2Jee1S z$!fxj2<9Moi9Gc`Rp4MQnODR!-BT=h4Z(Z_uOoO1f#^SiHzhPH*?DB%7A9-63lO}E zK=dEM!bYB={|Md}Ce`*}5rUNnK1A>dg2f2b-BJGo>VKBbWjyO+IV;nRPZ4~9;4|`{ z3!kYXd!=9nnHdcI62Z3!zCy4X!PjJ{|LK=8f^W#I5&x{ce23r%1fu^4z85~bBhh~Z z>x4=B&EO}5N^gHgxCMd@2>w9u3j!thqW=gsiD%kx2EUOJ{jbONC&JATQ2&F!g-`D^ z{GWJ+oB!(>Zi#Svgj*rp24NG1ZY`l{UmtEuW;_AHstWivA;PPCS4} z{ST@CX*~&Bl5eF@T7>wwMtB6mHV6+z*p`gwf0o1HVPr)AvzivRLwGd8Bgu>YXWvN< zssEwqe^!p+@d%3uPe6Dc!uAMHL)Zb~$p||lJP~0h#vuA%zt%})x(IV_Yua5Ac1L&$ zZPEXFntPBD{jcZw=?Kq6*b`wNgrffldoz@^UCrbR(^r`6uKOYEk5Kd<;n~8cwK^32 zM|iF;f?(B2n~dy{|I&AvpW*~M`#gkVnOX{r@k12(2?)P zsKsERi|`qQC4|=_EF-KU^bm#!efkFqvsN5d$V6n=io+P;bqEvkHQ}@CjwCZmn5>?U zMmQDW7=)7%-oVfsiDQY>|4{TlH}D&Tw;-hcht&V@c7!Uy;}G71koq6qiEskKyAY0V z=&-C|!!7ck@n6;;6#bV!kE?HDg!dw(;D_u2!u#c))aq*zq3FN*A$+LeZ~j9(i5W2VHL#X)A5w1Y^1<#Tgvj1g=E6IFG<_+3kBUFXHiuP*Z)7~}| z{YUt%FxlO$Mffwq?-8y;_ya?Kl+g5l)8TqDKQ;2-fN&GSU&wDHpSJy9$x#18(SL-0 z5dRdPENA{kWhYcNLuG4J{)ftzsBA7il`a1Dscc22i7;uNRJK87dsL|Z73zPQw#p9l z6#dWE^H+e%9;h^+(i9cZe^hps(Dch-m1bmiA?`}tjVSux@Xpt?_e5nMRQ94R`k&=e zWnVJ;36tJSr8z1CQ8@sWGf-)PN*h!TM5Prf2hp>oc&4j>DhHDhrOi~d(iW9osEGcf zawzdI3GH?pH1QZzjzy&lD#!8gc;X4f_QVdvj>Jw1X>=x@NK~(Y zFR$|_lj%x4h1iYQo!EnTD)BT_PN&gRq59>5aj1y?qtZvxpYF?0>5Iy_sGNz)*{Jkm z=vfk)ww+3UGUo`B_Oq4qP#J*A`Q$GUKHZVILjA8$|I?OUQTekFl|iVyiOMCYyoSo9 zJnJ%|=szk~pfUrMD^anPKA>_HDuYER#J-w%4e?r3hR_(Qkj5}nhSL~9%-4Ah6`hPh zG>MjkcDj^yf#?v6M3-11mWdwGCkDijSRqElDlsM|#2PAh(6|njku*jTuUAN8G%922 z_6?}qNOEkQxe4k|e3|Dh47!zg8}W8j#wjCrTUQ?5NxX|Vo;ZPcH}M|gy{J4+<36a# z-Yn(^P? z$NyP@N~eAaN-54l~}HymDVXuSn0U!byF){v{g1`!qNe}(#gmdA6yMsz$Xs}MCoWi=`r zQTYayA5mF@%34%J|55o)Vg2sDCnNfwJ=<2+q4F~-)c;DV|J3=)26~GA*U#OA%HOE` zipn3TQ2#5U|Mj~Q{YT|5VN~`iJK7A<7Kr{wTl7C0$3|O{5&h5l`e`+>5w3 zaUbHo4FjJ?v>)yLiOm(tPvUHWs3oEUd3DkMhW=;LZbcOR&-#(54Wf34+9Em(5%oV3 z{m-;9I-LGT2$TMoAvzM#F^G;Lf3)yv-xnQA<~U)}{wO*D(Evp45uJvp1EP}=bwqR` zqE7Ve+{lyT|A^!N^w}!vil{rHQ|Q@EJkzm3)Pu~a!W@{;J{{57hXA>VHK2k1l7NGXIb0N*VBQ${NvNM2fkZq1VV2vvY@#87j<)?D3=Fh%7`S5b22W z4Amqw%MF8!NoEFZ8&MHafwm)j`eYrsWJQldmE9Dsw$lT(QAl8L=PgWAi5P% zglH6^Dxw;qnCD7v*ROjWnUTU|E$DhgHz68Lehl#j;*G?y3hTLgGnre2N$0Gh+Yn7a zbUUIu5shQ$9TJ-5$z5c|3zMb%ZbbJXx`+I|!lz&FiS8%!fH3JZUGxy5nTQ@n^aP?u z5Iv6QQTjY4KAmN}ifAHnk}&D$D4L8&P53-Xev0r}ot#EyIx)@dr{vixdRiXn)UVCE zh@L_8BBEyzskZqXJ!eS_>3@r&7s$*OCVk3_UP3e%(aYrL2;X5D?N^Ae3X_hLqt_9A zh3E}LixItvXd$Av5Y0zK{g0^sS&l8>x$nrinIfr#eSqja^6v|ud2;+8iT>9;KSJ~w zq9uqvMnwIOBt6-Cgy<8-@G1S%*gi+J0ujgmk>qDKyBJabqc4TYO6_Yz8xXBR^gW{0 zh`vSi4P#p)K3REvM`o=sSy}vmXgwks|07x_e0E1ak@;DeEdF0mRSL5aRi!YS82T&m zH{$Q8?t|zLse}iq8vZAuzi9j|Sluk+tN%lFb23{Hx2*G9@vsT1ThrL4&Tq@Z?NHsG z#ty_Ci8~QNY#`={I}@7{n-O;*?n>N^xI1wV;-194h0e;-Ly@9ER%QG>#y)BOXaSig+~f7~-+SAbHkK0HtK)1i5w(%JLi>sbb&kN|u z+Frd7)yq)52-QKT4rHk4zub<*c?nVUKbzO8UXJQjs9r(-O5uNvXb&ce{%5tfdM&C& zREMCdqdFAT5vUHM&v5ZcpGvBEGMX@1$_-R)R7L+$wS-TfQ>xVesv}I=I;t+J*P&WM zRSABX{+@)UU$U(RWI|$kFA=Ha+V>LgQ%K`}R3D)6An_sM!^B63j}paM?Ndy9B5@M&3F2hplf)^+ zsl;i->BJcdX*{KNfTb}L)z49V2Gw^_eHPVMP<;;77f_vr>hrP#uiA*Y<9xMkE2^_m zeNnd4Rr@AaUqW>bsxQmFt7?~9wZC(9Zcc5`tPa(d&DB>?U4ZIqsLn(6byVL(^$pp; zS2^_h9@V$hb(O)ZzpXa0MRmT~_E$)?m2>qSR2Rw)#cKCw*|K&xs_&t?1l9LZ{Seg; zP+cV3#V)^)I~4Da>S9#Y&c8X?5LR}-Rmon8>L;i!L-k|XxK{1&thS3CvIx~rQT8xSWaAl>Q|_)MD<>HmhGES{aO;Xd_VfEM%)3_Z)mR}eoOog z@eZi2MfDeTE~?)Xe?av|RM(@rPWdQCA)QrDs;iGeb%R0)5_==!&1h^w^;eapsQ!lP zpQ!$>cHJfaheFwbxB8c4xEOy+kn)WGhqwvi%@J?O!!5*N<=u$4k~~!V>MB&*F~?gY z-Ujh@w6_&i5Fd}Y9pa-AtNn=QAwEjB5>^hfp|CnU2Jx}7jk4Is2`O7DzmE6>#Ot3$OF zb=*-3F78C^Ogs_sJBUw0>?7`i_+rE-BR&&xSHwLLpMtoD?4})eL)@JemHVW}ry@Qr z-C0}qNsmv@_DPR>Ay)gCbD#9M58}Rv&yY&kc%SsRAL8>7pN04w#AmZiRZjMooK!`r z8eM!Y;`6x0Hup)7FF-sH@c_gZru%M7)GAHr^*azAD{!8}VQ%P_Vn1e@C^ z#2VrPVjZy|HCeT+*hFk2w$g^i4Y;{adh8%pCl<4P(qmW3OZH5E6LA@_$8EUZRERi0 z{1D<0@mRza#MdE?5Z4e_5y$Cn-LfBaocw2>^mruVF^E-?MkBsn8cXAS(qpA9+$TN0 zG216Sz6tSo#5W_p9q}!QZ)3^c`k#H$<8g@ZM0|%7;y?SO$5{y?o`Cp1#HvZ&BgHCB z;NG+Z6(YVL@q;WuwFSJCU0Pm8LJ1$|cQt#IGTqhgh{HRd8w}cqMxEebVE%vVGFyw-L{m zB2fFJ#|!@5Cp}(>_G7wCmHs!{Cq4cG@hZg25v%&V0`bcK?2{g=n)9{j+lu-=>G5jB-y;47@tXha zlOBJEc3*CYPvKl`M|8xa5UpMBEfO^AO-{43(${gXCi5eq#crGNLnD-1<5{0c15y>w1{LkB)k8s zb;+Jc_WD=rlD#vnOZG*wU#4}*{zwi$(p;|FSnHAlk+el}5R!wDw9K?FY4xwxC9RRP z`B&?bLy#PS6K|+qEcShy5tNbec6<#bxA)YA(FF@T#DpuBo`p*kK}wL=O8)vU#&}2 z7r<7gn%ilFN|{Msfv`t5~vE{zvPQ ztC0*vat#tS*vnDzR5_|Vk^W2lkPJgI{GT#Kl1EZRq9HMn=u(JM>kM&FN|;zk3P|jK z^iU)*apX{SYKe=)qftUqZdBqvOSv@LT0FoP!+=S#tDS9pTuwo2Ba(7x=klc&pAtd)9c>u}%|7x!q3MQ&Akp5A+$mC%p zkNi_-kf`?f9FoV8Oh+;i$z&vxSYg!Vp2(Crc@oJ~Bvby;XJsIn#=|#}%s?_zv^seT z$GW%Z*|KevPstb@h#%eYP$=rWx z7m`-TizSVQY4?ySVmO6K<}J-URbV*=~JTW z1=OLcs9zvig=9Gr)hVdM6~vYG-b7W}uX4*3eyuRKTouh~B;V5bhPXyyZuy<+hvYlr zS{^=zMkMQysEktNdg4#@Ug;Sm8*IS1e-QuVp{jU)qt*nq%}`UL{V!4bA5oPBd$;93qo$q(6mF$ZJr<$1HEP?@*oL?* zpOu>CRy0Lzd*TiXRriP5PN*G<8c^F8wFcC7LoJ6|GY0KU6gNJa9f_KH3Q)K!54)hY zJ8FC7Rw!c+;+_g~EBdM*YI_s+;o%_E_Cu{DYWt(6qEd&=i3ccDy)9}7=2oa_-h&jT zoiA#wP-~N0F$T4RQESbvb_{VAYHd+FL>}~3%u2QR{$O$K1*$Y2S@nXVki(b|Pvg zD-yMnQ0tOg*-RV+o1xYfwNr8{TkufjXLr<2Q-`SaK&uk?vGpf(h>Ve-f+5$ z8fqp<9W_ISD@r*Pu6zPD3pG2p^7(WOgPMa{NgbkAM9s~~lbQ;ehgvzeaw!j&qNXlg zMJ+(Bf?6m;9SK^6S|sxTa;OR}My-ZglKWB>%|?Z&UB|&s6NRXal5VJWJ#jQ@|Hsss zfK4^Ne>`MMeCM?$*_BFVsZ`QpsVLbCsfg@RL`Xi_%>VaZ*L!`hdp^&7o;k~NzUMyA%zGw}v?acmw(GuXmDEU*;4r~O z+LH^Gu8z{2|4GaIPckE&4v|*LGXIZssR5Vyf21oy^k*OGdZec#Jq77Ukba1*4@;|l zntFOF$uuE)ZaMuZ(oZ1G`TsQM|MeVrn)Cl@&j0H<`SdeL&qsO&($6D36X{tOd}zg z9fau5dNMm9vnyd^WOin-i?r&k$n1v99?0xY-bA?mlr7VgWKSV_&Nc&Njz=bi%%RBC zA=3<*y^+}unSGeKuVg0cus_KGLiEgb=0IdxAk&=uAmMt1WDX`dM2OxqnZuAd8kxh9 zISQF0*m|V2s{J6_)sosuh#sq%*2r`~rVV*p>M_)I)b>h~ah^GrL`HIL+fP7d95Nk| z8I4RQWJV#=nK>s?yHLBz{?Bxyo( zpU7N*%!Tr8nI0F&-?IlGGZ>kn$XtZXB}}+jsrp%AWQHJfsrLuzxo)Xb0TF73#i8@Uf<{y#aVGGmY#iwx)gGo1g|pHO6OW#(;?sof@XJ2Lkm za|beaAtUqu$c$${n;1`^%KU%g7@2#KnS{(la+&{6KIzNwbBfFZLXw^*Bl8n7X=ENn zCWB0fOcogjnH(|}GBW>TK#9>hshWs4r6IQs+@$qP|R>PhCJ=NL@sIg}Ru! zgu0aaDs>t4HR^Ju3|^nSYS^i~Mil$(RxUN9I2vdK_kVK-NTdM`U+Kb|-1g zHkMZXNpx2HA6Z@$vbzaaAAx0eN45#F2ID=DZOULz>R!lpLl(%k=gSnbb;venyf<|p zWcO78p(qLplqqugqFFV$F zC%){A?1?qfg`}&z?D8J6C)Id&WKTx+3byu0wZ0bFp2+s%%ih#eYMG}Zdm6ICkUbsQ zOOfrvb?z(QX_u|&M?C}CGa2-!4xpYz9Y{T!suwwz@p;tqsTUx7F|rpTJD4vADdm2+ zNcNa|6so+@B~hY(Y<{ *~^i=tU>DtiCaI&rLN=_jYRfNWUoT@ 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

m;h$`KNk{3YDB{sPn&e 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%0AN6RGYk~M0#D7IxE(fF~@;aC_Y%St4)fci3 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 alyu^w;B*PyJ0>)?8Gy}7qhq2CnR zq|lEFeT(}Y{2u;bo!*xGgz_`|1^#NTH_q=0ZC2v6Xyyf?}|a9`NWTyKQt3b$5xe}xZLnEVePNKXrRkafBOV|n?YA*kcjKYU0 ze3Zh6qaOj=z$2~4+mfSEj)BL*w&ps&EM!OEc!kF)+)m*e6h1-W3l(m!@YxEVsPJhD zpF|H=Q}`6>QyqHOSNL=k@;`hg^;r(1&*xO-a$xluGhi|3s3;Q|r?vLRC3g50U`5zvLI|vT89&g|8 zKq3FbcTo>9*V|?%|3@n9w^knd^=7u)>ciJPQ30 z_$VB0J>Hf)j`9Q?1Ks?0kLq}Z(+WSS@JxlDQh1WWPb>U_!q3q8EPM_=@31~5`5%4} z{UtaN*B$d^g{La~3i_*XGMqwB6Ke85{2KLiIAa@kmcjvrUsw1og=gcw0q4Lst+z0H93=shFlDYcen#Q>3TG8AW91Yk|HGF5 z3KwB%oBj$)71rQ8aGpc&-V|P-@P~-+D!h>5J@`KSz@hh?9A2dG#|ke-{|GLDORdL! z{s}Kb`2>CnKQq^T(hh&2$g>K6smQqsf2GKQ3NKgqH-%Ryyiwt=6<(w8O4eEhzk#c5 z1UH|Bl^?mN@)CWU`g_*?Yv;P>zc>+z1^Pbfb_@<05mx!wrBE8+zB9|~_# z_)mKNf|maZZ?;ZvPq(6w|6$92h5s|xeUA|NpCUUcvYqLX?IHOe+0lC3a~;_kU6A~b z>`L7f?&e(JitG;efP2CQ*a-K6d&7O;zOWhG4>pJU!vh>PberAKt*A%~MUGSCAVrQ; z0r^3^q<$rw~@;_qvugKZ313briykpx@k$#Gtr^xk+oUh2G zigZ%sB1JmWc>(MKFWhFWt|%A7ZtxOw-I)`)Op&V;4QSa)Tl_Bi^V;4~m}fCfLiNdjweQt;j7DeIWTC>1#di6H%nUA`dAtK#`$}+@{Fw ziVUQ45FBis-jq-hPchA^#)ff8;@Py)7B3 z$T&qFR^%~7M$!2Qd=!qhPH#&dM|lE{fn)#AWpTVBPf|PupN5wI^%0&^bXP^5S7fCk zFDUY^A`=uTDDt8rX+>V5eJuE;C!RcDtKnGC1Esc;&64NiwM;7m9Rz7A)@ zH{cxjCVUIN4d+51^uquQ!jMCXup*Iq9Yu-3xFU(Vo>U}d_3DSPGVD546UKK#0mLN(JlWK`5b;>J>Hglg|Zy3fM1*Ijj&3QUlsXAk?$2*t;hyN*3h#S zu7m5X-`k#zD4XE7@H=yP@?`M`MSi3p|06$BTmE~`w~^lz`A-oi|2Hf02kxJc{Et}v zdq0_qY(d`&|AChO4cC%X(I$%SsHk%x|4-5FAo(A){P(Vx=uYT6L-Idr`S0y}w5g(} zD!QAZhby|fqK7EDhoXBcx+nb&uo3QMYq`fWx(~{}uo>JBHi!Ew+Cow1_y7IQKSiBC z0q{3$?Mm(Z34o(Ge*%DFo83~;R;+a>Yz-~{>)U^XqQ@%Q2K`8Q6eRzn$5^L(zmB$5 zw7sIo;T{j$!4s^<{e&k<{zonU6+IcAVy<^QPgAt3qNgir@vi6@ijx1)vsgSETK?Og zGh4&Cigs4CBlUUkeAvlh{a9Uq(gj`!FWSbvSkY?~?WX7zidz0FdMUgNUT&S<-jV-N z%YQ|$hTY9|Kb?+Vt7s2JuS35c-T-g39`CI6L?Qp9mj8;{4Wd31Zc*wdMf)f|UC~<= z>!fI3MW0o)pR)mq_J;%57-#V|MVFHk3gsKP8m=+d+mdyP?W^c|MgLWFgQCAGx>3;| z6x~E8`5*m``g>c;+q)l8eu6*4U(EH+*Kdmct?2LQf51QCU)JM|uo-0w+zS6O*Zqx! z=zogss#p`nc2vxntN&AMJGedE!8+Y1uGmf}J43-;%yr*o$C@hEpxAEcyTd);p4Q`T zNz5(>#rA@G!+p&4Mrfv3TgCQM>`=v;D|V1#`_pp(JP@|9e)sMfI~e5<*b=rf*F7?^ z)`}ge*kS0L-`Ek56qx>^{XV zRIHa`7b$kNVqF!xOtFhus~fxoUTPz_XE|p1uh>;}cILBAGW2QB~I z5L4_%lpe4ryvbZ|gqsx`q*!mo`YCn`ZXb9n>}#FwoiWxQWdOVl4m8(04ucgNqS)=| zcfdQLlmGv>B|}l}hWEgG&Goiqm}1W;He9jMij7cgq+(9~JNy0sd=Nfl{obs0^51bs z!AIbu=6W;aF~!Cy_Bgte|4!!^IM#aHCxO^_lqca+@M&|s?Ri$QR~36sv6mEk9`^+} z0lrA5JBucwOoA`NSIp&ASe&fb6pE>E8hp)R{k3K&HczpciUk#$rPy1Fy-v?;_y(K< z-*o8CE*9TbY%YZl`l022edLg0S;fMNB@~O`MqvzE{x|j`XJSc|6ima6!}{6JDOOf2 zk6wU9X!&2C0~M4itigB8b?+Ck`HFq6*aF3tD)z2oA1bzxp7-GU@B{1jQeqLxV)zkU zVlLMviytetjN%jcDg4Y~ec!)OY^`EnDz;LwuW*;c74U28^j>QfihDL!Q?D`Co7+zQ zf2-Jf^bK$$++;o8eESaNd-wyi{IBQ0&x$)C@QdQD6#G?iC%1o7%n9({72B-XAN2nT z|AK$py520^g0dC<1OGMGou%<6itnhnbBX;=@$KODa0lygw?9t)$9F~-B>&w{3F1u^ zZ>IQeiZ?30JMJFP@?Y@=hu&Vq_d?klTK+4(uesiLab+J!|o!QI3Jf!nO_@2XXDhk5~L8 z#oM8i|MB+JCpxTe^T{Zuz*FIA=DN?@@iP=B-s5K~eirW8ume2DI{B#wiyaj|kK%mT z33hhqeU23GqWFD^U#NI5#V=C)YQ?)MewpGI)7cGP0xz|-+<6th9EJRkUrBwHx!y7F zuJ{d#UxR)vybfM(J>Cf9f4m2JPk58L?(dGqZ&rMe;=L8`r}!;19Z+ph0JPDtI zPn+wF@T}r5AwH)#`5%9Q#R<^Of4j;QpQ!j`#V1j}3}1n-I;@|mDJWCnH29ji-fPWJ z(%I{oO1!D~EXDs){B^~bDn48BoZ@dN9#(vg;y%USWZk#m+i zL=;ad9z`er<8kVQ^?1i5g_4Gr|B7eL_2xic@db((6t5~?#I^iaybLSW>CL(t$~$l# zoNul-&bx|#sQ5zk_u%{R1MBf-<|35Eko=D?G1nX6W5w4gzD)6zihrW`mx_N%=V$P9 z_=WX**YZ~=%i#+6wYlDCt5Cjy0$!;^_lERgN?Zl6ZhT}h#WjxW6h=E}*C}y5#SQRA*aP-d zVt^7iDbZJnUP|1e#LY_dZrovFL%Mxq$BvENH!0CaiCY_&yw|woi^e4z8{_Mh=*PPK z9X5XSQsYP0D{&jjKsdtCuUPqY?-+*(>b<-^ImXe1m@wO6wDKS@xyb?YoB1(||3GzP?WUUYk z+q&Mh8C4>s1o@vJ{}Yz~N+hkvdv)^P`F;V@E&r9snd{|DL5c4Xi%OIz%CG{fum<08 z{+lBu=E3<&d`_`IiFYX$!uR0&@B{cET%^Ru6pNMkh++v`>agL13DnErC-77FnZt&U zi_~AhFO^uQ#8=eI&9zNhp~Tk|E8(iT{*4l=QP#kSV<-ZcYIIJH-@;^cTC&>Q<`R^U!zm;sN#AYR%u%dGd*h)eEC&>SV z<-hmjocy1XJ1M!H^(4vvB>A5t|K0RX?u<+RC&~Y$<-eEw$=#IPPs!bt+)GLFKS};4 zE&r8lq?3(F?u|nJC&~Y$<-fOI$>vHPq$K&DB>$7-f0F!nXJGPRMj-!_EvZ}C2%g(o z$*Yw-Ovw|JJY30Rl;rt8*@n&|;ZgADZPq##r7b)T9uM0&tdHDY$%~XcQOVPkJPG$? zcnUn#I^Fj~$$9;MuT)bI_FJ|Nlwy|NkUAqMWDX1xoV&|0FvpY5((2!zV{K zTz7uM+IdRy|NkWU|9>3OM(C>KWlCPmnBCwd@KT5MZN41k3V0>F%3SxEB-vfb!Af4E zWN#&}RkDYYJpU)Jr}GAQqxHMF{z~>izZLd{{jA4(#Q`X{ z!GUm)x!wr3D>+=rJCwXz$vbiHfvVswDR~ddz3@Ib%v^rHujB|NM=E(g`UCJm zX!&11G7qDSf{#GU|N3@5rqroQKCa|9N~bYR&oZe z<-d}%pyhvkHj@8I%YP-`gm1yOt;Z(PTmCZj{XJw5`JYp z-rQS(@-Ao7^>l848{sBf%S)~AP`-yhz#nnl z?f+THKa{lmSCZ%dA8G&w5g{--SemD&mJY(4JQrglNu6*h&tnd{yuQhO-XQmH+a+83)qDa(JQ_JZVpY9H%& zpB7ThlsZtU{cxMZ{ow)Dxn8N8l)3@^M%V-Pv>tDSUMM%i-tZRK z2j1#jo=WwF{a}AM0Nw@%!a;B_ydB=*u%UQ_Qgq@<<)N4vj zrgI9M3a8mx-s?_BnE_|QS-4G%_Hwh8dV^vPd=tLqus*_Er4mZ{lnN{5#|^+B4AE($ zDHVZH7=v+#-e(}Gq*6JhQt0G=Dnp&M9{28_%A*uu5thvLW>iI~&y}hw^`TNVrQTKQ z9eU=$`EY^tZ?G&+xQT{7;ep zDe^z{qq*Mo__K1(b^VJnUn}*i(#}@>rnECBf0y%iKJ|yvyDRml(%UKZms0;IMgFHY z^D0~5)@@$vUzGohY0hlgri%Ak>Ft%4(&T@d{7>&hryX-|Yty@+>MH2LrTq%XaP z()%mDr_%c<-9QidpWcglZ-?HUBE2t4Gf4iYE&sjamOen~LzF%cw*@>19&A1CaZ9&E zX$233t<80hTl#RN&r~Ug=Yn zJ`tV#PoGSEiuHISoQ85bJOiF-uD3mBD?Li-4oW|u^f|ca!jAAfcs}f8zd@Jo3@?CP z;Dzua*cD!^bRVU=QC|Wtbx3iU(w9?Q0k4Et!K-0+cn!Q3UI(vtNO6PGH&XO~J>gBT z7rYtvhPOCuDDk)L>043y!hWzn8~|^F1K}Vz7~T%=fOo>X;1DALOV$1V_S$9eUZ7b`JFuNAcbllrAV;Rk}!L36^2S`n`Rxp^*P+ z@;^P_T=xkx{jSm6J=J%?Liq-+hUCBd(}DClWt^*iy)w;|-k|h|VK`cLp@_zV2iVf}TT{NJqfALxI=zo6xR{k)L>>8Z(}wy;coaMu9s`esZQ*h7c-T&v4$7QB-5#C@Pl6}IQ{buaG#Ws|q7dkl2%2@t46!=~4%w-Ht{%6Sl4EdiS|1;!&hWyWv{~61FR^b+q zv0H#LHz-5?XDt6wdODj#(TlTiGwcm-ap+xNnOl{)O_{#v{a}AMfSv`^1K}Vz7~byC zyOU<_ROWtV?o#GnWrpAmg?Gbytkb>vGWVejgTvv7ZQKV?9)u6Uk&yiNMsW5tq|Bqr zyrRr#Wu8&yF=fUnWBISl6L1V1>(EQ@%y^V1;ZyKwbKQ)}Jgdx$%8>sV@;~zeJrk_Q z&HoJfpCSJxT&ag5Il!+*lS0<`VN*VG$WBIR40wx`L@5eLbf5!4( znJmni>%Pm*6qKndQ$#2KGiBHovgCi3{LhmAS@Pfg zeTnSO%I>DDSd0A6TK+5Blo4zkWp{_)w~MM=N`> zvd1XfPT6B|+rs1E@z&{{h3p9^?cs^=By+v}Iz`ztl|2>xGO(S@Dg*qt-4IvtCb~5 zvRB|<39qsqZ-nkB*T8Gxb>?~_+@S2O%HF7KFJ*h+_JlWCk2|}vH>321x4=H;ddID= zvICXvhu$9!fVa`(&Y3|dgW>J)4s+e7uk2mQj!|}qvJWadRM}z5-c66?zq0qj`>fyn zBrrQ1Wdyt*TK?Df=pkhvRdyu$!*CRQ#Cp7AG8*ME_&9vRTyJ~ED*KGG~rYP!x!KL>+xReC6tM95`5WQ_pdv%uPXbuvXhlvsO%JFqsmTI z_DyA{DLYHq*XW-PXTX`Zu6N`u|COB$-+*(>_0H^D$_A9R{8x4^^g+M%c-vbTIK-4KDjQceqig~<2~#j_o$eE6mi*7=(DSf>yMVf+>^sVqsVlGwE&uCVG7n`w zbk}+p*PYw%DeDC9`^tW*><7v&QT9VR7s18wBkNya$)M~~_%U1tKXF(;GM_2CT-ndj zzkuX__ABf0j?4=5ui;9#%3N=MS1bF2vTKyxsO(zYb#Oi0V4dDM+Jy2g{0@GP>s}W> zD*KzVKcW8&e}TVl)AKvZAMj83m$}|q-mILHw_B8Rf_JNOPJsWT+;+j{MIx;5KgK?ycOx%I%}v z{>tr(+YIgpn_H**Q`8*!pCkWsEpW+yH#2jGD0i50Ezw&+@;_&1xxOWbqaOj=z$49d zk5BGsNjB=+acdT+JDA$%A@;_(!uUtFpce5qe9_2)6`LEo`=DP20a;GYHmU5?| zlm9u(f91}!9`DGI|G5t6=fHE#_4epI6THq}*-F^-}Iu%1u{pqH>d!o5X&-3}1n-I`r-ZxhW`9 z;WTLZUq72OlzT%t%YWr&LGnL0n;v%#%t3z>z6Htu++1q={ukx^FaYiQUnoM#+4sLt z^A#{Tz5*r}Q!ZZD?JHm!4+toiQf`rQY2|9lWt1x_NB-x?{~Y$!M-|`Z#UWVj< zu4=A#g}$TQLgnV+&W8)2oBvIy--GYN51{3LeT2ozeW~0>%6+2T5?t~>NB-xQS*QDc zE%zzzXOR5QS^nD&+EM*VxmC(7r(OZc|J+LJ@#g9`=&RuxxYk_nnp&@XqjDRR`%k%z z%KfI?Cgpxq?pr#)gO>lw{a|Z(WB!Cf{^x$7CjY(T^Sg3R$dmuMKXLzpe><#?umxo+ z{0IJPuA4deCd%(*V&3_;9mV#L{Lk;WP3O+a@20$P$^Sh0pSR=Vy;gpA+&v)qpKsX4 z-AnnSl;2zVgO%S$`TdnA|MTR3em~Y~ZvF0^G*ABL$^Sh0pFhZ4_ooc`LzF*E`If9j z{^t*+Zf!m8(aRr>as+Gxk2KePN0UEV`ID7DM)`KiAB)=-9tSP|y}6M;0i``8|MQmr zUXJBYQT|NjPsKeAlK*+j|N54kg?={d04@LPZb#)ODSw{wLzF*Xc_(-~DSw&rot5vZ z`~~!Pffqu{fA21tzZj((yaZlqt~+n@mn+|0dGbGhCGJ(w^1uG-Aa10!4t~bJX<)1=)vflr+@-Ha=4C1r!IrzN8dd~!u7vW2AqPgCf zFDqYB{uSjz%D<}oY~?2_KVA7LbWVlSpqu}fQ_p}i;Vk&NL+^PY|Az8&m7jzDCVUH8 z{@1t4hvJ6;7{qnQ4=bNkK7t;FF&KvlhxKt%%IB3&qh}!bpU-X6Q$R1m614pH5<6d2 z{tM-6$}dv>9px7)KaZaIZ~=VR`rX{lzlZWZ`~ZGvuKSFgU#$Ex1jg! z3H%g(20wRLKO!A>_^r8K z8h@{1Yvq4X!3lvMRd7P`Cl$6+{%7U4D*ub}e=7egYyAd)hkw`z?lWrsFO*HDf(`3cXQqQ zU13j@2G|Jqf_ppkuF%51DjcgqGZk8?u%8MoRA^4m{_p^3`R~n*!a*np!$V+8bKPsF zaHtAxRA`NU7(5&vVLk5gDIAG%6g(OpW3D$sTNO@I;W!meRN;8scJKt)-a6gS6$>Y! zoD5HamjCtbJY9tjDx86SCM5q0XIqau6AI^`p9?#}^UU?e@1(*XDs)!iS`{u(;R+SH z$oa3u3m4LP5$p;twzb@hEnI?fDZC8Y_3K^>EMBR?RTNjl?(iCi^)0_n1)Gp6T(80n z6gR>iuqV6;_Hu?*f$x7T^j2X7i?^uIM}=7`+^WJzl)ftTQ(=e-eEDO6FMll9mp|eT zRAG<`cc?I!#oJxIVPjJk?}T@mxUs1ULs`5V-eaO|z`ZKmr@{j&3{zo*3d0-z-eQ)+ zzqhDxzqe?e57PgT>#Fdu3QwVoQsEJbN8xB|u>QwXcwB{XDmJ952eJe^Md z+bgQ@vAcW1_?ov#=FXsJrZwA^yspB#D$G_Pg8qgIb12?~Z&{nI^|lIgRS2r!Qz4*& z-+tNHu^hUE^@QlOUjcPQ6{0E>REQzQVZtoyOsbGlA*(`~#f+;rtl!LH4(3f+YW_I=TIq zircI3w+jENK>imj|5exu|FM2A3CaH=`CqjBS8+RY-FFtn9aP*!Me@H${ujyrqMQGA zM^lmfFOvU7^1n#_dn4?rVsjN6RNPxd^1o>L@BO|(aUVw57dC_Ynd|0QaeoyLR+0QK zTK=op0$Toi`&%Uci%ID6DvnU`a1}3;^P7al(^PDuVq4mdRFV8IlK(}^ ze-)3lb=^Bx@i-MvRFV8IlK(~WzexVOcZwqUUnKvFuVOby{ueF( zy|Y}rT*X^dyh6nuDqgALwJMVTMe@H${ujxAZ_BS^oa-U^U$p#pM?>tXBKcqJ#p2Dd zxAk}<^ilB+6>nAXHWmBg_JjT5fNeSlq6~tA;qB&nXW>p2?@{qC^dWF4yxV%*C;Z~Q zDEGl(aJaeN2=}Y_x{42|_=1WLsyIf)hg5u2#gTMA3`fC7Y%TY?D2_&X3_cE@FxNXH zV^w@w#c}B4;gj&GZF-(Tc@{ngpEuV#;}cYzrs9h#zM|qwxD(+d__B4n&j7_&Q6|GF zaH_dHE3){Siqk1(z?pEC!}__Ht)dU{4LC=|H!0qNZ^O9`>)Ym6F{NTa#i)uw+z<@I zh;_P8FU1&29425A*PZ`q6$>h6(6cZH^Yk>KF2WKl!-~WDmelm#1{L4Yyqi>Vt zPt0|nz>A-$xLieh{#Wq}_$B1Y)iYN>;db<8N~fWp4$pvRT9120m&pH82lR8`x#qf`)s)Ut=@OOBSLs5PI^lMP z7eLGZ`kAu)SE(z!7*Q<1wN;jy~ zSEU=x|=iYSdlc^Hm@kC^M; z*-N8U`b?$AR0^o{xJr{$dP1e=RT`txQ!0(6e;gbSpR{$o7_4>v8X8rMFS$LT(fM58m}H393|9DWp!P zG>bWv@)QMFge8ad`Cn1#1C^>OIU!%eeFx5i^R3gHz3-wdgzv%k&GoLM4^>*K(jxT5 z(DGlUCD!95%*QCp;3x1?bG`ZhxyswC^o2@4tMsKx>s0zmrBx~|r*j4T8m_dpysi2M zWi?y_*P83itMw{o3Mq%!$mK7gJBVGHZ@ zw(Ve)LtsnT%3SYNTC04d%7>vJ4v&Cstj8PSD3qh&G4NP(-JdL!k5lC>m5*2Da+TYu zyjRpM9~Z0T-ST6d`rFVW5t49RPIYpzq;O^#Q`ec zMllc$f`j4h@D6w-7k%`{4udLHLl$BPkw+qa0E^ zqVl8ldbG-qAwCYDfMeiTI1bvmQ29yt6nq*!1D|zB@tn%f*XtKhCcqaPceGCGiExt2 zFH^h%Uxkz56gU-5gRjBqDhE`aq4Jw5&s2G~%Cl5{yn)>hrfYY;>lyPi24O!l?~gRyVw#Zd~f@m-F*qhar`t zDu-2$H2e{4ysJy&9hHVPb5xG09B*8Dk{$4F&JTs1PV&D@{+G%BGWqY`8Ou49%PN!q zW%9pF{+G#r@2aeD1yv#WU$*@B@~Z4S|1VK_fyy7KO#YY2|1$YsCjY$z_>d9E|1$Ys z=K0@qm#X}k%H)5U{4bOLqz9H;V1RgO}56+PsC zd9^A>sJup%9i89SR(Y+;eE(y4z4H*L@&?G?$dorxe+$2Z-@_l^kMJk>GyDbq3V(yY z!$07k@Gtl`+zhwCt?(cCFZ|C~X#(v5Rh8}F_HYM>jYIft_R3BT=Z#WjXWN~M;4W}i z*c9#tcZYkxJz)cEgnPlg;XZI**bMFmo5TI#0q{WB0v-ephKInGuoXNMwuXnn!yPs* zJ)gRboc~^lU!iw)$9`MBLjG6C|BB_mDs4H-+!HHK{-2~uJM|6c7W$tr#tg29Z}AM=fh68ms4M$%EhX5p}r7a z1iLz{kI)U}5_l=R%v|^0TDd}%`&GG8m3vgVN|ifQxmuO$Rq0OWHSk(^ovr0QLso7; zxe@k&J>gA|{I6L4tI``<{;Oi)uga~kuS1G{su2E_0W4bnQw&sPkR?)OutN&F1z2sT z<4#rXq8I{)!n+;TkMO-H_rYOsI2_^7`xL11fGRJj@}MeXRC!31M^za~&%|C_5aR+Xn!8HYX|J_(<)9&dzaP@aX)!RO6&^QSUFm1(NHsLCs< zyo5UuPJ%C6r#H^4D3jq7IMrP5?7XJR>#9sgp8;pWS=Qsd)@+nF;2g;Fzc=gNR`pm_ z=Blzx6`v|qRs5=?R0*gORV7G&2!>(Aq4%@DN(?0q6EJD6_qu6S3aVKCtCEE|X!-BG zU#_^P*z#YMGPL~n-p5sHsw`6F9aR>pG7on?TmUWq>&JoouUP)8@&UB`ckdc3E>`6u ziY0Ie41a;Y!r$QU@DKPW{0sgKH>>Jw z?G{!3Rb{Ix|2SgfRev-N9EJOzs!ba2>h9DHUO4Ax3{)Coxjj`>K#>WWt&vp zN!6Vxc>b^MLcJ?&>d>y`DqjIp-JN<5Rrj>RWqO0EjjHnXF4etI_Eweef2s2QFV$w& z$&;Chf^Og~iBHmbH}s}6&luj&!Dh3?F( z9*KSwJQ^OejoVh$YgIi?)y}FOuj(19wo~XoXJ|5eL>Rk?#yudp6BRjOB^Uk%Cs>NVzi$LBg#?^N}ARc}@G2332hO8!@S z&`;T^c{zTc(l1F8;D z^*&X}|ElG`s`o(4|N1!Of0g{NTK=ngzq#(a-Rgs?KBDSF=;VKu{I8B;1oyQb#T^aF z|LWuBwrPhlM(;SYdaP;#R2`@4235zanpX8mRcEUDl&X_deOlEQR3-nb6nn(O!h)f7SB8emq}Rb*ieb;FAAU^1nJ|o1SU7ufgeX2CjRqXQ>)c^>tO>Qgt@& z8*mPM(>lGg^ES#{=!1T9y(1P>HKu9^Jq#`XRgKc~J9QkA|5eL>Rc+4KN64u9k*Zl$ zoe%JHs+Lu?{8zOAi?C$GO=ZOIyxwUGR;lK<`}RMm~D?V{=?RsU4=TUCFi?K@S;|LPAc{s@0^`2X)^)n8Qo z75z8po`pZG$D3V$skXhUf2;bhs+;NA0=L3{tkc`V|4gYd^J~tIJN0(va`su=LA4zz zc7o)8P1fTchuW^HwNkCAYRy#JO|?eVcBgX>xF>9|e&>C#f_(T>vk!mj{gDXRaG0P+AFFJQteUI2CFtqwcAx2s@fg&-wE%6Lu}nOFH_$Q z?}6^Ty3bs9{?~@9_K<4if9-yH9)J&8kNd8zHWKAwI0`<3y94!T)t*u9G1bPY_BhHD za10#lu>M-(QJ#cP!Kcmju8wC_dr`IL&@KN}djU?c9&c-3LYW9BLEFdr_42A}Vbvz9 z_J(RxRGXpNRC=bt*Wh&Pci-jJW}?i3ufy5qx=;JHIjZ?ov;0@>ElB>?EdRatN;N-v z00v>mTsMJh5!F(vMbTq04inJwzy4Zj)e5R*(6cZHE&uC1MU)aOL(BiVTT{&m$#+!y zRJD1keWcoa)!tW){I8M!HS)hk{(JlQ0polK7s18bjJX75Df}2NgP%C`{%WuGnQAK# zKUeJwiZ7w%ziP`JdY=;4zE*9GYAexKLCb&DR$GtzTvuC*vJS3?8*p7^)Bj`YJfNf~ z+Aho|f>+|K1Ob&GARtk|07w!<$w`nPNrEI%$)F-gP!TgqFaQFg1VKe|hRHMCJvk~t zzyL}V5D9<1w`=_O9L{rU?t8nsy1M#yZ||}Tr}Ce|p-VV)8i&r|(4X}DMV=wgieI1K z^HeU77sN2>Pq<*Wo}H8?9%uR`8SRuzwZyw2)W?jviEHS<;PhqD2k zwW-%3>yq`z`ilBGbv^*+LvS{v-iT~WK1h$uA)F7BkC08sri!`IJ_=_SIGe-ShNTv8 zwq&Cf*_wPzQ9pq=+rrr%&c~^@BcC9j6puc-4pcgloyg8owXX$dS2+8@*$vKKaCT?4 z2icQ+N}PHodsBIu>_hgIs{JhF><{N)IG>?DfE-8;5|5o@&LLEuC5Mud|GANjfb(rQ zpM!H6oFn0!0Ou$;$H6(8&N1Xz^7(vQy+GwfQt}_p@lyTo`NTO9&PmiKlT*m4|9Rk? z4(D7rUxsrgoUgF@DmjCEO`LlCv#7jI&L-zb)&4mm=R7KJkZ+Q2k@FRGHaZu;`30Qs z!1)nN@51>W8}F0$_4T3n?Pp!*LO7Se`7x`Xkc-I0`8-Rhd`f;selAt}`OUcu&b4qZ zhjTTYD_H%KTuDm)=Z@|xDr?BENy-1**1e{qolhjjWn#_pDe*5SA ziOSF9Ve$xhlsqPH&Yi!I$H^0p%7ftK`+q0j|2yUVzYKx1xO>`SCKGSJ+_wJFl|+?|&XRufqj6Z@{Gz{-#u2%r4je z*uLfeoi66Ti}~*=%<64Y<m9g;!8IAK;czkDT_fOnj{S@zN0FnYH~U`Z z8VlD;a6M0b9QgwIqIm2(nrl3j3FJg_l2q-h+cgEQ*WsE9*Q;<%V|6&0XL<_Z_{-?fqYCQ|Z0x33@IO2V}nE*D%s!nKnI zbqmETPQmpn_20%mU~wCQk|6ihr0%=-Po>0-cQyh>yUL7 z^%`*3hr1oz4d8AD_XBW01b0Jv8j+332lM$Krt%2cglsBRJ2Bjk!rdC~=G0q|Ey-5& zoMihklKJm$%l6}}@+`ZbfV&6WPr}_9?)I#9AUl$s#Azp(J{Mi7+s7;UpPQMUaQA`x zDOP)t%zyXO;<2CT+!~AzM|J`4(x-4IH z1>Ec5{u1sraIa)_6}g&Z{_E@FYbxK6Ysqzrxshyu`+K;*rM{8eL^A*NXn&xxnf#I5 zqL}Mp8$4AnE>Me24kTw?pOcy!wQ1CKhEt8ia~oB6MMzE0;2@}|%u$N2v% z-*XE*1*zXk79tCa$9{hH0G@}Tezeb18J;5Wl!2!xJPvq@(OH}(}!LJYC^w z0#93bn!?i(o@VqsN;W53h~Lg?Pb(^|N#?(&4XgJ2KMqd^c-pc01o_H?Au ziR?^vk*dA+Jl){w4^MY^dc)I$)t=;2WG`{rneTa;N*}T>Dfyq9nP=b`0?z>I1Ia<; zVDZ?i%ftNl45dDd94=M+%Jn=4&v)>Qgy#)-M!_=^p3(43f@cgoFTyjH{^!YY;gl9fH@4@pnJqyTp$alqW-}OB2Q~7}Wko-uh_IIp2AH%a0 zo=>PRA{UcO#G{YyQ!1a4pOarm)xMW`mcz3So)z$X1<#kPt|V8HtHr6$?;0x1e-HED zBl&Ni9krI=Sr5+!dcGw$lAFY%ul?`g3B&UPJWhBv!?PEjAK}>n&lWnjlH17bvXx#H zJE`mWRgrN>StO{2A(7EWU2o|{!AVgk3L67sT?DJA&*N{ul$qn zoP+0AcuvFf8>_#Q%zw`*aq4ycC-uL`GvryR>T`V_p3CrDpnj2L{(CNoM~~zR^?%5# zB=cXd^Xu?E3(pOBH^6ff-oEe_fcJiQ{|9e5cyEEXIJ^bn1-!S)w%$Ud$$vdgZ)qxJ$g<>}QnhEyTOQtO@K%7g61;b@dN+9w zSy7z!oOml!sY2dMR+TERFMg~JujD_xHOQJ|Ek%9pduzk{7`%1heHh-l@HT|E9zFHR z2IK?cx36e#BPxwa=D+tLsp^qG0&jD8o3PrHY(_pR9{U`5TTp39GXK4;rKBXU9^Pl*eGc9M@IDLgKsuTKUdexWhsaj;_3j-?Wf(b}93fRb zKO^CN9^O&ZN0Vd7vEtG5Gmgp&QvL7w$2$SuiSSN?cM_|U$tmPiaq5vs{=@q+ z`3m`}RP{(+gZC47XTtk7ytCk)2k-0j%qHiMbH%UE%NtbQB;O+EOI7!_0NxMaW&V5L zW%WJseevkyV*Yz2|KVLoew?qm2;MK@T@3H%@GfC>Dfub+nK6;ax?2HTe~}Mm&0Ld_!d|xsF_)ulg-~DhD>g`!l?o;B~|M9lX2X{T|+}@cuym zX7WdJi)?G(WxU&{Y$tb+JEf}kyBppE@b00$m)uA07muFjgH#TYPSPb+JL&waP@H;}Oez)`BEwR(pEzc(o!J(4u_44EY*|8r;aFua%G zJp%73c#pz+5?klPAQlSL3f#nE&42+5SVSb~1ZU!+Q>1=D(Nu?>$4$S@GCU zdfxL?E|3?=zon{Y<}!S@z+mxFy;te^m%NtGd4tMLp|1d`PLLW&L$(XT2l#Gf zyAWBJyiHO64_x2vREm&A$zoEq*SW6*e9hr23EzG2IpDhszC8HK!gmLqrO47`8QIF7 zAD`queC5dUWQBayyWy(>AM@W=k=06MW%1ZE;A8&#s#32;R%dlM+cn^82wzS3>cUrx z%Kc<*vW}u&r9S4ruRiq#B=cYIr4f9Oz}J}igXBZx!-~0MX+otb*^GRY)oyIJfUg^T zE#d0`Un}??hp#pD$H+EhTg6;&?WjCKO8&#wUaERL9jSC8CI8{;LUvWuE63LzzGvX; z0pHW`^__&OD$guG4uEeU8-vKfpS23)IT6UBtMd>ebxIuhHnjgpTPGSON-!J%*GOODfy|Qelzd; z9KJ8%`-1v1ayhv|Ja$U>R#I6-t|q^dsy?Ex;rju;Z{SlQzn0Z?ue$gSkIe4ZUtc9Ofu-BPvxm!)qnd{^Py2j6e-?T0S_-vRjC z@ExS{5a}dcvX$Pihl-cQ`MUs^9;ksDA&C;!*gHsfJ_Uz`Ppj zSN$mEIQM&kJV{Fa=f?Rvd}k>B0pBS$PLs@k-(TX?S$Y<}zu`N_>Uom+@4F}-Jtvo_ zUnZ}R|FGJP?SJ7{(RU60+u*wn|1Iz_|9#AVe*y9M|0jO?&gd^lY!-A=yYg_Vcr!`R{*-`orWSQni!W-xU70;BN;1aQGjEzYF}$;eQhT7Vx)$ zza{;x$kwFfzrIfWZK*s?wj(9~?VkCuJ^UTm=ty=VJ1gpJ@ppy4AN<|m?*)H%R(p`l zf4}5^&e@y#(_|k~@?U4Ezd!tg;eUqu0FwFdm;BeO)IWs!v*b{6Sib5A_+N$pIrzuJ zKN9}u;b;E)N7Ffm983QPY>y+E|Na-*eo3nKPZ9ekz&{m!=D(l$@1IQ16!F*z?`Qt| zng4#~zyJU9pXM3xzXtyt_?iFySrnQ7{@K!x{qr9Fxzy*8%zwX~|Mt}}AO7v|zYYJF z@GpRW5&ZAK{~`SE(*GX$J}JkguU5b0Kl}^HkI7G@YTpt3i{bwqe&)ZQ`R|wfhhJ_G zxmCyf_cQ-DUj_d+@UP~!Uy*Cbuf?fX?^-JB$o1p~R*SN|5&q5a zZ({p9Qt}`E9~5(|l=<)9LVYXA{I~BQ{vGg#;NJ=HQ>4}kX zG9gYq@)VUcnIW@M)fxCR{3?_VQ$Io;C6Cclo$ce~3GyV#{I~DI{@)Sx!v6=tx4?f2 zL3L@IMqmy6e1at1nxngJoi|EyoFD%V4xlXtq`b>fNgGozytI!{{xNK zZk*5m5CY8*c$m86KLSn2rujUNQfW@MAY10Ewnm^60*@i^1OjbXZA(5*wiBoQos__n zRN9jr$c|FA(<9IsfgT8Sq286`wG-$r9(!#EdQyLi>_zsLs_vl=0?e@G5Gv1-L&;%M<@LgkBM^9wjgchtKQLN6dQ@W(7|+u4 z2r&Nx%>TfP6kigjy^;eH5SWUbFA*vS@{MrAt5{13b$Ro%l31l~vBH3a4( zFcX2f2+X4Mb#gX2NBp|Cc~ssY-z49XD%Tr7zKy^FHr^qb{{hK=wXmstfWT)6e2Bmz z1U{m&ko=hZL@_s$i>WLjmy(kI`o0$U9Dy$p_=5T}ayhv|Jo+kLNo5ten*2(t_MI{C zH3C-<_yz$3fwc(iM_?TSTM$@}z;_5p{v+@$xslu?+p3=1bwhypANYa#X7Wd=+TWoI zY(-!f0+Rm-Y$tb+JH?~-&ioJTp}v>gCsjR52M}Pq2M!`|h*c-)BHiNDtJF({`5%z{ zM<75-{^!PHBB1ihLLh@c2!S{PVR|BDl#GdA&zs~w0!cDOrlqRaOcsHo2>e9-XYw$4 zL_GHIB@0OYBk&7(oID{_-NUa4sCfU4`tRf)jZ$#A;=-3VE-ho`GOBD%HvRNXh@)IBOx;4Z-^nd=SCf2sS`a@*lyv zWIeLJ`0aBSWc~*mQg1{yma0DLhY)Or;KS6J|G_3~H_hi^{s)^=Z$Y*sTam5RsYmcJ zvJKgme4K1YK0!W7wkJD~9m!5)XR?bT8(keI)ZJP2+#SJZ5bS~A(+KwD9-kt6k-Zi5 zvrVuMmA+&@vcFXIJPbhaSp)}CA4Co&hloed#!xE5$l>G&soHnv;7Ej?L~s;>`w$$B zpc>m41g9f77Qu-KK9ArF2#yoKUJ1`As59DU4 z+RwwmEeP&Ja4Yp~Xm;Cp$8EB1)=*8JkII~@+A2y`5Vdn5B{NE>mhiGJWc*d{)JE;f@fe( zL+~sNb)}qxq4MfHj7Jf?0HZj97ZLo2=D*2H2wrC6ilY2$y9U9lFm6TgUl?lMt|536 z!RrX#aI_lkX!W$C>lH`0KC+2XK;7KgxP>ezo2!4_>cJ=kqX>+`FaYB=t?#M<<92Cx zJ>}>egHcqqVH6XkO@BwXJ7AQ6Q5{A}7!_bRVB85K4@PMis#MC+?NLXM%3|Jm07e-Y zWgR{899@5KbUr4}7)CkvR$dIvcFR#1cfq(9#@#R~!MF!TMaQo4GWf0s92-u@Y{JFUtds!0#(pD6dicmRePwmPDkFlxi71>=54SIc3Y6HlwBVbp<9 z*U_zmV{1uKn(c;BUo~JfkdM2HayA;mXab`VjE7(}hVh^hWsu6yeLIYYVLam4)kYLG zy}OFSXv!X%(V#qT7|p4)AX~y{52F=~b}(AQXba;p7;PN=O!2FKJ?e8p9(Qz)IeMvO z@C3JdQc62Ft7(MMfl5ahondqmUHuMo8FLpHUHNglW9KzTo6#`3!%#EX1IDW`dcqh1 z<0%;ZVf3QEH;g_oo|a8`I57Ic=%@CZS9_j_n-egefiV=u02qT|41_UA&b9gvSzSx2 za|dGxjAtD^^vcPr+Z4ty_B>oR?>>|5=U|M7F%rfLFh;=`3quWTjAPf!s+#xGhmKv( z!%+XmIhuYdTXnlb4FJZA-1a3=x_m%o0*vV}Cc>BkV-k$X4)r_7RCS~53&vC!)9i&U zi%JyfAI2-tlRy{W(c)=e$Hw_&^oV*&MdV7%){zw6j-Id&fAnt7l42jcH_*3tcM z7$3p-9L7QzOJRHrV-bu`q^kb)P`xdNu|(SHlH7fOJ;-dp_)J8#-qfF6GroYa3dS-R zU&2@pV}+y3GO4P6>em+=D;;~wId=ZZxmwL_zf#N_zsPY&&F9xtz9HAb_z}iB7~jKK z4`U;Y4KTjVt8++I9nQ7%Y=ZHf>{ls=VvhYcVA!*|Su5Su1a5($u9vMacEH#MW4k&` zwd&+*YNOWJP8hr7W2TaD=Vlmt*z;cLL5)+6Za>W0Fb=>}7yCgN=V2Uzk%8faVZm_0 z2*Oa8j}L|ihS#xWy(|W`_I9a-txifHug;mgI@8tR^B4{GDc4cn_(6_PFBl;hYG%SP z)C@#mL{;YGRlCEn=Yon67-~r*9D9Azp&FqiMv6V86&+pg=22u}{0ieI7{_7!4C5$_ z!!VA>oX90m(y>Jy`!N{5NSf^`npd~BV~ZN<3HEbR`cdh$MeXP}7-wMo4nt+vA23d- z4INIoSkzgA@h6PGMA_9nuTolFUog(H2ga28liYj%2jc?F+hJUUaTCVhFs{M41mhnV zmtkDVt6N+hFOyKs+f^9)zhH`YKn0LS|3ey3z7|aqdi%V6-0&^8+$-HV+=*$yc z&64y`3T8Q&rD2wZSw?hqrHg*2wAHny?hB^mKgb!@QfyJ!D0g)nHa)yE4ps zVOFs_cc}k(XiEOewWjVSW_6ggVBSY(4VX2hqz=%&y3PCbN7+{$n4@6Ug{h9K9?YgN z>vO9HFdv5b0L;cP8^Ua)b|HgQ{m7g=2=gInr)SEVlztu|n~12!AWAcsEnz+?ihSfP zz-*zWg&$kNd>m$Lm~CJ_W_xm{psggQx}TcuL}$vud=h3KnC)S9hspdmJHqS&vlGnD zvZ1>5sI5Y?V0MMsO@)BoHtmJk111CC?8#j}C6lJ^4rXtDWd6(K%!Jt&=3topsP~6C z5au&5)n9(!F1@LhBL^}_ZsqEux)Yg0V2*(KEX-jrhl;3f(BiS5H0<;K9F>t$Rf7z* zgK4j{G1SMx91rt(w#UJIkpp`n*AMew&47${0?f&5OoTZ}debvGh1*UQMg5aiG#yq4 zm@mUT3G)@07R*;+u7x=R=0`AJgZUOrb+Gebs_B}|&0m*oWiNAJ&XqH`^MKqARF0W% z(D0@h)X|A&KFs%Fz76voc@Q!eDAJ=2{5`!O_0=T#5A#FWR{gVnfw>UoGMFF3{0!zN zFqgnw1aq-Gn@Rund07hcQ?(fk_^kPU$% zKg{d0#^h|?l!2*zsf4lQ2Ml24@?RyJbt|kQunNJt4OU_G9Imf=3$SjNkM>^F^SQ<6 zf2)`%)M1r?RT)-ESmj|kV3mcH2dfk;$$9$_V3medM%r?F9qrhE43^|Sta93;o+_;h zRPKUx53IXIS5I8(*sY4NB>ee>j9f3Us=%rZ>t0wjVO527AFOJys>`#q>RkO(X0g?f zuN2hNzEz7Kng0wiSao1EgjE+-eOUFxFF_iE)d1E5|Nl%b$JQ_svlVGWm_H>td6kO!|DWU5vH(|gf6t0}btkDi1*~4`kyx_DV*cCD|5jffQ9oGEsCy->{`T%*4S+Q;Z@fHF z>#r=V!LUZc8bbfGu!h4L3Ts$ysQpy~)(BV<{_-`NqPlFYQLx6rQU@{?))+fB<*Kos zm&;i_mC0FtfqlyJzg$y$w!<0^Yc8w_uwI2V5!Q5AlVDASH5t|vJ-up9WQM14cTu_a zEg3DWS47b>HiOD*uwI9yb~H;$>Oqco6Iioh&5?AqFGHE_d9YLu%zx`mSZ~963)Xzu zN)2rP4f!h7S^$ejr@kl-Nr$lBgY_}2_hEem>jPLH%ABYH$W!!LSPS(>b*HxY{I6Hk zVs5*HTncM7tWRNm3F|Xh%V2#D>kHXXT{S!$Sj%Cpkmqx?)YU)rgm10nwyVUT){pcr zw*Xjbkl(ujozDsCA#ndTSUX`IfVB(OURdhX?{Sz*FUOT4(_*ln6|F3+KVba?b?>%*X7w3J{h&5ibV@vG-3SzV`KU4V5O79SU_KVkg^>x>xW zMDy-xKTcccDe~FFy2#!A4eJW5ORz3W)Tm{kj#qt+X8i-}s>Gw(Q0+zC3#@DOUng%M zR2bGxgbK>XPyvMghY-VG^`QQ#zx^G$m8C+8`s?V>Z3vY>2nZEL=yrsP$iCDgM5vu4 zYN!}O#l@`RjyEZUn2;fdi0Y|8-2p?A{|J>5MH;0MD#J!ulKCGhhtRzUl}D%&LKP5_ zb&k+ovSQWqOz0kjD#}xt`UrQVN}_x}hz zqnJB7zW)ymqCS`$B30ePP=v-IGz_6p2n}a-1o<2}Qk?c%+0bYzW5}`O^HR0n{D)pZ zXd*&<{~zM}{}A8*hxq7y~(Zk{y)U`|Dk;E|3mMv`Y!n% z$@l-dhYu0@9HEa8T8z*_R{8!v#P|OpdHw*pYyDuzMA}sTq9L|j=n)CiO^bv_9L_op)CllN9a3*HqiMkxslu?Tj|;6`~MK% z|A#iS`lD3s?~jDGBD4!3zW)zxXLSd;Q#`r{zW)#L{eNgLtNWy?M|A+9AVLQb@*s4G zRVV2p-Qv_UDewOg@{xX0-v8_Wrxr30iXdcCw@AMK56S!g-0F%_kCAaQ!K#Pt6hbO( z(g>YED1*=ugtFB6{y)U`|DnU;w|~kvbd=R&l7EqBq^ghi972~Vo=4~c8yCsH$xDj4m2(B5>j?cr{VMq{c}+ZeUpJ`S6ow0s z>Llv#h9F!JkqHRjitslG7ecrf!i5pO58>MoE{!k{F2PN1N4N+ZMag1haYcPL!zHOW z$UO26vXr9!jUVAM2;W7qEW&rPQI0H6R#4Pq4&RM%6@>4hUXiRsR?g?Smr7N#8d+Vc z_IJC&H4tura7~08AzTaLdI;Z7Pi?XeSy%k_EQRY+X+Sas`9w0m#;YkROLHI?4$Fll7IgWgR z&Rf}ji5yQ(ASWv3W?(YHFC#pKy5v8?)5z)KvG01}SE#&7&LCfts-EFl2rokTb%Yln zJR9LR5uQWOTyh@yhWPcdGylW$sWboW?~{h#LHI+2-=+Q@`9Ar9Vs5k_QCUcSOiKPc zeqF7C6ye1Pe?f5x!b{osl>ChRTv7idSa=!2s}NpJeFga?xl%m(xKy8NHohX)kY7tx zpZB$hs4IFM!s-VR*CQN3cmu*7gug}jAi^8z-$Z^#eoy{D^6&qK`S*Xr^7nrc-b!vG z`S*Xr^7nrc-bwP0|Ays{|029ck&V3w^Y8zL_ve%Y(olcvIedtFagr|5t(ZG5FTw`G zKI+W>aDeTgc=S0ksaRx)3`^Di-v{9+!iN!#A)H2-`5#WulO$8()GH@LB}@K9{w!7d zJJ;bO2%kXsDD`6`^FMrCJo*YfN&Q!n`5%`2ckHv*_9=v~BYYa+%LxC8@Ogy)qVo)S zmOLkZJ)R3xnEzqsf0+6I-}kb^R}g0Yhp*E4FL_ORuzz|gd;<}c-Zv4s6%pot@BPIWHBY7N=XAo(JNOwe@K%^5QPtqg#k4OiyqxkJ7 zjR^BU(uI0gvYS-(zIq_?G$K8zOa3F$i|j2PeMEhz^dv2_ z=8$vAd5XDFy@|-X6yHK*J{xb73&?jAbLZ|oL>40QKJ^dC56O?jqi37>ANhp(B66`* z^)W6*WIZCEBC>*|&k&LPN8}4~8M$0Bx5qCLS%b(*>Z{1r_KD)^_}D{a(6z@UMl;@ z{p10u>X95mG)gF1Y1fr!7ElJ%$ z=8<>g^OUAihAd0oDOG!wM$04m0-_ZVZI9?(h&Dv@ZbWM!dJm%aB3hCDN@QiSO1^EY zQmIB(C-0N0Jp<92h}K247WMnd+GHK^=<(O1QlD%O&;+ zKg#^q&Zg9xk<9;SbJf;K5^afSTSQy2+L~nkN16ZjeJc7m^>*YFq~w3DhYpAiK(r&G zJrM1LXlK2Kqh09iN_Hc=%T{`Bdm`Eg(Wj{QB72ihi^sl>qRjtjKkEI-XQXPcwCF%Y zhfy4a=wLR6kdpt14pq$cGaS*;h>oBx`H$#Ga+G-VF^-`!mX!QQbevT6xp)!LWr)6n z=$nX+NAy)hCm=c%(TQ|UA}5nmWGg-XX;h|@FO#q2tIj}lHlnXlpGnRlUl))4yKbU$ zsLUnjk#9)V&bR1Wh%Q8QKBDg-`ZlWzNXdUh)HOA$~WX% za-CH5Y;QpHdqlsbzLDHSekUILi8uNKmCfXj%ZG%Te?Q{25Dg$U7SSMLDk2O-uOMn7dJ<6! z(F~#?MB|8t*#q-G8f7~sz3G`rP)U+0GA&hoTv5#A$E&YV+F}u$wK0>uZY-fh~0r05G#(@?W{8Y zV@266CQkcpSgZt%mv3u#PN>(GQ%U1R^8>>O3CRvM={MV@%tAp4Bh}ETDkE~BN5Rd&l z7HdeQ5!sl0P^ugiKR%4uBZxIetO-9hC7Y3tD(3oWL8T?xifk=a`?ui6+91{sv9^eH zMeK3JIw01Lo+rpB$@b#c$JLQaC$cjsYan-A-4N@ASa<3@$e!d=;?eWjo66HiS5WME#P%aL z4zbS>djYX|h`or|%ZR;%*kr`U(?5ZnNKTS%?dvx-h00WN8aZ96_FXUb3SzSmdzJbO z@-=d%c=Xs_r!t$IL(Y||o~1Vs`w+1=5qk%*w^*G|zD-L0>x7KGOXWTCeewgT>V7^# zY%yXBseep|8+NH!t1h2nRJeb2@Z1NN6bPjKs`tr zq$wUf4M`Eq{)mp?dOWvPgH&;50givs{1*H*sqBF zLj5>-f;=f6`<+|tH!8oAe~_nGwU6sh#8t-rh1f-w&LGD8kDcSk^W+8bb0zTO--ume z<1%@L{D-_s{;Mu7#IBLo$s6QNVZ4AM8~;Q67Q~AnUXUMeB@2;-$=gVf{43k`Uu=vQ zrNTe{80Q~&n>d`X)<4;m=Pj-;1eRqy`LcBZT%>TILKjK}z1IcDzWyGgYpGr<6 zr;A6=&nr}3C1;S5|GAl&h4?1KUq^fi;Ov^ zKQ8%?_&ZXy?brS7 zgM_-wvq%(1{3pcEApSGrjQ99q#E;N_lsrcMBHQYDJAwEgh@YhXEBPBK`JWr1|HR#F-y>B!4-=J;xF3niNK{9n3aj^$Rmo~}O8OyjA6bK} zN!C)#^-~*(21wMQUYD##*3aj8fJ#HM5!qO(cETqfLSi@)4823GzvLshZ6WLi&zoScZ zMWP=P-H_;oM0ZwukUhz##A&B=qBoVN$v$LXsp^sRM`AD%&rlyg4kQPOM<2@&D$kNb z$zf8p-xwrDAn_^^&ml1$iIGS=kHjc?Mw4U6vGm)=HI9npKN2sJFGx5>t_w zNPQAHnVcdXJ)UV)rjsv|uSnJYj$2{|5_2fNhQv%ZW|6OxvlaEzT4F8|^O2ZG{SER> z@-6Y$e{U%9HkAeBJLJ1kwbLo_K2mj%_yEa{NPLLIIV3(p;s6p0kywYs$4D$k;u9o3 zMPd=RT}&<^mr6f+jeSPtbCUU=SSD3FB@!!;_zH*i%c|r*5}U~H6m$Fffy!o*`JdP#RlQoaA+Z~Y?X2z~ng5Ah;<4XO zB$)q+y{zsd_e<5jcO(uXkw)SW5+)K(B-BeD7d>v$Lwd!pXU0z@Kn6*JRoiJH5kn$G zJxoT(sCe|T$EhU9B$<+`{X2ycD*sO+q4NJI54 z{ffkCBz~j*JNXBBN<8*cO5#r{f01X%vr^SPoJX<>5*Lsxg2Y86ZX)qF5?7J9MCWDl z3i*$0Wq-wy_?OBx@;Z4#s`jxb3m{nt$^VI-yoD@C-YOn@RLR0rZX-e7E>(MlCyOFk z7Rh2r<{?>})e>Y$(jiX!%qAuOkt{`)CMEy%(IxLh@@^!{Q7=zcAny{7eJsg)s8l2? zk(H&YM{+NcjghR1WG$AeA;~;R-p7wM$eQA}*J|>9BXEcYvK^9-QEx-GB_F59 zK8h!(JV~}ECI55d?1bbBBs(Md3X)xr9FAmHB>N%R4ar_ecBh~DpX|x@Q?jl7HAu2I zm8Z!*WM8S;>7DG4&h6y$)W?y`|Ky8O)$4FPl2eeJ!0JSj`JbFD9{ZU*IhFb}aylvbpPQvuk(`g@ z3?%2U^cs@P|Ku!we4U&vejYnN&P9^>pL~NK-z47>k6r_BBl!uE3y@SH{|>9~lJAl4 zi&L+q52<`aE+jwBS6zhUXGkulzJy##ekvY4Kc7?if?P%}m#QAgmq>8Kh#6 zCTU4k&t4eG<48u3{29q8k|`u(^u);onH0Z$XGx~1WXLS}lT_IoKORQ%2pdPqW8^Q2 zx$F7_QdN*ViIhsVUs?T){GDX}Cr`0`T1^*{f0BQZXUMbUIr2Pt0jXk0US#`k@{%GO zm&q&SKjc;NUnH-wah<$D-V~+^kaDt+x`ixAvcps%whJq=aT^KpcBG0RRaCX}M!aYf zsp2e^AWM=CMK(jqNY$iXi@cw#EmiwTI8_(vib&N%>P@8TBQ+4I21q@D)B{L8 zic~|S9!9DWw`xp2NIoPz*lQ;B2$d$JltJIrNBJkvj^sXYAM^Fibv1S=Tw;gsby?0m#Y1hQR+*i zjw7`asl!OEVs$n770LWhea-ea>LenymRv`!CpVDak{jjcFjJez@5t}TAIQz*kK`7l zJVX8kPK$QF(K^4=F#D z02w3=(j+Z1M25)-86{(6oJ=5flK;82%KT5Arsq%cFRALQ<}A{;A$1O^Ye=0(>M~Ln=($M# zOiLggRwD*3Ne_4>Jv^esr;png-BEk~t?80f9AqAOhg9urFkKqy@<^AVUY5L*EGHiODo$6Rau<0wDfzFD zC0z;WiAYyQx&zWxkZy$Zy-2G7uZna{q^r?ioxG2%!EHHXY36^L`Jb-MY8_U2rqcDO z)F&H|50DKNb7O0abW5ZkM7k-`53%|%`3Ncbub-dO&8R#|HYX+jb4Sq%>Bo_7P5m*F z`JZkp9z753s6RnINw$}&ea6!rksg3_C!{6bk?xFi7dE<*-AKuQy`s`Rk?w=^Q`CEr zy-CS`$5xqPr2CTn$o{0{zyAJydLYuHkRF8eFr){wI)r5YrzQV$&f(NYh$7uSM~=)@ zM2a!^8|{nKUn0ko6Y^CjA-xLe$wSavu2xJzuf?7CE1Mn_QrnJLB&ny#(p^ zkY0%N`>cLIen?9GOM1wDKPEpR7m{q?!NeZ|Gc0t`oogvj^!7RK6uQlAEMzXHoilq_-md1NF`1 zkK`8d=p))jWjncp+$mK%57WDmK1gv7(tFw1NA4#NDC&Dz`ViEAJWo5RyGS?b5sw~^ zkBXlRkimRa6K66=TliI79U&ZXBOS(1iV$=`{PykXh;3ej}9rnaW}E2zgYhTwVP53)08gI6#vB@cA8zHewn;N{v#gyIWYY%GR2X;hRiKUUuX3O$^6e0 zkap&O;fMe*3za;7r%D&)OnRjKM8sw2}Cnfs7w zj!X??8X{8@nYzf-qVs;THd%*T4QIO^$^6eWVEX~7+Fvhc8X@xtGL5M}NIpb9EFL|F zO{g>_n~{%7RUdT=WZEOs5}CHhv|_b2`54(ooc6iPJWiz@`2;EXZ{I`tu>&$4+2}-e zCc7x+M$!$L=aA`+%rnUJK;~&=deX!E&-7xuxA^rQ`%vji_9OdCRnO-DWS&K4AoW4y zU~&jO_UsL%GK{p95mMFtk3?nyGNX_ghs!8kl>FCk9x|(t*@?_*WHur56*B9PSwj!=Kg0abtQEig z-Ym18)eYpgq~w3Dx9^bIg3R~Se;}FvnIFZYuf(m?w~^b)9a6P_0w=QznFKPskvV|O z9#;2~`^f#`)ak(+MCK56C+Q;Hq({AMN5)I~>bD)M@9wj z31rS9a}t?T$oxv@Z{+XfAF`ER8>gxKN&ZEik*c2CbI4pm<~;Qa& zLta(PT`$*=y$zY`$lij?4OVXovjs>sjNH*>3sPbJXA7|{`LC~nERZdZ?CsQxkj(#V zG4a@EFk6CpNzy?|{^yO56h*caviBof8re$7mO-`xvdsVNovfB4%PZ#gco&tsN#=jH zqEziSe%Z>%R!6o9tIYpwRko{%$4>0*eN<|YHOX31wXfW4ZDj3%)j_r{tM$nGWP^Op zhR8mQY$NK8$p=Zve|@I1k5FksHYJ-$Rqv}gvgeU)f$U;rTOvCO*;dH*K(;lqosfMD z*(Z=~!>!tqkCW}B2YV%CpQO^B>_AHX+jGT_ossRrMpu$+Bimg(_T4Aj6WM{tK80*w zWP8yg`H$?=WFK+b|35d|k4k^?8FGMBbw7iU9fs^+>O;t9$)V!0Gc!A!$_Vl~a->x4 z%*l>Mb{4W@ke!U|SY%&9_IY~7kuQ)hir>CQvXcMEP9P_elcZ{Yy_ubY>?_Dlr9O?E zPQEN2y)q^Lk)1)lM$VL~K0B`?`wp_Rk$n@{Ijqhl=aFxSQ;*~=D)Y&=$puo?GxIL8 zA0hi5_4mmSNXh@)d0a^4WAYPnkyQ1HU4raEWS1iQ9kQPy`xUaEA-e)u-XOAH(7%ja zE?eofA^DH&N^%vsTB`ck*C4wd*{`X8L#`#)iAVRq{Lg+%eIvO^s`ghC+3%6vM)3z^ zH?#30xrN-SnA_KOWcMJugZfT#7r9$JdS82~>?8M+2c&9$k3M?{*$lEyWG!S}$oi3W z)8iq%q)+^Mtp=zBNrN<{s#79_?Ef)!AMjVs|NqB*5l@MV$c#`TBO@bPs7OX-WR{T; z5uy;0%7~(@GDFC$$jHpzR8rB|d+%ibuh-*xpWnaR&Fy}Bf1a<`xz2U2@jB=8DW87P z+U4Xc@Mm0UJ#K$ik*vlw_^Va@&n;`$YHdnu16mu^+91^shA~3t!K`B##{?!lo6nNg z+Je?*$g`M3oBz$8B1s9$Sh1@AQ@*t|1-yH_uE3sJ+fbmD)~-{)JMX`1tvBS?)Bgwl ziGSH+zbvr+2mi(Y%)myT?y3%Ktia|9Y(l;%w!qD-$3IE|k!*o2aZ9WEM=7wC0y`+M zwF28J(3)x+Y>V4ir~jQ`pdHC}xIMPFs(<|lc2uB)0y~lKjLiSQuGZuBWH<8Nu_N02 zci$NW_EO*|1v)9vO@Yn|bX9=)ALv5oKDe*-`_m(^AIbiB03K*n|9%e~q`+YcaDD^K z|G=U2bhjS2KZlbXfz1Cv53Bk!A#k(;0~F|~z%dH+qNg|Z!M@h%&&~B@J z!@YplwjmGk9w3XElOJ>G!hJl*Hjz>NwlP~av7rYLZ;0=FqJfu39NR-9=4 z?(E!7G70a%$yW6zXJD!VFDqd4UxB;uZoCJl;k{n70{5Z!`=*jCW+-q!3-6y}@RON* zIZJ^DSv-UfH>-~*@F>Y_oP&?yJTD(8 z@QDH+l7ECB<5KH!Xa7@@&+v2n!m9q?ln8vKkau5yt>Enne52sr3Vf@8HwM2`Af~|g z3anP(2L)Cr@FS1?376q=+m5^1eVV#2B;Qd`e zZ-B2?;2#B;|A9a0wE3^V-}HB4{V)D!1~#+k1@};}1CQMecgK#N)@FOMC+>y3-e6~|`aio1c2V$51@}>~kAnLu*j>S{3U*U) zKl+*fLFRw(Kzo$i=0Q{s#zXK>tNMR0C3u*EM=8ks4>JFQ%>Q5y>+!GZ;L$v)C-%bL zR`n-mu&;uH6g)=30SX>V^*HQ@{jJl#GK0sHoPYz-=D+&{8$3zDAqt*MehQw7gRRHC zmZ2o4q0N5<&!Fme4pZ=I1VGB=j#2Oi1+O8$7O%sxX!E~$WX35tLBa9l zH{wlrv-P;=V*UqjC7+15ZBU)0;93RmQ1Dd+CoA}vf>RW{U%{ygPE(NiA7uUq@8+>K z|C?v|XOhpt2k{~6ar^cN$)h+M=UCN${|!E_;4_3zDEK6c zr|@Z<>)Cv+XBB)=!RN^5;q&-{_4uLP{s@vPw6#QJl*A-l%-~t5~E4YxJ zMfe83Y5nf%wfV2$+sOP6zH3$gCqKdW6#Q7h_o;q>AL2*WsEC~Z=FKk^Lq3DZw1#={R96*oB!^+q~Jd!|KfjU$Y!Sd{w}n! zLYphJ3Hhej0yncB|9%gNWD9JGTUyos4l%TqLVGE+wL&{8)LNl-3NimfZRy+wx3zx% znh$M9vOTuP9jxkKSD~F0+D)OI$$3Kw?aI1?_4q%F3++zQ5%<77t?FONp-u{QQ>e2- zT@~7!Y8TuG_odVJU!nbQe>?yW^mOlup@S4UOre9x55YsRyY=|rfrgm>p(DtT#2!}l zzrP3_t+01+dMfmWLcJ8aTcO?x-Jnn(g|1MjuR@n7bPSI=7LP-l|K5C4sJ}u3Y|z>I zcsv0I;)x0kVsR3ljHlqKI2ecEP&^G!_hfN~LT9oVhG*f~cn+S6=XtU?U!mbFM&Jc_ zAzp+R<48~Y@5{dxx|COR8D5T~cy<0!y;7lT6dFx_6<&>FtjAps*OFX^WAS>c`tKB> zaSBaRXuLwVD0Cy$o6zRJLKCdhUBkDMF#kg~{}sC3s{Xrq=njSMQfM;y6r758S`Y7Q zZdQcuQE0A0(-eAGp?ej2K%x8SoQ^Z_etVREpN3|V%)$rpp$)2!DD=2OkCM;EIry0M z`0uBoCrF+|=6}fMfAea8Mxj>~dRCzq6?%@IdC2?^yBQA(9a|* z(dNHGtE}p-kTnVg75bI@H(ZMW>v4M$A_*h&KVRLcbU-d3VQ>5y+Z#e^as^H@h|+_I^BKr zFUfyqcq8+}`{At>zD(iP3LmL( z8-@2)xUIswD7=lr?G@gZN43N4(B^;hu{Qq|-Vt}govrF$x8YqC-b3LIIOw!&{veG?bsTh{4+&IvRB!|#$W!S}4{uJ8{O{zTyq$v?u6ap?v<%>VFb z#!hb6Ky}~hte^7X}!apj!LgAly z6!Sm4+_vM6*w5rE@fT$NyH~MB;h@65lK+Ox|L_L$KO7LzVj;fBH$@+#J_PLIFkbtJ#zdi=wxU)mL=@L!5}gZFPm zHdpu`MK)IWU-JLV$VTX$=;pbOY(larw!qD->K~bi6xm9VEy!Eqme|UA{JSi&HA!o1 zgKe$q-yM-{71@!nog&+@*dE*C4xa8Vi0q`uZi?(oz6IZSxRCj!@)K^6q#T z9&SDUbsjmAqz4{_M_bkZelXHYkrNc@t;lhT^r6}pkHKTD)4z%${Yd)b0JQnv+>?Qd zoTA8yPr5Mb1@Z7(Hj<*?1292eUp8 z&&T07!n3)x3l+Ikk&DPL#*ui5_4wCwYi(&B0no~n<6hMa=Rk46q%&ReTv+n$X$v| zrhf`fMdrUdzju?|gVXR{Pk+mNIbD$%Ebhk#aHePT+I~=xrxbZekvWPyOqIJe@+j-s z*6FT+$4DN>C-6zD`tKBxrxlr}$Xs&ff8<%#&smQ@y(7<)F#jXW|Hyo+x-Gn{$R~=t zqR88dysF3|MP8%-bzFc8t>0~p`5$5aM;23k%c^c~-%;cPMcyS}g74w`*5kJDAqn$8 z@-geBR(1RHsUlw!ex}IhEWW@m@hi_}r#Jt9RODOo@9=y4!Ft?t{Y0`1m*Wbny6Le} z(M=WkMUjFcs}zYUvRaXVB5UaU6@SCE_9%B<1xc9ykud9sRo%4_QzWfOoIHU^Oj(cr zE*8mN4XQ;&{!pZ(NL`UK)e2UzW}WWUHAvRs@3`Ko{!e2fe=72yB7c$pjsM`k z*5jYA=th=Ay$yP9jGI{1pB~W`iteK5W{S2|baO>pDJpulz?QhB_4~j1ExHxS*4P@` zSk>R3=r)SBS9DwQcDNmGZ#`~*b|Bdicfy^m>b9_}qFog2py-~8?nZTY?1(o1-8qWx zMbZg7zOalQS@9E=i&J{+_QOJ zE>Lv5q8BPUTG5LXy-d-I=^2Ta;HB2@-y_k>Nk-unc%@a{S-wiq>lD43d<+M65e4|_Jl8|C_0tJ zop=}C?b+PhX^JjU^j<}uRrEeZA60a^qO%m8LFfJW0M4{Wx#xY5g+f3~7e zDmsV!F?<}Kupa+s6w#+hp2oTOj8)w+d`{8V6`iN(ONu^E^#yzp=Ub;ck}s3Ig0G^@ z|K@fUD7skDh2)Fy4Sdsj+;#XC$=mo2+WdF#v(fhyU9RZ+ihil+2a0~8=!f)tgdgKl z>-T4J^iz`0@N@jas{Xrn^eaWbSM+Q0Z}40E&U)OjwfV2;kN6WVv#L8XD-;bX`m>^I z6kSR67hHv_t<(QAmnic;`WyLL3|Q68kdUHrMZ@F~jAG1s+>uF;Br%0)tGd^cRm{7` zbBgVxXkM{R6fG#aUeThWHAPGGm$8CXd#pSAb&>|I!{4pyw)}^p|0?FhbOT{*$x;YBBuulKIEVd;{D`fu1Z2r4FiM3H| zJH^^k-3FQev3AzupYhoCIzh7d9DAr4{Llrwx zvF=n4!^80i>vYGE`5!xq{AldCLAAGH$0^o_ye}Su$6Aj&GW|&U;{ZI~s{R>_4ODEb zVkatgo??R(J5#Zf6dR)0$#kBAr{Z9Hlz(@`nE$cU$WO;J{;$fH!xXdmuh`jm4xa1T zeBSdFyIis1ie0SO2&xz0g?N#5`d4XeB*`UsDPCq(cYH=EcC}(xkY9%e zHFzyvXH|Cuu2<|{#cojScE!diHbJrR^xTLy;my|Xf1ZimLSpk@v59z_Ro$7Lq}ZK` z-9bJXr{GlUaj)nulDqL9oMu(GKlds2sAAIdian{=9P-ETaeTsh{MizFisWgWi_ciq9oy%W*jBN5ihHN&dBrzU>;=VsQS3#< zK2mJHVs9$;l47qb_A-xs1)2Y`*K9lP?p{E?5Er4{mCb!vtk@F8-Xeb+-$8%=`*+iO zB=6$~X!F1MNj1i1l)y zVj0B}`Q^mJXyoGhfH^a?Q_9*{;iMJ%#5?kR` zR(0EKt#~`d+mN@#ZE#!b@$Z-Tb|l+ld)&dQ{oS7iRjce76a zXI$})g6aFF81D}J!zJrzGh z@go#Jl%DQ*7#?o@Zfi%9^uVL=Xsfy-(@XJV74J>n2m9hN*5i)MaU}h)KMt^}+rkNo zpQiXg#ZOWEM5=@EBs|$V{i`&7D#>6Rfy*G#q;od ztNPzN#78LpuHqLcK11;f6~9sOixj^~@rxC|T=9|gUxJt7W%gMA`j3wyxdN}m(N=ZG z@M^`!Dn5q%8oU;-vmUo^*OT0U<8ZuH{b?V+N%6^w->mp;icg?=3*L$otr;zy{pKDe3jL$0mn&QtXK40;9^gNF*;EUGjj_^w) zFXJots#V=~URV50#TSq-#6|dq_4t2Q9$!rI7QT(|Sk-M|iQ*Z>-&1_K;_oZ|rQ#nb z{)yrr()kg7j7#lNZmKZ<Vc|RKLaVtjC>A=6{^|AODH! zGON11TA_GQ@t+l6qxedyzu+odO=l<8%>Ov^KfabEK=muuA;sg0Gymfe5}W^u$LR65 zkRVB73e!~mEo2q{Tk)LY6-s%<3oMFQ!m?*`&#Q|6u6T{y=D*?%TxUJ*nqN=C{EyrG zSNt!ly4U`X5>otMCA=a3pH&kZp?C1T^~ToeAH&3^BrR|=+}x`Eb`o1Cv9%H{$+yH- zxD`FT_C#xvHrN(z{x`SKPRagCY^TInCAL?hpAzkrI6#RVl-N^=9hK;y#7;bFXWRvC z{x|nU_1nE{x|pJFp|UZ2(@h}=%d8Z4Xj!yI?IR=kKoBwW3CcFc6 zo)QC;7^1}SN}Qy`3G@ua6LFCByRF&$SK<^r6$e|@|D2N;s>CoQP9r}Z&%iUS$8Evp zzY=HTIe4yB-4@PQ;&LU1D{-+BBdA`07ve?M>8_%YB$wc&c$rn*c19_2wGvm5Ux}mf zDti2LH-_XIWd0|vqv~IE*DK+D(7i#4`;-``#3UugD{+ewH`0F--i#CMQEso8|A~p@ zx8dzpb$fM(5_c&vnS2UP#XGIX9Uq(jO5B6f@LsF>_h4eW60?<C0m zctwd9>6wo&;mg+Vp7B+Z*YI^*U{!a&EK=faCEg%^6BpxK^dwoogYV)Je9yCaY(G%q zD6eU4_z9Qc zawWZ)utG_1;QXxQCQ7U%{{>g!YFvZAdb0RUiM2`u?8`4hN(7bMSP5@YRU%A71fv+k zI402hpDesRNnsi@n8h6Cl_)7uU|sa|o`|*gZ=HLOtytooy+%^U2Cl>3aXtQlf8t;G zH~xeFdb0RW$&GB0OXICQzf@jvIW)6aB~!Hfh}=MY~|_pIk`1SYixsUaU0wg z+u?SeZ7;o!b$i?acT}>Yk~^{98F#^5u>Sg#eSg# ze>Z26Hvg4856{QpR`oxXB`;9&N+mB;@=_&j{wsMgjzpXP&F8ZDujJ)83a_xL+sYTo1|{E7a-5R$lpL?*BqeXO4O-hxO5V(30^WkR z;zYa+Z};^6k}B&vlzdRh$x7a<|+D9*+?_!vI!*~b4DHa;cJ^ zDES%dPd&X&DfzjQU)cJuYTHe^wORMNl3&r_&HwL|{6@)d+qSTy-R95H^xNxg?!%8< zKR@9zT<+=K8I#`pPbs-l$+b%UqU0*~-kn@c=NkMKf8$a9l^jqqs$`Hngkg+WkN?>q z86$~f0_~mAeHu)rm8>b5QL?CHmTC_3Sg=n29WYrUDPskzR`oyMChJQ6p(LOGlk2Gd zj_a+*?a7}cf8pQwk5%0k{!{7zr8ZKky;A>Es+Ce3E48^&n^96seQ@2;(oZlRoxa2RI0yH-IO{? zse_a{OsRwEIRp>I?$+ky4N>ZNrA|`n1o{W!iD>h`d1RRXsZ+>L#lcqfKjWo_Dm6?goBv9kj%T3F zfA^Dt6!SlIHu*Vd^WWV&sqi2D|L}lGnKknshgD= zsni&yE>Y?VrTF}xV*aO?|EW=IGs^a_#L>w7PhD+Q?{>ERyhf=Tlw$s;t|J+X*ISSO zSvNI~WIW!8H(AwfVS-Y3Ds_uela#uZ>O{N^Z?{f&UEM)48K>Y>tNK6jNZqB>eM;R; zeh*H=d#%U+nOJH%$qc+7AF!(bQ?Jx4rRFL1pi)mM^^j6?lzNz+NAOXcZT)L%n#J+IV4rCw0#6{TLJIv-!cm#x#i_E$+>!`E?v zRo$L1QtEA`-XMPy7vo#j){dB2wJBc;Ak%DZ?zS86HM zPw-Rx%(J=wUy#`6f2I8Gd~MbLe+0gj_X*Id-{TMXqxHCJW0_KGm0GUUDy3FX{TWx{ zFV^Xfz-p2;_$&Tq)lQR4dy0Tk%>NYgKgIk{MXc)X^q5kADiv3%q*OwwtWrrHn8Gw> ztl#ZhjwFu-ELzo{;iDVzUF)v#_o-bYYN*5U8C9{=!c-tT`Yy_r&fEA4gK z{8#E<{Lf5pWS#zNPj5`J32urltjgTr%gvP*i!HDvZt3Z+)$~?MU#j%hO7~Q{wbGrH zZlmZwDjIeAFOm2rT15QAFBIeSKQA!-Ela8d+ozW&cd_t9IN`*cKSS}FI4(` z^5HlFFR&iBCl`@ij3e<9tGX>*rt||!U#|2`N{>?dYNfBB=Sm!nS6RQiD#j>%z0%i^ zGyl`qu^wwZ{ySRw29j|&9&fa&d&ZlUo~rZ&rEgdI7OJ=6M7+&9-D|gdT)&&On?0&GR@@>G?{}Qu;}yA5?m_(ht$|Fg}8h zZqPr6U)NJgKd1E5ROjL|_^kD~qc@M_d3*t1w5tDJmVQa;#Y(@d^a7<{ zq53MmhOb+vJ2DGN7U3KCCe>3}zoqnhO25te9efv;csB2d_enm$5Ah?bx_fG=GLIE#U`X{BoQ2JY?ng4134*Hrce6zt8z9ab_f50ED>dxIVrGHU+ zIr$3w8CP15yJuICtj0C?D^;6sO0QKqrF1~)sM0}_5QZ`0**sP;k~k*N?!o3+ODkPa zIzyht9OkXZ|Fgezk)(uWtZY!Nk<_t)>+pA6kAL8w_?LH(mHu0qos_oU|Ie5F698%c z34qK-%GilehTs36vETpCmtJDO|DUz}69CF=u8jTif7V+l)3UkVQkhoG^;XK*@BgQV ze*z$5{{(+O}X-~Z2=e*z%0qqp;X>3;veGP@|VYqO^V zrQL9MWjeCh1NX$euoHI1y|D}KgZp~2=&HmJ!OkZVs+8N38!rs`&9^zkt8RmcHSn}hrpH+yffMCK%tlkpU^JJelQnIX!Yr_4}ghADFzRpx)j=D#v$ zTBm=%XU-xy8*Tn8bFNk0o}91DMam2(AAvUimATM*{K=EKm}Df{{8#2utNJrJbGb6N zDKko$>y^1enK8;R|1+cMyb76sfNjB@+`cjYGp~`qjti{n&!x;F zWj;{m4Q1X@=1r=L@hyDYI^EHJmt+aPhc^HHpWgH3hsu1!;$vKjpLjN}vCouQt<2}j z{G`km%6zK~^FPD<&wNe)H`ec-k@=rt{%3xm`lDytaX+(OrpyXuZ2r5?3>iOPN%a?8 zWmUJeHOj=5`Bj;aGQUw>ivhIx?|vSV36t3TS0;)!|NSGzmkDKT{wtHhG-f=TXFR9u zPRit!-9(v!GV7HoDpOOYL?`ni?VwwyQ{K$DBFRa-Eep8=;>x) zc2APM(BH$(R`vhnDBDHZ{gvH^>b}?&_p=^>y>ISN0@j$0>WVvLlr}McK2JJyqG$l^sm~5FCo9dAd)n*)vGa#9?Uj-+gw< zo}=stWzQu)56{Qp*5i)J1tb^ZMQHQC`6@0^mhqmwRN2d@UXG*i3hQ)7ezdaJDti_A z)i?&Pu^#`kT$cHt9ZP;a-e6V#%Fm8hc80PyDmz)(o0OfX?9KE{z+3QE>;KBXPHrQ) z9Vg)(R&`sOqU=4&P9?t+@4~yS$L;epl6&z!oW4Qzeq|q1_5o!dR(2*;=707<)(=^y z{~nipgyd12jdQ4;%KC9-y>tBp>nHIkeA=^l7M>w_7McH9=D#~`FDUzqvM(z8k+SoZ zeN)+&lzm;ymj;1SU|oI7vURLb$8QZWtS-X7Wv!w4%+;8e~Ui*9?ARo z0e)yz|L?(OKUVfzWtS@Zg|eSe{S-gL&#lwl3ty6aglEe5RL|E@C|A_-#zqgHiSPF&fH zvI+7erZ8fa-O zll+7K;(u24pDXu2(8;=mL#ok zE8N-AE3?gYgin zy4T)axgN?f|8s{^Jpzxk9{=aJxuZyq#-7;As%{H?l zNV((5Pr!kAqV@RKWbP!AlkpU^>CxQ65aq@xH&nTi%AKa%*)*K49P>YSCSMN2vv`#M zde2dAgmUMSpNHq;aO?4Z?vcBIS8j%KH!3$-xto-msNBtTPQY96R?p_O z$NbOTPCg0mu&V!=IX6YQdz70>&iv2a#rkgR@$cf?G?IJqKAdh9k9&1bkUWV`A@kqe#m^{zhH}p;_m6VVDffeN^OSpE zx#yKzsN4(6y`tQUJZe6^gfDwGU(2f`ui@*sz^ZQhiEI!7i_=#upO888Asb>=t0O|gYN%0E7N=6_z~TVPA8 z`bRt8O8K_RZ$-W}w#GKrZC)^o#u}=Ru z=R1(>hP#uGWW9&-dn>;u>%FiOGXMPvneRff5AKUyJ>3YY~7b-tY z`8$YfU&p&BZcjTW|{&`Asm4AlCv-lj&^K`Q} z|AO+bDE}h)e0&LCrpLciUL|=AU&jSj_2*K4k@6Ac-%$P=<=<5PBjpz>zeM@B=zJUB z!FTOZ{>;z6NAf;?fFDx*iuK3Jf37_9KmQ5Ir}&xmxObA2=`L)WgCSQX#|CRr3gPs6M5SjmZ=D$0e zQRV+oKBjz8`MB~Kwx_Wo3%h4O!?;0^h|ss4li;(ylZzxIN6sQ;(J#<&S?YE}R4D{Q91mMUyc zF5CiJT95ye=Rzxzt#E5>ZB_r1x%ZEa7TT(?jf&T+u&oMTsnAY^t5n!dh2AP`ufqN+ zv{zvd6?RZzR~2?-3(Wt*&a8K_t@+n{p##ZoX!Bo%j#l;W@xq=ebWve1a<1w^XV!aL zkAFoK_9599yW)OUbz3+BR!PweH{JhpvQI8%kbDhyKL7!?Mna4bE?VL$9o|Ea8x#}jZMp6KcRj!@ww6^5vA zGWjX!KWeb`xHC1BocUiko%I=3byvbL6)sZYEET-JzF`Q%sUVt|L zo7=fqh09eKNqz}likDfB+rlW4EAUDjZB@4?SF12vg)u7JslqiXOi9i7bo z!u70gut)j#cws!rjmZ2j+-z01&0AEMq{6LKCnEE|aJ%)my}E;ZGETv%R&`srONHr# zcdKv@i)nZ--skD=zQPO@9#r9ea^`e4xS`D!ik@oAfNkx6tN)b5CsktFQ#$!}qEBd-9g6@EOVH z_yvAxRd!3TstZO_ljy_?7i<*5i(FfFy_^3|rNmuc!)X!k7wi770vZ%G14*7BVUnRmhU( zFpmZ6@qhb7p+r(f=6|7TRkycw6}_3+pVse=*xw}o;J^5v zRsF3M|EJ<+Dl-3z%>Ux1)>CX@J^rW1;^rhm=6|uJRoxa^sn}k{tyJ`e{MPie#x~g2 zI{o{rxGhOL+zz+5s@u*ED(;9&xI1>Vs@uYzDxRp~UMhB1 zv6G5jY3Qut-YmKx^S`+729MfL#cnF@PxSyi(5n9XMe!gKo9Zeaf`?kwy`sZZ?4#o0 zDju!k5mb-F9(dFSojplvTu&3KHgjaWw0ztjgKs%P}fm z!{S=J4##>nw{U|>T~!>X;&&>JSMdcEZ&dMq6>m~;ii$U@c$-Y{ zJIN$u{ud`()$QR_6{o3qC)K;~ZoJ2O{Ldss=6~@%^65B(YJ>FyDn72_OcftdaTdvg z_z>FsZ$6jJe-&rr9DK~G{wK`h6DmHV;*;c0;nO(RdffHT{4YL7J`bO_s(URjs<=eO z`6|9n=_M6y{;T*3`d8y?*6+^a0u>jlxRB~1d;{OK9(N@$|BE*NReT5E-JtrOieISs zzKTm#{DA6*_z`|=oo?SgA^8+P!_TeCp77seL@@zY@JL?EWF@|wZ z_bIWMRI#FBO2xd2X{s5_V$M39%Wva0`FrIsqS zR%uJ}R=5>zZ9V?AQDXj=+LCXB+gjD1tEKH!+FhmXRoYpl_EdMk9dRe?^p8x*=D$k2 zVh7yKs{ZHjQb(0KtF#CCp12owvL3gEy-B*@KDe({{kx{LpGwnI+Fzw}RXRYWekvWP zQV*57snlJigXljP55Yt2vHrbZI*jCSJOYojs@w8WD)mw6X!4%e3wv9SJ4$^?j=^K` zIIFs|&|js&Dh*I+kV?l>Jpl*eiFEqs@g$Oyk@;V;`S0%K(h!x-RB0&H)9`dW!+P9N z8b)#!GXG09|C`nGR2r+&`6^wm(r}e7R%ryC7vP0>k@frYsx*>>`CnrGmoBrayM9Kg zbhS!X(8K&Mjb?q7^|<{RLvjsXi`QAzzn)9it8|-6-u%B=rEyfpQA}S?J7-GX%hJzI2osG(8K&M-9>&k-eXn&9i()xN()uGPo<|+ny%7pm1d~) zpi1}C`2fzuS@tNmSIqy?!{m?PqgLhU@#P$qZ2qhCI6i?-dN!|(r&Y4?uF_nUo?-DU zK8N!>-S>T^7gTyhr5DNP<4gFm^|<@-Rg%|`H;B>#tGc7KNTsh;dPAiTReDpUcU4+U z=UezTzGMAvYfDJp!}sw6tGcWDBb7c=$>zUGOYsx@)O!5Sz@^VgzQ8Z>E35i{c3k>K zrIjjutI|&@eMj|s`~iQoPIsJ_ku1j*$o%K-yL%)@lE(rT zt?K{nmr_}!zf`KIv`(ce)fzJYOE&-Azq3>NoqRq1fqz=nO_;w`_Kx#E@d!6U&21hTu@N`QJQKXQ+IR%4d=fL*{?^Z0m8as61Zf3soMi z@o$_xaT4BPRX$hn?q3r}A?uPgi-i$}?1cQ04pSe*kCVEPJf~u2Fu76; z{+A!8`UE~{J?fiVe{%f87 zo>Vrnq~aZR&y8^ttNQ1t(n6J%s%%ESISRM19{;&2TavUwoByiV8-%+8D{WNSTa~t| z?4rsxsizS2b%#(QNSRraOY7577%|IIx=P?bYf=|+AK9*l=rk2^lyNe;uq@d&HB zz3rh&O_ifmc~F(3RT-s9PgRDh(o2=&Rq3tDajNv;QGM|kJl3}0-@lc9B>i!K8*<dx9}sti} z;rUek^FBhAk*Zukej#3jHvgNi;u4Ze@iM%8gX$HkOj6}aRmQ0@T9s>6xr!dJ<45mPm(-^Pvcyx`k$FA&#LmGD$kM6!{_k@>v3m)KFLe?GQMI}cLZKj zN>P<8c@FbfupW07nE#bBc?GLhbrYbj>Jh3mRNY#Yb*gTz%I~UrM`pb$f2;Bb z{eR+LJnB@|%>T;2tp78s8(H=LKJ8RDR&^8dO|b=TW<6Xve92otbqiHn^5vG;3b*of zXTRE7)y}H6QFUik+p4;~s@u@BEi(VB+gZQ=imL6&cfcKSC#(9O_o}<7+ELYA$vfa~ zxV!cE$Go}+$)30ucCxB}%~$tUb$`Mxs_w&LU+jwec{cat096lB^+57&co5pTb60-# zP?GL=7~1@AKG%_|UZiRdRR^hhl&bwzJzCYis`jL_7xumhX7t5EecJRQ$KoB!_GtDdFm`Kq2x zehxDKtLIsdfA3d^laIg)@ItHlS8w%VRc}^xq^e_7y+qY3RAv5GFQfBv9A*9f=cwwH zB%_h}U%lF@{v@ehqv{Q+UQ6{l9E;amkGp=xk&MS1@g}RfElf~#65%bX-pXPk-iEh( zx(QIdL)E)folHIjng3Or|IO#RoBSS}hWAqSkM?xcW~(|wwQj23uWCZo2ULAe)tRb3 zr|K+KXY-H;RegxX!}th3>e)Pob5wmw)yK$f{;T=~K50GfEIdsz7oWjrt?IuQROhL> zK-K3}eOXnT|Ej)-^YJC?blZ7_xHVmrRpNqHvd(96Bm2B*;sv>!ex>S%s(z~KNA!G*OYsxy_y3Hq`WeaR_yvAxRd;oLt?Cb|enb8( zeuv*%kDCTRlKh0raJgsOOHO9}v#P(cSgESbe^poEYFy*lc4~w5Z>ok>UCTOvK@52| z@An8v6k{0oY&*5YI;q;0s-{%+hIU%jB4I|=EQ=iGvEbQuoZXvzSyHvkg85&qvaWfy zZDsFDsy0;HNL6qC|E22hBm}Z4=xSTX?$H zSlgV0;a}T=bxY6Y7Fwycr)pcNwu5S0tG2Cbt?6llZE+h9D%wlisg8O*3z3c$iU2#9$AN~A5 zZ|$zP+Ci#arrN=(out|!s`XLrP}O><)}8*t@Nhf=kMwk(I%-Fe9F0A(7xwmS9^1aE z4N&bEa^`>SIMz1*RqIdZ1FVn76L27&h=V+vTRT~`b5uJ;wbNB&BGm@dGX#es*O>pg zsCEX)nK%s3!m~Zy^;0`nwF^}{kNkWbjwA2_Pd7hn7m-|yBk>Zv)YE-WUAtVhTU8sS z+Bns&Q0*GkuB2x)UWHfV7|-Szzm|mgUmMH%dc47Um<)V5UbP!p+=Msd1iZzwxwVO^ z-K*Mds!dhxcB+%`4xEfrJl)@asNG3&7v7Ec;55(XHt$nymTJ?e)Qzb5x6~_Lyq#s`j{Q3srkUwdYiOlFp~_X`GAC;Ip31Yj2)vFRS)E z`3v|W&c~NL-L$N|Lh>rUhOgrSPyf~Np~eWlv_ zs(qr`2lRZ1A0hLA>>*)LwGfLiMlgyo&*rlyRNqClr0U*X zoKmf>T3WTDY8g7Sn8Q34JezlMiKL7btfI|-_o=4l&HuktTSxvouE#&{PtWGL_?zS( z{1^W->l=BxnOxsk_13CyqWTu9Z%VZVZibtqJl)Tr>McpO#8$W!Ztdx=^LiWAw^zL_ z`8K#Mw!`f_-5%E4lk9*y;!bGu-yP5TuBsoQdI#0Js=k}*omAhQo{qQ&?umPOy6+)G7$eySg=`u^kx;DOi;5At+ZNc|9!L$Ny^hKGB)?`rEus@`Aq9;)|I zo%vs9{?~ib*$aDHzyDdK-k0PUJQk0`exB}ns1G1H9#6o5cp?t+Y`&J0wXTKgr>Nn* zqEl6WL-oO`Pf~q|>X)iMRP_<6pQifRs-Mnd&%iTr7@pAa`>UXIAsOpndpGIkl>QhkBAIB%~Nqow)c}>nG zc?O@w=Ww29^C-Qb`m3tHNIoB5!k6(C&*p1+jfDAMU%+}HF0vkfO4r|1{V&xQs~%SU zE!96&{cY7hQ2iY`-^C^P9=`9{oHHMie1sq4QvAfT?Z-^H`e&;Ds`}^TU*MPc6@HE1 z;J4nTqWX9EJ^p|{;!n5?m*Wcj8CT*jxC&R}8qYR~S*(BKS=M3zgBbE`9*v0VMb)FK zr&W(pjbj3nnDT5M;S5O@bC}11XLFk+)f=jp$t&m|nHuZ5b^3o6P-p(veR9+N}VcwCJ` z)flNpcQsB`<1jUjRpW3qda7{*{YPRCJPMEYbQ87Fi=;R9!M=Emr<(wc^{?Ggy6UcADTX7=Z=Gi>vlhl}@#vN+ht;S@k zQ*bKYiFbLrcfH0vB-8L-ybq^)x=-MZ`_*_@jR(kQ;w)tTH*EeluY8;TYCMXwaSlG_ z**w=zsPTguPpa{*8c(V5iW*O=@w^&y>3jyC#piIIXY(3(f#gM;k1yfNp6<`18?UPI zh8nMtzm5xVAujT49?v&P7UNs^HooK8JUdI&_)?Ac)L5#<`&2)`5Ah@X*wanL#wR47 z;%E3de&OkFlP|wg<7*b*;J5f4e(%|Q_8-;As_~N=0X3GXu}Y2Q^sK<2aV7rZ*}PU) zldQpC@i$!S*}Q*)YQ)tDk%uvYQH*&uk9mS5i78BD#7RA^gyesed{Xk4OI{@3SMn@uL8_BmK-x9aN*0{ClZ)3g~Y$#-Pw4%i7hdz#h|L4zUJOfd!Udd08{7sU-O7c@AKat8wcr{*wlg(fcUrTZwUXM4R z>;HZy&)+QhJ0yP#`K>q=Z^PToV75C+?!voq8s1|DHTOyWNy*g%P@U-Camp_Sw}NFgTqpCwKM*aq9; zwx++I3++j^!w$GTb~J;UPEy!e3Z2P!#GSAUb~XKLM}=-AyWp<48}4ofdudN8^pwJ0 zQaC^gd$V*O+!y!5{Z0QE6%Hinjt5~6JlOQVhZGKx!Vyw9l>9L4g@Dcq6t0lMc~TfJh4ZPo z058OGc##?GlZ#2{|Ak8#Uxt^vn#NC@3s*|v8YxU5zX~VfB)r-TDkqan!E5n4yxt7< z@QqTqT?#jm-;B55tvD5LGaK8*!#kvKCxg52Zk&eqn8B;xCzVU3aKDtEkir8}yhRER zN^yHBJS2sUQkX72Cp3eQU6VJSQ*g-4j-QG5&^$0y9-jD3paX`G3(@EOzphF^G2 z3ZF~idGZ%{;{U@v!yUc3ZF?~ zE(PWLF2*JJF209LaT&gEGFUE!4;Xxi9|ifxQuu^q1%4Xj zD|xsISK}J9*@~-e^;pj@*v2pMEBqS2F@vN3ofLkT!uL|J_P&;-Kj1q25!ajkH;}>x zlArMx{1tyQ8^?%;e@Nj^27lq-NdGVVYh%BY7xGfH{a=t`ObSIQ)TL0OlKx+)Fs@>a zXEl1h=aM4hqMepDrvDeC)buBbOEE3Q1mh&q|BK2vW%@m>m?6nx4(b2JCRfwA$Dr6; zifyF0sT5mDu?00PaWmW;>Hm$ZPsJ@sw!+r9HEv@z_B;>UN^x5T?XW#=haJq|)jLXY zkQ8^2Voxb{lH#6H>@3A@QrwZsov;gb#hp$6^Swy_FVYW-^#9`S)a>DE8h4l!_mbiP zQl$SE_hBjhzqlXc{i$^8BgF%e{$Hg37kiK#>}vdNKSYX0OYu-C_L1UYEbWE#|6*^( zM^OJgd^RJPrrq@uuG&ii4$iffP@W;z%hDk>YSEo=D9} zcrv>FFU4V|-*t;4NKV01@iaW$3~EM6af}p4lb?a~|KeGU&vuoK?;gc-NXFv1cpjc_ z2D4o##fefJC&kO8co9p-BmKWf|1VzZ>KoVIiaZiUTZpdf)roJH}Fk-3+LcmlfgVG z&S$Uy7vkIa4lcsQCW9qXd{>GeGJX%2;xZ||Zv)25@q?zeLxbcaDSk}&Nsz4I;ipnu z>5@jJ+t}4oT*Fp;hM(gX_$7XYU*k6>gKwqy9fR+2E&hP(@JC#4GWbb~8yNhIzXbWO zJp2uRm*O9dys7P3Qv8eXZ~O=U#f_N90v54^WvpP;WKff0oq^{pg)oc}jA9Jqm@pY6 zQKY0nk|IfCrm5}4407)LDbfE+uK!D^88$clZ#5qdns*0O&e^B^#4*j_pHXxJ4*Eb68*NcJvAM12Uo+rzC7$KCHjA9 zCmwdeu1NoH+#yriMM`^1iT+=r|Ci|hCD;F@v?uOm`ahK@?IWe`QlkHt=>H|x|D|*Q z9_T9l^`!ro=>MgIS=tj1aW#z&P&!OXtkwZE2vCPL$H|ETspQ1~WbZhq%f{|18n}ODB`l|4Xj_OKG^P zY5YW{bc&Q{?4?tsME@_j{x7AGI0{|=4_^IDDUFrVS>$Kq7HnoG+_U`sKS4^9rF0cbC*mZe|Ce0< z4~_!;zvTMAl&(Yif64X#U>$Cf(!El;SxR?E=@x2k#i@83-fjllMgK3+|4a1$68*nK z|M%DMJ}J$R68*nK|1UkrJg)ysX}X)uKTGNVCHjAf{$Ha1m;TfLOHWGq0VzEt<=v(9 zw3MS#nkl89q%=!PFH7keDLp5pXaBQ?&+{rT;B0&mUowNOctuLzOX*ee*YI_G1K-5A zaE_F|kkVW!z01RSQkpNNccip{hYRs-vuR!9NG&2+j7$ELzbB`2 zgR^dfl=4#gSxSFO=@*v%iofCS_=oA*tUJno;otZV{)-#UV9tV+YEmkam#~Z#teQb( zoy2pNLueP~VH_P~R&r|I{c@}W}hBjv-$d*R{O8;>x9^`R#ZI-ifaN2j}NBl6&x8ybtd;{r|I|{Ge3qjrNd~S4nxgl;4!{3@JY= z<%gwg?fntz>Hp=&7(b3rxEUIMS1mt9@-)uGS@?_@?A7O_{IZmvCw~EFEC}+ zeuaeoUw)18>-dJNX?!}D-;(lsQl2B_x1~InrSot;F2IFmuvgz9S%iym3Azss|2t%P zsgysG@-p)GaXEf~ADY3de@yZTuE0-mr5V($mh#_HUL)moQvOWJ-$?m$YQDfP@hkk= z435{gB;VopxE6mfgPDJn@~=`}PyQ2bz@PCKvst`x9{xu1JN|)x;$LQPe*Pnskd*(G za#_k7S(?WJ7O`Xo@4E^~6>C^W&-C|XB`lSsR3a{~L@|bOOql*`6(LbfVHz{0f9xtb zsT?YmO{CIUDos+^S}M(?vbj{6Q@JU&z?Qg~>0kG#Y(dfrx5TZmwHeI6ja0UiN*nUF zxGlEB_GZ&hNyZ&;d+dliU?(%!_8q0Nw^VkL%C1uB!qTp|Gj_vW%%&f%W4s&gj(gyq zxR)8M;XYF7E|q=B_rv}106ft2k7nf{k{)<4_QXR>|NN;OCY9k*=_Qq8rE<7bj*?1m zYL37@*cXp9{WG)DkEA~yjRWu)Gnn}}sSJ_IK=R{p5Dvx@%wR8_NOBUMj6-pl>3?EY zMo49hR8En~D5;#v($nyC9O)_>R{|@eNzTAC@hm*s^na#MIY%lNN@Xnhxp*F)j~AH1 zIWvyrA{>tw<0WRZk^eHjOlm2qTrSl^q;iE+zLUz8Qh8b`6Qp7n*sqex%~F{tm20Ik ziTbPY8k~$%Ouyq*8fU`wY@)$mjPvDdIl6j8tBf z%CpowhtJ~+INS8^fvLPi@-n`Hui|TFunuoXWxiD2B!3I%;9Q(%`k#-L1tbgcZF~n8 znZayJr1Gg$-j&J+QhAT1OK};#kIT*AJ@_HXNBA**f-B5m&XrR6LMp4sSK}J|3_mx6 zcgmL}U*XsI4Ss6|=l}Oo%}QmhREkphK`OscuudvJGFXrF|H=l&KbyhX@~c$-mdbDB z^#95qjQ_;H{!{r6N#m@h|5x%P1y|F!c3LS(H6fL^#AIfuBP#K@ao=DJy5FquykLf|5x{Ce1NNL z{GG1ao#Y_wfd^wx(?5>YL!~-Hs)tF{8doo=j*#l%Qaw(py`|busz*@Y2m9iYc$DdX z)2sF;IT{DxF?g&Q?1zC;JyEL1lMlkdcmfVF{k~m2iR5G)iodJ z)zesdI*!CqINA)h@l2Al@N67|=a|8q=SuY=sh&rEK3;$q;y5!{!|@~+<0W`0USJLlxGpRlz)wxoARH`pX^)ac= zlq&td`ULe);#2svdv4?J+SOSk&)~E896oObHM6Dqnp9sTe+gg4SMXKS|GRDVb&@ym zO?(UIn0`mC&XeluhRdki(GxIdW>;z#%~eqsju>Qj=HxC&R}8Z%hK&!zf@RKJkwPg4C-s@C4WqULM-2EWDcOuv&? z*OL5z>yZ9mUGHid{kgh<{Ac_Hf5qSMcQe@PKc!le>R(bVNcC@){)7MGM$DT*S1FQ| zu#6R~n!(YjOD!f<&*ilchB1Os)87NNI7tGND5$326>Dj!EtOhEY9pkUmD+()%So-h z)Hab?YpFF!Z8NFS|7*>8?xxrRTe^7~*ZFIklWc*la7*0E^!G+>YZCf@tqtS0xGlCb zgUaoswu{s{NNq={ZO_t5~* zr%3HFshujdE2Vat)XtOI=~6pOY9px}g`@EdJkt!$x3fvc;5j%J&ozU6d%n~zmf8j6 z7vea)2*;cLcYxX@B$wi4csX8S1~n6;HjVHqsZC@s3F-f}YZy<)DR`}YZI;?~cs<^L zH{wlrGv0!?;#9m1Z^t|EPO05xgQh<1n@ZnE?e1nP?k2xSY7a^6US9D&ydNLH2hCvp zr<2UUhw%}7)bu-2?QyBSDYYl0_AHB@l-g4ap2nF-|F1n`<6u8OC$*QQ_B=~pz}fgB zzGV9Uw_xoRl2`FHd>!8~gR}81sl6?=IplM39?r)FxX^68IuGBG+9C#vaS77@Ywy`O zI475B=tHT!FLir+E|=O*Qu{z^Ur5cul~VhNXMK#H;0pZI4AyNG$!c7KpW)}G|LI@* zQfl8z?JM%H@f-XWzcc;MpxRmz`hRU5;~#Oot7-gRquK_k<)!ws)c%wj{l7;4ul+`) z>;F>w!__ywE7txZ`5XVie{rK3ymtyxt4Xa$Ucxd~kpAEJn`y01;yLRfv|VB22u3j` z_4ZPa+n0Z-C){5F+#o4+VW5}_^0d@5Bw5S_`6g0tB58)rgM3q|w;*YWo8jiT1-8O1 zaVu<%TjMq+gEmrc%V1k<=kk7=INjQAC-n{twhxkyJlsL*or0t@$&R>_)Vna~8Z6zJ zhux&UOCxFO_qEh_)6h#&-(5q`NPQ0tJt1}ae|<0Z+upbj?u+~3{u;Vk>Ic{XmHL6$ z9S_pbg;MV!_1~m^FiB55MC#8;{ZOf2D)qypK0@lfq<);#50`pBsrQz8U#TA<^*&AW zH#D`4xIb>@Bc*iwlYKHaF!KI{TQhq>mIf}tMOc^50v_eQa@hm zCrEve)Cap6Y+6?{l&1`7n*W8n521dN)Q3v_drqosaE)7)9M&P{U%v*tGWIZ{7c>SO%%=UxI9jdf*i z&Ciqic&VQ+^>I?aK2QMCzAI{YI%@ zA@%E|ex=kWG|d&tta4&7o@4{5Url}uPR1#Ct?B-_n(Ik!XgqA>Qol*+cJ57+`YkNI z6{q5Dcst&KcbZIf7v62U#I5-~crV_E_e=c&1`pyxCeNBK^%+usxbZLuAEo9osn3-9 z<5GW0>UN?&$DfJhm{-M-oOMSl7UzGYA zQn$Cjt5Sbi>aV!s#u@0&kk_RCIteGCo8e8V&z1UHQlIm`X*rtnIMBAY?RYJa`nytJ zDD_2Be_QJBxU+>5!%h;ZFP8cew?2*YXYM4azbEzgrM^_^%l`k|bFZ~r>fHI$I3Zo- zM{LE%_=(h4xOq6YrT*#v=9Ky>sjrs$cT!&?b$gG0CiO3+{<+lcwC7x6LaBe{Ki!?@ z-?+_jFZwO>Sn|Epf0FuIsjuUd`=N1$OZ`WwbMud#igwPsbJb4fU!?Bt|8bkirb*r1 z|HGd7ooU_uKT`iwJbU|a|4;pI@$5~?{Xcc?|EX^j?UF7mZYQw*O+V}*Uf3Vo5%i+s#l>^?|1`DZUM4RgUb5+j zj!i%GbgOD}dMaLqK}tM#^N-t#1>+fyl#%-=@Hgu+VTZ`9Dylup5OL3c~1zj6U#oN{mthadW z#oJ!I?ZoR496OGnTa%8i#_mt^I*GTZc%8-DS-c&^>q59wv+jp9+h+#ju1#|rE7ncC z-Nf5Pyj|UM*?d#H-Nkb&>{hbTd%eBH+h4rB#oJfBecU4ZOog&_F8}o2Pv+-}) zt`qOnAUUnEO5%;AV3dZ&iZ@zA`-yi3$(eW-o-N)Q@y3Yvn0V)icfEL4e7Sh%igzK$ zM59o)m8uOP><&Y4K*-3pLJp_Wv{DJ;yG6)^wlv-t*$U;O4Q1w)d=edA3X65bq`N zUKQ_U@#z0nu%Pjld`&!e^QSxE=Wk%!-xP1IcyEa}$4z3Depi_%-h5YPZ{fM^S*3;I zeI(x7;=L!{JK`-7Z;^P5-LtG&*_C;w=;JeSdek?VTmw2jYF`@74BI z&Ij)Q^ga=9rFbjEv(De%ojk4^+x}T4-fAmzE917*&XCVE)Fj^L;^oErLcE{E`%=8` z#rsOUZ&-(~-Ft9BSMk0T?>qOb1xE<<%9tL%i{SPZY19 zp_q6@@#^B0#H)%|7O%pzv)n#(^VF=~t*3jgr=hThLT&~Zex;#^hNAXOFL>#e8j5Qu zrJ;m|#P*Mdl5Q8-X>jla4XJzLT&qcID5s%}hO#bcoT7fsCN61nm4=#WsEdZ0Yp9Ke zHq}ro4YknFX3W#Failb~xrVlI+iTCY(|G(+4Q;8Rtu?fjhFaSTS@ORVRYTjj?Q*Ns zRzursXj=`n*HAn6a&E02($IDq>fokoyj9!UrghX%XASM3p-%3(HsR2jtlN$n+Q}uX zs=b7Ux@u@I4ehKU`;y;HL%V8d7gs=yhIaek*ajMMp8^`%v+;Bd?af2K|7&R9#_`gS zegE&Tp#wD3OGB>zYp6ROggwype+~7tsWjw1FEn&09%i~fE_eN3L%s0`bp2mLeep<> zvZFNQ`hR1sSah_8254xchFt&Gkn8^%a{XUJ1Mzqb4b#vd4V|o^!5SLEJnkca{duB> zPIBGVP9!_TZVz*RHScH*4QGZC8akC{o#I~C?eo(#bh>*A51sDiM&W359|0P29|0P2 z9|0OV8^_=|CKH~^!}IWbyr8j&@i=tf|1~ro-6y_=F2PIjG7U9e{c;{&p`j~n;QqM1 z>INE`h?D%BF8~^He+AHx`zwHkrr@=B9bS(&;Ei|_-mIZp7`X5M8k&mk`#*!*HFO7q zJMk{OTSJd%Xqtu|)X+T|x{npRx6uJKbialkXuOMq-DrnkhK8owb6w(&$ix2Fz2c+H z>Aoj0c-*x+mp^HL8`Y4z{-Ysx{YOLY`j3X(^`FKyB@MaDL>hVy-Sr<0x$8d~a@T(} zpL+<)d@ajuRmf`!j96vCF**?;+J?mo){ivZ& zG-Qq4UH{RLyZ)o0mFTYjXvkgv(U80T)3^quq0cq+t%klJ{}SEx9}T(dKN@n^e}Xk} z*MBthJ-X{Z8gkcvG~}-TG_JyFXuXF1)zD8G`dvdCSo$-%>pvQD*MBtRuKzTyBWcK8 z|IyH&=&t{0$X)-@kh}iVxI0cm8#PqXP@cSi?)s00-1Q#~x$8f{wz%s*8mghY{-Ysx z{YS&@`cLC$ml}>}cxw$uHQc1(n1)jtj#HDsBnqnO&m2yZWH5_4+{E;cLb#cRH`j1; z@=dV?w#3a$e@}+DAZdkL;#Sz&3})L#!#irYjfOjDxGhV!#dg>pw=)|*Srh8MnS3CmyU|&2Ek1~Tb>965|8a|qQ03L(K;&G;beuj@H8H9uJ1RP>ETftcx zK1su8X!v9epQ_=ZEFFf!aRi=X25Wd4$>}%}N8xBQIGSf__*@O2MSeDp!EX1iI#_i6YR4d1EZTUk04Z^PU14zqFnS;Kdc+>O)l9=z8KUj2Rz zKdj*g$REUqa5~N~gI9lq8{1BBtNkfku@YC|YFuMB z&Ltjxu3`FrnEoH8|A*=S;cr}}e{OuI;omiE@93X2yp|{afa~x_TyF;T8%XH?;l?}b zSCZdc4R?}g_zw+R_xO|iFZ>(-!GF!*U6v;)U=iv6Vfw${E2nHv8V;pK+G=EbjciL!|Btk1yd8FMm5pN*=}58z zcEZlMqv`kdNEeNqtdXu7>8X*OHL|}(x@lxjjqF0@uDBcSj(eEF9@vXyZ`=p>#r@1+ z9S$Hl5WC|+*aHtX8$Zp_$RQdzS|f*Qq>n}pV`(ou9DCytW>YV^N2D(a{XgRRzef6D ze^L%u$cNyGc#^B}XB(=K>oqb=BWG)5xJE{5 zWCS&*;Hh{To^A%`z$lW@cm|${XPLpwV>EKLM(F>Mu`E3o&%^Wa0=&?6tVYJ+MK~TW z#!K*0ybLeLD@+DgYGeX~tAb>rMkcxON3+PU;Z-K%6ucI%GlR9gK_jWd`w|45l}1*@)xyN`HS*9iSTO8<|BT^NmE)Kxa#Y0$bshrhk4$TWhqF zMz_{zdyTsOuhBNx7PrNAX0Yb;|7ZvD?Xe^7;A$F2A=+7^-88x*`A*mcyW-Afur0fg z?25bL?zo2;%(jY4m~U zVH)kL(O%?-V{beH`arlFxx1NF4O2}joz!#GcY}`w%(Tg>DrA99yzZ5US%kc`gD-PJw)aV3~t8gMt z!mCZc^F$|W^d`b78oidmb$C7AfH#^=8yfrPW{uvV(ObxG#i@83-fjjn-$`;8-i_1n z9y2&Y?$hWi8oghmPigc4jXt8$2dQ}or{fHK*lgUNuhBvAhQH$qPM))B31Y*UST8cVoE zv5>}WWo!_^D8?{u`bQy_)L2$yLas>vkEI!BTxDa6VmXpcunC)CbJIVoV=Xk+Lt`y9 zwx7l}W9jC&1-8O1aVyikRb#C+wl#xouno4wZLyu%wB&k?wb$5oO-rg8vxnyP*b#TY zPS_cD#GSAUcEz2so5^4ojqS={H{2cfz&&v<+#C17ea&Voij4PXTMobju{$1Q2K(e- zjUBGBp5%w%p?Da&{vTBKCZYew`Y`T`N4lEEr(3L_CK4L!ukmIYJ6dDUYHWbUCTZ*# zjg8URu^Jn$vEwv0L}LSa?(sMX2jdB5@QNpr(BEPwGj{!7W5ZmH|B53tHcDfske`aD z;psTiboV;CXN|@)@Ju`l&o-Mnc4K^w#xB#?SdER-*tsO<;rU4akGcLIy!u7tG#Rl zO(ZuX{Xa(kk4<$o{$9FWWA|w64r=KCvAY=GjniBu_vCBrUXuIpetZBQG=rMy8hb)x zGss>4*VrTYC_aXdo56NHN%9mvjWcl;K4bb_G4`CszSY?C8e68Z7c@3kW3x5(n#Sn= zv6rZK{a<6R;H&PrjjIi@*Gb;MH}Nf;V+LzJPh*QTHlKU}(*I*`Gk(WaHopJF7LzQ& zckw-3Y6i2tud&ZGwp?Q?H1+{YKScU}jQ$^U{Xba4Pg%MWSK(@0V+M16PVxnQiC^K@ z==y(fK7Xe%>oebL><^8t)z}7&{Xoq+{1MmVPiC-PKa>1|zv6G``hTzve`+kRvA@Xa z|1tW1>|c_NuCnoI9xIR(v4mx;n8CSM(|Af_b&ba~=DDTu5L)ZDG5tRtb@lwu0veB# zCoqYEYBsilhiQ#x7-W(DAE*DvUH|vDCEi@)_iB7ojh~|N78*ZF<1IDbPUD+tytT$R z=eb*8E8G&dGW|Uk-|_~j=k{+jrU>D*JN;HV`h!_)A)%RxBfp+<43bC1MnC;7LPOi^Cx~h$sinzC*Tm% z|6UzGiR5G)ioUiW5=-=Xna$m##_sf=&K+g)X&!^iI=q5sG4W;_k=`A^M# z8h>Bo_iOxBjX$9Ar#1ed#vj%ALsU-38Tc@|{_l6W_+uoG;}iHKK4k{`bEd{$(D*F! zXYg5k4xcxJZJ$j-|Bt`K_+@nc-~W7xzozkd8h@Sq4SW;n|M5AD=bFJDn6L508ec%Z z5b6JM*Z(!X=s%T9NZ!Twa49Y`{cGm&bl<0rTRKQ)7Op#R5L zldr+g@N-wwxb_wQQsWym{*}hpYW!=KeuLlQclf;->?`_zd>#3ZxE_C^CdBw>O@uW5 z3*%q$H~by{z(4UXn^xn0<3IQ>Zp1tmu!torV+E@w1N#W5Gw@ups!tPZP5p?}u z6ETdN{&|u}YT{o_h$g0LLN#%OCQ_PcqlvU8w$MaI6U{Y|s#>G$WvrX($} zC2oeBn~fvF!&aKulEGHk8tMOuZEWnne-mvr(M1#6YNDei+ELRUx5EzT`oI78;=~Rl zosj;Y*pad8|Ni-q=&FfBG_f;zH{1nx#ocgs+{2!ti9K;I+#C17eQ`hB9}mC-u{$1w zJ@8=cX*R8&#`sWPv9HWV&$opY`JQ@d>?x4G8 z9gD}|Ks+8@{|{z9K@-C?F@*d?r2i*QX6*XE|E^CACmDgK;Hh|;8Js^OHF1F^MrmS< zCPuTA{+~FL@mc8lzu&tO=a7uWbMZVp-}K*=i3>GxsV2seUxcpzYvN*b{Xf`V`hSA{ zpSXghSK_o`h&SQQCWBivajP4*{+frk zY2s~7+^&fyHF1X~?&GEJ)Wls3?ne55!u5Ym+-v&ZRTB4W;$clZK>i@o{}a<0&v2EE z?}3R&NFK$EKbUPU$vm8o3vi(sY{fg8_)HUvH1WPB7PFN8pP>II z=>G}&e`1+?mVZ_+*Tf1lT&@DK7o@h|)v|1pE^ zw^5TPYa*{n>wX1IS`#j6GOme|COl1)sjpxaYgjk^Zk!CcBxw)L2u3kx`fHL*kR(x1 zF@j^}2D7yzX^-1s2i)FtZ$r0@J7}_}COc_zPfd2#WH(LjNbdT-Cc9u)+}R9f-i2gW z+zsjf$vvoP%)FN-576Y^EZqn9#r<%9(?4p-14+8$LD&NiHiPv%M3YBr@=#6o(d1z) zrT-`C|H;hf9`7pseLk4v z1RR1V;z?$(6+<<7t0sqO@={F>*W?&Yj?m;NO`byKsp$H@CQrwaX0UamNzTAC@hm*s z4A$WsO?HC2<3Yw|Wt-lNIeS$YTFiFe`MIL!?9 z(!H9TuF3nz@5cx5L43&cyGn8f$;0>vK8lZ-joEnkgeITVKG)HwOP0m%ZE-_D&Yc)Av zlOJeu0Z&}0$#*sRHsg125iZ6hX5)8oY4SairML{=$K_^l#6Q&Jmzw-YldClOF-t$e z75FKxG=t-~nq&=rhM(gXX0T7bBKaD>!Ef<9{ND7xy(E9oq^HSsn*3XnKWg$U}_mP!<37{`R^pUFc17bQ<&8Z)k@(PJg2(n4hu@+NGC&2dxHUqfk0vKelUTVN|Q zm~AVSib`vhA62$i>8!Gi%62MksBDYdVmoYa`bR-JkZg|~aR=;V2J`PovJ-Ye`oHYV zxEt<*yQ)l8+0ELi%I>%a?umP;Oi|feQBd!I0{GO8F(h1g=ga!JO{_( zxp*F)Z@O1>N8v)1%T>lPz6i(T#drx`ikF#gZQZln&wo{}#0hv6PQ*zn*Rb+e2d^^O z^2V5gYgO#`KiCY7b+F(6U}O9J52pS82h)E4gK5A2!L;B1(828uH@4sZVA}70Fz-YouKx#}wyL_hN=-GTQdf6G!(Z*$4N< z{cwNN{{+_qRS!|^PJR&fz=N@;8SMWt~y3_gz6~OQ>Zx=Ps7u3 zr0JjAI-2ARJQL5tv(2F99Mua|$C96m=i&Kyff-beBe@92zxR#wmEM8JsQGtKO=51Nn`36W)xsn8B-0CAkf6$2;&&GpM;+ zb&2XU)!C}|s6M88uj)gp_fdI2K7bFpXElB{s?$kk;KTR`K57OtKdw4U^$GGP@hN;7 zXPUwJ_6*6h_#8fuFPOnAzNk81^(ECeR9|N4EBGqDhOe8!UV4+{Eu4dMah@5x?gEm9 z_%^PM=}sCgfk;|KVm89eJ_l2332eu^v2#uYXmu2x;c z;4}OjzrZieV79MSe^LELb)D+BEd36@$F=x_8SH@{N!H^}xB*@N_kVJszpDPN`WyN0 z_y_)pf0@Cn|3mUGZp1vg{vRBplBQl)Eo;g;SVdD?s#Y~+jk>0(7{&GxK>tsL+{08D zBN#RPPL+z2Bru7BiYe3Yd#Q}3Hq}&?JcpZL6E?%AEXzC#H9(XYJ zbTy6ZFsVaH4#Qq}IQBOEW1Z@wsfn8EtErKiI#N?7XzD0U9jmE+RQAWCaR44;21o5U zl7V6b)lw4Yw8?L(f?Ct zQbYewoy~ZRt8e@(nABL3bMZVpA1^S2*Bz&+%QSTn`FOk-UH{kArDkwGUrurbUWpU% zDl=HaNt$|4Q&($hs-~{d)D4=NOwAO$7O%tW&0rnq|EZhEZ^m2jR#(%wGM~ClQ`0nc zJNX@WC*Fm3n?dD0B=_Qdct1X1`rmv~4{2(arlxD^aZSx&>BIO4K8lZ-{wG@M36dxA zDSR5~|BX+R)H9lTQB%*7KZnob3pm?sS~#8YOZYOrg0JFhW^iV{q3L}!^`@q*5xu3U z)tZ{4sim5ltEqQ1HIMrFxBwU8+ou21y3`_)#kd6D#rMqMcrDY^$C{%5rdbj0+}t~4JL={R`;lPIo+?c!ld(`g17%wi5V!6s~G zZxc;7$4#+?rnk{_OHFUV!_9E>rge*(Hl#J(O4D0udP@tN2K8*(YM!QBYkF%NSkkQH zZ_W0ftLZj8rLCshYkFHvw`*GVYO{`?xPq}i@RaS`(^qxY^!A$GP17AU-9^(ous)rz zGwz5xnf`g3?n<&VcEeq8SMxvHzPqOPAm0=B!o6`H)8GH;{WN{LruWzM(V9L$(}z%S zpr*SsI0$>-!PwJuzi!SQkwZ1zN7IKf?uCbAZ#=>b*10dqk$4pL!~SN|z~dPY(DYDE zAEW8Pnm(4~I2?$Lnn5-W*8BwWAxQsE)Bn@1|GRx_x|JNJ>ER4U;3;@2y8iEf3rdgF z^h8aM()5Lz9;6F9vG<}(-FJkFe#c8cs98IR z4{2tgrl)KAA5G8D^t+mVSko_R`VnS$RMSsu`Z30j;}iHKK4tpX$w^fN-Iv z-)8U*F2cpQ#Pq)vq~Fu@51L-8>D8KErsHlfh|AS-t4NJep?~wkVUi+V#b(;Q_ML%kKJ%gWc z1JeJ~zu36(E++g<)4wzL1OG(&fBJ752S@E+&2-T8M!W8!>AYs5nl5PC+Ix}u5|*)o zRWsN|`hVJUc_xIsku&uF#=oo0#59xAOq`_&OroHg{@IvGlVmW9Io!nb_f@8uX138x zbIoj_nN3;R0$bu{xVh=CVWt(ymbewR#;wi9Z$j2g8#|G}Bcxov5MzXLe+~6L$H}vvwxwhV=i;u8encHA{|ix*fQOX7*&T7w(Pw;J#+C z2lm%YZ_ON_nVyxmzD zh3$V5pKO0LbAHp}E2+5<$D#Fqn{7N^jF;f0X0uQ2EN#Za%kc`$G-jBfnd?ce(#%B7 z*yNLVcr{*QHZ8LEpv^o5uf^+JZvU;h%Wu%kt(v)!@lAL$-eTJSB+hs$-iEhp=1$Gr z(byJ}yUfP_Hm;dz?8$rZUc3+Owd|*#wncViAJojFnt6!vbew??<0Gbj|8~Y+-Rd95 zC-6yp$_(DWGd1&?W@c$-wq~AT>9hD8K94V$!MXGz$xHY$zJjj*2Q{y2W}ar=Ab%6z z!a3;rzyIl(nNP9+7vkIajv3S}*35UBS)!RwHS?}!KG4j2)GWni_&zQ-gY)@Al8^9X z`~+8+{-oKA{?N=?&1}%j4=i1W zKjM1)$#jR?9haZ+7yK1}!{5zdEB@4swfDcs|HgmtU)*R0`@BF>#1fXVVg|F-G}}%y zbAp0gluoNxsCm8 z&$iI)R+??e(#>#l+yYzSmS*FB^3rT;lC5zYY=doaThsq;kZrHoy*0a?W_QtS2hHxN z+3l(6h&x~>>}>jbCc6_!7wn2VV>i=32eP}8?1sDJ9=Ip&Wd^hDquIkWyRT*s((HaL z-5(FY1F^dq%-nk{I9*qOcV76m5 z*H*K~X?Big2WobTW{=nGd72%h+0!&TShGVldjiiIf+ylhc(Un#ugeZ28IB|H6g<@o zUh8zto~7B5T*Wa&7(2*=~arvI+Y zUP^KqUXEAbm1bj39$ux{i3}#;)p!j~HiK8cRd#h$|pyo!r32(+* z%%&xcEt*Pl8{Uq0;GJeL^WB<#K(o`x@4`cPP zG)w=_KEcB$@hN=T4Cb7r*;h6D4EeM896paP;B0&m>Hpc68NXuM<%p&~J8JedlGpJK zd=uX?gZKVi&2G@_Jk5Tp+4-7XuGs~eU832ARKAVx;38aX2J87Q$$PjIm*M+nF#iW6 zAL2*&F@Az8O!v2~xwgqGHT%70S84W3&8}wY8vG1D$1hC(XJ^^3NWR8z(Di@KerNvY zTw1HyAIR6?kGLLxGJ|9Ev*zNO{YA4y&Hk#{zcu?CHNWE@_$U5l27BNi68e93BjY?4 zTutNeq}h^Yt-Y7YD_F%E)=hu5T*xIk+jV9HqZl*&ZwR@B<~G$_Qgd0&2}>1In8u9h z@BdtmWD{({X4u^Hw>{TFb6aYzCHZE!Ic|ZiO#d@Fw-rfi+#0vRHfFGf+iLD1&9&3q z1)6KGxuKfdPICh^*FkfAHMc$W^#9xrj5}dx+!1%O9iq7|*cEry+~Jz*#&{Rp)nu@n z=5}Xb_y60o_S9T=&F!VR{WNFy|65}B|C@IIfB(icE6v&c|CZSO|EAsl-`_5CF+NCh zhiI+`W4r&~mfHRQ{oQpiH$D^(!(J|L{CkaDZ;~UhkIVhpj$~Vo!hYBvk2d|!n%ps( z8?3ow$&bTOiFgv8Y`Pb9=gct8jnv$5#v_papF5TDX?VIB)Q{5K z7|o3)KLgLiv(R-*{~XSpLoyc6#q;od)4x8JyHIo2Yi^w8F4x>eEFF&*<0W`0USBfB%y-NB_@FCZB@W;&ra3@m|Z_pt;*LNB_^=#L}Db7Q7Xw zn!#SZU32$nj{cv!lcjgz-8juv`up}?lKb#}d;lLbgPQ4@dq;CKH20k59%ktyntMuf zk1~D?A4mFs?nxW_|9T?#H2F-Nh0ox#W-$Nrnwz7!7c}>(=IH-9`hSl8pL?15SEz4v zlGjM+|G769zlm?Tn#MJ*++31*I3E|_LUjE<=n{)G_pRm@Yi@<+mS}Fd=H8{|JzR>* z@O?8lY9Ek%h#%p{==y)qF+SDY=bBqdz6w|48g%_X*aKgXe2HJ-*Xa7ce=Q>So#uYh z-1p>bk^Y~f|L1-rasB`QsJajMujc>%|2~NBt=HarzZl(L1CA`00; zD%o3#?37fLy*HsmqHI~e$GN@E`G5OgF7M0r@_gN&kJovfb6)2>UhDmSy}h3Hty=u3 z7T=L?!tZf2{$P5?>K2l%_!H9qTR8pSTf^TJu{-^D1;?qyAM#(J7JtgOTrIZAcbZ!K zC0|#y_*=e!TKpql6SeqPzMa+LKWAw^?lqs?oQ-$Ho&ImhzD6Xw;I7yhW!Cp37n{o0 zj6rj3fj;z`?pFJP@*OB&h&+rDjA9Jq==6X2l6FP;QqI+#K^imiWf|l!j|D7Z$z)K* z3RbZuUxN)8x5QT18r$G*^0j5KJMMvdnhf@mZ*K|x3tscyHUO~YOWSnApYcf^7%jBCzelcEx)A3T%J>z^%|CetjUXEAbm1h0*G8cIW z@LesR)BokW7O%tW(dqx**3Fi0k$gAFcb9xO%Qs&>`oC`umA4}O-#5>>R{hb(cN_Tv zydCerJ56u9?w0RC`R*Zi`oDbl;r;l4>FuS5NFK&Va3MZwdNqsXds@E7$m#z+r~k|M z1U`vRnclv7hU8g%4wvHdxXkpnzTTgUUZ~8~%lVo8CS6FUfz7{vFU-fsJ=G-DipZo#k&LeJ!W+F@KOTSw;z6cY)6V{1g8YY&ABu-zd+cDk@9z3Lk#xo`*cH2(-r626 z|FQD-kiWP5M=;wHdpR}rXIcI}BuC;=NdNaAl zUWPMpCSGoOl~*cY_scB#x5|H&{LAFOTK>D_zefI>D85$y>lj>*H{gvp+w}J2&GOHe z{}%E&cq`7ud8T(}-A1wiZ^t|EPSZP=@0NeD{P)QJko@;DdmrA958#8Q+p+!hfBz%o z3-M80pA~2!|1S#II$Qt$Oa9-e{2l+mKXIGs?W?~@{=t9oKgYlhrn~&WjtVqZ zU?=jOu@UZqyP965NSa_%Y=+HEug0f9S^>WTQ3V3b1~G(TjF|4{3xOC(921ztl<96o zAfrG@fh>6r^H@Nq|9iJyCaGW*YuI3VHLVmlOo7%4?8Q_Y1$JZ57I#Pbe_&4=yRVu9 zdn<6D0{bw#FYbr?;{m3({DVji#&&oJ9%_0u?G@-o*g=7g3_4+F?1EiQ_pvO{U4h;T z98TT?kHDVT%XH7FKpztNf8Z#_N8>S0P4*rFw3a z6qu{P3LHmNN#j0>yOBRn@DcPTW}8E zYPye@fq4o%pul_u?o!}3W*6Y?cn98Tx}O3E?k2eh@5TG@e$(6Y50X5D591@a5Fa(Y zHC(LV&I&xH!0QS;uD}ZlEK%TD1)iYtNqh>Q#%E0T{qw+cBunvmT!za{?}%EVz{?7} zNWKzR;c9%z^t!zKXAzUd zJ2>Ou|8Pg#$#jqQU?T;OR&W;un=800vyD;M1e;Rb>0;3P+rVIr zYc(*%Uv36lDY%D%trgr&!8Y4nrLBU_mw(p(^v?zg?#Xrca%$|S=OP97A=y{K0~ze6 z;Qk6aU;asf^S6x(9)t&z+{O41JQNSZ_SgYCD%f4YP6~E${{A%BIq*)x{<>Ddt_pSw zyj=-2n&sa%&iPB*;NjHwQ1A#F1m39y*32d8#UAdBeUSbibo#&h_!T@x!C?v>tKdKd z`%=>nkHh{rz;w@`;2;wEe~|tkbo#%7L!FxXv%%nS1xG1J{}0mtgHHcfkVl!|NT;&i z--4sb>HonojGg|k;MnbIPF1);!SM?9Rd9lWKPz~eg3l^=x`GQ7JVU`L3ZALpc?#11 zgY^F({XaiGP1?m4m`hSrAAEf^W>HqHf zU&hjA;7p|d2d`jE{|`Fs^1JHx!(&;BEdsi=BUX&Hubs@OA|sQSc50?^Dp}{|erP^#36JKX|Vt-k!Oi z*$41Jr2hw<{%?m9$wCE}DCqQm1sCCBd<-8qy?d7aAEf^W>Hk6ce~|v~9w*N!_<@2; z6r{|Y(}6W%%Up@JI}{7Ats6r}$L>Hk6ce~|tk{M@PM_W%`K#}dB8 zukdSJZ+czv8wEEjxRLx@{0=wa_olbKKal*0TW~A>WO_BfD3n$3SNm&P1%Fd$Ck5^O z|9=$xgUUZ~8~%lVo8B4yFA4oWME?)b|3f=EHTA!{3GJ*<6NMT%m7!gb{vT@0SWadA zyP-l&Nt$7EY=KVycl$#qKoV3at`Pk{ME?&($fFo@>g(rhC_$3M6s9p_ddtiybdW-M zg?3Y@pioVrA~hu}Bgb&4>RiiRaszowY=y0{jp^>&P+NueQD}GaJ#bIl3->m?%6&=p z!~O99Jka!N4pykULhTglsL&zI9*T!yd+cDk_fDu2NoVYWU9p?#J_8ILu23I^dXOK1 zJ+T+|Hobd?{uVll{AfG|k9BJ7og#aj3iVUyDTR(x=rV=+D|CiJ0~8vm&_IQTDKv=s z<8d$!!J(%6IyW?&hNqj}UOH2u zixfIbq4O1@|A)?@hW;O#$oM>`zW#1l=mL^Scp*;4DW-QsO(mIz7vm*39WOP#Tc4rO zJcVW|bPZFND|7{eD{&THg;$&2v3IRPHz{--`So}M-iWhJZx7r|atqGETXC-Gt;2kU z9#rTyh3-~p0kgN`9e5|+WqP-M56QiFAKs4-nBE?ENTJ0FJxu-xF2qN1k?F1BV zEq{$dZz!~u{1v4ChhAg+x>H&IBt7&d$y@j~zJu?Y-qPMz=xc>OQ0Oy-K4kVI{1`vM zPfc%`pObun>+nnb%Jk0D^$KlLXao5-xDmg_?@ad*C-gnZX8Zwv#4V<`w4W4iuF%g4 z@1T(N|7{BWO3iQhJJSC{e>&HyKVu2~MgBMbga6`xrdt#KpTfH;yrYwccfy^q5$OKYKUN@1VE5rzHC1~7;r44dwr3`a>~7{>%U{om~{;k3dD^WnY>7Kvg6BQn#@JZw&aTJcmlTB|+>Hp!e=@tJrQo{i_2-qA9VY)#+&eFyv6ix z@m7WJQ+TezcPKoM+4)#MD;F@n-Klr?*qtPI;oW!--fMa__ba?m;Rnbc#D|dnAAZEC ztbfKAew2I>F2=|3anoDc6AG_V_(_GISNJJrpT=kKS$qzcn)P>txVTK=f6HMkaE!B_Qil5=<_=V}+;+Kl_Q1~lFLJEJa@V^SLS9q(!8x-E8@Hf{*mz(r>6c|ENuP%4~2gw{{`v);olhl?o_&G=$|Cpkp3V3oAE!})%>T( zE>0NPK@r;o8|;Ym|H#ga8=3AhBfBcnT#?4)!Y0@ho0(o^3lbmtF@QnS-B*#YBD*UR zQKYCyRFSkIF>2zNz$B(j_f<(GLz2ZD=CNS9kED^3A}tjulUJ~cHEb}w^=w7b8r$G* z*w*xF_E6*yMfOx=e?|6Uc5mDV>Hm@aocj9TbVLpyKM)VXgR!0I_QuGeigZ@wF!J`; z0Xt$R(>*F8T}ZlOH|&mwo8B58p~$(4^i*VsBE1wjPLbY<9HmGfDvxw3-E}*f=G0g(TK%~qXONtUXW`j+j_IB$k%@}TQsg{EE>+}wMJ`h0 z0%|7Vg*X|fnBEpmC7Fg7<0UxVbUR_>GLjiM6EDXr@JiFWm#8;@+lEwHKK8{OF_jOj}NkyJh z-dK0E%Pl!K2YRs@^|oEd=H)e?;Wcjl6-_8<0ts3=`GC;#chgwp~z-M)+zFhB41MT z6@HEDaf9h?`$m#)@jKjv-<$4h_Q(&4{G!N@`!D|I7~KJF^}ORYx)aIH*a&yQT}}6MoTwD_DcXd*DK^9A*ur!l zVWWN$`hPUYID}!RrhYs}ql%udXiU*zipCYKD4I|-r)ZMO6s9qQS<~I0(L6~3i&(<4 z>F$AORndWp*2o*MCAPxW*amlV-VcekRkSCA-Ej{^dH+A^y#KH0-pKp^(R~^3hx_9J z$cF+^-v5s}@Bb^>4tf7S%KQIO=ly@e_KJ4!#vK*ysn zd_E|%85PRl$9E?M7sOff_=x{|( zRrCZ!M=Lsl*%Q&}|B8-8r~kX>SM+3(F?b4&#c`&0jEz_HEJY`fJN;kL)A0;E)3mq8 z8J~?#|5x-}oQUU{-Z6H8qO%p9r07gVFI4nmMJH1;1uw#>IL-8qF8Y6TI{BqY|Buda zYUMF)pJC(L4oprkwufyxn>Hmt}XnM!$O^Vt+zgf}wir&KP z9K03h;yly+6fb%k$pX9`@4!1v_mL=S{r^El?;*bz@5B4?0n>ez5q*f{VWj^@7czd- zsd2Y=v0^P0eN53!iaxIB8;UMbbcLc%DEgeDPf}0+k3P-#8GP1RLcRY-my*!`qstgC z#}~G%c~Q|dimoJIg{$!;eA)E&>ROUl@Kt;bo&N9b)i)LWOwqR#{Xo&TnWg_n>Hkss zf0X`T|IN=R{XhBjG|3~TnQTl(B{vZ9n{!f`b1pLk5AN&{T z|FIox>~2wPM<{G10Vt&OciUkzQ zDi%~Mu2_g!r~fM!!6?Q|_Yp9bAW32h)0i>qdyI=Y#qtaaSi};RO}9J6s*3HcSWU6r z6l-9%CAPxW*v9ng+mh^#d*Gh9m+3y=i0z};L5l55z8~(72jGFGd-lZ+CTWL<;GuY! z=^mf44vGy@tfOMR73-u}cf~qW(*?U?H>bY-Zg%W&k{);j_QYPM+ZAJd6zi)P$4Trc zW{<{W@K~p^{^~x~kK{P)j{|U^=^n$e;}ttuvB8RsP;3aZLva`m#}iEVc#fS&auSZj zQ8?Q4YQ~V9f@5(Uo{Hm5Z+lNu{5Zun$jUWv2tD!kfx zgD!RrUW?b^^>_o`h_mq~ycus%Y=L5P6q~2mt(N#ZPEl;G>5bBV!KYU zC-6yp3ZKSj@LALOSvEwmrHZ|%*z+u587{{caE0mJ`bv^jxEf!=mrbv0tySy`#a>bD zL&aWI>}|zfqvmyd1K-5AO!qM;M*ok!Oa30dj~_TSJkoLTBgN?dG5UY(Q^L>ib1HXW zyiTzn6#G)Kjf&C#V_%c6#|`+6>Ffb#PkxKv;U@eZH=AC~kBa@O*cS4w_!It&znEU- zZzR9tANVJ3GrbP;x8ixl{!zS4< zQ8NQ);^laS=^Y8PNa+9Zs~KN|*E%)s5qrJjwbDK4!YT zCB8)Qb&5Zs_*;rUsrX98pHlpJ#h<3~8GII>!=SW5GI$T)#}DvBv;GQ;iytfg z34>4ZGyELCFunWzOT~Xz{42$`DE_tL-zmPHnhp33Zp3d*_g%;MCX(-QGyZ@-n%mtM zTNVF_{Ac_Hf5qQSZ|nY0qLJc%D*m71+nD_e|HgmtU(?;Ui5;B8E;`cx6FV{9*{P}T zvBWM)G*e<%^2R7^f=x~L%t|yTX@NfUW5D#57Ey?Nq(MyS#5_>5T zSE8asLW!IbNv@m1G-fbsy6^TU@+1W;VhPKpcZ*de+9**YZ@`w=3R|1*f7wgyM$#5{ z$31XQ(_7l!O0-vEA0-Y_Vqa$WL;8P${-1FAzk5_94raC;9)gGBVWzjt4oY-Wq9b`H z?2PpPgwy}MrFADi9DCpq*wb{+$3$->PFA9i62~iXq!Rsytd z!HaMzPQ#1w5}b~g;$=7kXX52}1zu@7zoO|Z`6_PZYP<%o#p_IO58R-{DkW}I;sGUQ zD=|+A`hVhPDsRC#cq`5|y>o585_c(a8~Fmf9q+(9P48Cd|A~9Z@5TG@ey67Xd2zx{ z$)}WfNQuQtJk0DPxDX%3MW%P_PXAZpaa@8=;FG3zyH6{zOo?a6pT*~JDL!vHzhdny zXF0xrEAT~JX?jQ0Y9+o@;w2^CRpMnOURPobHEZz|d=+0az2o5xk~i@!d>h{}y={3< ziBFWE|0h0R_Cx##Kc=$YCqE_m4C()gFBq?LYTP~fl@i|(eyzlM2K4{LH;gypx2Ct3 zHYu@H3HpCxGqXS7kGN&K%AZJn#$WJP+^+v8{!ns|5`QY$N{MYsT7&&d$;L|jt>lhM z{6qb}_@86_OicdI#%>=-?nJ&bHo{$SSJT}_`+ovSpOQ_;o&K+6Gi;76On2*&ev$wN zF@#~$-T%p`k|iZ$N@kRdGn>F9rZ8=K^;wb}=COc9)BS6{WSOLbRjgqHI{n{U!`4c+ zSF(+gdo#70l5H96j(gyqxR>eefqj%bNXdQ4>HkUkfARp51D(qHvzO$-B<=7JJQNQz zy)EjXWN#%qD%o90`hT)BHC?bPcH6F={-5kYPXAB#WZcWC;lJJ}*+wg@ zcnluvRJ!+mKN9+XvOnViIMAu7|2|&wcqK1Ya+2Tlaw4v%`hB}PXAYO1fFPm zTQ^e4u}Y32cly7QC*v4A#q`!>9LcFT9w*>wrnj^+lsu2{OeN|6$+Nk54xWn>P4^i> z@_Z#PQt|@wNq8Yn#wn(E>r+Xl;l+3fPB*=!U8dw*C1)skwURTLy&SK=D{&THWqRv; zjgqsKyq5erydH1B8%=LN-$ZgV-hy-RR?~f#J~>axyX@#va=wzcF}nb7$2;&&)7!4Q zN$x@VfAT)Y_u~VmSNV`qrzrWbQcaY6M9B?GE>v=@l8-96RLMn3KB?qluJsr`j!W=Q>vg;bEU#c zwV=j_ehgp`L#F%MClygDrBswWhH*?_(sb{ORGK7%SB-M(fHMYUsu&wFc?jB0*r_`S0d*R-=5AJJvmHU$%fCu71c(Cc7xv4{x z>Z#PBN_A1{FlO6h2keNQu(Mg;!(8mDR5u3Q@o?;cN0{!nAEbIIHAJc2N*$|IA7+ol zqwr`v#&nN|R9}*QcpUb}0XPr`*#;_gJPvj?)_&5TDK%87lav}p&2T&cN8pL3Q|TOI zBXJat#*=Z3>GsvsSfyT9YMfH@lsZ+ZX-bV(>H?)ED0Q|{r%``8o`GlLS*H6*XzCo2 zb8#Y`hv%F1dz_1tl%oHqCUbELUW8LkZ=Ekz>KdgkQR;G~rZamfUWPMprso=3!f^*R6|4Pj@y_)$-J+0JjN?Frh zpwvA|-A>INcqiV4cbnclelN*=ct1M*U#SO8x0j}@|39YGBjgM5QCx(JO>b$BlPtj} z@JW2i^w#qkrCv~q{-1h|*`@eAF2m)f^U}##lNCz6tkjE)SK=yMjW3yQZ%nNrS&OgW ztN5Df)x4p!E%QyKzE|okr9M~cZKXa`>K!WI#rN=i{J?Y{cTyjbe2nz})TfL;b86hR z{X(e?O06UR62HQ)alPq&f|mM*WFvly-{B_H+gF>F+NRVGO8uhLkIZhtt@soEYNDS|E1L5?Ffd6EJa zv4myQ-K*)U(ruKkkvCvVY=x~&_jpdz|I=;BcgH<&PimZfrS#rv(_QI(ROzGizABup z^nS{%QhI-7e^B}WWv45BpwfetK1gY+JXq-tO1I;>hv1<||4+BKv3snhJCb+8&e#RJ zVmH&frw&)TpVB>)K2qr;nC*$Zus8NG-7`9U6v@$e3?7SpO>fU1N75e$;6NON$D7_> z8lvZ5}RCcn`XDK^T>9d(V2hYWccpjdQ7uc>)dXlmul)jMhWM!ULdWtfwl(wm*N>5dK zj?&YZy%;aS>3At#hBI&`UT!kDLg_0R%)+aX&wta-=f7OMR%t%}P4oG0n$LgJ&gZ|( z&Q_Ywf75*ao4&=#^AnkJKL1sEF3xju=i+>&ozH)jUVwc5o96T1G@t*b?;^h&@4!a6dkv^n*%2ru0Kxd>9|Wh4?5g!o{ZjfeGWsaS1+wPvTSfG(KZ`_0KV`Z;|c% zUzA=(&2oGJS1A3C(l09g5*Jr0y^6tV(_7BVBx`UjzJjmfYxp|8fp6kl_;!7lno7S* z@*cjAA1M8u(jO|lPU(+GKE_Y*Q~V4+H~o3*nO~SBU*cEzHLk}E_ziAU`db?~8{+Q6 zP2}I>X8Zwv#4WfLe^UBq8~F2MogW)Gcm1zQ|Hj~V{KL!tRC=2-QNq8J{#%(wjQ>&k zUk3j+^Rsk-GP@|#LYZC38>6rZHpOPx+;o1HPE*E5;>Q36F@#}^ zn9k4Ap31~X;+RmTs7#V^3e%XuEaot;Ou+{JrK6l5XNyW$#tK%kh7H)#bbjnRz%#8$ z+9=bP!EVa5Ri-oJ-Ej|P_GGXZ?v4B4zPKOmj|bp^cn}_p?eGvh6c5Ap*a16YC-eXA z-%J-}x{`Op?sz!%z$36H_QKvKgFea}$>1nuj#1`l@5mpj%(3+v|FUnD=||0R*k74* zl(9Q~oH7HIIZ2s8$_!!Zcx47V*Rtc*xt1;D1Z9RPGu$q^xwHRAD08BBL!9ZEk;;r= z38R!5t<1^ZtaA)2a|&`i*UyN|smh$L%y{w%c$(>+WtlTb&cw5nIlG=a1FR^}FEu3>yFUWeD?4R|BY#+&eF)A@0>Xb#D( zjOQ|*hx73^T!6RZ9j1GaINN)dGIx{TgZC=4M49^-->=Lv#cyyUa=tkC&UeaevZQ{bDYKbb z`hVs}##?YJ{)9i{FUtIC1Mk?YpJ=~3iF3^SscaKvwkf*<#eXUDH-mrhU;NK>k8oR) z?EjRd|7Yp{_U>YKS7jS1yNgp}JHZ~~>=85DSoTGpb{5ocx_)?Mn=0GPS!TAmvLR(# zF!m`M@GrG`zq@tWpmQzvDq(6OPU2iK>eV>?pCqAdl0gd7n87UOFt2RES*Ej+V=W;p zDO*^{oYoLM`0vkl6&RJN_Mt(0w}Y-=aq$llKGMooP`?5^yd%I@JL zOM9Bi?&XY~!QO-qGTs+?2*}z?fCIRR1Mwhb4|aE*d((#~+gaH|ovS-L^Du0$YzLCD z%67D^P`1-{+tP*Q^AM2jrfhevaya%d`LV0?RJNb8y_7vhS^B>n2H8H!9?8{@a+dET zN7wg1;j!4)n>tR}!6f~a9l&594#MM2_kMTwz!1WrI852$3{Lp}*PJN(mN}<*B#y$- zcrx;!kUfR5bKfaD4o_9~bk=sfvJ;d&%~|JVA3Iy>Y{D7Jo~^7s|3Ay!OU{vLck4OI zp6l#wXW!PB#`FIy&;PR*IIjY-lkh^*ef^%DLUIvK#c6mkUShiM@n$bo_6cP#Q}%Xc zXDEAvvNM&vO4-Y)yaKPpSlCCb{|Hpk5pS@ApTa}$neiPn|x8NMp zebtklOEM4V<88RWbYG8W?@;!B!aJ3{i-Gh0kFxjRy?CGLE%O0oA6522@`vzYd;}Mo z{x=sfuDh7=WB52OF}+)VQrWkaeM;F?%08{EwfASJc^03;rRco>-Yw~iEo+iE9mSy%C1xPU1dL3_C03b#}DvB z{K)jy@Dq|x@iY7!zc8Ic&e_9XD!WnHuNZ%g>v02qV|v^2Ey;Jd3BO0@m9lq>KPqRZ zJ$gLdxx`Tyy0bGb?O@O|hBjEwcrQ5B(Uxpy}?bTv)lJa=ibOi!vL- zI3}FR`n$)u6iFI0n8lpw-C{wxcFGl%+g-VmaxIlBQ&Yhz*08~J-#f~+B593na5rpg zdNq3}XK(N9Nxm2Ejr-ufrnjE^lN^8t;z4+@>GqJ^A_~ikF#Qp`|S&ob@(NIg~B9^dhdP}P+KS=qS@?Dj0P<~(KTPnZ1@~x&yc-z%Ad*XS$H;{gXfywGS4G9A1}a3c%kWjb7Ovr^3#>ShIl>bustCY8vb+z(ymA^*$*~(u_{dIUf-heln z-Z^y>$<25R&cRzv?|7c4{GH0rC#V1C7cjmZ?{F&XzqOUWi-i84r~l{gCAkmp#|NC> zR?R<%58=bgKcoC3j2GggxCj^HWB52O!6)!Z<)2pmsroO$I@W(1HvcTM&*4&h9+%;A zd;wSBi@4IXZ#`9hmGj-F&U#w^e^+_y|F0{*hV@^Iui&frn&}+_Z;&|sU-`H2ZG6Xc z`*Z$1@P_F&;Q2wcc;=_hd)WS;a~VS zI{n{$jLZM00*$?}g9>)|{ZEA*aVMnz7o7g@?xn)6Dl}K2F|)!Z*c6+Y?s^tlkU0Hc z1wRHbXu8jf3Skwxs1Q-1l?qW6GAhKViDLqjn8LK_u6ZG=LRkg+e}VpAC{RtSLTeQcP@#_Pt_9oc}_r?8if74sT z164Rog@ecs#&&oJ9%_1P*q)>VcEnET^nb6Ws|v$a=%&K4Ds)$&w+e?-(*x=Mg`SLi znSn7^GVX&%BK^NW|1TV4iFcp&Rbh|{{irz(`{Mu{XnN~#Jjr0B{}<^0g<;#(oS?$V zDvY4!L_7&c;wT(#y1lM2MuiC~oI*Yp$Kk0s-t=z$G?LTt3_KH^{_pMcb5vTQ!nrEW zRbiqE8&x<@g-2C5Uxgc0xIl#&Doj#gnhH+;S798%_6zu@$L6{h2*c$rh< z9$hn4xLSqF$*;iro}b0|s_iPTA-NW>!|T!M|NegUJwIE8J5{(zg?TF6% zru+C_m``#WF2LLI4%0gZ?o#0a749a#2k*uE@P5GOzGJ$-nNxU=*W z$v?x-@e5pMdTaO<$=A3ZH{ds>w@wYHr1%Jig@OQJm4qW_Gg>4M}!oTq!{MU5Xwzz|e162H zMf!h{E>v{-zx&8o9H`(^R}##fw#(sp2KnOh@{E(dqvx&T#7M&#{a2|04arNdGU= z|BKu8|Kc?&&Q_8BU!?yRuV*<<|5x!wXKC)9yorSVU!?yR=a4x4-|Ya!c`EIq;(Qg~ zRq-|zpH^{!iVvxHyNdUycn9@&;$3*RbKUyy4;ShGMf!iy>HjJ|fKLB+U$qqHkHi|Eu^YF2co5W&P8QBK^O(g!~D766yc$7CoclODaCA;tMK1$Lvyc`oD_HaJlLB z#^MT+7jY%7!quj?mtI!!brtFV#kI^j{a?jb@inKi{`>Pq`hSuBU!?yR-=^jrr>5T9 zi|?tpRmJyJ{945iRQyau`hU^s|0;frpWvs?wcPEZ{}<{1#dXYniC=A3vtGqbDsCWm z`oD@B@mu`PbYG_wzbB#p7wP{+`hU^s|K2VBq~f2H{jB0I4Cwzw`hU^s|0@2mUHvwd ztiAt5PX90d!`SKnD*oqG)}I5H><;~(O7#EIPK@dQrAAIoeS1s0sx(=p#wv|bNh%u?70jj{%ixDh2HTRw;yGqml1_EAjnrCBFZy#P`3I`2M#N-~U!}zW+_7 zfj9_{$H6!RhvG0Cjwh%z!UoRfb6==*61O-KN8xBZ+4PR9Q&c)vrLiiVuF^PWPsQ;# z0iFKu_M8&^zvT3PmCnMm(dqy7{lLYED$)N-PXAZw0;K1y(8kp5qy|CgNp@1FZ5r~j)o z8|nWg`hUsk|K8GWRp~yJ=BjjuO7p0kkGJ6hyxnwP9hB(*rMt-Q#(U7||K6UzU!{dA zJwW~-K7;OHTh+=`nQrzqhm}RJJqmNtIJ7J*CpuDm|^z%PKvi(hC$n zs}lXcME@_*|4a1$((?arIaIDtiT+<&$;DN;8ecNKTU?{k`zozf=}nbhVfIyg4PVDM zOt;UM=>H}9f9V}&-^KTw8n?@Rpwee5(f>>I{}TPbME@_<`+xnMqW_oZ|D|;-hyGup z|JR=zl-8@fgGw7z`dOuKRNAc4Mk?w5C8z(Zv>I{}TPbME|dEb@_iPw@`UUl^d%}|1Z=3%Z;3+ zm3P5ion_YcU@UBcO|cm^H{Elj>{B_SvY$MFK@4Hobl0#PC5d4i6PPr;rKMFqM&*pk z2dJD?xwXnUl`AUesVra-OISADqqkfosbK@Q#8#%a{5C4@rSfj%ZE<(3Z||N?rMs{8 zCf^75#r<%9(_7ksDtA@+AeGyzd@!@^@DMx{4>P?r>_E~HJ7H(+VtUK$rgATpyOSS| zJ@5$ZX?kneo1_mOiAUklrnj_XRUWT$UzJZ#xu43%t9%?a{c!*e#6hOFo`Xq-;7}Zf z!%gqjN2q+V$|sVagd=ejjyAo@F(jwpSR99^nqJKWl_#lun#$*>d^)pd;F)+9o^85+ zQCL2gWFnr2=cCjAy=7jg^2I7oCZB>A;Z&SvdX<-uOvg*{GMr(0HJ7WrS>-EKUZL`p zD&MQ}ES2Y|e3i;KsC+f`*Wk5y9bRv`pFxywB$D|h$D&Ma1T=IE1A8*42 zrdN3f$(?u?-i`N|Ud??fFH!k^l^3e~0J9I`L-;U0V!Dqet;bMFYA2+>aTK|7e z%WyfqV0tw#s{EG9E6G=>{EEt}8NY-t;~HFRx}CH9D#>g3 zI=+E#n%+_D5R{ zs7Ij?5vrW5 z%8BGB;Yb{XqfKx9$B>+YV{sgwYPy}LGC`GdR5^|ObUXvk#Ix{h(|ug4oU6)(s!Sw5 z56{O7aFXfW`ec$Rco9y;X{NXLE>Y!rRi>+QB~zEGav6geI1?|&D@x zZLaFssb%KRUM>i2UUBk+ELZ+s&=BLGj_qQ*v<6T^KgJ(Maqvm|P04L#vIN5aH6|Y{T>ZPhqC7*^D<0UxV^w#7uk{LJ?FUKoP zuV$92H>i3Q`PFz0UW?b^^``q6SG`fyTUDJ+eiPn|x8NMpTk>3zc{m?$!v&_dAMQ}~ zNmcJu^#P{tQuS^I_u##FAKq_zN7RF=E>iU&a;N{R`Uoz>M@?_}i%A~C$8iZhVS4NN zl&Wh~eOlEQRegrpXYn~)iqGRRT<+|O=dV%q1zchO=!d~dW>?{AdYJ** zLjEeghOgrrrnlyAk-UxX;Jf&q=`HO8)mEwcp=x&ee56`d)sIz^s-LL(x2m72`kShs zajnns3tWd^;#X+@|J|C;dfb5a|KBayi1z>AZEXMlo%fKd_AlV=;`gfBKYzD@{quM8 zN8F<7&kVNWPxj7gpk@d8FI@c94AchuH;h&FcW(C&r2kj9G5*W+?w5a5+ey`b$^Ub# z?STKo9Zk2g=JbEn8sRRuD>gR0nkK5nRBNhQK(%JfHpdp|L%-?n|5}hFgkg+e)U*w8 zbZ#`R8vVbPUn1==6Wp4m7=`9jsbM!gi`1 z!r)Lm4BKM|(|ts!byDqc)jE@R!LHa1yPMvv)BkHnkoUx1*xRY8|99rvk*b}q+EJ>F zRPAWhhN^aqY6Da|mdd`^5068q|GQnWHjrcx9*=`@i1~ld-)h5D8%}-#j=&S~B-2~l zQL3G(+Gy2IRqbSE$KWYA7RQ;~$=P@go{JOlJkzVZ zK(z-{o21%I)h<-+V$~*7GX*cgsp#~7ZyhcnnU0s@WjMq1mVCKtcd2#-`IR^eufnU5 z{$IP+P6XAi!|U+|yb)*PO?Wfjf^+azoU7Ub)#fptkGGlr^{W`)?u?zAxI?u&>tlcF zdDZS_9qz$<@jj&g*FP7oJ*e7Ksy(FIV$~jI_7Pl&PXAYJk?B6SuhIW&kCQLKC-6z9 zrvBM$?P=APsYd^=(f@1o|JqV2pLZ(V`*AtR3%CMb#FeJ|e7?3?4XsssNwr^8ds#JW z(Q8zDOSQGCz2a=FvxcwYYxp|8fp41iwc_I2s?q;z?{e`yd>=nBy|uFb|BY(a|JSMZ z3A3N#XZSff{omW(FG;?_uW>zYFuiWDQMDgb`9@wz6 z8k(q~5&14i|8Ho_SWadAzH4Yo(hQqp3-p=po@ofEA*+U<8sci8|2NS88zNLjF}7Vj z{l9_!-$4IwNK=z>YTVn+siC5VJb3|&Si-XDRaQxA*nlmumFaD78#NrIhTYWAQ4MX? zurCF>t6>iYdm{b6!Rh~M*vIs)yPq1`sbPQe1JLRJYB&fFHoY}Dgyc{>4BKM|)7w{_ z)X;;lvl_ZE=!)I2J05PjJ*t8J-_Vo17xuD1Sc=Z3RM&cSnWBG&uAvj^00ff}Z&VG`pDaWYQ9 zi%f4@rjcBXm*8}~)bwg*sMT?5n5mYN)Nr|4hShL|8lF?bm1?+G4YSlRM-5l0;RZEa z&2_K&e^lKE{FU?n|M8IWETd4#ETYfZd+$#w4TXkm*<@rjQAUKUCP_ODg%T1PNN8AP zlZX~&m0kb$^*Go2`}4ouy4`Q@^L)R~`?}6`UFUVq=kz&+BXJatHoE_EUCmgMarh`c zhU1O)s+gdfsj7K`d?HT5$vDMm_iY-M{X7jyF*DwQ4pp_{Qens%8_(ch!VPu^G4ER@{c$jrPd=sG46@ zvxA)eU-J`V`hU$YPNm!Zek0$7yYYAY!)R;%lBd3E{+7pF|4#o`&A+$@_d0s&7~N02 zJx>3ZXFsfq`(r($`+NJI1LQea9+5Y|hDiVSIQ`$MK$ocmTkne-gTYzu6O^ncF@|EnQ9QJ#|+v_|^B z$HUlbw5$2$$;cCsCnisj*${>?f>EPAR&f$uCOk>TDNH*x?jC04Da+&Ze|hp)z#^86 z_E=R&YOxKTjBSnXJ9$rgc`lOY6nT2c(?OoD@^qx86Vm@Z^nZ`j|J~0dJ*P2yI-Y^u zu)EQ{>O4K=Iai)D$$Q~hcs4ry-|pvmB&Sy6?d}7t7OEo=fDpN}fxZy$ml$ z`oG8N|F*slxzqpUxdyMr>x_20*UQsio*T$-#GCMD>}Rx<14stqARLUh7~Nj#xlNwm zn)>HnT7jHfy^)%S0n>GI5xX9oF` zI1^{#Y@^-!QzUb79zKoF7~S{Yp84{umS=%HOXYb^o|oiVNDckp{B}VtP&$CRPH|1GQ{u;iH^ncF^r*dU=|5uW~g>U0KxXNfB^%{9TlV`0w z>*RTt+4t~$`~W{Rx}R)&){}gMALA$ZsnM?aIms9JC4Pk)@N3+N-+Pr(jGyJjbOPnWkd`Kjpie|fv2a~|!Z zJA1$$Nvm1LVDtnw#)u?1%l0_KXZ9 z8H9uJ7QEHyzA}1;$U98lq2#yY9Z3K8I{n{n{ciGma5&zJ_u>6GLf&QaI{*KRyynkL zc^{JZad{smc?3t|C>)Jra4e3)NAWQnZ*;%g;+;V91Wv?BI2otlRGfy>aRxqVwCl{0 zccHwq$>$*7|Ml|yUoYSP^*&9`_kX?5GMQ%v zub1!tdinmZ*ZKahU5D@gdinmZm+$|2`Tnoh`TnoGZ{kXP3*W|fa22k`HMrJjSAI|4 z?ee}a?^p7EAnzygI{jbXb+{hs|6Zs6yRUa%r~k|Q8GerRfA5!0P4yMlyFuRXyWOaK zY58L0aZF$mo&Ikt>Hj|Zzc0sZ9-aPg_pl@%?b=tCuOeT2`D&?YgC`^X-`CE$SM_HK z-znry|Cg^Lc0#BB+pTwz?;QEM%GX0ar~k`$I@14r-57WOPkm34GqD$*g=ZVxtKE05 zd>6@g9y$HrNB{TH|9!okN_P)0rsfi)|NAau?DT)T+LiKsA>UQkj>6UIiHXE2^5-wgRCv&AVm6{q2Jqx(~~?@5xGI16Xv9HZNR zd~@YnF5f))7R&dvd<*4!hMH$_J}$uLjLvR2XXkl*0bj&L_>$3H=P#4Ig0JEdT#Cz# z_AI<6-@Ed?F5lboy}|4Xd=ppVTSi;|4#_H9jcahN(Qf@c`96~Geew_RLtKaJjc(8P zeN6HReu|&r=SI8Qm-3r7_?3Kr%C|wjALRR5zVGGRNaZ*9EpEc^jP_V}hnL1^!<0pD+Jeyb`a%K1TPo!+#CQwRj!& z#p{iB%^OK>!ke)l_QwH6yN841e@Onp^4}rl#zXOTqrFz|l>c7&?;;*ZsIL_FpaHRZ?%KsRH z@%T7Sz$b8`k-;SSCo`C0ld0UChSPBdK51-J+e7|YY>WQypTqbmoa=1e-Dh(tE|mWn za{9l2KH~-WoKso-gvb9p$qV=*E<*ahTl2E~zsUcJ{2$Bzs{HTBzeN5w+wp%d{}1wSCf|ZvaT{(o+CBV{ zWC!lVpYUg+UF}x|4wnBn1yeersut-O)sCcGK@VSl6B!vg~qxLbii3Jg_XFthak0R2C3 z8_5vro$FtL+wl&(6Ys)dMtgSdQQ!duhLhim_u>6G!f5yKL6V2?VSEHf8tt=Vv;r#> z7^A?m3XD}?ngZh#ctU|kseBB_#%GLnwfPDxQeXl3bGQ(n#~1KLqh0eQ1(qtXnEYjY1z*J_Mq9azWI4Wu zuj3m=d)2+Ez(xgDDzHw0w-i{bz}wWkgR5{gt})uH?p>1i@O}IMKQy|p9f9=zqyKNK`QM!_SPZH`CcQFye`)*nl99Jaugc)Za)8o^d1C*n!i8f(yF zw0r1NFsqbAo$*xcVs!gV@H7PnD|otsmnnFLf@dk%jhgP*1AF3` z*vn`ilD0M!M^0z;|+Kt-ej~}??=)f2jD;)WVBnqMZrfDyj8)w6ugbuAvhFo$2-vJ z|MmzBQ}BKT?B?qog_cu&-e@eYP2=G6g2I9H~H`Q2mXnF8Exf1B>&wsLX8#LU!jHy)uXaL9)Q9IM)!Dz4kS4U55_~Vk@43ZpPchp4>`2lHJL9R?#b|3zQ|LT}PFLtmh0b8M8+OMY*wg4<^PyfO zXW`j+4xVdtJ9FrKg)UL(0`d#7H(rDn8|~IFCAkbQ$1Ctkqg}0!!h03ET48hTU8B%@ z3SFzvB!#Y1=stz|Ds-zt*DKUtp&PjGjd&B@jQx!6Z>xp|kPO5@I2dm++AHBUh3-;l z2>DRF9q+(9jrJ@LBe@&z!QptX(fy<`biYE6Dl|f&kqXiOLl08(5I&5LIQ7-fLqelS zM&lS9i{p&d8g4$O(0B%q;{<#HCmQY1o2<~w3QbYyX@#aLG)tjr)X@J!GZ;UKGo5?6 z`!Jhi4m$l`p}9EEXs?846nb8vXUXT|0(=e^8tw6Xf#gM8gfHP@qh0M4h2B=^RfS$x zXbH1RaTzYh*Nk=#-ym6mZ{kXP%UE5Lo9`&Jiot4JgKP0!quu)Z3jL$d2MTRg=tG4* zQ)nGE>+vJ}7(c;JjrKYFxk4Ki`hxsR{0cYV*G9X~-;jKZoA5jQ-srwQhPEiQOQEd_ z?Nn$Rv)l0p{1JB;?bY=Y3H?9x3*%q$H)@=f721uz;~)4Z{)K-V?H>NCu<7l46gFLb zufqE)T*s*i?}Pi|epuJ&USr{UB=zwC6gDur{Xcx5!iOq+5c$DK{|`4}+}NqCUVGug zNDjv)*c6)?ZB289Pg3|ugZ^IUCCTx40=B{vjqWuNZmn=Y z;Tm!edeMh|quqLtg#I56Gmc=?sj0s23da?GMB#+O7b=`oxUIq|g^LQOsmx#&bC^e` z|GU>!xI|LM3f5v9JlSaXr=7yx6mGBZsS2OMYzOR!ov^df{kx2C7m}`c8lH}4810(f z6+TmQ7!1YR z@eaJx==T5cFoo||_-^uha5&zJ_ZjWhN02;#58^}ku+i<4;gJfjQ+SlZQxzVq@Z$=P zp=K9?Qxs0@LGizkkkLe3mHF;FW`%~$UInuUsCuTg%>k^8DGIyaS1NPWeUH+U^%{~ z@atw!{TCD!UP1V#!fz?Ol6(fq+s?T9Zw!W4k*szSXVYt(f%z98!|$>`@8SFS0e)z- zSKxYuw<-LQ!rvubIC{{>Fds zU)*DK-;+n`C^AKneH1xek$n|8Ns;{&IYN=TiZoPYf2TfD59{LrC~RPKyIJHwMGjTu zAo7Fp5Nw2vjqYAW=>HM=f20YsO|h9%Q|+#i=87Dr$dTkn;n8>u9&2=aU8Ds`OFSOw z|B+UVPc+)?wpJvmNR1*PMLf)Uk^Ud?GY(+T=pOAzm?VNxjA0xTM!SAWk&_ikD^gS> z!)z9Fn8$+A97+88lFigZ_`w<0|hIY*J6RGx{w@GLyrXxBfN73wM*;gTwJ&ybtd;+I@IHkn$;To6KSKYHjCU&CBQ}BACvYOt|09!~8uwWE>lOJ)k&hJlR*{bt`BITjsHFc#K4bhje&O7!`nR8vuShoF z*GT`5eB;!(=WCN9+Z6eZ+3#^PZo#cad(5|!{D42=4%}(9Tl`s(J&OFI$RCRQ%It5r z3wPu1MqB?U$zS+4{)7J-tLKrMdljwY45ItszPKOOHM+kW8Lg*iO40g?9X*H zam=>BmUuj#V07QxM4kSx=tHmr* zjqbA}npU)%q8UZoDVkNZtZ0s!JQlEsC8K-3q7{-_Y=b9bTccgMy`rZodJ1_5?1-JP zv(Y~4E+k#?G&~*8Fxp4mUD4i(_E7X3MSC)PCicR!@NA>=1xDvFo{Q(<`FH_dXmnp+ zq8BN8g`yXeUxJt7Wq7&KK9(y!;AfAj@rU&KZDl2cjz-d6Nwl2`CmT!KrD_G(U36 zUrByL`hRpcN^QU5_Y5%2I9Yz0U_8RIH#_ipn%*FpD|N8>`m?H;amu7?iPswb;h!_Q_aV#m-QyonoC8YtQT{ z*a16YC!;++r;>ERu6P=rZgihJv2Kc;rC4|J9@rDl#9l`CN{gLMat@x0=i&KAyV`|{ zU7=WS@{90dyaX@B%kXle`;3TPsaRjdt|IS)SK~E!Ena7|*Qe?K{S~``{6@S9Z^nK` zdld~J8Hj^$Fy3Oc*XM1DJ)_tV#YQVORIvvXyIrw+6uX1UJMk_YhIbq7o(w0s7w^OS zafH#HwFgNa!iVt@9EqchwsMSOQxzMl*aXGKG5aV!hU4*Zqx-iTu_s6-;v}U1$EG+n z)$b+6rYSaCvFXgtz$bAg&NAB7=8!yvb8#L%ZM4_Gvx==yY`$Vk6kDL!BE_DgW+6V0 zFW`$tdwyRcS&T2^EBLChdgX9)sbb3*EXUXIb$r8U_u);&K2&U_Vrvw8i`lpF9bAR0 zjdts6N#4cx@O^apzwHm}6#GoE_2eJn$M^|;YP4Jboa77q62HO?_%&`cmxp5C;J41D z;@sS%*mn%R$IZA!vA-4D%6J=Y#~&2?O|c&p`-=Bitoo@ui|x_L3|%0gMAyd80d^q@%OYuV#Z{R%kctbo855j|uZnum#QoO0+jmhc%ar%Fp{vU7R zR91gtiZ`R?2yBi=;!#GoOUI8<+^hJpinmgn{vU5aO-no;PjKq1zsnTol`BsFkJJC- zHPkr$-|d-kpW+e4{p0}*VhEl7Z}%`t62mwqFln?~Oe@|^@r>f_6wfMNRy;>d9t&7R zr~li1sF2iR8$21?8r}Cu@%D48& zy%q1F_&JLAWcEz#g=gW}M)%b}elE#*==6WZFTe|p?rTB(BE_#z{9^J;@KU7z$E*Fn z4#|~x752fa(dqy8NM5J-WW~+<|N9lcUh&%$zd`WD0Sd=4i#oD?WzGu{aLt|MADDtUi{<$tU0wNdJ#da%!rdW5lN@{)*yL6@NzY zX^PKQd^(l%|2X|WPXCY3a_;5s!yIa!!nrsPpEkO$r}1YMe?js2g*J#NM=xYcOS!gi7$@JHN%JB{}I{;c@#ivL3X zEB=PNaJSL!;U6S_;$QeT{$sQ?dz5Id_+BLrRHBX&^_1AhsY&dM`yt0avA=V#>Ze|b z`s4?oumLtSx{p0^kP?R}aWMHI*a+$Wi9?;r>eZ4soV*D(#b$Vf(bgQPL`x-(B0n0B z!DI0_Y+Yv7th1<@dBg!-MvI_ zCHg6GkrL)Zn~RmWQi)5bxfCzM%kc`M+YJ&|k@Uf<@fy6===Rk_Uy|$b2BiNdZeo11 z(e7t|CGJvUfD*SUF_76oI2doiTaES{4Ivqd)w6a7<2#+2>i01d!<4vRiMz?~!Qpr> z-ekjP5(n#1~3@ zqr{iwU*QJ)8aEp4ett``3BSYdakJ4r>a9xbR$`kHKPj=D*&pyn+<`ldcFmtjenI+w z;y1>-oSN$AGl}1o_*aQP$p6H@@NfLbXphn!lD&?}I=Bz+Yjn?DvaXULCHGhING0nj zc@PEll{|ofumLv21C8$b$%B2zNz$B)O_6TH1vY5j>7L0b~l9FweER$ET7Te&-MqAmAq&=R39k8R(p0CbI zo~7ieN_JDS3$tDEG&~*8FxoY{lk~uzcqaBT+BMHs@6h5`H_-WC^<>VE0w%U$*Yv?uVf!3uUGPF>aW3T@jC2lbg%H_4J0?>O?Wf* zGuoN~O5UdAK=MI27;nK_jdp*AkPOA!@eaJxXwTy?B}XcGw~`~2yocH0crV_E_Z!{U zl;i^>58^}kFg{{*pZiJE{~uFwH2D}Di{tQ7qus;tB#+|+d;%vL?P`;id|AmUNI0Nbb$(h`%`iz)OJ_nz|xj4^gANw;(KCk4nK8Fj9c0XSrc@Y=k zOSsr*YhF?EZ6#k-@^vMbFuN3&;c|Su|l%UO68tWg6EfO8%ouaet}=&SGd7w_hci0Ql@+FQu1#lcQgAt{(*nu zUq-v;KP3O+9^C7gs$+C(Qu``(fKvOB*Twy@9@aP7N|7|chIk+zWOT30)FDcFm1?Ba zF-kR7s+m%UQgav{j!m$s(cbF_lID0M9)(96-A_VN$12rIspH67U`sq6PcYj3NmC7r1 zjZy`rdMQ;@s*_SBrP?Z0=3W)7#Wr}d(LL9xb|mfb6zqT!Al@^kQ9JP*&u3ygNn-b!7r)J5bM<0W`0US_nF zSCCwZS79H#+Gx+nwMyNq)OAYTqEug{`YCliH8M`>1_&82Lr~lj4CXr0WDL56U8SS%ahEne-^`uhID>YN8 zrzx1F)NBTG@F|>&^NiK^NZfozsb?9?#|8KtE;QObc|obym3mRBSCv}C>`S;9U&dFA zZl_HxAz6yca5=taw8!BMrQT6$1^Jt}65qnNjdts+NLJ$-T#N4-ZO3?DsqdBgK&cH% zeW=u@O0A=2J${5A<0nS^9tvKj4o>_h+}%PLiMSXZ!_!HC7)xH+Lzuo5An+2mXnF8SN4HN9m`P z`d4X>QhSs>oPxbd*HQXlrT1}eruW7DurBV8^{_rqw8lywU`lM;(>UO(f#+S z(uZ)bM%Wk+#lwv5xl1=u`e?$YN;hM01UAPb@hGEvRiuwm`UItqB|i>ZU`ssSXjg7U zaw49Dt+B>vSMw@;n$kX{J1Ff}I;wPlnjnTSj1i-I^`>JaaZF$mQ<%n#^Y0L*vzWs? z7O;pVEMo<0u??P#ZLuA;SNaq)aQHq)%7+e5KD& zx|h=3nC*@|uqU2rv`6nOlC$v~JQtn*Z`Zs)=}VQqki0iug!KRPB~E3v>!vRwzZ|bX z`hS}KpYB6)b>mADN?)V&WTmfF`W~gPQ+lw{eaWxK8}LTF32(-J*dGVrKpbRj+^3q{ zLUJqKhC^^D-i~+Rop=`x!@G@ko#9H4R{CD@`|y4ofe+w=_z*sfkKjlgWwfh}AsLI~ z@KJmW$K&HT0iVE$ILT<&nL;uZr{Q#*fluO0oQ1P-4nBo*ah}nx`Ha%vEB&m}tCXIv z^b(~PD7{GO=Qv*r@p*g!Uo^V!Skm??Fd>!8~ zy6*?l^#3&dKTZEnJN;kjcbuA~yBM!l`ctLXDE*<*^#Am`|7rSvn*N`5`oGc}jCKz<(p4P&TMcD`i$FbD}a2Dsz%Drz+E0nV{)i%G4<1 zVY^=Rp&y<8Zy#4knY=P#Wg>3J%S4q)QWjGt&LH8`SFe^#N|}r@PXBk`lV`Hj=ZAec3Pts1A4$8DAKgG$b?>#adNjm*6aj)%67i9)0 z(^Z*sl{rnB9?G0f1}QVx{r?&==2E#`nOl{) z&3zru4B=iwoqM_K-=WMfW$q-u%gNpK?6G0v|Bi$NP{nbCh{lnJ1Ka zM455QjHG51j>a)K)@b+PQIf}SJU)&SjP|%qRA#y|lgKCI6r76FjJ9$H$&)w}XW?w4 z-Os0#S)|NdWfmwikJ+d38GIJ!8{OXq&pb!65TC~vkpAx;v6qxts?1{Ymy!OTar(b9 zON@=ayO!}XT#oer%h?j#x=OsXwMz} zKSTe|e8B97xX!6@d(KD7e4z~eKl2H*pW;%~SMcN^W;i_9M+f8t;G zH~wR^{b7%?&6U}!?19SGQMR74=JMM|*?n<8tcy{d9?5WCjC+wnZR|cmc z{XcsK<8DUxGs$cZWzSKzC;6G!3!VP2?Ab{ZHMO3h_>IbMNR8r_bU?L%@kUW0Uo>~&5}^*NQjUfKT2-oWgQcoW`?{fzdy8bC4- z2jO76#b}S@ZORT)b_n@UydCerJMk`~-TK|ij!^a<^5J+d-iP-a?baV4c@Q7Mhw%}k ztr?~4tICd6cB-;tm>sL^1ZBrDeiR?W@%XsWUg1xWOvFhz8K)TS`qPwsR@v#w&QW#- zv-JP$OvbZtwo~sO+owq8;yipBpE26!%Y0>DRCWRRbGQ(n#}|xt>x)QU!o~P9zGAdn zT%zo!$}UxQwX(~UeN)-x)X@L4uQPrFS2*{o{!T@9CCOX(Hok+ajP}{IM%fRQT}%Eh z(*Lvc|Lg}&W%b>7b{(_p@gw{gKQY?t!8%_HWAmrR*;5 zyBmMUKk!eZeSZB-@(=!tdvLGOeWba4l&i1YzD}Oo59{LoSkLJ0Rqg;1VFPT42O4e7 z!O9(_+#$*}QI7tfqyOg)rSdR5+^Mgg*<4eSW_ScP$0LpIHIqA<>>-Se1hPjU)&z>e6-XxBVdxo*mJA@7Q( zA^kshhErL6*5|sD_rRWbCiXJg)y`IKm~!VRca?JIDtEDR=TUP$UVs;3Z@kD@y`s2z ziE@`RxC}4HEAUFAJzss48=&0P%H5#cHOyX%*I{40-e~uV{-3*v{ATQj{hgZXza^d< zsN4|c29XcOTkuxA&1hE}N^(2ifp_9vM)x_JyIZ-*%H5;fDCLGL_keQuQga{Pk0YG= zYH!IsNb(RqjE~?*qx(}*ZnSdal^a7o7RTYE_?XdFK29m{uItd`hV_er?UF(t=zNZ^Kk*v|8onSn(A*;dIev_CAidRpIOUEUc=Y%4P0TgM|GugYm|G7{B3*( zSK(@-y`t8Vyo>MQ`}l#;9)WerZB%Z(a-S>r5wjoTC-^CTX0*?~FG#+`uW$p>|Er%t z<-SpFi*nzRZ^G~Jd)#cat8FFOhTHK6r2o6m(4ETHRnGMPf0Z-+|99nnq2^co4R_&g zqrF=GAo&yj!oTq!W3@YRbB}U+ok6}1njJIaeQ`gd`|)yqf8`HVzMk?2Dqo-315nri z8yelml|P8&U_1mHVPm6vZeaV#w%TQTYf-6k{02gwfWd zls{SdwDLve>Hm59e?CWL9t+f;#<+xKtY9s+G1_C*R{2iKw7oKIbNAet!bMZVpA1}ZQjdmX{QvN#SFIN6a zXv8{(1&C;Ei|_-fVRHL%zQXyObZGf;kZb zm48q9LCQ~3ez5WnD}Rgf_bPv@@^>nK8}}W8L-BUJ!)PD%T_nTsZoCJF8{MDp^7oP4 zk0bB_d=MWp+I@RO`A3x>Nj?fk;}{%^PXGVEXK4O0<;RmhjuY?+oM^Pie6sS-D?df~ zS;|jkb{bB{8Tcg5G&WlKBjef1KcoB{#!ul~oQF>v-Sq&#=qikxC?h1-FKe(KS=(>zwmGT$7ql39u@W{+^a$zXHeJ&_eH1w zt5Db2XgSX>=Vm<>>XRRU^#4Kw#togy>T6cvAQfsJ|%7En}yR%CMsUxl;C&qn%xf&O1``oBFR7chGv_Qs3wVx!&qr7AqE!euJlsKVtc zT%&^1|5dmWufjffwbAWPg=iTZMbzGx&rsohwlV@Azz6XmqdlsR zkc?E}Q58lp9*tvgERHkU`o~DdBmKWX|1UWG-`TYDs3)oLo(hvycv*!hDm<;iR262a zFpXLIe_;k=`hQ`jbKmOEM}^tsbMPsgi}Q@`=lq3dRCrzm`hQ_QvkUM!T2YT(Ekg|NR}i0zxsDEg*Q}qM}-yS^#8(2#`OOJ{om~j ztH@X58eEI-8r_apF#Z2)6+TemQx!gBb{($AkMLvs#Mo$4^~(8-Xu8EnGu@O#{Bw9lQbD(qBY8~Jwp0e{3DMtj_TBKaAA!C&z=qrDP#tN5Y{ zzpHq*3V*10f(n1CXqxa}Dw?inE|tGkaQeRr|Kc9p>sYK~bhlO9SH%NV+>g92?vM4b zzR}(PBK^PEfV?3dhzB_})xT9K9-`vWDmGHFsfvx6Jroba!?B6c{TuvZGZOlLu{q-- z@hGR}e}7Y1JVwQ1$&bSp*bsObYDA)0g@m( z{a?i}MvQjln2H${(iM{YFqx%l9c#ev9t9Y)8 z*Qq~KMtkMoPI3p{iFe^Jqus-M zRGg~fa23a>c&~~NsdyhX_u~kB03S5EKSvZFCV2!$;wT(#v@4HQae|8D$R9=ee{nqH z$DPV*r!77~G7%@?WSnBOt4&k!SrwO8EA4dCF{v!Ds>Ho!l8SlZpMz>Ry_ED*kO8ctRK&Abh*-~BH zAM0U#JOE{Mk4C8>$$@wf9*l<=tFOP@Y^>6u3=YG?u?aRc+SQIwX_ZRNRf?;0q)M$- zI!dLMDjiMbF?cKP*uF@6%cVDwbXVX_XKLtD6y;`N~Rk}u{ z>r}ed*`Hp{aiFHJb1!FGH>h;8N;j%>le;Zb;2eQ|)thX00ILmD=}wgfsdOvhV3lq$ zgKC*dx2ZH#r6Fd0o7}F_9gVg&bZeabxl5({RT`$!aFy;>=^kgcPlv{rPcl2K(!DC( z=j^%JN%P04AED9%&VD-k^Pox(IV+n}VE#DukEryVN+VU8snRHwCaE-9rAN8r7?sAV zG_HDI=YczC@G+Gps5D-s$N&Fzo=|C`v!;3ATbr9Hl_sk+L!~JyO;c&AS;VP#R+w&< za>mXKFua{9kYuOa=vHoH;?N;d@mFWK^r~j+;C({2*PXD)Cr~jAe|0SpY zt6T^7!F_Q*=eNzvb#Z^JhxPFQ6gI$ycpx5x2jd~w$jG3vGw8Zq<-^pbr1Igaj8nOZ z${(oQRONvxH&gi(m5)$4pmKASoyM;6kt!d>fc{^m|Cj0iWvBnUkE`5L<<=_G|I76M zGX1|y|1bZi|Cei6js9Pz|Cj0iWvBn!)q*PLR1T?}P?`Q;rvI1e|7EBDs~mUgtAGDh zPLk07%k=*;{lDz=f4gR0Wvm#TC$+P38$21?VmoYabkBIXgUaWt+)?E- zRqmwn=_+@o=2Yy0UC~+7y*|rlkaWZD*aLeSZA~wdv+!&@2hYXxjPCQIe1XbWt9+r# zm#N&F*^BUEyaX>by1&m^zMSL=yb`a%K1O>auTl9%m9Hhg4*TNuc!SX%rJG1@#(vlz z2N>-!AEfe3l?SUlQsrAz9;WiGDi2ZlHfkQBekk6Kci^3Pm(gzPZk0!ych4o z`;B)0A0T-UAHs*x*_Pd_Q7Vro9If&g24is?K8lYS?YVwj4;f#((f%W1|zR*ZE#2sno%Ja9`XH>l)pwx>8S-ma5cO#Wd{$ zR5@4`QPTh$;(>UO(fygCatKKyY>bEEVMe!yRGO%AlqyZho8b}I9FH_QuNuyN9*xJ~ zv3MM|FuKRQa=a=Y!V^?!#o$Cd30q^0(bjua39I5G_hSHq7&5w7VZr-NK5C%i>cI0_cxzmi@=Uru(Di5o2w<`Ckat}4b@m{B< z`g&ctpJW6+fYmGZA*ZJLxlQE}@{u?SN8=bAYqZDkQPp0l%44ehq{?_zR;cp0D$lAi zL6vE$JVE_LoP?8c3QjfJy_&Ad993qJKZ!GO7S1->%BM)?;yipBpE26Kny<#KHOC$HTP z>*D@c&*&c2+5@wPatW9C*n!i+GuM$sx7M4tJ;)meX5P9 z)=y0UgBZfF(R~)zMoD5A#{?#g?zLK*CdptH>HoEP#s#C@hmvYLtG2BF$JCvGOF94l zANNIgDV&h4sFW>R*2>Hqavk{ssk)T_RLMQp$lma&3WJRiH@1$ZG|gk4Pr7dwOH>r~&J zN4W%h;HB8pbg%0A%T&K!^}SVpkLvrV{$|zpRs9gvU#|K=s_#dAe;j}V@e0#>zE_f5 zg;(QXyvB4t$E&|q^}|%}^ncY~k3;bWywUWo!{H=1;RqawqfF;{Ia|0z_2X4Pn(-JM zi{tQCyv=l1LG`z*ezNNCAionQ;6$8cdRNz7BvbHioQl&-Zx5%d{yEj(tNO=Pf1m0f zRQ(KUX5uWoA0IHiEk8u^Fg}8h;$x8E!Vct7R+6=lBJFiQ7zXYhS7Uch!HbdTa0W|N3vK`3}FwADsHyS331Sk^GFm z;IH_b>7DUEo(s*xJTVG+bf&h6RrO@WzeK)KfAUq-y8SAI;<7!Yh!Ni*K~vROsj0hJ{*7t z;z4+@=^jI0bNSlK*FwHy$=U%n<6kl7CBk)K(3Xe8xN1mJQ z+JNljQ42c(Qz_FrfeYPGfA(#g1eLv-arR>?9xk-*+ZA&%(3u z9MjwKdGdcFUuXGk3-$8Nk$_aOLGtw@?~enJ{_nfOsjRKsd{>fRg;(QXto46hcfM=on=IdT z@{N}7diidWZzwf4;Egy8hnw!t7x_kzjKooRGu~p>Ep@IU`Nqh1yL@9A)Bk<9GQJJR zo8ErjK|=rc*=xk^I}s;2HMO5;^4%rh1M*Fg?_T-n|GufzOhbF=*}bMa^|k*W?Yoa; z2F}D;==6X0{n7WJe2>fb5c$LS2tJCBncjJMg5*hj3ZKT=rniT4<=ZUZGxEJ5-#q!2 z$TwfU7v)<(<+J!4K94V$bxUgJ=p~YcxCmdy#inU3?GU#}CZfSIyk~NWPC5 ze1f0iCj89wwzfsSujSiHUb_yzVEiR+!|nK$>ArLMtQGuB_^o{3G58*Tz#s7^(>uSv z$oH3gzmorkzvCbHr|EUkze#rBKlrbse<#yD{{EfiA0z)R^5^8=RsN3hH7AXB{0aHP7m^F`Lc9pOn(meF?;UoZav`LC9LAhTECAf&hWo&N7$=l;Ru*WeJm7Oykip9c32 zm4Af%H;~_m!_evf^50~-??nEQB%|7C7K^3Rn29`fmUFW!eUOmA=L|9+?c%l`mAhz~h6 zwV(X-KO+Bp`5%@4Y55;x_Hldy>HmJG|9jhX zJ39;IUnl<}`B%yRvi!^BUrfysT#EF6ztjKSpX>0yM!pc6o`cr}3<^M|odyaoIy958he;ormneM&?b|%>ccg04yo9Q0sz#atk`&-7}VDbQYl0~BbZz<~-Js=z_i9E^uxb8KO{YtF!7BrUNOw#LIv zZ_8~JXs5st|lD^ z?4-cC3Y>B3KSHGD3DShN@Wb= zn82jzzIFm>k_=`shk4UoDFuoOoUcFwc?ru{!K&%)Z5NUY@It%@yPDpS@1{V11-dJ6 znF5zE+XLzUfu4+eIrX)7qCjtwKG+v8$9`sQox{xm3Jhd$1rEY1@ha0@5d{V-aH|5> zC~%_!Lzul5ufywcDBfUt`#em6n-v&NeiM$skvPh9UsHiwNJirr9E;;j?-|{uz%&KM zD=(e$pC$s~8-6ucX!n%*AXqrfZ$rjy@`_u&kjX?jQCev$|9L3{`w zHr@A>z@rKttiWRmY*OHH1zuC&2?d^4;7J9ZQQ#@+pT^lZ2j`kidz{309?r)F_$)qW zddJ}f1r{stBKb?W5EtRgrq@-LkSxVl@Ks!9di%Uwfei}0uD}}#tYCH}uEN#0#`LeuLlQccyoR{Gh+jREaHnN|B`!i^U2jGEtkm-JQ8azb7n1am}JYB&S z3Lc~2p$fK9@GvS{Vk>No^#9sAC)k$6c|-+|#G~+N(_N(p+bP&y!DGpf!{hM;Jkj)? z7uS67Wb#w+R6Nb8;dv?8K|#NQ9ThxB!A{Jcf%N|%{XclNQ(yZWFL*Aq=V520{|BA^ z?{@xRfINsH3}XbH{_kFU!MK8#Dwt5PqF_?Nyn-oe(wM<4=1lh$8Z3|$u>nh1Hocmv zf?X9npS%lRfEVILrgxMsCh3OV@e=G|dRyzMU_ZiM3SP#bH}=84c)95v)&2@zrQiVa zfp`TD!YfVh(XS>MjMv~0bo#%ywd)msOu?awJgndi3b#`5MuqGe8>ZkE1&1s6q=Gjo zI7Pt`3f`gMNCn3#IEwAujJM!u9Amm2EI5wjR=f?z>7Ln-$bYXyYJn>btLO?1HO$L zP4D`ASHX`Je2@Hn`~d0yL8t$FkNyeyr??3}!_B7GVYVuCfP$YZ_?LoTDEKV}Un;nb z!FK!#zs7G&Z%@8c@D~NYC;tI|#GmkI(>q_klKh6h;~)5^>3+={{97R@xI>{`6#R$T ze;q?Rp`AnCLJsD5IQ}Hy@Jzt>?3i%c4sL(kIbz=4mJQL5t zvrX@qoJ(>ZcE)=2nYBIVWf>E7JL6r!<*(h6m$ z&teYqSTNn|In2~bU z4GK+F$ol`S3Jp`}W`%}Ra}$ohkvPh%+cKK*Em#|mVLTScneMATbelpG6&g?O^nZo! zz&mk*=^e>QB$LtU{|eRi|8A$I_C5X3G=&~f=pKb;DKwp$d+|P;fiq2SoA;AEfKLBc z=plUA^j_VMD)h8MkC8u)PvDdIl<8H@CYghC@fnHhxD&|;D$xD;Q(S50ppUQ=kbLd(ft#}&8|SDD^5yoTfrd=uZo zwWhnK3awY@BZW37^o~MrGrQ55t^M}e(7Pn>;rsXjerS5v;l~PXQRox$PjM4|hMP_A zs@_WSIevj(;x^MeUtcNQNTIJ4`dy)K6#7x2Z>jkXzsDb(`r4X5^b^U?_zV7uPXG6g z*dGf0tI(h1f8pP_1OGAIJq+*UBw^dQxijv9yPEFS!n-NFpTfH8)FmG z+veUR`(Pb5#eGfp)fe7h;X@Q|Mt%SuhzH@pru&(5xH(A+JQNSZmZrCdtrdP>;lmZa zLg6+FClzk1a3_V2Q21npk5u?Lg^%K1N8>Tr4v#h6V;i>qZ^z*TJQ3UDNoMWrbMq91 zPi1f#o{k-`qv>8J;WHEtDSW2FofSTd*|YH+JQvS1y=PHR;zK_MFlg33&*5fR;Ru5$ z#xRZv)BPWU;grJN6;3PMMd6IX4GPo$!#OJRSiquluiDiWE|HY6f>k`zVK%g%>J( zrNWOWe3in}6uw&FNeU09@){h1*Wz_}Jr1=CRbl7yhQYV^ z9e$5Lm|mCoNs*lt{#oHa75;_UU-38m9se-BF7y}4-?#&v{;%-Arn_Q^{7;eH71`Oz zBfH?P*a&ws-A}?JdyokC#KzdfbiW#n?5)T#itM9E3q|S_IY5!7)a;A<;r`gnbXNkA z14$0TgYgh-Zn{@a`hVmE#wTKXr@r>{9+8ttPC@#AoJ2kaWvm+f9IY*IBZcE)=2ncmg{id>~gP?4^RgcQju5>_OsNQBBL#xRcb|Jti2k|IfC2D9k& ze{cH*MXHJv$s4eQWvrOq-kwj=1uwu0@gmb*Sw${Zq?aPy$h+eu*aPYRk)AeoujI&O ziu6~cH?w`PFJ6xQOm9C2kPO5ta1dT;x*aldwIX*aGFXw3id>_}4T=n*=32ZCug9UL z`|6I|NHPqE<4rii^q$u!MaC&|Gx;qz8pq&R(_O1XZY8-5$K&mIhv{9z6BL=D$V5e^ zDl&=L$#@q|!Mjawo6|_{!RdG}-e=aXOm5CpWEO+_@d2d&M;@}Vcg!DA><~pBRrFRx z9#iyeMIKkQi6T!ZvRsiT6?s9Crxcl|$kS|LHqODh_>AdY74u0J;IsG~K5x3~kjRUQ zEK%eo@`bnvU&h6zx3#4tui&e=3|}+7n%5QiSCJKpys5}aW>?{AT!U|z-c|7y$y!{8 z>v03VjT`OMDDn=zi|^t4_yK;1AK}ON34W@`Z;EVEWV<4tDe{FPn-$s0)Rww+X$GI0 z&cE6x@R2VS*;Y%MUT(+vD@A@#;FGD-H;`}sO~R&xL=*|QMc7XMSi!Niu|F-pNjm=_%Hh~zi!LJitJG2pQbCPH*IuV z-RFIrspw9M?xv`<#Q!O}Gwy=BVk6T%^3mN%=>Jjrf0X_oZS2(4-u|IyJLiVjq?FZt!@^nXSB;{elL z-9@h;8H88jRd}`OZS5LGM=3f)(Hj+||3~TnQTl(>>Hmt};MBWEX&A|Hya`9(NV9eY za`R?I>Hksse{>AtSRCh6x>w6>imp&}yrNSSy`9-R@J^h76LAvK|D$)=*xR4G6`iN( zR7D?Fbef_w6{Y`2>Hkssf7I#!iq3HERr{nUI*a6fd;lNBhfHtFk0|<-qK}e4hL7VD z_@wC_L;8PoHu)T!i_bVUwVzpy&R6s$Md|<1XPKq{N1gt!=nMFwQ~z@92rN|e6-DX) zQTl&$F*QqYsZ+W96~?dPGJFk}o3uNZ!Vc_zu2n)~Fo+@3J8lt@D8?|33Ddp8V=2YD zE0$KQfvJpQSq3@GV*!h%_q{HO9ll8dk_UX0yLZ)=w*Hc+u1 ziuFo?=rKdswk)ip^B)9%`oJy?7taFx~gr*esI!@d11g zA2Piy+xq`0#U3Sp3?E1Of9y%8vi2?(dzySU&cV6(jOniJWAhbTs@MX>UQ+B?W}n07 zk^Ue1PydfCBwvIt<6>N5dfR+OvDX!Qm3$e#hRdCr+Bzh*f@CGG!qvFO^tSV+;t9px zQrw!xTE#wBY@K57DYl-<4fr;0#CPyr)9V=TEB2{k^#9n0%zlI)<0t>A+(hyjZpJOR z)%4EJ7mEF?*q4fZtJpSXx8qm%HGX4ySMPTu-{TMXBmQK%pDe|GQS2YZekK16f5$(N z{vV_N$NnbSVK(hi%l~zf_)cg$Y2%%77u*#a*`ZK;H{2cfK;fR)7@H`5fZ}^8UdPS7 zaUXvFRb$1QD!!lM&d>ilKd9gQWySYbyqOIwX?oN*P0w1SI6wa%KS=TBiXW`_A$6}a~Hqxcz$pGSD6;%6~98_&UW zP51pe-dXXG;`QV{^kV>>{_l3kc$g%DQH-I}|J^Gmo>crA#Z!uRSKLlt7sWG*Hz-d3 zkLRe*V*!iYH_f<&^#3^hKTiLTpHEHgYPo=#3-KcCiWg%y(>tD*C_Yf}9*Xx-ocTB!pcwZ9wf4m>#{y4y?;d3o+UZMCP23O)$cr^|--FKh(5XC1cey!rS zD1M#d!xg`tnxS|D-iX6YcU=^}iDU$hMEZZ+>HltTjE`1)yy9b+9gE}eR&@HmcLZ)H zxdZRS2{_U8Y9=dwzv6c(K3(xC%-)StaT?xZy6c4ay(IVH44jFx%>Nvv2NZvh-0A;{ zKa7vyqo#MvA6I%;#h*~p4$+fJJf!$jN}R3u(@N~7_-w`PwK<1-%~kw4#h+n359i|o zeAe`iJpDiZ0{M&h5-xOVYJV*yZcX4{#TP67n&L~CU5c;ZtGLXpJtM`Jle~^Aa3!un z`hR?l^O;8c4YdCMr{ZrhUW@B+z2e_7*r52^HekF_ap&_N#_uZ5=RfiH6?Z<6QTzkN z`TQr&=Ra{i|B3VYPyAB~HsNQu8Mh!G1jU`te-!`1Wbmcp&gVahZ^y3`|Js?dlV$&$ z{9EUylh`5pp5zDov6d_Tlj1*<{DQwK{=4G8)n>WZAI{i5ZgRH3&ws}GASk|rdgtdq zZOSRI3nQ_U68~ecGwy=BVk6V-Dv8~dI9!Q6lxU`el-Ng!J*jDoO>i&V+jPHvNz{=v z#eH!<+~4%Je1H-ylsJ(5AUqfk!RDs>N=Y0_au~M6R@mC~w$?_8_DZx>qMZ^)Fnc5( zg-7EtrdNL~$#Hl*(*F}q|95*r;v^+HDB<*fB~HOpk^Y}>`oDYSCpwaM!ZYwpbo#&d zi03HLPlus5(ya$;I()iI{n|<@(oIiRD%AW7{=^yr2i*IIFIIoc`~w1``vRorII|E_C|8yM9PaRbqw`)5x9vuf%ku z|0kUO?_G5>$!FpH_y9g=dRu!~$-R_#M2QcTcvOicN<5~-JS84i!W#Y))IUjm?O8uf zG8^gtiMfoQq2_hQ^Obl}i3N{}WE7*9}&Zufo;12H!Bfv;3A48+OFr`#0{ufAC+^-NU2}{-@;5xC`!zjm+8} za&vbj_h2C06B}a_(|z>h-bx0P+(*fFO4ccPsFF>UJW$DfsoW3u$7Xnd>8@{+2az0% zhhTGTVY;7lCJ$4xt&%OtTVZQF9NU=gu}X3!CyyjQ3XjHPoSNFJJ9(^<9hE#z$&-~l zp4k)dL~M^IneH`^JcZ;`JPl9B4yJo$COav4u99bvpNVJT*?5lW9jo(5I%7Th&~JJ* zK_$B?8B#K@WLU|hk`Zd6NdHg987G{3)xNu(Op&B9gIUa(-j)kWR+TK0H(&|NSTVh$ zbUsNJyZ|r6i%joXU#w(5CA%rvOUdrcUV=UFQtWAZkA4{m{Xf}p9E;=dR@1vq#w$5V$=k{Az&mjQPBgvB$s~8-6ucX! zn%*PcqvWGXPFM1NCGTbSKAeFwahB;_`45mhh!5ez_=xE}?qf>MR`PN3C-6yp3Z4G% zo&7l^bMYCRhx1ME>_4mIIwhY|a+#9PEBUgLFHrL$zJ&Duy`Xe$qh=rujJdzZp3%+U3|~< z_V5Fe5Ah@X7(X$+Yj2a1Unuz*`DWaLTk&(#tNfB=8*az1@N3h17T+q>QpxX>+EvN# zmE57^4@&-~uwlyED573irgurdPig$=~ObQ>oTUouJg=N*%3K8*19(5qKmXWqSL03`sjY7LUW@P4_IM zPE_hNrP`C9geT)Ec&h1sb&xupqyu)uPI!jtZS5?jd`g{7eh!|C=V528H*0&yO}|nB z20;vA7$c^)<(N`WDHT`Bnp;Ati84bFrMfG1nNpW9+XFAfp4iLu&T?;(KG+wX{;yO&(|s36 z4N&T8r3R8;frIc$yvp>>>|l~>a0p(D*O}hdhAMTpQa30yPN^G}8l}`QYKG%YI08qS z-j;7Bxdlh#7#wSQ&*fI7CMb0q`FOk?@4!1vx1**el1#$Mco$AF-Su#4s!|UtHBG6R zO5MZkbi5bu!x^UA*;2De?#Bo4L43&cp2Z_1kK$waIMV-9PukdhuS`9y)Tc_#R%)42 zbCg=7)Lf;WQ|cM&=iz)@fX|xV74Hq0E8+%*ZmwZ3mADiI;rdM;2(ruMK zSn0!*K7`rk*a8oADr;vj-IAmgw#LJ;jajSV<`GIC$>1nF8jrztru$k;AE$I@rH@zo zRHaW~_C#!tC*jF>is_#B^l3_;sr2dO9k3&I!ZS?wXs6F2IUDK!>2n#M=hW0b5lz=C z9Z}jx?#BQIF@#~$I|5Oq(@Mw4`~oAG;v^KYgKd-`d}kO?M@~7`tJ2yu@^`_VlGn_f@(lc`v*Sdt)Edy9O>N z>4*Js01m_}aFFxGV9Q}jU#av}-uP;z2NPa{L%jT2rLQBo9*5!$c%#X{HZ{C9u3NlK z=@Clbq4Y?l$0|LFN2LF!Z(%$d$C%!^7)Np|-iG7xcGJ5C?o@h;(i6xh;v}4mcbV?1 zK7BXIRGfzQ;B?d5+I>pDp!5u-pHzCL(hn;=i<Ao9g+A4FbGDnafiAUkl zcnr2P-J_H_PMMRHIiCCkJQ3UDNv3=JGpCT8il-s{KhwdfseO`}>7-0|WzJBhpv;-d zgq1lm_-f9*_h^8#fqWN;C7#f!0<>23KEWrirzLz%wHT*_=u z?1h(MZ|q}w=k9W41}W2zygv@Wfp~@K9p@`auEMKvFkWN2y&`k1GPfvmoif9fxt`gf zcmv*u!%Xi=xQS#0j>J)Tv+4G<%xGoCD>H_CERMrl@ix=j!`n&jz&mjQPBgu%da|KeAtQ}i!zM{;l43^<*xExRu(*H9bG5*+ezvjw(s%&FrHYxLkGM_QK8Mok8 z{M_`et}jWp;dcBAzs7IyTe~on`A(S~%6!lG2mBF#!k_UM{1t!0-%SR8DDx+SzwmD- zZ`FtKKlra>b|-W$MP+x!U2s=ygu9sxc2{-}2Esj^e9=ven<%@lvU@rEpWPex!8&Ye zy04w=ekA*&)Blw{01q_XbCf+;**ldzMA_?=ZLaLm%C=DUaAgmr@-S?Pt+2J}UX$52 zByI5sJQ9yG-QPx=Jx19Rm2F3UEFOo);|ZpF#b(=+oP;OiDR?T<|Ffqn8?x7zvK_Fa zvYi;5;k@Xa{7gJcS^N8scJmxBw?6@CH_ubHGXwkkk9O0iY(QDRQ`6#OM<)#aXB;Mp zU{u+dvKKJ6zXEBM2}~-RVqpJ4)xwOjMP;)#=4MV=`(3G)7o3DgQMQ4kq-<5$GUJNb zbY-D#ac%qO6LxXJo);*4p|X9Iy@;@@vX>}(G2?F7-E{uB8}C7Qsj@v8^uo)qx5=Q7 z+4PVZ%3kgz{gmy`)BqfaSKuIJhbVicvV)bqO4+NOo%~{oJzUcb{pz;b^S!3-+ai_M z;&rCCGeeafsVx0JOaIS0{a@MPNdM1{u(A7^&5lxboU%^;SN0Yhjr9NQSf{eKhRNPa z?(~0U$K&mIhv{u?g0fF3J5kx0%1%;tnzECrxeKS@-8j|s?nVF4(*Lvc|1AAKOaHI^ z^jdb7vX3ZB|Ia?a7U=(3r~fPau(P$=cU7|V|1AAK`#7`o|Ll`aP3w2Cvh@Ef{Xa|p&pQ2I z*`@djzG{b5*=6Yby-Q`6-2wR-!+{}#Tmb^-2KXapj;niKUB_MzaJ@QedA;0tbu$&&8N5t>HpcyPFHl==@wf0q8Ab^5=uJCt*pxw8K#OaIU9q}(pb(f@N!|97{XqyOie{_iEbJ7c?VZV%<8 z+~LYO{a?Ap*aY{&y>TC`!=|_|?uYwhGdutf#Dnl)|Ia!7-(9ulIyl!rt|NBBGw@8)eU0SKRxYaCIm-E!JD1t>urt=9&-Cg8 zBtZ;e7$c_p-G^LExgN^J$rG5w6s9qQ*8kJW<&fW%owNRLiS;E>k{%=;% zn!k;$`I{Fg*G;(#mFvn)dkaW6-Eh5f*8iQq*z5d0?VR<0tGtA%v5YTeA9`XhybODr z-t+CN+%3vouH3cC^;7Oj<@!@I00-g~ILLG!&N=2+;ng@8ufZXvx8>`U8?M~-^u`hV^@ z#!mnDj+N8@m3s*nBK<%2vQtxg@5n7t?hWOZD)+i_^#9zeR4&8UaQT1gSCFj4Rk#}0 znBL>QN%9u1#dWwIo&N7M1ZUqiD)*Ig?WXC2qs*rgsFsR_+hwzESQc<-TS1JNzDhz#mPo{%4Y3 z@K^i|e>c77^{4XI-v1*18+YJ8_^;`n@x1Nu|CHYucfnn;k?F1n^1JKe#meuY^N&$p zYPeAOJylq)d}HN5SH6kzeU;x!dB5^|D{nRXDBnW)I^_>gzA0PV7x%;cv6<<9HJ3k- zkJT?t6E>Ey)phBp!uFo9;2pw^P1@^2aKFlJdtf zOaITG!1zRL|DXDkNlw92@iaW$bgznhN9E5^z7zQwcqX2OXPaK-xg_UdXRJq`>Gq<0 zfFy_^3}XbN7_*n8@^R;d=?oH>#1y8L&oIbh4*C0EdH()ap1=Q<=kI^zoxlG@L0Ng{ z?|(7oPk`n56JYr+%JcWX^8Ed;Jb(Wy-<2}wkAErO4ZGtd*aI)co+g7{cp3IqzK@eT zPu#X}x$^fZ-%t4w%J*0PYUKy;Ob6l>I0&yqr~fzYC&q)7AFBK{jECU0cpYAEdRNE| zBsbzP9F8}c?%%!5k5v9npgk$e(P#=Fqz|K1)>C7Fiz;B<8Qf9-H7KSTLd%Fk5(DdlG=|A_MUQ}X~mh!5ez zru(U2{!x<0kp7={`oHo|IyJSQAIm?j{CwqSlh47q_zcc7z5QH3LjTXx|MSn2ynrv_ zOIED>LR^IQe}61lj7xASzJj*?w^>{No3{QpZT)ZB`rowmziI1#?`yjJYUSTkevR_$ zm4Aarr2psNV!RgDnckV&K=L+j#CPyr)BS8G|Gx5{D*plbhxieGjGvg!4mihc6Mlx9 zaSLuWz2o_X3R&g9RH3=@+f>+1`R&U8q5N0M|D^oa)PIBY|2+La|2@eM&US1;mH*NG zol*Ip$$!CL@i+Y4^sbFRRj{M<7x~|~1L^8)Ku&K|=p8(Ekfg|5xD{r>6E*bKzJOPEvvX zUpSuG6OjI2Xzx_IN9km8`hVe6#;4)wP7Uo#g^nr&ROqC_xhkB&?3s8Lo{i_2?)Os) z^#4L<@_O{4->IpsjtW5);wsSp3-td&gc|yPA?8%Ndzc_kVhYokF}>=3o_uszCoQ3}NNRFs4!QBd5oW_+q#g!e3QWfd={Tm;rUu#x73c_iz+Np;U%VO_gcjG zWnAo3x@Tl5$t(COF2mPM@9KJ8#VIPRQ1L_+R;uuq3aeE3T!qytyr;q%71pcp2KRas z-@>)H&UD{}3mZt@#*O$6zH7Q)Llxdv;ZqepApa0Q!jJJ2)7$e+B%k4C+=5$8Z)?{7 zza_M{fNc!6<5&1Keq(x9(RV8RqQdv&Kj4q}6aH*^kNzvkZ}>a@fq$Cb74o-=`>U`+ zMQh{#sAyNhzfMhYC#R-%-4=Hy*#&pSM!1{lZl}11ihHXl@;$LJHo?72cdv^3kknyQ z+!vkx?`^G_iifLsfQl_tJdoLg@L)Uyo15-gD;`R67`DV#*xGb|Gi0%iipQwfmi!1j z66ycNqn*my^;T?0ek>k`$Kwg6w}5vWn-bc#4XhR6Lc+)9`fcfE`V@ zdlb(gITO#qv+*3$JLc!97*w${c|H2jj{(!$Tl#-7Odi1~#+;hk`&}`iVnxNIig^`N z%%(AeS{&UmT#~)hZ4or~elRF}@P7aw^?(I+)}d9D>*4b*A^M zhpISM#T!%{sp5^y4#VMi6OJ(5-zHrgMRGIJ|BIs;k8x_;BR@{XJ5{`u{5Bkqx8ohA z_gp5BOvFhz8SgT^tL|?@{ql6{o9szl!%#e;>}knK;YzuB!(~ z9>j-`{$F(Zzx&l?@i7%=tN1vxPvDdI6h3WwXKfD2Tzm%S;e69O^3STci10ZTpJ(s_ zzKAd3LbLYj;O5IJE@rR_V8lCSV<{06@@YgY?5zgO`G20!9Y_%r@ude_x&YB*ZO-_@|6ihrnK zHx>U>!%iyxMdjbP1OLH)O}A4u*wg%<8g|BAa93<(y8n~6VRtp`rG`Do>HiITGH#4b zoXXm3uwieKeXtIj;=X3n?!PhKUk%L}G*iO?3=YJD@L)W|be~;A3pE_BhC|5@!+82r(N*`hP=|am=aT z>Ri=oNMI6En8u9h?O{$0Wi{l<3s}Skbo#%yhZT}4o{wGd0@JIxNR?aE&{gH-YPeYC z3)Ij}rC-(1U8PNGxJ0E5YUrWT8)~?e`}V|Mcp3J_J}TX*hQ2D@q=w7w>8qiiN{6YT zze;GfBGE@x{)o=sj8*vy8 zN85qh)i6R0x2a(y$*8)yZ>!;E#<$>T9D`$VoXOx;XE66|#^Y;aHQb?wJKfyb)C8|! z5@nO|E}VjQ<5ZkxI{%zIPFKUbYPeSoFRS4`H9W0`8Pv?gS$ID_fDhtB_%J?#kK$wa zI6i?-;!~y_F2=KQ4$j4Aa30Rb1^6sJhtJ~+_#(c93vrQI_l)zr)Ua3$ud87R*yw2|>Urnmj~)UaI*?~{LkAL2*& zF@A!d;wJnIH{%xEil5^b_$6*L?O)Sg-PQ1w8vatl*W};exA+}?k3Zm#_!It&zu>R< z8~%=e;GbsQ)(MRN#vS+%{_9xU3IB&X<1Xmzo=S~yH{2cfK$-3tEHx%+f_vfKxDVE0 zQ`{H#!~LTQc(Ump&(f(Rr{U??0Xt$RJOj_fv+!&@2hYXx zurt=1_Kzp)S1GSjfINsH3}XbN7{fRwFo`KlV+OOBGwZgFVqCx?Heda)K7RRY{D}&oi2IEz_oxvTZ z+fhrr9!nF+C*fqg3#X{`l1g{0^teh>Nv7dFI34fB`)~%%ROvAWvsAjD!2|dpK7kq8|ORWD(tp7`_|4Xd@YoBW&bK25pDs7`+vr4T0ORWD(tp7`_|4Xd@ z-TLh+eXkPh{}Su}66^nxv;J4|4Xd@OFKxM^}qX-U3n)bDYO1Bv;Hr${x3W0fA{y^mv>XSiORcE$@;&{ z`oGNjzwE64-Tf@@MGfo!@;;1N|CgQhzx#dU@_s63RNi0Zn99wlVf|lb{akJj+(u=;%57CXP30p9k5u_2m5);SIF*l9xgFs# z?$0%qkFEVUklj@Ic$H67`2;I){?*8gQ^{qMZQ zoNLAo&SaG@Qu$hyyQ+M-%C`RRsd6`FyW=I;1D*B1cVE{3W!C>?*8k-`)bw>~YTqX< z_fz>wmHU$qz=3!L4l=#Hy^7>&9E{iC5Ywxs#^j^O+RDMY1ndGzZetZBQG`)RznB)Af8^L&y8_$)q$&zs&hUsQRC$}f>G#6|crE;hYATuSl^zKYB6HPhSL>#DR= zd4PgGu|@;b^^tGtH68~7%^g=Lt%E9lRXVD2jw+p)Jp<3gv+!)wI}YcPoQIvU z9(|^_&44N~Rf6Op3}XbNrniT2k_09(g=y2%zZ zI{*jb6*$QBuE48EuExQ54GuBA$GuLK;i_CuJ``_2`hR8Ee=2VxAAuur6y9ul&v&${ z4XTV$-* zQ&o9Hm1*Sn;B>qf@53256KCQ5_y9hL58=aR)84hMJxW6VuQ>f*l_&5?)9n(Kr&W1L zmD#E+P-PCYbJ6Mls?5Xrrn3lfl4tQbd>&uG7tPvP;O0VA7BP4k7vmCKYI^7ERaM?o zWtl4LRC!I6)v7F~=5<_wD{+Au%g-dE)dRX$KzRen+RI8}aCwW%tR%_R z?t~nc>duUJacXMYuQpP(v8ua~?~Z$*a8J|yZPL{yBzqzKzq$|OI@8h z*ba|1y{#RuYQ3r_sCuTVC#rgys_m&c2~S4)fAv)7UbU|xtEZE9z>e4n&oFCS=H^+d zp3UGKJQvTy&Zf5yK2_7I`c;jp8elevAq->0^d3D%62}D6|EnpdhOaaUGpc48r~ zESm1?u3A#{MODkH-mYpz)hku4s@hZ4^HsfA)h^UufEVIL*wu7bIMr?>-O+i)soDcC zHNAcArD{J_FC*`beXuWHZhHIEpJV_I#4B)+>8`=5SE+iFs#mLey{dzmrTZp!Tb&RSb$w%SMcngj;y*(UDG7fLW+i<+;)!d=#L#p1X z>fNeNV0I!-!pV3SPBGoJeRZm;GgO^Meh*H^d+|Qg+x|?FS$IFv|EmxFr{-Z*pHlS^ zW*^1J@Ns+spESK~KCS9}RcDjW!MXSh&NIEr1tibnb4dTMzVM%#msI^p)rG3QtLh?E zSE>54s>@VeO#KpEim%|Srn>^EzDBYfU&j@=()9LWwW{k>T|@o`zKL()TGOjsPqG2& z|J99*-=QYW_&rrWSM_~WKh^)E>Mp>gs^0hi`w>KLL_HXYgc1sfB4AL0pkQ|*Fx}n9 z4(#qk>_o9U2@Am%Y_R|d6&n>$|IdEUUf-Yp>*9J{Ywq>To;7>+JhNvG=gj2KNIu6! z_yvAxx=!^q$v3zdm*7&k_{yu&E~h zuE6@5Z2f&(M{Dc2`2G+y>nf^KhZ4{6KZOJ#lcDNz7 zH~n=6I*@FH9dTpa#PnYi11$=4SD=#uofX)O+0Aha^!mU5C4IBhSL|lGTkN4g z9|g7{-xhmfFYIl)%I!$D$G+GP`TZuRu(JiUM&e6PUylrZIzA?<1^04)e%wrU#1N$)q<` zQlQ+j_mq~ITY8_u1*%-DhIMRUtLg6h2@0I1z=`B1;mLRko@%=LbvnrzI0etdvrMBzfpZnOSb_7HJs&T?3-Kb;?*IY%f8bK`%h2op3S8mUG=C>6aFqf#C~!6THFzyv zhu52Kg;Pmx#A$dFdi~!$Uv5?4Lj`VA;CTgZSKuK9?oeR50(Vk*7v7Ec;Jv2*mm&i9 zk=&2;{{a0z@Ss=I{D0AbhZT5Ifk&u$6d%LK@d?wd_9>F5@fmy;pEF&}3ku9r;6(*q zR$wNxvv4-f!Iw*%_c99nPO=*Rz(4UX(;X*k6}01U z9Xb6!@DJmEJ%j5}>8arQ*aq9;2H4K@dsnc%f@KAz;BW;yDA-5AjTG#xU`GX86x^74 zum3B!sdugBkss_tvKelUTi}+a|A+^-Qm}`DUC6h_uGkH`oBo~*ZbPyy_QYP;+w}Kj za61L9v2Rb_7yDs<+yMueUc>QLYyE#01qU+T83*BD9Adg#-<4!H+#QGFFw@=o2nCN; zaHN9!DY%D%dnq`In$fr?j=`~}|40S*CK-q0aUa~*bX(qE!9x{1fc!x8`oDq);~}P7 z=V2s=;}Liy9%cIH1Hoeyj461mf&m35Fnb(M#7Q{WbSn&!gfNT|jGC?{u3%Qd1bGru zn8u9hR+uBnV*!g;GTrf3QSe~}s|sGDU`@d@6s#+Fl7bB?Tk&{20Z%mjbNJxNB&Xo1 zcp9E=`o9SkoTA`)3O0{{vzR>_&%tx4Z0^bPNiM((@gls~wEM2$B??~3fbV|~^8N3@ zE4zQe+66}&^i>lD06!Ry)D4LB8V#A&8`j@(Rg3*L&i;q9i| zt9L4RpMrOh-;MX+y*S-;`{#a=8A$&RKFIhXucq0Nf{!TphJueOI8(vL6nsX($EkS& zpG5k9@M-T_&3DAXXUU(#=kW!6(R5p$rQoXy&L*FOFX7Ahis|mrYb0~=b)1LuO}Di- z75qfOw-j8U;M>f;gYV*d==FcUa|RcZe1IR~NBFVnw)v@oUn%$*`RBL@zrZg|x5BSU zzQM(~1ecm_Ys(aRO~K^~O;B)!LOm5+sn7-rey8A{3VyHPFADy^wN~MeNdFK1>}{v{ zbFtvBp&b<3j+*VUFZRR!roSgc14wqnop2!TY`R+?tk6(}hLG=q^#9Oq zjCcP}R1LvA7rRjpI!Jc@)}*WMAA5_eZb)yPAU( zIzpj?$q&Ipk**c;`oFt%`hUpl{|X(A$KbJEP4ksHbeuw$D>PA|hC-7RN-H#3p{POu zDuWopFh)%OtTGfMiDLqjm@?h=GYXXy%97_Wj|D86Znb5S3Rba(b<=IFRiU#KI$ohu z6*__06Y(TG8Ba0&SNYIsB&XvUI0er%{a2jO*$Q2#&^hGi;(2&JUSPTvUPN*+UV@k6 zWv2gsyhB$gG(({)6}m;Cs}#CHp{uF62Cv2I@Osnl^P#CEH{vwB32!$2^YhTH3f-;H zZREG(9e5|+Wx93VLvk-p$NTVp)7|R_6na*n2Nil;p@*1#7$3n$@iEhX-3&cJ@+3Zm zPvbMD+val$%~t4n@)z($oQbncx57CjFX7Ah3chN(nz;%OQ0R4q{#9t6LQ52yuh2&d zy`j*13cX4FTlhA;uOZw*(g`=i&2bCUZLPDyJqWi_xC?`=u`71N?xz2&4{xLJb_#Dx-V=LaZ|q~b zTi>3fFZRR!xP$2*rQsbFjw!s8!uu&aP~njZ@2v1{3J;=kFb=_8a97hme-7_XG8Bj5 za2#Q}d$)(ednr7Md^GNfV{okLR=YRJI2@1r;J&7-*1yH%pQvy`;i|$(h4Tuh zs7Yf6>Hp!Jcdh0pli>n+5ldLcis|-bjiinZY{ld81k z-xRngZxgs z3-88zOt=2&B=_O{I0GLr-TEI=_(_EyCVvDU#mDe*e8Ti!t-?2Cc+l9@OQXQS8u-L1c@@D~cdqVRhPzpC&X3cp6pTznnp;e69=`Aw3y@NIkt-!6<$ET5I?{V@gviJcM$%B}H(XqdOK_>_zg~xz zDg1-N%gI;ZO8gGLH{F(3k^G21;m`Ps>Gt_=iu70bcSTwhUad$Qh5u0aZ-xJ)@-JM2 zYjK_F?%h8m|9VE&!~fy>roa72TSYo3vH^KJ^!mRd?NO%xdKB4+q$AS*BbzYZ)T?Pe zBO;v?*+!Ag6zQVK=FDz^TViM2%5>Y@nxrds!|vF_^!I0ETSa;+(v!TGmp9*gM*5I! zhudRc^!mTM?hcBKS7d-9!xY(3ks*rgM9o0l83*BD(?6Gs>_W0D?uNVLP}AMh;fn03 z$O!V0xCf5H(WbkPV@Ss0Ubr`oGyS7FvX3GM6Yi_Xehl`<1MomR$aJ@Uh$2TRawz#> zcsSDkBS(6b&7bT?jwU|_kHrb-^?!E^Oj6`UMJ6k9i6Q|-s)_^^NhlJcGK>+7VhrP^ zyOpFOc|}s>Y0O|2bEdne1rqvyq{O(4mH*V#6gfkYx*{hj(qOg~kH-`6MAJRWCzG6l zr{ZaNy6J9riX!JJawhp%csA1iBjEoayPU0 z;Jr8 ztZ~g!jepF;7`FHp|{(!4Yx5A%D=>L&l82^gDc{TplRx4@^_76p^Y5%FnKZ^WC%^F;b z>+o;W9Vh>KNpwB5J8R?hv5na>rW@l86x~SCc8oW~_9*ON`s<8#B-t1@!A-Hn^w$~P zOwnx>-CWVF72Sf_EwM9hgxGe*&U6dg;x7w(PYaJ=a%_a)g6_s0Y9K+}ITqX#QGQPD#b zJxb9-nLP{-NBV#C$p6$IO@0g>ixcoT(|@i-Cn*|HbTWAWgBU`u|GO1NNn#ks1SU=Q z=%*DuRnd&1t%_z9Ei0O%CXWTA|3^#SwVFSLj8@32Si?FtOn2+YlbnDj;z@Wio?Ep&i}7b z^l~b%z$@`8yxMG8>fJ|0uf^-|db|Ornr{2k6un*1o5*iQ`hWCR#GM<7(R|qnEuZZqE9LMf}&58 zKZDQWbNIaJR`?>xOq_+YagOPZlb03!LeW6@5d|*Ql9`uj4$NZ@S~;O_I0p zZKVH4-}P#mf1@M%zM>y1x`5e*_yK;1ADM2QpOActpW)}Y$aMGmOGUp|^eaWbRrG6S zzrn@01ecorS$A|9$#PtQE79x!u5bLH=&y>dBL5M8!k_UM)2;9~lHYMP{(*m*ZcnaJ zEUxHU#jJ6yQ*0|m|5mJnqW>t?R?&aG`q+AC3$XF}*v9nN6Wf5K9d3y2QKrA=V;d>f zNiq6=jQ$_ngqlsU#j9){pRvtIHpeY+OYCgAnl6fMuh`a#ZL3&UX1if`?1A+E<~Nwf zdXn_Q-q;7XGyP*Y)>pBe6zfOcA9uh3NdNa&IFMv#9E5{$i0M|it77{rwwq#mFtxj4 zLm3Ri;Wz?Enr;oF6x&;|(d2vL7#xdxnQr^zNXFwnxG(N!`k!OR4p8h^#ST>LaK#Q{ z_Fy~&55>bw|MQL55hO?AQFt^SWBQ#THbJqVV#kqB#7Q_Az5ef37$ON{1fv);-PRI{ zU9MPCv6B@`DOOi3tyod943$~TVIB*n|4fOMNXl5jD%MQ@*p4+wTJd;10Z+t}Ot;!o z6uUsNQx!W)vD2769nZiic&6!&`LjvR!E^CEJl}NNypZG~ycjRROYt((J?>X1cDG_z zDt3!vS1ERbVpmgh4PJ}a;q|89sbW(}Zp3Lw|Bv15)$qzlc&lQ!F}NM?z&r6S)BkKO zc8_9@D|WA94=OgD+57N*oPiIRZp{yoJdBUvqxhKV_P`U0J*U`{=nfyR_s;9cUJ5*#jJ77RqPwZURUe`#pWsY zj$-rK&Kvk9zJ+g_?$LagJ>Ho2XUQP3zUF<`}K3D7`W zEBxAYHH#JdNwFo0tyIkG|B8K!%WyfaF#X?$jeSS*J^p~J@JG`f?LRB_hho2w|BAoi z@3`7@m4A}_g==svt}|W7{zq|Zu>UIFQStQ@Z>PBJuKy`c|Bts}+!nq5?_VpvAxV1_ zcEF8H|GvjJR(x~CHzD5?Td)&uX8MnKd<&8-u`_OkT}*e2T@~-AcsIp+Dc+sg9=Hu| zi#<*MZwkff|M5QL+u`=u*K{lFPqG6Jz#VZX9BBIgOFTYE@zWI_tax1UA&T#*_%4bM zSA170cf;LrC=N6I&urr(NJiowI0{Fb{v#D1qxe3Gk0sv=_r`HJ-gNtl{vY@HzvBDj z0eB!DWLl--eE&z1N-Cu%_OS0_x&&4Kl}QXctY{2;z`Bx zil}raisCb>(2Dakyc!KHOy0@23!jth7JQYtf z-O+W1;@2oXMe*|$Ka<(B@N7H>>HqQbZ0x_1#xGF(GQ}@s_9DC(FTqPqw}#6}uD~nt zD!kfsYq(bNI~2c8@tYLCp4l64D&C0GO#gKuely7}cq`t9x0~*`x>ND{6u*o7ZoCKY z#p$M7;r%2t@Bw@fA2QtvA5p@d(T^(rjpC0f{+8m8D?VHCClr59@h7Q&3ZKSj@LAJ; zHHkk@@&dky^#3^hzxggNK1cDnioe9{%lHbuim#b&&99Tp!}<6IzG?ceck#Cs|4i|B z6#qbR`hT4MAE*Dv7f`>@t8c!?iGN7)5q^xH;HReBtDloBLi&H4{vZE}T4yIe}jwCzbK-?Jznf{}n7^1|UO6;P< za3ywSmj0ih|0jl$4D;%n@9PsINJiowI0{Fb{`<$o7$x>mVl4SyxHr=O6XU(g=Hs5& zmwZ3m9}mC-O}{TC4pt(n#34#dQsPi0j#lC@YMOid2*yX^QQozhpByHRAvqQ&;Bh$7 zbbE3#NdSWw!Z1cmx6YUnSta7+2~1)N)0i>ct>=`eD3K>GU=d4LHrz#N zi|66_rd#=iN?fkQMdTObC3q=bX1bMML2@Ntg;(P>rrX+eO599%y%IMtn2I;zG`z|5 zdvf9yCGJwz(3i_`Hw)Bk(9i5W_~ro;nEJgdZmN<6N_L)1Ks zkKm*DnCZU~C7vL85}(4S@fp+qi}8u)l$fo=^W-n!i#QW!nQonPNM6F1@fCd4bdSqi zB^E02x)N_IF^}2#_y)d-Z<%hJ?~uHU@8SEnz;rbqDDjyRACiBBALA$Zsp%>|Cs~AF z;FtK7>1w`Fa%&|PEAfvKOO*IoiKR+>r^L5ZF2m)x0#};;8Drvmk{@st{)j)B?l}2H zi9eP2mHapS9arNYrd!EhBx`UjuEW1gSM#ru9hF>9$#zQq&znuIk8Q9mZeaQyCb=O= zdlYuSjZFVlEV;3gn=82q`KH){op3YLzxCu6BwJ!<+zPvxZfjkY+(F51O7>Q=JF`7- z8{8IqVlUJGY$Vx-WINm*`(i)rZ@M)MP;!WpJCg5&194{@go902zl)N?mE4tlH{2bE z;xN-yjv%4`C--1H3P=B^W{i?|C^=Tis*-ytd90FqD|wibl)P5S3zfWF$%~l17%#y~ z@iNnG^9qtH@hZF;uQB~zn!HZQo0Pns{05wgH{vwYZS7`~TkuxA4R1GH&7DdvRPrt* zpH=d1B_C7r9wi@8@?I*Z<9&EP&M^HhlzfonA$%Ag!AH&JW6H(Hm3)H1llT-qjnA0w z(SJ_Kxk^5-7MWO|K!W$ui&frnpe|2V@bZQ7NfI-ywMy-$VL;a)DRlZ|wsme^T;8B^N9Ck&=s){Fus5@KgK@KR4YT{(|I7{0hIu zZ%lWbEKzc$l1s_I#bvl0SD5bj{Ep;%`~g?tkEUDa&r1GD_=}RiGWZRD$JO|U>3_d% z@-HQ=y{{o(i|g=j{KxcPRa5JENy?UOu8(c7t?A#FR6C_FS87A07An?M%0|zDn(?R6nH#D%GFa9dH2dh&!2Xn>&*X!ofHMcQIYfZc2?* zYIpLXI1Gp52-EH1JxE63XxtOWnEwBWNbRLmK&iczI!vi?N*$oocxveXseKvK|5N*W z*J}Pxr__Pu2jRhZ2p($s$7L|uX<1t=k^Ecp96G)E3i8u)-oBnZ_ z3M!RTDx_3GsW7tnUA zmnqdy>P)3tl{!VKR@e;h$bX&8h%uPyNq11IsUCAu{KXow$2&}S)ZL}jvr65q)B{Z2qtv|&rsI8hKh7}SGvz_09#`ri@`v#ed=wuu z-D;m8c@m$(r|}unt@b&k<|_5PQgf7gf!P;vCeFgyraM|*B6%5K!B_D$({1y0rQTL* z9{GHH1K-5AO!pYQL-H=ZhwtM8)9<~h50u_TsSlO5?)Q;W-zxR7QeRT`iBg|3_zXYC zMfio;+yWQBQtE34-{4|gf=f-e@?}c>rqpt!Rw=cD*_HSmevdzxZV&%R@)Q1yzu>Q? z+he~gwN|OszVi&&kspk#xk3aTDCs^zVDRlhRu$y&3uDNdHf7$+)vu*?bnHyO3;+U9lT>H{I5@ zQF=$Ew^e$3rF$~l3wvW9+|G2{>`T%Q`{NEcz;xT(iDV$|jDv764l(^>CcUfD38i;a z`T(VOS9+AvL#Y{t!*K+T#63*E3#CUZJx=L8$;aSW+zaFc=G^>_nL#T!lc+`Nh8 zX1oP&#oNsPtm+P>?l4>HC#_MClpKK7bG6L-?@i_Q|6pkKyA; z|4)1U|3A0>w9?No`z$_(&*KZG{}a#jOr;knJxl2~m7cBiYf8_d<|TX?U%^*RcPz~% zc^&8Be0;ZN?ZT`Oz97q{RltCPw-RI?Saop7U388 zC4ObPZGNNla-|oOFTthwEiNob3mtiiRo4*xd)v#rnd!EI%y_~*l^MfeEbfI~|5s+5*}U&u+((&x8SIDq;{kY}=^vk& zgOzzmnM0I0O_@WLi79iKGRG+6^?zlKz$20VpYi&?|C5N!vC0ILnZWFEI1wk|WYgVB zkR*g*j9}FC&ml8$Wh%-fl*uWRWHyCq%wX1Z`y@|Nz#^8=>;JB%s>}(>)X3}Dz*aoo zbSpfOia6it#2hi*P?$#ex=38YRQRWS09#v+hGLI?qj53c? z`2;?RPvO(1doDan@*F;oFW`%&+n=+Pc~zO&LOc{ce_djbtvqj`MK7=~nxu zGM^~(mNE;Jd7D}Ke}?{_d5`3MuioER3rRk}5Ah@X*!0iAGM_5*l`@}^e~ycg{-62M ztMs?_HTgHV7?7yK1} zGyPAxGOLwYr_3MZf8t-b2G^Qy4S$pTga3MF*F(EGcdxT;lxpqlC7~TcEj$btJy|{fy!>H z-22M*RQ6wGdntQ`vb~j^sB9l)_f&Q}Wrrxcy|Ozh+m|i$!~VDf4lw!^4sOpFPs6Z2rD&_Gt2B@K~IH$C>_f zDmzKpR%ItEn^88PY)si8HT3^1{Xa|p&qlp#HUCF$Hcm|flbFJ^>9(9zwybQ9JdXt| zV###-yh2jN8rHF4y8CjxvS%xMg0iP6dm^(Z;mLRko@%=K(@D<2DR?HHWx73ijeDtooEw<&v#vNtMwEtS{d^>_nL zHQli^jpQc08E?T`O}9U9SN2|I?;yVu@4~zB9@DLMI>~)_KhD4hOt;#Hlzm>=hn0O& z*+-at6d%LK@d?vy^C^<2@fmy;pELdUs@WHmeM#9D$!Fp$r2l8xr zDSn2Z<08|o^GlMi@N1<1XBT@l&3Dt;rON)I?6=B(uk12vmg5RsiQk#-IsOC5D*O?D zLa+b3qxV;3|5Elh^51ba{(*m*ZiQ<|*5W$+8~-u=`nqnoxi-qR zDA!iG4$5ud)#uvbhS(lu`p0K(Ba)7|F>ZpJn*O7o>!jRP%56rzIc|YlVrSD|bFK@? z*4P!hVRzH5c^l<+RL=VU_R95SwiousKDeFfR@j%MANI!`aDeHyxs!6cC^wLNXB>os zafssgOJnn=0 z;(n%E!vQ1*;z4*Y9%8yR9Hv}Axxn7x8iN4 zTj3qby{O!s$~~goUCQ0B+}+gNgZJWeyw7ycju|8m;Dh)OK5V+j{ZZwfR_-zK$MFe# z5}z{NI-enV7N5iC@deXuZKiT>C^t*FSCyO1>>PXvU&dEVx5C#*=Hlx(59gciSbCG> zEqoi_!FTaJ(`{{m^7aTWRDOtZA1L2Wxet~5PPvbiTcX^@%6*~SCtT}O{0u+GMP|!; z&HeBt$yfL_euIn6=D83Tmn!!ygJrlJSKvz1J$BzK_m^@%DEF&!tC;-}f5M;f7t`H~ z-$;JP)%XYgX}WE$QQq47TJm-HH~xeFn*PuJ^8fRa{QB4i+u{bM|GJakQ2Fl4w^x2k z<)!?l%6FiK{-5v2cw^keyH@jOl=&8tPPiFvj$4@iW0&ttvK4m0t+6Y1GyS70-$VHU z%5S6mcFJ$dY)|Zky|It!@1^|qBz>_T_QxH}=B;yaN9A{7Fc5dfK{(j-f0HG@i}FF` zcU69W<#$tlFXeYveh=k`QaKEV;|LsS`k%4nN0E%iJ#h?~+VgSmJJ9*T#V{`Ugsk5GPs@<)=>|MN#P_WHl_$9k3i<8>U#M4W_^ zF<|=7-+V~rpCRFcz>{+~aC@s$76oTdB)%AZYs4xWqW;rXW9OBa${ zgcsu_c&X{X56WMz{GZBSq5NFsuT=g4<*!oyR^_i&eyZ}3ARBk26gF6*K>!^3N&%kn&F`|1h(U z;G_5$di~$+Rr-JaDe|ZB8GP2OY5pIZ{PW7sQT_$;7jY)e!r7*~zb}!zjIZFU_?qdz zs^(u;ezEfNl>boq`O3em{2SD~iErWC_>SrSj57Zo$@{nf7vcw|d%QkUev$GYlYfGr z;%E4|>F&`NBwylJ_%(iGy5n<+@;@uTRQd0e|CZThNdM2TV7$_+Z~lMv{P!e3;41tP ze==R4{DtIK{0)D{)%b_$R`{0+>np#8d@ZiSzwsaZ*R!x5+JWs>QfQ+>7Zuv7un|)m zsL+nVhS(m39Zdfg3msM1OofffH^EJ@1-<_7-;2WLBwOH?*crDn-PX2Np(kNi6}mC# zjy-T2+}8Au!$L0=`l-;Hybo@N+hbqT@56=uBs<^$+!1#&{l~7bvx@hsFi3^fDhyWP zQWb`%5L00n74}nMR~5#pu$u}aRoI>D4#i83VSg2lQQ-g;4pZSkW)H%H@en-J^q)OdvlF zC*mZWZ2CuOAxIL!Fh($Hy89bf;dB)eDpXZSs*qP9MNJwrn8lpw)>$AaVhPJwG2Ky7 zQ{hAv>f{Y<#pCe=(|^7fP9ixOPr+01G}9f2XQ*%<;S?3lWN;RqjpyLG=Kp(jE}XBz z1>_gvMR+k@V!HcsnF_C}aJdTit8j%1H>+@^3fHS}6_r=xHFzyvXSzLn1Ibjp5vSoz zraL}wQQ!Y7PB z^(veFx$rs3BK!is#IH!|-5|G|Gfi|d*G zSxs?$k~Y{DH^6r0|9eMMY_FooJK#px5jQsddsp04#m@IGl zVhq&0Fsb1dvJiItf#oJZ9iTq}~1#iXMOt*zQNbbbD@NT@vbT!je9;V`bDt)Tr{VLf} zF+-&TRD3|iXH|Sq#m7~o{}&(Ty7d3zql_Q(w$pr{SbT!yNqh>Q#%D~oKc7>{4rcm) z@dajI#F;n?XX6}unyC1aN@G-fS*30&zM|syD!!`XyG*_2eGO1?u8Oa7aURacH}Fk- z3*W|fOuH82_f-5$#rIogp4~F@U=Wme1Mu|DlTtXe4mZIe?9FPv6B2d@8Zlf;~!L7 zU&U1_{@5~eNT)H@1b$M{TKdnO!ZTF-g_>XSH~bw};~%D#G5!nJ;96XVf8#&+uV-mJ zmF%|$M%lP!&Osz?RBGF@WSp0H1skZ;j=_f59;MP&Ds@n)MWu~Y+E}HImbc7aZC}`= z(k3cx>Rp`UeKUKf1#?vDq|z2DZKl%Zop$@k+xX(AJ58Rik`;GuS-harf<>Jc+}&xx zJ1TWy`&(mIZzD_kG48I?Xq9@X)KjHxRNA&v_@+)>k8J6^xYNR^D)mxnHSM-qh|Y z4Q0UhznA#__tFTGk;oUpm%KgP>HJ$r_B2~&wss2J6J#vOUg&)hym#byn;q{xFG~9$ z{l7&2FM0jn|4oY0f!^3FJ4hw^e~JEIqW_n?{;$&EUQP3Cr*x!BMU{?HDWcNRDos*} z{$KL?ze*GEIGpHRtNFY6CHjAf{$Ha1m%RS3QrN3$zQ->`RZ6Qw|1Z)1OJ4t1DTyhs z(%%~WzeN8p(f>Im`sZ}NVf643rD%G%#4X@t6U-bXd3FP$u68*o_ z?EmYLpQ_SXD$)N-^#2n5zvT6QmCp3G*6g<>`hSW3U!wn)=>H|J|EqKXUTDQCU4$3o zC1~IOV!3_)i)r8gV%qn=nD*r_rhWN~c{N^x*Wz_}y~*GPm8LSdQKjh&rr}L0-E0HK zx8SWR-NxW{yaVqv8Qi7P-EMpj$-Umi?q8^6{ok7H{VF|0J_8?6=|Kh$;ln0_M^t*$ zjUQ9#aW{T~*(d!!5>k5F<2 z&)^4Kg+Jm?rhn#B`bDLGRr*z>zf}5-+23(B{(*m*{=4AP8j`iR4*$k~On;l@^;B-B zGHs;1zBgNLgKcpGuhMp@mv4yeQP=@DGTqiTR=Kyzo2cAP+GZQ0F}2R-yZv7KkSb?nC{khRC$QX zJCP5>opBHjHvRV<=nN@il$#~oc_r?88cPj^|e3;5!|5y1Sr2m)c|7EZL`#*UvAI|I%cqAT$ zN1JYI$EqAxd4kG8mFfRwum7t&3F-f3umAg>l$Jx}VT@oDz5eeWg@npEm6PNtOk)PU z{_l<%`hVH$|0)-;gk`U0;EdB zf~O+=zkIq^^MAj6R-U5rnarMr^#3ybzkKfhRjPcx%GaoTfy$Sud?A$=;l+3fUTU_C zc!}}lcm-aGSK-yB|7uviR^@3bUq^mD-hfl_M$`XW3gw$fZpK^iR=myhKXobJq4MV{ z->LFUmG4sdQI+pjd4|gOPvwx_R<6RAU=c-<0Gd3-l6=M%Fn3$IQbL! zBtC^to9-BXmgG5n9$&y0&F0p)I7{W(Du1Z*94Ssq)*5-)fnAQKvS8Rene1cWuye@GSn>;@_uW0WMVegHHW|HunAaukjmPj7v=aRiOMW$ueAyD{!Uh_Sp9%Kj13- z5r4v;O}B<$Rk5c1o62icrvH~$Q}YM@iGO+Z&9kHOT9S46H~xeFn*O6-v1R;EmG!X= zw#5ywo$23trM<2?O%-X%)~a;SNdr~cNUf7p>8ScXs%)&v0#!Cq<#<&#Rb{LyEvoFO zN+(seQDrk#x~Q@_+uQ=T#Ll>t={*+SO18$X*bTd557Vt=TUEAKr6+kW?2UbJJJVJ6 zCFzIs|H=-G2mGgICslSOw0pEOgF!eLhoIO0-8OeqWuz**lMlsVI2=cq{wEKWJxE63 zXxtOM{_j8fmAzC6sIs>zhp947l><~6Pt88KFYbr?n{LYolFr{;$e0US;$3y)uF1IGl)+aI)$5t4dInoGKwz5~|SuEA;7%atTa3e%Xutm*DWUX_X}1@a=6uS6aQA=I5W46I7Y5%89C6 zt;$KNoTtjks!UPk6zWgK)6nbxs+?iEy>uqYS$H;{gXfxV|D3PNrK(&&ej#3j^#95w zUZua!FC)Jk>Hn208GHTTZS5LWZdc`6Ri>$O9kbWt4LB8VG~E$$6Uog;|F7K2nEwBN zuVs}xRJoJ!Fx^r6~A(yDl=8NUzMj-nW4&~sysjq{lD@MXtznibuMy5xWe$Uv@MU}jUo~BinyboNs=Q7< z59i|>_@?Qfr&Zo2c?aLc_waqw?f-?UeW=O@s@ZBkRLyq9N2=Yd%EzjFp~@%Je~O>s z=eWppkI0uK^#97&jK9IfxCED~x>A*IRh^^CGF9(XWx1+Xsj@=VeyXgr#i;Tfevdz> z+C!C9s&-N3M^(4z)bTS_e!`#e7yK1}Q{{ICtML!~Q`PpW{Ka?;uElluH~xeFdREs{ zwXLfEW4u1LG3}qXp6Ui9?Qp|p$XM6`H^Pp%F>ZpJVheV{&2V$m-dHi-5`o>}E3P?q;{);_gA%|>JF+Npy~is$Edoas>4;? zN!6WI9q3j1Ya68MuBr}Z3qx=hZ+6wOjCaG`aVQQmJ7q$QN8m`@14rR#+|z7Xb_3(F zxRT#+bs_N0I z9;WIMs(M?qKgdbtk$BX9l4D4k_h^Eb_io;oiR6=TG6u{}^PBa}`xqvVU=(9s&BE!7 z6RPG^O?ruUFH)+e8Duc)cxyN!At*B zb2-Tsc;$cct5v;DRX+czdY}JzQ{Hp!dMcYo#Z<;O;xtunR`n*Yj3blq7FBO$a2wu^ zcbM)7yi3)mRJ~i(>8kSKPu2VI#|pTu`>4MkXW#>>KCJ44j2|-Hv)~buNAWRy9G}1^ zO?M!guRp+YuDqHYA|MAMa zt-VgoJe-ejsQR|5Z!&(%bX$9e)G5#5UQT10Fc>nsIqw4R?v8t<8{eyx(@h@D1YjGX^jsK|Dg~7j`HT&ni zEULD?Y8x|XgKbsYfI&Nx!G_pgH8JSm@{PFIvD38Y8Ek@^VvEV3lWLnW*c`WT`If46 zCfUkMW``JWja{*umwU_Wu38TU+u*h?@2OfZlHS2gU8)^>YQz8k$w<}qaI>SR z8I5~3%Tyby+FowFw`wP=WCj5YqW2iNM=Iity~RXT z^Zx#`YH>_p()5R8p%-q~&})t)Jqd)rxdgKBlv z8s4p2X#Zx1R6Cw)o#53hJ;E*QB-KtS<1YNs*djGsN zpG$I{ck%x{$``11p=wiAyQo>I+Qq6}Lgl4+nQGUncDZU-sdj~GS2kDfojELgMYXF{ zyT)7OXOmify~=wQ*RJDQ*Q<7e_v)Vsd9T-9Z&U3?@@W>Tc9V^pN2Y4GsCJiXod4In z^MBQD$2-tF|M!Z$ob&%0=l?bD{9m={c;A0&W{^Cf+GDD5{$Jz#zsC80%{%{B?NRCv zXUzG3jr0E+=l?bD{9m=Fy_)9FgKE#JHb*ti|7)E8*Es*LdFTJC&BR$a+q+it{YC91 z)#jcFW8t4Bt&i`xP`M+vkpm+Z7e}`I) z^Zy#>|25A4Yn=brmU=bK-;1m*Q|$-UmUG<|xDvm^?@f2VR+0ROKjF{#i|N0!uKlLE zt>kyr)~dFe**}oae`qxUuQKXRmLn`T*5iRPUjBC)Kx7eKTq{$1QM6>}!I>USmC z4R^<(ILvf4BUB%w`bhFUa1@TlJx#a5u_Sxp-Z&1&oBk&o^?lX2RQ3H-e?;~DRX;=Z z15{6_exT|TR6j`dBUC?_YaN1z;$i4LXZ`0_{Ya9d@Mt^+k2T$+cAV-V)hCiq!pRuG zpy^f~CW&AaV;DExen_fbQ$3}6LG?7V8O&l1^QPNok)(uWtYFpjpB?qO>L;n*AaBLv z@dP~4bXz-_St4P4xWqW;rXWjT&`b8auHsP zm*AzQ-%sk7lU#vU;#GJxUSqm-UZ?tTjw3xazZ2e?s-= zRDY7nr_k&Fsy~Czn(py>p5z655oh8o)BnV*K1cPrs=q}3GQNVZ;%lZ`?dv4-a6Z0) zZ<_8F-&Vt(An&ODf$Hxv`yRfJ3vi*?vcfx_RsRq_!jJJ2{1iXK&+ULweG%IEo{hg$ z{U6o8V*E9JgNt#A$zUmdtNJpRELVL6;Yyc$r@Ed0+ctl|Rrn+Rgm&_8v%jF7|J&H! z6qt7YZ>~l=|F`j<_?PPIR9~a|+D-*K`#roVQ-7N+-Dat7C;zOlv7Q?LQ)4G@wz0k% zZCu`#WCJzYF|d<=D`>BVotE1`YIJB>`Wj<9|F@*08XMbyvAqSb#NGm!EoyXf`DSX^ z`M-sB{%>xHozc$!E$M=G{_kzamaT@J|6AT2d*C)`=l_=X#9nCU|CaQ@?a|2OFW4f=n>>;L|UkiOi-hy#&K#S)tIP8SPlArV=~vJ z|2KHPG(udHA+e}n$t{CQTRuErEK8fu)Z2K~Q5|8LO$8(#lc<0NmJ&GW9tDJ1m&2K~R` z^?x3(El6s|AyE9-CnwY8v1{O{@=Km#Owe5C)JJ1)c9GA z%hh;JjVsi+Ta7E#ps_cuQiJ~A@cO?R*Wz_}y|)GbK2BBRRyFAVjcLq!{a=ln(d++i zJ@o$u{lDS$e>LvJySy5IYxk%@V{hE62K~R`^?x<)#~JALfB!t8@sJu%sNwa0H6Fo7 z@iBbdbhl3bZ_xi6^#2C^zd`?>Fr515)%Z}27u1-i#*1patOotR;q`wtX5$?6`oDYB z=>HA+f5YqlYRpBi|NG~GjrnT4tHvATUjJ9)Eqoi_G2J@p{|)+ogZ|&}`o9_YMKu8efupgkexCs@6@^_)V?0{@>MDtHx?7|G+=-FI;1K9mBh) z>+o;<2mkeK^`3YB_FLCiYkRe}A#aNtU_0E<^jF&|k`A~LcEpWM|EO!-RIT0B+M?FZ zYVE}AX1F1sr@@=sv_QKw#Tj6#j+hbqshy6|e zJfU@fTK7@wj%ppQ)}7S4i&_U#voj9D!8pWp>)e%OH{2bE;xN8Z{1g|N2zr`wH~6@{h2)g55$A;VAFrBTMs2U40-fhk6`Te zfB)!hJ(}bgJQgS5aX8U*EBybMx(~Rk=l}oXzV_3+vPUR{h>}%i(J)H(Rw_kBlFr_H zA7mu6B3nZuX-P(pV|NVZP&-?ekZa264?R`Dpuk$(Y^BJ%6xh_}dx>|v- zeAmc-u6)R^B#eS1o40}wz8e!dN!wzrDcSmC^-<|S}mhWEq z?sCc9W+2}^ZrNk_@;)~^)(qIf1M-cRkN)qY|N9l^PKz9}SAk^b+q{a?NpY)zvR`d*Z8mV7Uf&%l>) zCca{HTboTX2j}8EeAVc-_L_Wa@?-qO);I1k ze4mkgj$h!H_?6MUuJ!VLFCYEiNB{S2pypfr&Q>;hweJTK`oC`@jjBWq-I;!9HfBAR8U9kyU7@OWY!)gn5mwyiiw*Sk&7w(O= z|GTa2Cx3hS_m}?&`CH0=u>1#5b08jst+2JxyL<5;LUJh5|NZoTzwQ5xD}|}H@*m0I zC~SxHfB!LN?Djwh`A?JoSou$qzausDfB*4}>HmJ)|GjI_--*04(*OPRf4}Yj-tQ&) zPnW-&{C021-vztknRu4bZLK>=5A2Ebf4}YjZiVN`|APFzHApf=GeX$>2hy9Ii z%>zm3|NcRY2jdO4#@pHu`Tg<_m4Af%!%hB1Osqg!E|B!NjxVcO{SYF7S7HJRrw3l6tRS5tQfuD^z+w9>UcZe zfp;2R&0X@3mH%$?d+=TygZCNTI`1cW03XDM@L{9ZEBxc+e@_1K@;@Q}1ZE#a`oDi7 zA5bn&wVwnmdcxuW+6G-^ssT{%@N4{2~9>O|y1vdgVU(H#E&%!{FPdnUA(; zcc}c|+pU>d`*c4lu$}xH6)+3_N&bK2-z5LyN1B7cAbGH1zISun^|Xzc3oPu>qxi< zm3!h|#-`cq)xbUqbWmVl1rAqWKLrj^V1H`NQd=uN`hURoe|zg| zS2bLLQ3~9`cm&e_1N8rZ?f-6tw*M>O#{dS=_J4Cv&N!l=*?Un1zEB{h!1D^k6&RyH zLV>aZNd>YB(EkHz>N7^~Cpm!}NgnC{fgsW;j}wsoAF%!3 z`+dm3;|e^hz!S_qiBBQ@KVbX6Tj6u$jr}&6@f5WE-_=Z0;4KASP~a5>rZf8@zJxQ7 z{vWXY-<{916qv7o?f(kQLHd7y{vWXY-)-Oae+3rc>q!3(*#7Umiv<=cuv&pd3cRbp zVruCB0s4PnDakvw-rMubNS5OYr2hw2HLH0~fwc;(VV3?M_<-?;_))XUk4ZkkPw_MS z+~`*LrGk4Z@RfpFD6md}pA}fI!1oG#P31SZ0l&rXjNbcH;0KZ)aU=eOn~d%i{i48M z3j9j`8~%=e;GafU`8UZwxEcS&|BPNu@P7(!Z^Pi03U0+e{6{d7~P`| zB58%K@nAf}=$^fef=4NM82RCN1h&N^jjpmC$FNaFm7};Nd+HJFr{E!!L))!1vAuSF^7397~Q#7A}M19t5`F7 z?+d}(6}(5mJIL?E(MbOf-fb%z-|q+SB_D(L;aI%i=+^n5f=?;J8%ZR zj5F~SoQ1QE=D!w0Hz_z*!QT{|r{ISQzN+9-1?MaHmV&RbwFUS(zJYHV-K$$jvIrOB z+qlH&YTi+Bm4fe*FT>@y0#_Q{RkNDpJzRtD;|E4p^O1tzD7aR^FBJTk*-w!EAN-8* z=eEA_eOB;GlCN+buE(#9ZiO2Z+^FEUL2(e{7u z{0y~L=x~J&CO-rZ#Wr}D(XH?ZlD2px9)<0U?)4s{=p=>OD`J+~LE#e=I#!`^3UyRy zh(gCHbiP8zE7VmXGj)nWC$fc;uoHI1la1d0T?(B_LjMn)&iD-MVrv@rexWlJI$NQ$ z$h%>8?14Rv?p2&aaxR{Sy|A~@)$~#58ig)U=rV;aWcDJw7%#y~jo#T9x}4++yb`ZM z+yC93xmKZp3iT!Lhu0zfKQzErHhOR9dh$Uy7;nHEjc#j070M|zOrfAcHz_nyp_{20 zj`aT!{XcZ8eN>}chHhha6#CGQ0i)Y;NTGy6VRHI^i2fg<|A*qX(pzVeniQrngIS}i z$t!f1LIs6t3Kf|xVHqn}HG1!%A+E>J?d0_T(4CA&+ZykA?^fu3h3+B07sudzIM(PY zA0T-UAHs+65u>Xaudw;Ym=hHGQK3f_`dp#M6na{riBvw0PvDdIl+n904?RQjEIx;m za57H8sR}Jp=y~%36`F=G;BnT>Hi`6e~A7c`jz_MY`u40{Xz04(*Hw$GycccH2!~0=wF4mR_H&Q zhw1-e`hS@IAGZD9`$=GU8)~-2?QnaP(c4;hM}-elcqfJTRd{EGcUO29YUuxA`hVE= ze}#9mk7``S;XO$9#JzBD+{fs)yr06Y6yBe_CDQ-H2Qog$RyJOBxHSp=KTQ7*A4<}O znhO{ouJADoj!?KQ1NwjXD8}vZXk+6&g)iGH+=0Qd*b$Gz2Po!)~GRukXWMNzO$2f4Cdt?zVHlH+f0+IszWV9;R?Vg$F52{}1 zKRld-{vRH}_*PrllRg=y|A$AB`_PZ{|HjW`!Xbt83WpU=DjZ=piuC`m?f(iVjNbi2 zI7O1i3}!KBbg!bIa82PNc?ru{!K%@njdc?GfA|i@cj9PU)A$^u@ZAb8R`?!;rzm`{ z!jCFEM&XAPrvHa+|5x~ad;lM`kM;H^{XhH&`8XVp6KqZ6ULyRM!cQwak(~Y?rvHbZ zBzekKde_b~B+nxKKRk)C?f-6TQx%@0@be1KPX{E?v zinJy_7!Sciv5nEK>Tr@Huq_^mM;Tqs(Tbd`$T5l>uSk1lJK(X{5sx#vS8)Q#iFgur z!p=tT-63*{B3%_ZmHae39nZinM)&MzlAMLzusilJdRJoPY()kta*iUGDRQnN7btQb zHNCJmo{xQu-urmuLXwN{Vzm8VkxPx##o#FuI!S6&Xf2NRhz|=>L%$84tmsMpu86A|n-{|3`*1dkc=hTbothMneCO_!!gw zBlQ19ca4M;d0LUMBDX6NQ6#NMl*$;!F@Z@;8Qp%!C{j`+OP<3#7O-e^Yc7*iu!=RT z8{O9KP~;&+?o?!qBBPnT3-88z@Lr=kTj>9hvE=ms2>n0upsi`#zeOHaaD0K8a5m-PWE_OF+B9o|@j8kwbK5umEe1T*-zKFK} zD>B3A{Z@ZurXuqcq5nr_F*_UQ;9Ohjol&on%*WSo0lsc@&-kVyD;0T5k)?_(WOflQ z#Hm>6jBWo{FBYxI7O z5#63dxC8Ep&H8_I7e)6_bXW2wY=OJs?nZBg(LG7_!o6`H+}G%J_~`zMo~UR`McXQR zfTD*edLT6iVJmEn2OGV2_UNG`ZSXKW9FH)%XFpQW4vHQ{-VTq(W3au^J1)^4IJHOtk&Ku}!}0u4oSiJ@ITj z2hTNnS8=qLq5(yFD>^{Y^A){X(LRb^s^|q&UWgar#dwL)J@zt^%kc`l60b5gYWVUR zyjIb^4Eo`9*x%Sv`*xV3w<>xQ`OP>SZ^02pw}(fP z+=ipjhkm1bEkQ-^QZ%G!UeU0kNkt>nL@|bOOc>o7QY2~2U>0*m?|ZapLD8C`Me-7s zv4T~jTW6i*cDw`c#L-4~-QBI|ct!6~^Z`ZhWp)hShhy=6qg&yFBoE=k_y~?OdiMs= z35q_c=%eJ1;Y55KpD?-=K1K30K7-HVb4Itq$%3i}Q@`8RskdmZGnbFTmIF4Sdt+*1wQs z5iZ8Jaf#7A<2#Cer0Bbfu2yszv&(S>uEbSFx6SuR*5Ld20e)z7D_pCnY40DCe}bRl zXZX3%ZS6~vubL(6728tLuND1O(Qg#}QPB<5e2d@V_h|dSJD)d_{DhnEXZ*$Jy^BSE zQ}iE2e<%L~|HQ`iX#2lg)n@X4@jq*93;dtad&bySiZv;=wPHIcwhgn};&!+_%IIw~ zwj;?-xHIm8w*R}D7K-hy*ly&z;~q%=kL}g0av$=2aX;K2TN=H)+1P=KU8>kYik+-j zE5(jhthHi?D`xw@Vu#?N*ai3x2$HsVBp!wBjNVa>9i!OsirN0JSO+{7JK}Lh z_quHVSL{SQ2|HnDqxb$5J4Lax6+2b2GZj0H+0*e1?1Ej5ZkuP3bi?l01A7|XF*--F zK8l@7ejfJ1-gv&zZS4Y*3-Kbn7%wrpn#&X$rr70*U9Z>`iuG0ON@}jctMMAV*67^{ z#QKq3hy8H?4m7$g4+x&+#^`FkRs3MZzEgZV#lBbUFU5XP>=(s;q;ezv zgq!eZqdV@ulKh6h;~)5^(d~i16*p`ChkP^A|6~8zaeNC~**G)fTas*rTjMskt* z@$D7gQ*kN2tKvH_yCd#|JL4`!Z-wzDk`}ld?v8sH-8T19yrtrMlkbE3BK<$UzpeCE zcmVl%6VJkK*xl%zb@85x z_g4ID@^kQ9r2ofz*-CFOolo8eFTe}&BBR?&mndO2c&XxZ6u(UIn&Ou$K2q^36d$Dc zm5TRM{3;%GHC}_)Vqc^8Sp@OxNc!Ud9EjH&-SHi)_)Uu6Kz<_*!J#{ zN8qhSx3$|8Pbxl2@v!1PX8jnzAclHqP2%-F4AjN%U|ejl@A@qT;&A2hnX z^f1XII1b0-1f$#9V~S5ze4^sdDE>IJPvDdI6h3Wq=l`=L&*3DTj8lwWCy76=_zcCT zk-vb`@kM;e=vMeL$xM6&XW?w4I|Jt`(WLl1#Z7~HRq-DbpRf4WioZtX0(>3cz&G(N zTxgc0_##}4Z{reNitpgNxXj34x#BC_c%|a2+<3L(?@_SECGRW#0m+9h`AG4#Zv3(0 zpD_C=eukgp7e)qOD*hFNbuL+N7EkgGuVMp!i{Ih*M%QhARQy-PHi$~&7Mz^)2l{i_6W0W{viT2EPz+R(K}KS=bG`V-KVE|8^5+D=|fh zbCgIZajp{AD{-C@mn+dri3^qJO+EcT(TA};`b}TbRT8%UD{(Pif|ufDMz6mmu27<{ z5?7L6g;(P>c&*W`wjT-oKhdA@032v*8b7H{3{qmG5`&evNr@Yny%C4tP#k9Teqx-s znS}nIxP|cur2jYmjYHx#B|=J!BKM&m0~j>A6^2P77{wUIjo!OMBB{g!N~DyiE0I>B zs6>Vu`hOzFIFAMUDDQQZNXl42+y9lQ8Qq?|U5R^?xPzSjpP>II?jpI{R(e;^y(D9> zaiqpFzTeh(&-kDcj}ktl#KR2e{|WkkVm!%&X7!IL@w5^X$sflj@JW2i=$`!<68eAQ zImYz=#AI9JJ^NH8K3C#-CEiqGniBJrctMGoN=&EzMSKZo;LApL71RF{v&d)T9Gq)w zykq(*$$Web>Hmq>8NXq4t9?s}RZ1*W;vFRxF}oPw#wEDa=<44kS%%AT1+FxD-*F^X zEAf#M?~$*;_wfV#(CD_dmgHmn1V6>kjNbcN;tM7IRpLt}ep2EqCB9W+9X0FmYy1W` z7~LNJj^um%0e{4eM(-z(iA_rUp~TPRzu>R<8~$!|>->}CFZ>(-!OceR{U!0Ak~=B6 zg_7GUX~O?0xg~CeTjMrHZ-vS2NVZ4e4!EPyd+o`cmE2v)UC4LECTxMb8NC%I_aNC5 z_rkq#AET?;Px;|W?yt-cC0i;rRmlUC{7uONl`JTEkdl`v*-FV%lx(f!F-jh+-Q&w|H=O318^W- zZ)+OeBRN>fo0PnP{6-vtLvfhVt@CD*;dl#KT_xCY-FG;?_b+{hC zHo6sVP;#S^-;#fa-{TMXqtWfjpGY?0&-e@eYIIxsU8(bx{6ncjl>AevU6lMwsqK{f zTPf3F{-J&|{)_)vQ(G9ly_(vRWGmbnx4~_V-s?(jPa@m_cf_4=XQQ{~)UHbHMcAZN z3kJL4?zji;Y4p~g+FPjul-h@UU)&G($CgI7r239ja7krP?UfPN~C~ zJsgj~ws<5SWpuCZXr+!*>KO9&*a45ljz+hJ<4I1y6OsO(>SSvgzlD-IS*e~%ouX7% zrB0>hG&~*8z%E9wv!%`?ISadCckE$wD?FRz96T4#!(Q0i=vLTAsjyNPC^bl_3zh1t z)I~~Nq144xUV@k6Wq7&Kdw)z_Npcm^|5Mj6zSh<>?%7iPNUp>FH~Oa;z+#B=(g-5@nZmk7&3ZSZYrYGy-G!uDk&9H zDx*}Kngk{>g=wSP16h(B=COc9qdUjSO5LGUg}jP2r2nUGx0Q`|meif(qwy}h8}Bi? zt&LIYF{SQP>S3kEGJ8ML|5Fb#eyCafBP8Q+JWjwzjqZ6TD)o#~kCQ)vPvTSfw9!>Q zOY$7j|5KA0+y3uX_`K2yrKTx;uu?B5^{rCVm3mjH7nOQVsh5QCpzYBBfp@e*@pdw{W4+>)xrwByZyqT#D})-O86K^|4aR zm0F|J3T9X0DqM}W|GRCzPx1kNh#%ovqub^uN`0l&r{tgE=lBJFX>|K`9m#t98o$8} zM(^G}^_|k&DfPWlrfL76)Gtc?NXjgkrKR+)O7B3;j<^%C2QJsPyGZU#s*L)Le;I;njGJ(H+yiB>nI@?2iMCZp+t`48p;91Kx;3jP7_1 zQ#z>hO-hec`etT_<1IJ>Z#BC5+ek*C59$BufURl#{(m||9>xepF@|xY+y6^*od zj=}qk-g{8`ev$|9L3{`wHo9jYr}X1Wk0+miw*M>r7)~_0$|p#k#Ha9Se8%W%o>Tfw zr6(ypQ|ZY{zo7IKYNq1zIL+2KzWYm0CwUQH!WsCo(Y@+dlzvs|S>&^E4$}YA^K50~ zU$CaAJfc~G^n(;Qct%26i#JJ$9xtXDdVh z&vaw9JNCey%_`3!ITz1E`hTXkt!ez5vP>Uku2IIkkjs?0kQ(}b=3>T|;H9?S>=yH{ zKQfn-T!B~ORd}`0*4UHeT4e?*)0Z**KSTe|^e3VJdq@9zl0i5aZ$R7s-PVRGXSO*^ z*-pybq|7R1ZdT@DWrizLQsx$AqRNa=#;?q+Ja#1BhNIADbXyCM1TlnRj2OM{k%=jj zQ6^5Fz$B(HZFI*XOOnGp7SQ&8x3#h|cM?{Vq5o%Ud`bV$(El@cG^-!2%zet-Ma|uK z57PfLV{E0j_r{Xnj}IXIKl6~SX?$v5<`HFPDl<-*=ad<*%oEB?ppyQdd5rNyeB3_D zJA(B84E;azG_%j(v$m#nN5+$sc|n=UjHlpKd>*G6-8!d}(El?pF`j`h+nUDriJ4cF zc}tmD%FI`0HnVeZF3!VOjc%{f|1%57U&lA_Ob}QT(x4~_V-U_qZlhFUOJ22i6cd|8& z6=ru)_7G)vRdz3?nv`w9U^mRO4kS4UTVZQF z*yy%)sIo^X+lKrwJRFa}ws@q`yDqZrl3==Rb>BoE^wI1a}fy^fT9RN1GLeT;k} zK8{b|lSa3ar%9f{XYo0lWOOxCl%1{YRApaM_IYNf;R`q&Uo?8Z;hCL5@-oiES8$fm zZF7#Y3zVHpJ`Z2T`DpvUt9+g04SW;d!i7e64lGu7ow9E$`@XVElwG0hQfl78cX1gm zH@ZiyBw2;4@jYB)bbagtWj|H+L-LPsEq;uj7~MKQBl#TZ|Jg4Ye`RaDuDD*=UzGh? z*&meshS?2h`@gc^;rB*&ef>zX5r4u>__NXbej)p-vVSZ48~N|}2mXnF8Qlv1A=!-o z;(ylM7Dn&hKDVWEQ(Dr}#T255%Lgh|U zuA6e5lsjFy&eWWYr{Jl0n$fNK43aL`6>a}l?kuA_BHficPq`lCJ@ITj2hTNnogvqY zq&J?AeeeRK_x*M5BIT}B?qYKKf6n%Q};ubjEPA4KI~ya8{-Ax5|NhLPNaH{)=;#pr!cox4@JfN~?rZ^KdO zL%-4O)gVa-!x+J+(QPfRTu!+Jc@k5Y#thp2?^c*6DPR#xSjLLcRo0YyK)E{k?aJMw z+#QVX#L;*c-feV`x|d`O-iKrHexthz9#rlry-OIxlfh*keZKhEq;uj7~P{jBccE2=>NGdNxo`U zvtGIHmHV3f8{B~3;&(>3&L2pA#EnS*&uyZ{UeU_^qTC#{F;#Rn|(R(M#Z>#)i%5SIq!OCy1{GQ57`CXOYfyy0m zC)^o#F?xF@-$X+H&+o=~cih9)G`^e5@1=Z8<@YAv2lvJOaDSs)?ExeQ;z8I7TN}Oi z#QY)3cToON<&RXp4YP;g;dlhLHM$iZMbZwB#$&L((LL|6%AcfsNAlzFcsv15G`h-8 zB%SeOJOxiRx|-9Kzf$=#l<%c{7v*~>-<6s((e{7kyJ2^uTW3#_v+*1}7tb?#*FwIx z@)s+AK6xMHY{_59_##``_)ar_3CX2+8D5T87~OHXO8NfEUrl}uUW&gMfp3G zuQFT1I^K?V7~OR=nuPwJznk$rc(1K#{M0UgpYjhYKbHJ{d;lNBhm7voA0Zis~Hux{(*lQ-LwBq@(*stfAK$~xBmLVS>}+9c+y=L`m5shp*q%hV1MY}B z8NC%2c2S|N3cIS%QiUcJ_EMn*HM=4Gzpw}6J?*0!Kbb7-O|lQ}i~HgJMz`eyR5(P1 z1IZ7CO;WZ!Bg=xqg&w_Bwes8o{47}-3q&_xPuBkREVk2Q-uL4 zoUOv8Dx9N29~I7}{ygl3z43gb+p8ClT!#)Dk`{{9Epb8^YxL$>!Dhy(FFy4SS;t-?T<}i|*@Mav2w;0_DP5%$5Fp~T> z9ECpg8{O7|Bq0oA1fxc`wYUmnRY<5%RUxTDUWF7jY0O|2b4Ir(3nWD>VHqn%@28H1 znhJNRP$$0~@4!28w9&2eZjyWOUL1q>8C}i&Dr{Ea0Tsrp@F24f;lua{jx)LyP9S*{ zAH#|GxC*9yJ)y!&Dm-cbUr*sFd>Ws@XYo0lgp+X!PQ~YO8oq$j@kL|fFL9_agXCqL ziLW4k52Y}h@f@6s^YB%ikFVhZd>!AwH;oM5!iC769VskU;cdQLf=lrod>5DDauwcF zVTBp<@rQ19tr@7mUn(i^_g@P3@4u+<8Gepm;FrkX ze<`eEydJ;CZ*T+J&sbC8JN(|r;0OE>H{wq!Y+~>;{(`@v{rooud<0zK4;Ad^zmfc< zg8lqA#{ZbVKEvQ&6}ML5KYMNzw?Nb4%y>(*{ogwSi`$Uc{;%S8NdGU|{_mah#T`{V zQN^89Y^~zXD(TVw*RZx z5)VN7fAJv3t&DE92dmg##Y0qVt0Mis*oGSVf06!QwEe%u4Zn~diAN#*zexWt+WznT zi=?9M|0*7f9g+TDJf5-b|L)mOQn8PUom4zi#m*|8sv`ZrX#2nS4pOxJU&Yh$4D5nk zjozI`@hlb3QL!6&ckF>Z@ob}eM*4q|{$Hg37wP{+`hVkltKtPJUajJVDqgDMMQnlo zU%aH*b}l2Q{}<{1Mf!iy_J6Nu7OzopfQt10BK^PEk4IgH{cUCA4xu=ZHkIB|5dDF4Q>DTK837E|1Z-2i=&yn3vK^*&wHBx5 zzkt*6MSRKVUeU`WGw~Iig|m&WX0D2Ft2j@^H&lF;+4=YyF2L7~-n(1zO_H~8Auhtj zM(=z7;t~~CsJN8;9efv;;c}yU_LU^7a5cV%YmDw0KTxT)iXW=@n~EQ)_>GEdRs2H5 zkE#3wKgG}RbE7*?z9jhy*Wr5n+UVA>LB)+KeoOuxevd!kk49Jd6Uiq08GpfFjqbJo zu9E4xf2d^I@1M;6g@5BexEcR7FHlAM_up080_{syX-l+!|6L{i_yN*hoRO+r$XO+%S>11YY|5xc$JPl7bdL69Pg`_Ks1=6(jfA|cmv*uLyT_C!$@wzn{hbaVsu-( zRiz-|NR@75FbaL>$AHn*hg3?a6ef>g6k`}Sx@S+4q%e*2|5Dc0c;{7K^~Y5zsPeH& zMU~BBN-7_yQdy;CDpl+~RjGrSaqw@KJn>8t(T>X7Nv}^aMHg|0R3> z@7)cSxc@J4|6j8A|4n_kXD&@vX}(HRRC-yZsVYrZiTnRjV^#M4-@E58+53N$Ucwn{ zfxjDAnyJzpmAL;easOYk_y6AC+ADGYU*i71Wbgl7{+dc}sl@$%iTnQ&_x~mC{~LdW zu(VL6B`R_AUs}xb+WY^eKHQm?mXdJ)U$U>o``d-3xI(3MDy>v$txBs@dY|Ie zD!s>Gjji{Nh`s+;$=>{{^pVZIBVta2&sF07zr_82$=?4r^=TXt?*B{N|Cj9jzuV92 zRr*n-uT}b1CGP)A_Ws|^a{phl_x~#W&}?fPRr*DxpUAoYFWLKl_bBfFOZNU>C42Ml zj@_Rs@2b*YDsQXO-zsmZ(myKwr_yFB|FxC;UVW zxt+=#R6d&g7;Mih$F$7fe=K(-KaQL$t9*jWr>lIT$|tLQ60@DKbF-RLNKVDm$Q#={ zL*=tn?n2%b&t$f-K47%9pBquF4mxe4fhZtK5sq-nP;^vVBM{ zXqH?=axq?F^TyxJEMKPbRVrUjeg$61Y~#pYO>zxh+br*=@{KBAr}FhG_h)th4zxAi zF&acN7;mt7<2%su5S4FMc_{fXyop(^-|}#hTX2NU*&1JtRQWbl@+yx~d9%tsLO%vn zo~d$Bh{_2HqAJH2#EtHJNRp&5ZFBE@$dcqRj|FBM$IkSBbJdi| zD_F%EHH{;9yUKT|d)^sytQY=g24FWSnAayrcQN z$}g%sjokKsm8aX;M%OLBL^1DHS5*E$T&+<@uD&Re2tRS8cs_ zg}z3z0AIJccSLOeSNSbmh>MtQ9FezGUZ(OA@}>9=+P&(|y5%abR(S>aN?g@!_C1m{ zXx|jPURwT8MT|54>%RNhEV|1WQ1{Ijj`_U*4Kn^sT%FaOT0J@?!Z;q(8?f0O^y z>`}J=tNfp}vV|&Vsq#NnTB)+7DlJsmN|l{d*;QeYAWqi>7dHdsuN!STH+nUBPs+^+A8LFI0ej1)`XB$^dr3*<{Jk#dhqq?awP?heg zT%t-3Rr;vXQZ^eGp>UzLaP5gez=1Xad2P6MlVK0L-O{lC)a|I}wX-;(j0sw`IJEyfFRk)vA1;%6sH%@O?Y$oev+9e1vOl?mg-gRU1v_Q&m1=mi}L%|5v^w`3l#mY8vc% zRW_;ewJP5eexu3;28}Dx_J4QH{y_dCZp5FMZB+iO${(uyLjEiMhQCwOI7WY}vRReC z$p6NFn$7-8@}IT31v$s4x}~ans=Ae`JE^+0s@to&4K?)tD*eB4jH)8v0e55z9HZ*a zsM5!ot?G%Y9;0eU z9@Spe4h)VpdRJEUIFjS>1e-THZS^FQPS_bwW|pH?Jyq4Ns-8xEI-Y@DsNtwp&s4RC zs%MdR!|u&ydy<@u=a4s!+Igz>RkfF@m#W%Z)eBWUpPD{+fvxn8+C?N6<0Uq4blU1= zs$Qk)<>Xi3mCQDd+SMf2;I+;2eyU!t>UHG((e{5;2ih9%s0~teh^m9h>HpOm?W}jy zhLR6M+yC98hO1gq^%hmbs*X_AN5QSCj%08fj%r^G?{Ur4N>VwVlhgE%4)kl~ehvRXAt?~B!W2!!>>O^we z|5bg$&U$;E{$G8X{27~jk9v+|lB!Eoovi8{Ri~)>vZ_;6rPWuTS9KaSFW5&l-fOD1 z|Eu~E&ak<6TxOEIg0pZovyJ02SJefo&Le*n=i_VCG>*&bsxDOZ4e~e9_J8kQvAT$4 zG1~s`-LY4fs`{C#@2I*))pu20sVe=yx}3@tw$eK;t4LPkdp7ru%loRXRrLe%5Ah>r z8^`5il27o{X8Gr;u2=O7a{7PuE5_?=jkkxtR`okozaig%c5k@j!dpX?{$Ks^{~kq| zeG5=^ld3=4+>U=y^;ZVJ;qTbkZ+|lW3;$N_e+>Rnbu)v1@jq*A3u9w{^5vGQZN*?~ z+y=Kbdi%V#y=v1`lWIlPc2Mmc)pk_vFx7TaZEw|fR&6&PvWsf$t6CFZwqOgKIknwM z_P{-HFJ?I_YWt{mfNJ}a?}z(iOKNy^wF6Z#=qb$;EgHUdn7^&tIJwI5rkZL!mHbS)w>93LPpXzxEyZjaGj`V7^Er|{+WzkzRU#>?_MmDN z)$ZiWs%rHA8kcA7cEUUCqZ&UMu8mf0jB0n0-;MX+z0@@J@O>m>@qT=u+3Z8AJ*nEm zsy(XOBg~G&@i@U&dVBIQl8N{@Hu`^Kk3FT@B-NfKe+HjL+yC8boJ=wWr{eQ=*4r~L zsBSK(>Eth}_Oog)srIF6GgSLTwU<@C*gbXy`AS@ctI_s<)z;wq_<_+q z>LZf1__58sYwA;y&+v2ng4xD3^_6NHR9i>B9=}H0|6ND@R<$2h`;Pp3{Gr+GMv|X! z6M5qm{i6DIs{N|kzpDMF+Fz>C|7(r2=ucbeoe6*Q*ne;{TWHDnKh?KVeG5CT{|~oh zmNTTjHOV%(ZL@rP)pu510)%Q|;5Ar?# z?@@fYH|~S`s=lAa9pxtA42J2QxmT*=!qWsD6X$ zZB_54`jM)ip!!j&cc84D>PIs;2HV?5HI8!qSdxx-93IasN4b8Y>ZhoF5_u==j3-mW z5viZ5dKcACBR?JK|BauA*SnIOiDwzTJDGZS)vr*!hw6P)@2UEEs@wjr`Z;*6t!y0S zdM}dRc)raWowI&{>X)c~A^AmkF|&=Mb1BJXczLt@O4a+SPXDi8&FnRJt*!BnazE7v zs(u}Le;idMD>K~QSunl|Ghn*BuQb~==OY8^)agFR5!1}{Quvw z>bC!@UPRmf-JY+IRIz4rZ_nSZ`dzBuL4GHWX11~C>Hqb6$Q%8?k>98KL#mG@r~lU< zVEmwcthWyzR(*o%^#A%eX2;uEZ_htULjSK%Z1$)pR5wlgN!2H*{*?Vc-F5r>KdL{2 z{Qgh&d)!$d0-~Xxe`#<&7RPy^j^)8>OSCatpERy`>N<^^${tQ9SRvKDH&-~ zMD|KFL@1TEic*TR_uiipO=(&Ul~JKV0}%}~l}hn{UypNL|6jM8+x_-F&-d%R&vmZr zIIMzs2v2&YIh_V3!tbC%3-;qXj#V@Bb{YzW?K_wwwG%{0V-#^} zmuIZ&?v=|l*nL`XL<{z7!S7mdfczlx{htMg7+c@}akk+PlEe5X^8KF$fB&cEAGxY( z!N1HN#bcJPD)>L6y`8S(NRG!7uo_l3mT!@ZlB`<&VlAwVb?_vkvu0fqzW?K@ z$GAS8V%3!YS3uXPa(^M$X>uKvtD#(Oxf;oJlU$AE8YtK4a$P0Y8FKZNs|nZT`#-K` zjGJ4(Vzb;MR|{+@S1Sf*VrwIVHgdIPa2B48?TifCV+TA(u8s^k85wlOE^?jApsSOg z$Hnupn_L$#=#Cc}8C)b+4+a-wPwa)gu@7EiwEkJg#rpn_T$kbHcm-PD|8e#h-~Vy- zBkzybAm9IS4X`T9XR_-$xrWO%h}pq-Jr2R4ILv5&hu<|qu5ogWBOMW>o%N>Q}A|U`I}T+ zG`|8ioxvS=C(gjTjLtUPBiC%XX3F)DTzpN)bsshNBj5jVS>OM$zbWT>n0yvKf{&v0 z{U7@~Kdw1)&6DeK@+WXEK8a5mom+pJLOcI`?Y{$!oY2Uq`F|J8Qlr*GjqGCVvN)A^qRA!m6~-rB&qR z`~Du|_tEPA_A`#_L%DXy^^shrS9~njr*f^KW-YG6_4tX=?yIiPNH*X`+=QPSo$dTm zu5ab~ihMI}LHfVz8>`aZ&hN;#;x^ol-y5CPcFJ{7t{>$3MXp`U?ne5*i~jGj`oI0X zLDwE;_u@X>k5>P8*8EkjKjk_^{u};|^naJt|D7$Q|GWNX_6YuiR{wX-@MCh1mAi`E zo#pHqF#)HKHy*wU&m|AxE!Op?~v z2HWCU#`3wr#ddPHXV3x9!H(F;Xzww17rC#J`&_wu$lX=$3*|nKn)9(6UVz<=_T$cd zku@%#Iqr+)?kjgsYI*M5}Blit*-!1oexo@T5M!6?2n20yw z&3KE^{=E%Y(@E(6Zu-A_2FYDkP5G6o`yRO;l6xlk zy?7tqj}PF3#`1G37ax{;7K2CdQG5(%8=aLOmpdx=6LS0Ho-6l!xu2xQ>i=@j!>92X zqjRnDneQTZqX)fKP5Ji-+A`toZ? zca9{F1uSC8=&bpy+@H$*9Qi_g9v9(ad;wpy-c7h)!k6(Cd=;1AYq-?BJ(2r$#&6)8 z_!hp6yk~bWllv1cE|+@+gO#`n-$g$Ealg;_1GGN>k(&>W+#fOK^B?ybGv?x2xz{mR zZzThVTbAD)yXpUK`oDW4_iGb=Zglp^m-0L(_gC^P7mjJM%-Yn}4%CcAf#?8F~%7w$GXxAl|U`{n+b{1@DVdvTx9sXRb(5P!u( z_?yu=;(y3vn)YG2|CResX8%I^zxxPdtN%NXsiP#vEIn25e^}LMpTnNx<*6ah3FOtV zI-ZC!+FR(UNm2`IV;wxnXrJw#y7IJ_=VW=B%2Q9ChVs;><`iszr{ZZw`}xH~|MxT| zKON7&CjY5vCQoa5nv>K2JuMlx!ZWSPa_{xDA!& zY$xoDUGQ9^v*vju^nXt`#us3BtET)&_go}TA9;F^UyMDm7xp$*tfrHAto|=gU%V7A z!^@5KYXHxc@;oEYRr1^+&(-owl&7COW98{j5d1lCCZv8H1@5XzO{_nZhs<+pq|9j~F9;^S$^AJ94 z)!0Yp5qX}F=TY*K4&yu)A_F2@zP(rCY1^t>z2r}Dff&&Tq-&+G@d8b8F3jMk}W?WHxi7T4i={KV+= zsLx0?;6~hpR{xjh3!}3)O#eS5&t`dc$+JbCZSs6g%{TZheurC)&VJrb@;&ZA`oHG~ ztET+<^T_&5UbE%D%X37YKbSp?e~f5`vEqj=2HTg7NUFL zo+)oL^5)nAIVZiXtjcod_qHZ)gKhCFJlkkLa=q>4?JjQzdC!&i9A-OWC+v(}jP^0| zb|sJ($XFJD` zjKy(y1CBS^k2UWEd8f-eQQq6+y@}bI@fN%lCmEeJCzDJ;`oDK7<7rk+`LW}@L*AM4 z-bp?K??U>&_a3XV{C>fEFZq3VKR$pD8l5xeVWobQca|cP0xeO}(QyhV94%+mk8ImUS`{HMM|Qi;#vbGXpx zthq?uSL9tx{sO*;FX78Z=l;G*vIJklrTDthS?x`EKauw>c|Vl*ZFyJ8`wlhBa5>Wd zy(_J2mEXU3-z9$!-$(ktcePc+`9S!QydN`IgKKdet~WZ{@Tt7t%KMqTU&_0I*^Rgf zKgTbO&aHn%vKhDF*Z7UmImf<}cc;8t$+zKlr2l(&Se5pD`GI^F?#3VSC!@34FY=u( z?;iQg8M0Si)7bY>vmXy2{ong5<3mPg{omz1BJUsMhw)GR3;#AckFtMA{zdw~_n0;I zRk3Qy&k??=@|`5#aq>yNHogIj4#E@@N%R5xbs~p-$MDWlJ61uu9oj6`TEH>T)zJD4U+E~>aWEC zI1sNh+OO7pgGsK(AvhF=8SQh@H$uK~@{J@Pg`;r{TK&IbXNmC*I391r2{_T{?17u* zn<3vV^4%`qt;|ls+mQb6n_|`5=iyZHX*eD4z&nl3F}+K^`{lcv{2rW%_u_p<=e|5Z z@*qBh592JOvsWLLFDRes|4+#`o7p+|I6i@M@kyhz4fEu4%l9<-GdLd?pv&moBM*re zedx!4(b-EO`SS9G>f)s*jf`3}jqNWQP+TP)ui`CgE3iF_|o{}R58ui&f3ik(j}ehru6>-Yw~iErWC z<^_p-@8B|Ajw^5_uEKZmJ$xTOz}5I6eq?0uamD)w7_60VgM90_t@Zc`eu|$Noujsq zWD|alU*MNUrx$IOZ(4tTI71sfRcN232Ul7`p_8{_Fl`{?+a$lpr-rsU1AIkv!-M*IHy&m?J$ZLlq# zWwiIUznucZ+l68SsG|FHb$$bXgm9p&#Ke<%6Rm%lUD>VoHDS3J+?tkaF;0_=_# z;zdShk6kQ(U-^5I_rl)T2QM+&9m9Vq$z^ysUV&E{?Z>SDYWZi%-%tKK3>z4G73;C_4nAH;`@_UAeN zS@K8ae?h;531*X+!Zc=#W=Ap3VIB)u#FEij^I7>{ zkl*V6@-M{aaS<*yI_KewBroC1_zJ#ibXI#!{v+})m4Ac$ugm|w{BOv=T>dwyd<#wg zH@Ec;E;HJn_V`zjti)CLF1}~9Uvc?AkbkZGtI0n^)BnwCALAOMbKlpItVjC4|5L`F zSvBQ%YW|J#ZH+A{~q~&m4C1N2jt%;|9)%Ad_~Rt6k~vy zJ!pOP%UrzXbNLT(mEWuaLizt-W%|GWPsV@Y-$v(5`$qxOeEwCyG_<1%oGt$`t0qtd z&FO8%Rq;4H9#5!fy-0y-SRGG9VGXQ_wXinU!IQ88>*C2+59{M8*Z@z()36~n!p3+y zo`FrUDK^9A3baw6g#u?P&{Ba`75`jqa?8bs6=-dZ7ayjwEuLl1TKBFU_q08Bz;m#p z(S8;SbXK670`&g?{Xane4_N(Qf%C1(*5&<1{||I0r~e16{;xm}tET*%80e`$KLvUz zaG3)1|3DvVF2TNdsa0Qo{}Q182k8F+tN$x-6<+c`;?I38~_R;;|6 z@kFE}1#V`13*Kt9&&j}T3QSjEGWis|9jD?nqqA4rU|{ogr8 zR{vLEJ}y8PTK(VILazcP1$+ubnerLI5Tx+paU;Y_Nfc_t# z{|D&*0s4P{{%_a3roh_@Eaked;~V%UTK(VdlL7jF!0P`BEXNhN(yFny@LdJ|R^UAa zwkq(x0viGxwzr6?6QL`RDLHd7y{$K9ZfsG1mR$vpepW_$! zC4ObBSW)hNTS(~t0s4P{{vWXVzq7U56xgf4b_I4T@ICcAa3|9L1G}tx`>gws{3rYw zf5AOQ=ZNo9;5P;KlOMo?_$wYVI!F9>l0Wb;{)vAX?N=;;BMMe1@Q;F0;9mugQ{X5y z$1HaKeNd*@x_>_V!1?N%uG(Lm#ae>i( zwhg*TJm^Iq`Z0h(^Ke!$gkg+e6k{021STl3KkU1o5cFJ?0E%?3YO}Q zTWJ0Ge%aj>%Q`Fgtbz-<%5!yV&8=v$LqSuvi2B(T%lb3*f`UsFe331D3F-gAR~Wx) zbnfG8Bunvir2hxsv}$Dr{HD<-&b%gQy(Zu{||o1 zMf!h`{vTZPpKGmCaHE3jsrdvy#m{hq(dh}BNIu6e@Jsy4=xoCl1-BD^t>8Bd=>Ng* z7;nXGM(1(yy@Ed~NdFJ+WS0IPwEDk-yQ!?gnEoH6{|A2|*@Jtnn)0i};C_XMD|kSm z<_aEEsFs4iDtJu6Lkj+-;BVCbj(^}`{L@(RLz?m5cm)5!fAOf%KDR?v6so4s|ExSz z6_3N?(dz&9d#e!rKV?F+llYX;S?y_sQVKnzP*|b)3V9V;K#dFC z=&|bUd+j6fV*rB~GX7t;3`G=*lE*NP2}~O8E)hyAv`C?hLM4T=%;qqU1uPn!{ZmQu zEIx+|@p)r;O)f50=miEZ;!F54zG8HG!V-nE3caRqSA~`;e4IkBEA*p6Zz%MELT@Ux zLZP>~*4y|FF2m(U`!#B4CCMs$7vID8jpg%}i>np-kikdzF|NV2xDMBwU9He3_$hvd z8*rnM!6t=1XYd7niC^Jng?1>kMWL+9gx}PizO(KCk3!#7{B^_(D%LDjXq!Uc zR}Al~(Du4LmRWxyyz%n7n>Hx4ldJrIyA;}O26Z=WtJ`KTvp*^HheAIqWZL^LZ1W!6 zi~DfD(dmH)Nq)sc_#6Iibk4)W3jM2))&CXx3+ex%BaHv~PvudPW0v76XbyxKS2fx_ zDtx@c4HZ5?;aW^pQ@A>V6H! z|FG5nt$*eSh8ro|M&ZT^H&^&{YUuyrCXAb6Gpo4#U6*hRl9t#C&&1Y7=YF+S_#B1L zB0n43VSDUgwEJYZBS|Ohj9u_tqy6X$pQrE?h0j;`I)%F_e5t}0DBM$F`hS@IAHIld z^}vg*>z2DvxED!p?1PtJU!$}BWeWFG_;PakfA~tqSK-xGW%*NraDS3(@LC*z1C7pV zgA^X8@L+{UD11G$Ly-O-w)(%q!>#)A-|-BOBpHRHaSV<%I{Whmg>P1PJo$|{0qOtY zo2az5L1FrT_*TY~@HU)mboR;Z3eQz|s>1gxJWb)d6`oGb9e5|sz`Kmjxn%W!g=ZrD zKWz1XyW@o)Q20@WA7u6+d>Ch;)&K4H`{Bn(X5$=u9IgKEY~hm%2NZrvVVA=5n0*?b z!TD(Qe`o)=Nj&I9ANq|>O;F*u!dCxRIE)db|A%8%rG3sM$dj1DG-iy>YB@#BqcyMa z*9sRDUZHSN;a3zcDZEJGO6s4*=WroDZ>&4lI$5@P`V&%PjprZ1sPIKfu-0S7H1SevE5yEv_>< zTlk5>pDX++`DeHRH{vFvvxQ%fe2HJ-X53CdIh5x|vvHR1i zFMkFb{+s*={)7MGQRDwTt469Q@;@t&RK?@)cs#*q-rMJ`a}L`BX}M2b{UP(zWL z3~FI*tb->Ro$J=VLdc zeKaH86}euK3l+ISk&6`Rqeu^GF27OJhjJ;yAnk#~aK2 zhl>*wnaJQKycy~L5v%_@d-68LlZs4M%$$K!6m71^?TWmo$W%olicC{vjv~_)c}S5v z6q%{Wovbqh@4~zB9;5w=G;%M=eRw}UfDan~@6~nWVMS(sLB9LL8M@hb9! zBF`u?m)R%rDV&E-8=WIKpJV~L(2XABe;#o@Mf~Ie3}OhwMrUtF6anOApa7-!p*qFXul(le51$?!fzG% zj=@&khTHLbqq9$TD)O@;KalUj-AMnB{A5*@KmUyULcRz0;y&DObXGg4Xe~v4Rpgi= zhZOlsk>9BK9sj_?_@~k70DqGl!GG{yJZiM}QnZSq)fD}ol}D@Madrf-W-G8Ro{aU3c4v;BLecHpE2$m##lTNvMJ)s#QsjNYc`bVVnV zPr=)9Do!&x+j$4coj3#U!n=*mcFt6Ej-vM}`mmz+F?&DK|Dz8we#ok~_v9>+NAOX6 z3}+jiqw~0;Pb>Na`CNPwpTc>@ilOEG_6*5ihiW1PtnDS`W4M68c;N* zXpqVfhB1Osqute`agqckF@N;6@5|B*A#t;+45uL6~@h* z9gNPccO>bAov{m^YqZb#*m;Uwt=RdB^;N8!VizlR0X5z6Lc9oj812^*v7RKous8O> zON`~-$i+()yNto*cm-aGR~emq)K9VDiuG4)kYd*`do2#Yfq0$K{*){>nB;mKf~6&-DK<^9 z+o+t3Q}A}2YP9=aY&yvucqh)lyNvcDI(Cm@4=Og3{9e2d@5cv>PUS-+592I+1Rpgz zM`yNTZpG#(Hczp~nSBE1;*R7E;Vh?n6HYFlcn{ZVs9vxQtWxf(ux%o%TSX=`hP6XxL{qY{E2I*;&Zsr=+rDy>=nfp zlfQs3;!9{fex0-ERgxw68ZO1xjm~OsDz;j&w-j5c*xSs$gUgWqA6xOC`c>rb;(Pc$ zTK(UC%@F%gvGt05ME)_Z!L_)~=p2_%NIu2Sa06~MI;(xI_(h6+p}1*xUn;g=v9A>S zL9xw>ZB=Xw^a@VRZKSpCnfQSL|;*g8vxHU7CwW6|?%k;#JVx zoEcZeHQL{9il0x?4KKj%c%jk$Tq52>@fnI=toU%n zdn(>f@m`8wrg(2E``{(m7cVv1-6Kx_k6%H4C0>PBTQ%i(F7f_~4^sRZ@@sJb4#ew> z&YmAkay<^gp*YNFpPBIyir=jGNX2hZd=#^zaSV>daYpCfjVHMgC*VZ9$!MRM@mmzX zUGZDVC*f^48K)SXEu2a+4X5KBc&E`h$L>=6DaG$r{6WR=i>r&q1))}C9mRP#eL*{ z3}6sLMrRL1NTL|SI3|qtb96kVBfBYopT-za{w&w<7&NzTK)Re?Ac3q4-aV?_~A|+=aXG zN27C;ef9k#~~c#hG2TqHUvalR6r$-CgW*cHz++K-MzH$@;ycP%G zK)enI8SC~r#mH5zS7Hc*p*ReO;|Qa3j7BMOs}iG?xKW8Q%#Ouzcms|%I(wD=pO{E~ z6W)xsST*HOeiD z@M(O;=$xwyNa+6wH)9Wats1%n7yU{E7z8ndVT@qZ=-hf-iIY@uF2({>`bx%StR);uR&{P=fxSSVHA% zxD;Qv>dWsq5^s{ch4lZ#JB*iEHLI*gq7o~V_&|x3j91~i_#VD*bZ&h$$%pt6evE63 zcK1uHQ}TEv)+_Oo5}zpXjS`4(A;}-nd=sd>1Rbqz{ z-;r;{ZMYr3H#+xyC&>@E3wPs>M*B5P;%6leEAfjG2bI{v>|Wf5`|*I$e!fWjN^%H) z!{6}_qqCR(RN|--f06%xCbq^lMte^t&muV++hKdO`oFy=lO2^jPsvW? zov{nj|C3$+Q+YmlH@pD5VRkHzL;8PmJoV)>VFLL?ya{i{Ta3=$n55)1C2u32j8l;QpPXt{ zmcRR&oKAiR-ib5tE~9fa?@`jD!D0#1v4=Z^eHTUBKNdHehWL>NLdqBxq%Ajn0~BC5uXC$g`NkJQj@3UMi7P;&eyrq|O0H4zGbPtDyAIdmC-|w+*`FIoHsU7y9KSF+YksBVcS>$1--2J`H~6j5 zey&MwCE14C@q651bXNO8sVYkDQu2_JyOrFlCR`LkRKlm>m#bZW$wbcKVs-sj@rA}1pIBPa_Jf48nu)5Jc zIw_IVKpyp}T8wL3HRV?esgsmCMX3t%x_C0y!}>;h3sVh9PQ}x(AvQAFuPRfgEA_Zi zXDD^OQcaZVu2fT{+AGyesn$w0r@jTY#8!Bw(LVaAHY9EFEIb?A8J%tJpwziaokQLc zJ7H(+Vsy5-E6I6yK6b+kjLvEoDs_cY7b(?8sUFN;j6Jaz_BPsmJ9P<3U%V7A!^@4% znpY}ytx{K!Uyc2+KVD;Wwr~K+K)enI;b3FMn(`hSqSSPyhAK5dsbNZuQEE6fBXA^+ z!qG-&JI9iY!y9ls-e`2rkcmp&rqoU3H{&gMD^4=nJs~xjWD4GnQ*oNn?p>)nl)9Jj zPNilrxC`&bdvK=F*-Q5+HA|`c$sfQ6@gaQJ=&bw*$)orf&c-=LXSFAkdPk|bN@bOL zQmKGaPbuY6Y95tO<1;uP7Z~j>k#duG(2G9w8=duoO2w55k%uvYQH&X#W11jIVhYok zF*>W|lzLIAyi(68RbaM=C9K3}jn0}2NuI|=xENnBI%~e9)KaBhCVvHA#U=Qf(OK8d<)+;I;$;HYNJximHL3G6-upSunOPB_waqAbFI}%tyAhl@{jOiT!U+k&Ni$k z`2;`3&v1j$epQp&q||n$K3D2%rM_VHOZ*Bq;})a+IwbWC$+!3&ZpCfJ@)mOOd!=?T z*oi;jF5GQ&?#oXqng`v_${nZFFUm|(YLC+IDYaMWQA+Jox|LGG4{k>MrS+wD1EKcmneOu(tVk|6feWe@d~4T zHm0v4q5r4*G47AoST*H$Sm^;u4^es`IsHF9i1A>&-l{CWPfrge8HU4g1dcS?kC*gl zrF}||QTkq`$0|Kp>2XTmr1T9`j>j8u0!}nK>)%Xr3*L&8@HV5f{uHI}RQh)EsW=U% z;~hr(JWtOcxeM>cdvK=F*`N0*{e;r@EB%Pl4>0>6K7ztYbt9Z))}bWrKI(jjWX7{MsUjLx1+ zkR&mMY0MbQD|0cYbe=&0i&(-+qq7aqDZNzbg-XAq^z+Qp|I>>Zzkn}V_4XO{GRZ6W zDlWm-jLw>`E4@tVH^|?_xA1Lz$7nzErk9hfz?HZP-!(d`y|2tUN`IjAVWn3q{k_s3 zD*d_AA1VEb(jQY#|4*-Fybjk}E7<4urzD@@2Hc37jLxlmq4YOOe@XroZpJP6wb6cN zNqlJj_faxe0H^Tkuw+vxjd}_FQEqEAx{wQ<$Ndu$`hVs##v5>>Ra5@XYUXogzE|c8Wxi47OJ={q%}D>x zd~Ma2p8+%9l7EL=aT{(oIyE~;cH$4X3wNW{|D8wZ&&rwx_=~btl-Z+|!JswZMYFOQ9e*%z|vL`89gS;lz!rEx{f4i$>D@f|%$yg8T8||MI zXB#NnPT5nHZNk)P$~I(R^?zj>BmF;nh8f%YIonj(GnH+|Y;$aZEwPo+xp%Ee+F)Cx z|7Xv(YB;il?XiQh=P>Aqov<@@F*>*2RoSSr=P5f$+4GgXR@rXK_EGi%WiL{;JM|Y@ z_2vH=BTN6!UQFH-dtq;@rhIl~FH!bNW&4s}ikIQ#c!kkEbF%dR?A7G-|7?H8^#Ag2 z1ZM{*J6hR+$_`cbI%WsqV5I+N|I`1o!^nr@2pox{jP|Sa>=jS!kh6Hywzwwr)N$7e_Ywg%HFH&6lL#J_I7Hf;xwF&cNm?$G=t|Jj*V zP5E)1y-(R$%HB`S14#eRKE(K8tFq~%j32@B_%X(_agNdMB-tmFoliJd*(Vu1h4Ya9 zpMA!Ro%3yhvVLV<%(~HoUi2C5XOOJb|CJ452N5ldK!&l;UQuu$2TlzpCj5iZ6T@I|Bj?2~<&R zNUc-$M`hP5`?a#4DEqmxpHlM~ZorMW$>{8*FG#*b`hRva<1JQA`IScY8)d&&_FMAr za4T-Z?M7!0>>$~RKj1FhZFIKtCuRRo*7W}a%KpOa9^8xjaKF(x2M&__iihww{N3oR zd05$hm9_f6vVY;!) zwakAlVjZt5@hYVM=lU`3Z*=z0waQ(u+yL@{cpVPH!A7TY2+2?!hQo1$(S8QcjZ*Gb zWhl)Fc{jB+!TdqTN;m77JueahX>-~oIPAHs)?;4z$y zbMSGav(0mr^DFnHatoAuirIPiG(Lm#jrMD#oQuSb9`vHm=$r!q$_%6O@bdK)_ zB&(7BpZkdM$JEqhyjHml%B^F(9zVfP@iU`yer_b$grDOVX!U>R{%%&jhjLq#uc_SE z%Kf3-H_H8_+_%c@Q0_bGx8gS3j^7)d`?!ufxh6CHzylzZm?DNAMr~*XXQyO!*U(uVUqSvq{FPcpM&YwD*6$ z8cB6L5rs93_PLj@rF?VcYb#%$sXEG^#GnG};>lRgXm4}=6y+N$-+=s7r2pp|GHzs5 zmS4%_PbWD8n_yFHW^`6-p?pW>TPlB+@~xOX6I){&Y-_Y1Q~9$=+F^U_fae(P=aGCT z<}Pb2)HTWvR{mP@0XPt^!$C&pzF$u=1c%}<9B#D!*KzB7 z7^(a%%8ychyz-+-#^6{Shc_6VJ#Zt*1e}OB;mt zbCjQ_{NvxWj0_2FU-QLKWqADSt@$-OBG({zqzl!k_UM++(!g73TMm z?8gIm5Pvl~NB=kF|5pBY@;~q}{)vAXo$WkA@(=!tNAZ}^-ZO>&sc@nd7OJXn9E0QW z1gwVDjrOe6;4y(Ocffc z&{Ty+R5r%b@eFKYv^!p*8A)?&fi1C>(OJK>3hh;BL*5q8!n3iR(f+-sLI;v_up@TD z&PMx@QaD$I3svY!ejc8W-S7hJZnV$&!bK|dQK1L<#n=;jVQ-_euP!0!i!I?&93-2SjA0NO6@gbwL+AI|gsqlyjZ>#XA3PBYfQ{gEUW>Yx_>Hmc% z7|+EgjrQZTFi!=y3QvHp<-(1qVrG=1`S6)RNuL&f7%IIP0ID$xH6e^LK89>IT%&iY45 zj#(C~;Qz3y(SB|%9WHY#>iv8{^d zsCX7NXJb2Tj~$HmIZ*6K(g{0b7d+Q!ANS&UB=r9x{l7^6FLo!t(5kfeQV$icQt@IH z`>NQJ*N6uOk_R zgYkMCVsus;rf1ivI9!!=R2-pFM-@k^_^yhhRP?GiTE&?vj#2S8700SLQN?kra08CV z8*zfs?vTZsNN&bk@K&5;bZ&RDig&0uh5UA$iqmkq(YY6QlFY!n@NTsFzq8uCDn72_ zeJajU@qT6>zz5Ol|0+Igv_F3?K0@*+K8CY#j?r232^F7FaW46j_!Q2=r;YY^(u(s* z7N85==rP)Tpy*SvQboUt85IL6##9Va6T&dk|BF%UTIFw37vtns|5q`IDNGyx@3X98 zR>d579t&8+lF|O@VewfNUsLfp6<<_wA+yipB3z6w7@fWJ63NT>3ciXn>LjN!R!gvqvwQ9;gF)Z#^(X{si z2#G&W%e{|h>g(d|8_qqok7wB zn_@F;ZnTd@sijJ1snm-6Ol*y9u&vSA!m~-*VSDU==NRqZJ}Y%nDWy_pm2Oq3i%Qq1 zbgoLhRqCqJg({s#{rT7pFTn0b`PAu0`I_BtGdgVE~$&YD9>hT(7=fg_C-2g>_xv`ROs zG=_XEj>8*pywO>00?9Do&-J#MHYHr7=I1Q&8oon4m zG6U)VCHjBq9;>GONG#o}(!(m;u!tqBG&*PIb0iD#d0d2xjn4Wns`Q#lFOk2D zui&e=#OQ48Qj*v44SW;dGCHfhqtbhX%T!vRWj}U4`vVJpZFL4ZFJWBhvZ*8ipMM~s~GJwv$CoxPgLb`2EBcl9UJsIsu_yMz-q^=zKPOi9 zRi$|meyJ+2Q{`o;s6|IEdMNni-S~2|F68Bi$icI z4l~+6^{5=7%7;`rQk6HTauldaYkp4jVHMgC*VZ932(+*RC$l}psTzUC*f_X zoXlW~k-_aaRh82iOvgKn|BtD=0F$cx-#?BbaU-#`bca$BiiCs+64IfxN~su#7+{bF zqF+ToK_pe&>Dic>?b+F-1XNl56dCxxoAJ@h8y6$tI=RA8R_Or8o`6^+m z5?>}v!&i)DcRyj|@HKoLrz>#=;SGG#Snyq+__h+~DRCxu#r#j4O`d~ujRo^R@g16X z@jZMW=Nk(?AtWwPVwMs=RN@*XexyVOd*c6;$oxsx6J><2y4Di940Z{7+>5Co=yNx3hAGvoijhc;YUa z-M9z$;!j5V-Ly}Mhn2XWp8216fcz^S#6w2=J~^VqQ%XEae+-Y~2|Q`EU;Q_l-|-J* z{wJQkWz8A6o>JmjxmqgmoLu#kcwVkbO1z-Nf0THUt1jVX{2Q+r?K5_j<{Dnd8~88& zhd0fGm8%ds4_vO>u`u3&MX)Fq!{Tz4kxS$fcqf*`QgW3x!TB%EnLo~+3364Gt1P)3 zmX9xxt3rHDLhb4FmF21-7xUj$#koUQRjh{9jRnu4t0qk?tc`WBt}(ub!}@YHkgJJY z4LNLtjqz^0$7uI-=D%FcusOCsXa3tYt>o$}S8KVt$kj%!_Hy0Fn)|UWGXGueoU7uW z30)oNJK}@b2|F9@nyzv^BG*Io-SA=Tjy;U_9(vOB!rs^io%vtzeeLQe*HFs-ayj!~ zu7NlR2jdW9!6y^fFu6v_^%(u*I2=ddNTdDgqiM$ASbPGXG!{%D*EqQr%QarEnQ~2# zYpPrm<$6x8NvwPtpTTEwve91qJk1OEB2K}Vj0L|JyIz)Sx?I!fU%^-LHGJJ@?{)^w z8~7%^g>M@RK3%wG$@L!PY`NwTocS-;JbVY=H5PoQyWW@Ue{#*I{{R=@hxn1ves$)* z>l6Bg$ozLLa@G{QH#AIT$#qe#Gn_q(=kPpUFxqGD63u1& z8?WF$Mtg_XQ+;Fm^ZEXYvub`^w#u zz8Ch!KKQ87-fcgc{>c1y4oU_%cqzSB&-^UZZ&(r{fHK!&vaM!~K@rbLD=UekRVs**M2&?{gl_JNPcXhwmE; z=CJz%xj&bCf!qt_{*bfI{FnQG_%S;3-@eM9(k#NoxCB2l7W{m1FO_?x+{@^{z~%TQ zt}xm=Tt%}Q*WgH{Mmg& z?w{n|C-=|J0`q523Ay*n{Y%-We=PfSjHZg*zq0>9JmhTn+A;DGJSz9^rjgtHIWG4} z@(E{ur#vP1ZzecjbWaJs;vZb~r`&(ZecD-Ozn0u*%u3Flllux!%Xzsk5H8{+yo}EL zk53^E|B?GD;Tm2?=D+)2lkID9Q=Y2w6q2WuJh#bHOrG1Fl^*85=MHiaEb3eppR1nY zG(zUT=T34-W7!FH$))9~AP+w#JP9;qu^g5+7QDMW6=^DAWn}()syJ)nzax99$hjc;rv__kVl8C;d+Ipr<3GDS_2}zk18j)S{I`4FEl&%1?xAmjO_BNUapu3h!+Ysl zVk>NoZHxuqWuE)xd0w8j@(hya0eQO1(@vhw^0a4V2W0+x9wc{iu8sd)L{Ar*uJ{mk z!-tLb9(u_0s63C*Gygrze@}0kKDVswOT+y4F#kORXa?T0X0SX@$TLKq5%LV>Ec4&< z7@7I+8Sbo)|Jz4BBk7s{p3&qnIM!Jc|EC0=C*_$W&r|f{a6B^qJ-5t%5A)x{{P#S| zn#uT_vEZHQc|o4}^1LX|oAOMN=T&)LV$D>18K>bZM*B>@M#KE~OefF4H=H#E@1?io znJdrR^fPf5&c-=L`<&0CVg7rV{~qSQCqDo0;OqzTd@j!dc^1m^Ar152!~FL!|2>~L zdltMiKV{7#T#QRFKL0P1m&&tJo@L}Oa5*ynJu6JMcesjvHLk(6_?5BX-#6>|M&7CN ztdqBlJm1Rmvpk9NWXt1{C&*&AJRX7u|E+IM)8JP~=4=~FNjLl`#NyJG%( z(&;lW6SJH(@lO<<9C^0N6P0I!Jh_~WVIJn=dSk)wv!0DKn{YFJhg*yVpT0ci^Z!nH zzNh~If5h#$!)Wht7tLANVJp#=ngAKF`ve!}E9nFB%h0#2>|Fd2g5JZ+ULWbA_}2 z;8nba*Np|Acs>8p{D(Iky@k-+o_!SF!tzR9-r?RNoGpsQu(-1_{@K7=g62*viKVc# zvEZHKO^~;Pyk+HWC~rA=tFWNFycGx)u@Y9syNm_z6K_>{Ys*`WzB<;xnpn$d@1zb* zU95-ov4PRvNh5iiQ#O|OZo)m-1e;_{Aiqj8MUzD7^bJc&=? zI2>=ZcQ{er=j5G4|1>^>&*EgGy~F2eUceV|3Oe(@;J--deOcbU@=lZ247XS0{XpJV z<$X)u*I4;FPRAMe2EJ)5_}uP&Ti$u{&ZM7(vvCg2HQM`mhvr>;58uc6M*9pbkawxP zAIkfwydQD)fA}$ef(wlWQ^LE5W-%_o&+v1j-E*0|tK|KHemQ=LD{!UJ-r;JRHMkbP z!mo{XH#7fZ@_s9Cs=SHv`sH=8#*H5IqR&|HNzWUg31Sj5|Gg>Bnu7OUNZw3&!<>y^ z8m420(cWhkO*ZCW6myOCy_YBNca-_^t|x53jkpOn8|~xTBJXy2x6*IJ@9_ux(P+Q= z4w{{~3wNV4|Ls@*NxtIp{w(ib^6r!OFbnp}`wQU!{)z|jkkNjh9+CHyyhrJe;c+~H zCyn+_exvyv|G+=-w9($l8F{bEdsbdE-p_INJYK+yc*$tj|4nlR|G}$x&1j#i8}i*Q z@4xi_;Y~+hAv6!f-l4BB%^g?-i()Zj!SB&N$yZap67rSh)SdE`B$UF^SOyb}1)oNI z<>b3dzVh@HkooVcM6T?tjK8mZRcNYWHLQ*`jCM^e`I^dCTfTXK1>TD-v6az&^)@v3;r-Yao%vtzy7=15pDkYp z`A5jtQNEe-Jt*G*`8vt>h^-d_CpsBVRB2 z-t_TT@KKt+*bn>Pa&{oiARLTC%o|d^q0ZaV3B%-jjPN)P#}POZM;QsDaSV=??+L<_ zM#59_jU$Y=%>?--(oDjqZU2mX&)Pg$zUORyo@FoKi#SETm+aZ8^1W>HH2Gd(!K?V1 z?O*3`x_mPTZ{VBw7QSsP+qfNhmi&*&H(S0;`R2&?iF|W;e&*pj_^x~lT+T1dkdC$K*S1^9h=h z@|`057Vn++hV#JxknhiUBj0KH{-Qi%o3rwrv-v!yF35M0a0xHlvww4VMZSM*bCu?r zeAjJbegyn$^M9PZDSx4Y#($gqw>zc3ux)rO{vwn`u^1Ld84DhT|4#W!%HNW{l>DU$ zWiSEDVmU026|f>!!pe9TR>7)R%}A&&e+`>!%3sUo+MKO}b>*)|sE-Y>p^?xC8{^%0 zkNizcAUBo2na$1RZ(+0ZBf#cX^0#Jj8{6C`|NS&=@d0dy?Xd%P#0Rkxb~X~a$lsOl zkZroj|1eE=+w_qC5u1C;-^=FSEbD`h%HNmJ5BnPl18^V?l7BE^h>A0z*G`Ny*I349Wt!g0oepJo0DG!tA{kIDa&{DVW5a3sUKy^;lz?xVKYhxX(i}e(!PiTM*u@N@LyYU`$KL0Dw6q{jlY=M0K540q= z!q&*=|G<4@KK}>!{2zFLrX9A&4%iVN#7@{5yI@y*$XIsbHS)vQ9edy-*waYpg}oK% zLwMBoeHG|ubAL_^z=1dj`4u2AggjJ%VJ0NxIg>y^m4^UuKi9;n77+vC^ zUx6_t20x*|SRFQR!Y6c~i2_gR`_&3Or7h-}AE(X#Q((M;CQnfCb_FIXutR}K3T#v0 zX$3Yb@C-XYi<1>_DexTmdFTH_8hAm0*$TXnF31`_*{X{Ok;0g=`HyS1-?{Z`7O-~1yCArxwmPMGL{9#m2lxZ|N8EnP*_{gf zqQEZt-M9z$;!pT9?!)~?yYm4WXZ{loDsYH!Sb;wjI6^*($M86wK<0md`5$2Z2Yxrb z^T&BCe=2ZQf%wb8{12Q_;GzO&x%M2M#|!aG$d~Xk{*BE4z&|ECf1I7;lZ5#nxWO9c ze}MTPxal;(LdYfYtAd3Utf=4}3YJu`h=RoxbmqT;#f$~dMo=`&|KOds^raLmt6*u) zmcfKu&X%Joj}>m|E74R|u$F>%k*i?U_!MPhlkw+D5sK_G{J-*p1MSK|3Jzx35FBdzVH`e&k1IHwFv6Z4$>As* zjbm^uKB3@~gr{(vkzjrVOdw2*H};mErhG=hXXCwslWCq)(3$__7ZiMv!0-<`!=J;c z3Oe&&!D+U6ML}o&Q#wBa6y&EyaJqssY|oE?AU^_vZz;(958C-3oTcDwyK)XY%vI1C z{$%EVkog~c&pw3t3c3|^hCgc-DEOhx{0In|+hG0&ng2m&{UjmjO8!H^h?0&en5N)=3Z^S~TEPqj zx3Vl#!7M^H<`@Z4%vCUEn>?C)1=rhV1Is{Bfq!HU$qT=*)l4{(wK? zb_I9Xey4)FD0katkAiz?ezMKa3huLcKc{|i4xO*^D~AW|*+U#2#v^zXkKu6zPY_Px zDI?)G1%J2MJa2zGIX=*wm*y|loWZkrPQmkp3wY5;xTN4^oByV{g8$%E1+NjV;|=`R z==^aW%S|QaDyfi?0!q3~NduL1yR#;#Fy4VhuqYP8;wUVEcVbB_g{83!CSX}Chvl&X zR>VqJ8Sla>SQV>bb*zCku@=_GI#?I$VSQ|X4Y3h6#=G$zY=TX(88*ijcrUg@hJR9P zavNm+C*4nOi_HI|cI5Wh0XyP@*aJ6d`jY!$ ze;io)+lKR*_r=J8itSI<2W2g;7A;Wqj3z5#V7Ddd|;^D#>NDTS*?ydeLWlzZ1-qND9&?**;lGDKx1V!Z1dRgfu0k6EZLp zvy6mn%u!O*Y2u$!l445QNuQ^re8PI%fE$g3O}JS}-x0RheyftU+5A1Heo)enw%M+v z9ZoLzTDw@V+n(LS;a>a+e^$~y!hZb4NI0ORUkL~CknImE=?KkHrz!X<$CX@JNhg$C zL`f$(d&;i=O-a8i>57v6p#Kw3<6n5jNH~k<@Vt^P*#4rDF4=sUvwu5>&g=D$?XS{b z!|QlMN&gc5GZJnpxsVf*Z!2h$Z&z|*nmgi6!NW-|N?8nxqp*aM?=*p2Qpu$VrLhbq zU|B4O<*|a1P*KU1;@P?Xp(!>~a&x<;g_7^3Y-yWT9JaQY{Jd>oszfMek;v3C4X<5A83A5@^-=w+=;tz zw~??1_u@}V{+Y1PNZ7CBUkC^ASKIR=Ao-Az57Qq(XZ|bsm|bIj1e~z>q>@i@_BY$` zkAR%@f6|{;>L?}urIa_7d`8JPDbFhT9N|1(z>7x0B_&@b{B4^n9R7n>@fu#o8%q9{ zP%!_^+es;fl#<|-DJI`eC~PF$p_C#v7gb6z%Hp;Whb8b%rIfUNDW#OAEaNos8Jkj8 zDYcbSj=nrraLzhkw<1=;%1XJ*_EnTp)#hrPt*(?BgqpUmltN_l{@?XbP= zJ1C_i&4ae-#9?RbqLi+-e@H3aC?Ce|w(r5=BiIvrVQ=iClt&4Djf8$m>2LD@nt@6g zWShZC8DjHL&JI%w^FQTr4u|6i9EqcFw2?4IDPsxF{3kq#{0K-HM;@<~351D8!X%|U zO?U>Mwf$rcpHs^7gctBdoMI%rq?D;PzpRvLHowBzSCzv2PkG(;)0HxVQ*Xo@-Y0J< z<)BjDR*HEAXL6SLpE8@w{7;!no)^DLDerLju2SB!&HFU-mGXgY7SQk`AmtrjwkRWp2FYocl-nY z#MAf}p24$t4$tESyoi_ZGX9NM@E^R2*YG;tz<=>Syy=))2yesNu`u3&MX)Fq!{R6` zfp=m_EQO`93?^V%EQjT>0#?LISQ+oaDp(b(VRfv5HL(`f#yVIR>tTItfDN$`HpaX0 z9&Cb5u^Bcu7QD)-_bRm$WlN>DBDBUfc%PAQzf#-U`~XcmrM9qj`9UX`pIND$ zS=I%+;zQUCAI9!RLJy@rVslTW_OiLRQv1X+d-i2p7Yy8$;k zYn*r5Cfuyl?+9CLzg4N*Z2n%UKXCR(+;00FPKbY^OWmc^-JIQnd+nN^l=`#H`#7~9 zf58LzD;`wpArr`l?Y2j4bBzADQcn<0;wgLfH>Lhg^9TNkr|~Z%;S8Qt>bZEs_re8x z_M%cRvEVZPtxz$-75qo3S4|*aQ|fiX4gA;k|8aOzp+W^s=r)CJx4E!$HgpFTQK+cX z$Dg`TaY{Ljv!;YXciLQ1p;DBkv5f5#I4q0husl}4iV9UCR5seLQbnPo3RP8TzCzU$ z8q9*~3e|AdIA6CW)>5c8p$^u?dJ1(=s6M%Yk4pzucYC%6hmT-S z?4?j|d$teFqYCx4O+SVDQx3p^ws-#ikIh3A8fx<}mOZA>MQ`$p%F`PmfuKp{8f z0);+|_X>SPW8R`46F$L(_$e;J#YVys{0u+GrMOI?FH9gWSLjQ^3frtyXqC;Y6LSdUDG-(Q@ z+a^OH=6@*5HrcGnQ7B5t#h5*t$6-FMS7-xaqdmKc!_D~JE%(2bW}8Ca6Mn!SjfCyE z19vL4i?AE_7zumvC;VBVeFTPoh~XbPU>eF_@gN?;!+6BVyW*I_0~I>1a7+3V3Y~OL zInV7W{7oU|f9Ma}|EbVvPW`3u9SWTxpS5Stad;k`9{~zo#7hcYHi7&%UQy^D+gw%X zn$6c0x?%Ib3jJsEO%oI@gty`C3Kw?H#;1L_h{DzAiz-}biuCpkde?$Vdj6hyKQ>VKca9?+w`L8jeYP@?2G*r?oSwCbp8~) zpo1s}D?B9LD?F5Dn8J?{9!F>X6GkXJk}wKKD?F7jM&Yq0ke^WaNt>Tic%04SIXgk& ziME+U^E5t#&*Ef-pEH5{yuvTo{G!5BY<|f;gqLkIjrFf6{HkqUqj_E7>4X{hhCTbH z!f(;o`5&Ii;Vgw`+ck3(o=Z8;Ht#6>u9FL%!1qm1cs^@BP~=X97ub~_D*Tbn<|Y1E zVUNO}uyP?f^PjLt;l+d{_!)j~BrH{U8Q}|Dj$h&mT#2i2HLgL1fA}ktIb{BazfpLd zZN8;XL>Ic9Q_dsua_B=p1{6N1a8Th*940B8Oi000BO!!gg(HMC+oyAwfti?v*_eY- z%*7Zo|HJv@^$Iip!yC<^^T)Z*&GD@8cdXf>@K)Pwqxl|xQ20l}cHDtGjf7na?Ka~G_=fHORro)fZz@u# zAV+RfMLAUriz^~RiTGLPb%~UWXGKaWQrhM+EK5*?;U6i-VR@{8 z6%}bpsH8|`6UcWdQpM(~G}RQTZkrm4)U>&lBDGmi2kY9t9*6a@0X9VQS3nz^K)xIA zQKX5}#J{^E&FtCcoNb}Vy|!toNGrZ|-tiu6-{dqw&yzosGs zxMUy>QdU<*1}id=!y$?cbuM&X^kIrTX7l4T!xb4}n~^l56d6qzgJbatd=j6+aX20) z7z_Spdt{Q*>{;Ow-9Ez_rhl(6w%~3pt$MFQ7 zL}&gh@|)4_!2FLm^IwtE$o!9-A)m!_cpfhp?X{O^E-Uh%B7c*w;6KRlk6a^P#~b*s z(e7~5Y0?VeZFoBt#yhYG7Bv=Jl~!D74V5OPRaaUGrIlCOovbN|rLZ)X!2~Re<&1Wp z3N#h55?02$(3$^AtBTc(@vAtjp|qNWT38$FU|p<-^|67`e#J&gYf0HyX$=3gdpK-@ zO|cm^#};_6(eBVnX&sc-n!XL*hxcP!d;r^Fd!xO!Bh7=@2|HsK?1~RzH>16(yV6D} zt%uSEa_SN6skB~%-q;5p#lF}N`{Mv(d^ZjUDQz%e2oA+z_!vHp!*K+TG}`+aO*00^ z;uH8JK853OJWjxgILT=Dc}8h-l=iIBUggwer9DS@9$&y0aSFbKQ}Jb-hOZdyp0Clo zj?-}lzJYJzTlhB4#927oc+0aiS84O;-@$kBJ!Jl;%_o0=3-Cky2>)laclC+Vjwx-S z(n3o6RB0}yEmGP_mMvD=62fQrIWEOz_ysP)hy#O=5Pcj7MGjeBq}{$#ZK?4#L_zu*D<6%XPe zJd8*1sL}3lTApo?2|5<5_l(;#8Oxq z%U}YQHQH;-(^SBUSP3iRU04OHVl}L8v^&&P`h7~TrSy9^Ra@zG2z9X@*2f0e5F24* zyxSPxjl(8NZ%Sx}&9MdEi!HGgw#GI_dq4Lpy^qq{D!r@HAK+{|Y>yqVBR+_ourqcs z+I=3P>4pzuckF?WU{CCYy^Z$TN0mNI>3!+@VSgNe191=z#vwS=Xm@yw=5ZX3BXA^+ z!qGSe#~S0;a`>dupHliuN*~AJc$|O}aS}d_&)~B-8K1-F@dbR*NSNXT^IwlmpQ_Bk zN`F}yi{*Kb;Dt%tO`Tr{YUAy>wc9@SJ-~#**Kf?HJe{8b7YN5=((>VQ8&Mv~m zxCEL1>7SFA;xePXb~(+LxB^$=DqM|gaIMi^^|jI?O8-XbexGT3e#Gs#19##s+>LvTcAuYUe#U*cAAi9E_$wYX#;@Y=u+o|T z=|?#{hR5*)p2So5o6&y7Ka_3;@}Ek-r1aCA{R_|FSv-g5@d92n+8r*_F#pr9kpID} zcnz=P4Wqs4KV=kC`c0?LD1^-ajN8eD@eVA4MU4g5W)!CpmO$ozMoDrhERAK1_NubV zcuX1PlyR>z$}6J=3o0n1B7ymzQJH)fR>7)R4XYdNZZ(zBNEx;0Ya{bNqb|7~*2f0e z&}gr1OmjEhgH5n0HpAxF!f3B*sf>q}(MlN|l+l{AZSX$4AKT&s*bdtp?G7Dj9>h-A z8M|Otd`lI z2S$7ChcqAI|L|k{1Q+6`xX5U)TB6Ki%J@tfF=c$N46iblDq}6nmMP;4!gBl)SKvxq zg{yImF}^2_ZaO}KhZG%Gxm}9<1cssf5n4%$Y`%UqKr$*II4_4m2r%-$MFQ7#8dbi{*Heb z?GC4D{=zeO7SG{%ynq*t_NvRuFvI+B`YXu%&$vpyhS%{1{%f??-gKJGLUN@6K2jb$(a%VIe!Z?wBrRAxT?P zQ=t78qLy|xxjZLEWJu^!gP2H4POuWC$lH{OFyuqigf=GX%7#g<09Lu+OBRAw7x zc2eejoV_30BJ)499l1Srz>fH!(eBfkrVDn(hp-zyjNP#ZK4P@j_M+*HeehB2i~X=a z4#0sp$Y^&MqRb3s4pruBoEoOg$CUY$G9Tw~IF7)PI0{GO7#xdF;FCtX^EhQbugvlE z6L2C*bV&vfR$GG8^?YhPF9GG$Iz<~&Z#Q05zi zH}Nfe8)xDyoQ-pEuF>xHjxs-1=DYOo;rlorKfnd}A%2AaGujjC<9*d9AzM|==FVQ1`Ov|s%p<-V<~Zpwa4 zSr03_u(G-<>nCOPP}XW?J)*3ql+{yNL%Fb*vU(Hx;G@_V`(b|^fCF(54#pwIg#ONZ zkHcZgdW`Tm4#yEV5=Y@^9D`%=34GER-%VNLl=Ysn#w+U$Wld1l6lG0h%_MvppTTEw zGCqgT;|utr(eC*Y%~X6Dr{OF3D!zuV<8+*1v^%^>^A^61GjSHq#yL0_=ixi}uF>xE zzOoi8Yd-x4xBx%Ik1+m}eoX!Z7viV5$Y^(4Lh~7Zj!SVFeu2yJOI(2~ah1{Tvqo82 z%37OJG*^M6bq7VJX_|6;#m6b$D#uQA&5QZ^=X_$@~m}#{4 znXRlXlsU?Z5^^zy%>S%>@_O8W8*vkE#_x=F&#g4u@O%6Lf5h#$19##s+>Lv1uhH)I zv$9SpYoF6NV`{&$ejyydU-2Lw!ozq3ng3bG$j9*no-`&5C_?@Xe^=Ju%KC%+C!WT? z@C=^Cb9f#v;6=QImyLGkD>VP$RlJ7R@do~j|KUx?>_T`OI`coi8;5r&yNI$|D7&b# zD=51dWpNaiz&o)dmcr6l1{1I>mc#N!=TF}~%C4yFx|EfaU72tfR>7)R4Xa}ftckU- zHr6qk4IP~aRZrRV2@S9zHp0euH{OFyuqigf=EnGL%D$JTrLsE_S}D6Vp$*=L_hVap z0NY`E?0_BdL8INdv$Fdry9<3+dI7$ca5>6n3;MteWm%HB+wqwFXl7h{-* z`M4f8;6~hJwEKLg>|M&v#kI#sBc8vEbUA+nj7BXU^@)DNMKni(pYKhQ(1>0`D{yeAncZ zQch>(lvYkP<&<%HXU_!XlqHnI@>l^YVkNAMcVQK*YP5G)T{(@FQ-i)H*23CY2kT-z ztd9+_AvQAF-R@RS8|BCz;@UkJ77nA5IY&| z4qcSfm$EB9q?~Sqhp{{Mz(=qr_QKxS2Ol-sJ^Ru0#{oDH2jO5Gf?9njAAavFc0%_z44a&+^C#Q^qcWJ+=5$i8-9;J;E%W+ci>K= zeO-1d*UY*-ioUCyy^8i#&QFToubiJ1ZK9lgtly8n-~s$q(c6@BP&pTsW9I+w$~ml@ zlgc@woMS9FYE0^*T`CY?&`px-6Ie#hVPiKMiZa;08ol(wt z<(yT{xr7nUqj3HZlyjlrpB3a>QqI51xvZRjl=C;2UvZYj|4Kv7Rpne)&NZhQ5dV(8 z;e1ifviLu|=@>2KEHn2Lynd8->77tsQD^u&H}n7RCt69-%8K4a|Bv%LI6G8T zw6KDDyx1Hit8D7S6^wI2W1! z(RWNvi2XkL z`5#?Mvkbq$<@hD8FxvOYDw@@}2G`Of}x}+=dm6(5GQKW?&{}VK(Mq)M&qVVv3san@69o==X{`^Iy>oxDhwuW@P?H zng7wPG~0}Jw;yPn$*HLG-L2>j+=;tzH^$%LdrdY&o5sxlzZBi4=rKk2)BJ)5@K-#D zhwv~S!J|fd565Xv;7L4%zv1ur2mXntjrJbSC~BtbS^9H$9xvcUyo8tWZ@gl(?~SW8 z*YG;tz<)9Re!l7C+(LMpF=4|ad8~jHu@Y9syRZsY#cEjHX!of}Q%kw`D7QAb4%WqbSRWf;Lu`bN@ouBt ztqDz2Y=+IT1>TD-u@$z)Hb(o5-LKpc%5AIMZk&2Rx$Ow;u>*F*2eA` ?uA2KEk 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

&LU{uzM#D|8{OGmLiS33=NQhPv$@mygLGrP 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 K%&m%W9p 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