Compare commits

...

20 Commits

Author SHA1 Message Date
HaHaWTH 010874586a Localized GUI Captcha 2023-11-11 11:12:48 +08:00
HaHaWTH fcc34c28aa Migrate to @Inject 2023-11-11 10:00:27 +08:00
HaHaWTH ecbc11cf0b Useless 2023-11-10 22:28:46 +08:00
HaHaWTH bfd3a8f439 Merge remote-tracking branch 'origin/master' 2023-11-10 22:18:02 +08:00
HaHaWTH f8dd410d96 Improved code style 2023-11-10 22:17:35 +08:00
DGun Otto 2459aec4b6 Merge pull request #46 from HaHaWTH/dependabot/maven/org.xerial-sqlite-jdbc-3.43.2.2
Bump org.xerial:sqlite-jdbc from 3.43.2.1 to 3.43.2.2
2023-11-10 00:49:53 +08:00
DGun Otto d623337a15 Merge pull request #47 from HaHaWTH/dependabot/maven/org.checkerframework-checker-qual-3.40.0
Bump org.checkerframework:checker-qual from 3.39.0 to 3.40.0
2023-11-10 00:49:28 +08:00
HaHaWTH 73c3cea778 Optimises 2023-11-05 12:17:21 +08:00
HaHaWTH 11a4cff10a Revert changes 2023-11-04 18:42:55 +08:00
HaHaWTH 628d5adcb5 MapUtils 2023-11-04 18:31:36 +08:00
HaHaWTH 8681cd0733 MapCaptchaHandler 2023-11-04 18:29:44 +08:00
HaHaWTH bb2fdbfb40 why r there so many runTask 2023-11-04 18:04:28 +08:00
HaHaWTH 4dedc30d94 Format 2023-11-04 18:01:39 +08:00
dependabot[bot] fa995eea53 Bump org.checkerframework:checker-qual from 3.39.0 to 3.40.0
Bumps [org.checkerframework:checker-qual](https://github.com/typetools/checker-framework) from 3.39.0 to 3.40.0.
- [Release notes](https://github.com/typetools/checker-framework/releases)
- [Changelog](https://github.com/typetools/checker-framework/blob/master/docs/CHANGELOG.md)
- [Commits](https://github.com/typetools/checker-framework/compare/checker-framework-3.39.0...checker-framework-3.40.0)

---
updated-dependencies:
- dependency-name: org.checkerframework:checker-qual
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-02 05:04:26 +00:00
dependabot[bot] e819be918b Bump org.xerial:sqlite-jdbc from 3.43.2.1 to 3.43.2.2
Bumps [org.xerial:sqlite-jdbc](https://github.com/xerial/sqlite-jdbc) from 3.43.2.1 to 3.43.2.2.
- [Release notes](https://github.com/xerial/sqlite-jdbc/releases)
- [Changelog](https://github.com/xerial/sqlite-jdbc/blob/master/CHANGELOG)
- [Commits](https://github.com/xerial/sqlite-jdbc/compare/3.43.2.1...3.43.2.2)

---
updated-dependencies:
- dependency-name: org.xerial:sqlite-jdbc
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-31 04:16:08 +00:00
HaHaWTH 1e3e625c1a Update: fake player compatibility(UNTESTED) 2023-10-28 20:32:38 +08:00
HaHaWTH b747a4bdff Update: untested 2023-10-28 20:21:10 +08:00
HaHaWTH 03443104be Prepare for PacketPlayerListener 2023-10-27 20:54:13 +08:00
HaHaWTH 819e55e235 Prepare for PacketPlayerListener 2023-10-25 01:07:44 +08:00
HaHaWTH 80b06f3bc7 Now prepare for B31 2023-10-25 01:05:36 +08:00
10 changed files with 183 additions and 80 deletions
+3 -11
View File
@@ -784,14 +784,6 @@
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<!-- FastUtil -->
<!-- <dependency>-->
<!-- <groupId>it.unimi.dsi</groupId>-->
<!-- <artifactId>fastutil-core</artifactId>-->
<!-- <version>8.5.12</version>-->
<!-- <scope>provided</scope>-->
<!-- </dependency>-->
<!-- ConfigMe --> <!-- ConfigMe -->
<dependency> <dependency>
<groupId>ch.jalu</groupId> <groupId>ch.jalu</groupId>
@@ -806,7 +798,7 @@
</exclusions> </exclusions>
</dependency> </dependency>
<!-- bStats metrics --> <!-- bStats metrics -->
<dependency> <dependency>
<groupId>org.bstats</groupId> <groupId>org.bstats</groupId>
<artifactId>bstats-bukkit</artifactId> <artifactId>bstats-bukkit</artifactId>
@@ -1076,7 +1068,7 @@
<dependency> <dependency>
<groupId>org.checkerframework</groupId> <groupId>org.checkerframework</groupId>
<artifactId>checker-qual</artifactId> <artifactId>checker-qual</artifactId>
<version>3.39.0</version> <version>3.40.0</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
@@ -1084,7 +1076,7 @@
<dependency> <dependency>
<groupId>org.xerial</groupId> <groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId> <artifactId>sqlite-jdbc</artifactId>
<version>3.43.2.1</version> <version>3.43.2.2</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
+30 -13
View File
@@ -43,6 +43,7 @@ import org.bukkit.Bukkit;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.event.HandlerList;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
@@ -76,7 +77,7 @@ public class AuthMe extends JavaPlugin {
// Version and build number values // Version and build number values
private static String pluginVersion = "5.6.0-Fork"; private static String pluginVersion = "5.6.0-Fork";
private static final String pluginBuild = "b"; private static final String pluginBuild = "b";
private static String pluginBuildNumber = "30"; private static String pluginBuildNumber = "31";
protected final Boolean SHAEnabled = false; protected final Boolean SHAEnabled = false;
// Private instances // Private instances
private EmailService emailService; private EmailService emailService;
@@ -123,6 +124,7 @@ public class AuthMe extends JavaPlugin {
} }
/** /**
* Method called when the server enables the plugin. * Method called when the server enables the plugin.
*/ */
@@ -229,16 +231,16 @@ public class AuthMe extends JavaPlugin {
if (settings.getProperty(SecuritySettings.LOGIN_LOC_FIX_SUB_UNDERGROUND) || settings.getProperty(SecuritySettings.LOGIN_LOC_FIX_SUB_PORTAL)) { if (settings.getProperty(SecuritySettings.LOGIN_LOC_FIX_SUB_UNDERGROUND) || settings.getProperty(SecuritySettings.LOGIN_LOC_FIX_SUB_PORTAL)) {
getServer().getPluginManager().registerEvents(new LoginLocationFixListener((Plugin) this), this); getServer().getPluginManager().registerEvents(new LoginLocationFixListener((Plugin) this), this);
} }
if (settings.getProperty(SecuritySettings.FORCE_LOGIN_BEDROCK) && settings.getProperty(HooksSettings.HOOK_FLOODGATE_PLAYER) && getServer().getPluginManager().getPlugin("floodgate") != null) { // if (settings.getProperty(SecuritySettings.FORCE_LOGIN_BEDROCK) && settings.getProperty(HooksSettings.HOOK_FLOODGATE_PLAYER) && getServer().getPluginManager().getPlugin("floodgate") != null) {
getServer().getPluginManager().registerEvents(new BedrockAutoLoginListener((Plugin) this), this); // getServer().getPluginManager().registerEvents(new BedrockAutoLoginListener((Plugin) this), this);
} // }
if (settings.getProperty(SecuritySettings.GUI_CAPTCHA) && getServer().getPluginManager().getPlugin("ProtocolLib") != null) { // if (settings.getProperty(SecuritySettings.GUI_CAPTCHA) && getServer().getPluginManager().getPlugin("ProtocolLib") != null) {
getServer().getPluginManager().registerEvents(new GuiCaptchaHandler((Plugin) this), this); // getServer().getPluginManager().registerEvents(new GuiCaptchaHandler((Plugin) this), this);
logger.info("(Beta)GUICaptcha is enabled successfully!"); // logger.info("(Beta)GUICaptcha is enabled successfully!");
logger.info("These features are still in early development, if you encountered any problem, please report."); // logger.info("These features are still in early development, if you encountered any problem, please report.");
} else if (settings.getProperty(SecuritySettings.GUI_CAPTCHA) && getServer().getPluginManager().getPlugin("ProtocolLib") == null) { // } else if (settings.getProperty(SecuritySettings.GUI_CAPTCHA) && getServer().getPluginManager().getPlugin("ProtocolLib") == null) {
logger.warning("ProtocolLib is not loaded, can't enable GUI Captcha."); // logger.warning("ProtocolLib is not loaded, can't enable GUI Captcha.");
} // }
} }
/** /**
* Load the version and build number of the plugin from the description file. * Load the version and build number of the plugin from the description file.
@@ -334,8 +336,21 @@ public class AuthMe extends JavaPlugin {
pluginManager.registerEvents(injector.getSingleton(EntityListener.class), this); pluginManager.registerEvents(injector.getSingleton(EntityListener.class), this);
pluginManager.registerEvents(injector.getSingleton(ServerListener.class), this); pluginManager.registerEvents(injector.getSingleton(ServerListener.class), this);
//Register 3rd party listeners
if (settings.getProperty(SecuritySettings.GUI_CAPTCHA) && getServer().getPluginManager().getPlugin("ProtocolLib") != null) {
pluginManager.registerEvents(injector.getSingleton(GuiCaptchaHandler.class), this);
logger.info("(Beta)GUICaptcha is enabled successfully!");
logger.info("These features are still in early development, if you encountered any problem, please report.");
} else if (settings.getProperty(SecuritySettings.GUI_CAPTCHA) && getServer().getPluginManager().getPlugin("ProtocolLib") == null) {
logger.warning("ProtocolLib is not loaded, can't enable GUI Captcha.");
}
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);
}
// Try to register 1.8+ player listeners // Try to register 1.8+ player listeners
if (isClassLoaded("org.bukkit.event.entity.EntityPickupItemEvent") && isClassLoaded("org.bukkit.event.player.PlayerSwapHandItemsEvent")){ if (isClassLoaded("org.bukkit.event.entity.EntityPickupItemEvent") && isClassLoaded("org.bukkit.event.player.PlayerSwapHandItemsEvent")) {
pluginManager.registerEvents(injector.getSingleton(PlayerListenerHigherThan18.class), this); pluginManager.registerEvents(injector.getSingleton(PlayerListenerHigherThan18.class), this);
} else if (isClassLoaded("org.bukkit.event.player.PlayerSwapHandItemsEvent")) { } else if (isClassLoaded("org.bukkit.event.player.PlayerSwapHandItemsEvent")) {
pluginManager.registerEvents(injector.getSingleton(PlayerListener19.class), this); pluginManager.registerEvents(injector.getSingleton(PlayerListener19.class), this);
@@ -395,6 +410,7 @@ public class AuthMe extends JavaPlugin {
// Disabled correctly // Disabled correctly
Consumer<String> infoLogMethod = logger == null ? getLogger()::info : logger::info; Consumer<String> infoLogMethod = logger == null ? getLogger()::info : logger::info;
HandlerList.unregisterAll(this);
infoLogMethod.accept("AuthMe " + this.getDescription().getVersion() + " is unloaded successfully!"); infoLogMethod.accept("AuthMe " + this.getDescription().getVersion() + " is unloaded successfully!");
ConsoleLogger.closeFileWriter(); ConsoleLogger.closeFileWriter();
} }
@@ -427,7 +443,8 @@ public class AuthMe extends JavaPlugin {
getLogger().log(Level.INFO, "You are running the latest version."); getLogger().log(Level.INFO, "You are running the latest version.");
} }
} catch (IOException e) { } catch (IOException e) {
getLogger().log(Level.WARNING, "Error occurred while checking updates from GitHub. Reason: " + e.getMessage()); String formattedException = ExceptionUtils.formatException(e);
getLogger().log(Level.WARNING, "Error occurred while checking updates from GitHub. Reason: " + formattedException);
} }
}); });
} }
@@ -1,7 +1,9 @@
package fr.xephi.authme.listener; package fr.xephi.authme.listener;
/* Inspired by DongShaoNB/BedrockPlayerSupport **/ /* Inspired by DongShaoNB/BedrockPlayerSupport **/
import fr.xephi.authme.AuthMe; import fr.xephi.authme.AuthMe;
import fr.xephi.authme.api.v3.AuthMeApi; import fr.xephi.authme.api.v3.AuthMeApi;
import fr.xephi.authme.service.BukkitService;
import fr.xephi.authme.settings.properties.HooksSettings; import fr.xephi.authme.settings.properties.HooksSettings;
import fr.xephi.authme.settings.properties.SecuritySettings; import fr.xephi.authme.settings.properties.SecuritySettings;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -9,18 +11,21 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.Plugin;
import javax.inject.Inject;
import java.util.UUID; import java.util.UUID;
import static org.bukkit.Bukkit.getServer; import static org.bukkit.Bukkit.getServer;
public class BedrockAutoLoginListener implements Listener { public class BedrockAutoLoginListener implements Listener {
private final AuthMeApi authmeApi = AuthMeApi.getInstance(); private final AuthMeApi authmeApi = AuthMeApi.getInstance();
private final Plugin plugin; @Inject
private BukkitService bukkitService;
@Inject
private AuthMe plugin;
public BedrockAutoLoginListener(Plugin plugin) {
this.plugin = plugin; public BedrockAutoLoginListener() {
} }
private boolean isBedrockPlayer(UUID uuid) { private boolean isBedrockPlayer(UUID uuid) {
@@ -37,4 +42,15 @@ public class BedrockAutoLoginListener implements Listener {
player.sendMessage("§a基岩版自动登录完成!"); player.sendMessage("§a基岩版自动登录完成!");
} }
} }
/* prevent sending duplicate messages */
// @EventHandler(priority = EventPriority.HIGHEST)
// public void onPlayerRestoreSession(RestoreSessionEvent event) {
// Player player = event.getPlayer();
// String name = event.getPlayer().getName();
// UUID uuid = event.getPlayer().getUniqueId();
// if (isBedrockPlayer(uuid) && !authmeApi.isAuthenticated(player) && authmeApi.isRegistered(name)) {
// event.setCancelled(true);
// }
// }
} }
@@ -7,6 +7,10 @@ import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.events.PacketEvent;
import fr.xephi.authme.AuthMe; import fr.xephi.authme.AuthMe;
import fr.xephi.authme.api.v3.AuthMeApi; 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.service.CommonService;
import fr.xephi.authme.settings.properties.HooksSettings; import fr.xephi.authme.settings.properties.HooksSettings;
import fr.xephi.authme.settings.properties.RestrictionSettings; import fr.xephi.authme.settings.properties.RestrictionSettings;
import fr.xephi.authme.settings.properties.SecuritySettings; import fr.xephi.authme.settings.properties.SecuritySettings;
@@ -22,8 +26,8 @@ import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.Plugin;
import javax.inject.Inject;
import java.io.File; import java.io.File;
import java.util.Random; import java.util.Random;
import java.util.UUID; import java.util.UUID;
@@ -31,12 +35,22 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level; import java.util.logging.Level;
import static fr.xephi.authme.util.PlayerUtils.isNpc;
import static org.bukkit.Bukkit.getLogger; import static org.bukkit.Bukkit.getLogger;
import static org.bukkit.Bukkit.getServer; import static org.bukkit.Bukkit.getServer;
public class GuiCaptchaHandler implements Listener{
public class GuiCaptchaHandler implements Listener {
//define AuthMeApi //define AuthMeApi
private final AuthMeApi authmeApi = AuthMeApi.getInstance(); private final AuthMeApi authmeApi = AuthMeApi.getInstance();
private final Plugin plugin; @Inject
private BukkitService bukkitService;
@Inject
private AuthMe plugin;
@Inject
private Messages messages;
@Inject
private CommonService service;
private PacketAdapter chatPacketListener; private PacketAdapter chatPacketListener;
private PacketAdapter windowPacketListener; private PacketAdapter windowPacketListener;
//define timesLeft //define timesLeft
@@ -53,14 +67,18 @@ public class GuiCaptchaHandler implements Listener{
int howLongIsRandomString = (howManyRandom.nextInt(3) + 1); int howLongIsRandomString = (howManyRandom.nextInt(3) + 1);
public GuiCaptchaHandler(Plugin plugin) { public GuiCaptchaHandler() {
this.plugin = plugin;
} }
private boolean isBedrockPlayer(UUID uuid) { private boolean isBedrockPlayer(UUID uuid) {
return AuthMe.settings.getProperty(HooksSettings.HOOK_FLOODGATE_PLAYER) && AuthMe.settings.getProperty(SecuritySettings.GUI_CAPTCHA_BE_COMPATIBILITY) && org.geysermc.floodgate.api.FloodgateApi.getInstance().isFloodgateId(uuid) && getServer().getPluginManager().getPlugin("floodgate") != null; return AuthMe.settings.getProperty(HooksSettings.HOOK_FLOODGATE_PLAYER) && AuthMe.settings.getProperty(SecuritySettings.GUI_CAPTCHA_BE_COMPATIBILITY) && org.geysermc.floodgate.api.FloodgateApi.getInstance().isFloodgateId(uuid) && getServer().getPluginManager().getPlugin("floodgate") != null;
} }
private void removePacketListeners() {
ProtocolLibrary.getProtocolManager().removePacketListener(windowPacketListener);
ProtocolLibrary.getProtocolManager().removePacketListener(chatPacketListener);
}
@EventHandler @EventHandler
public void onInventoryClick(InventoryClickEvent event) { public void onInventoryClick(InventoryClickEvent event) {
if (event.getWhoClicked() instanceof Player) { if (event.getWhoClicked() instanceof Player) {
@@ -74,9 +92,8 @@ public class GuiCaptchaHandler implements Listener{
event.setCancelled(true); event.setCancelled(true);
closeReasonMap.put(player, "verified"); closeReasonMap.put(player, "verified");
player.closeInventory(); player.closeInventory();
player.sendMessage("§a验证完成"); messages.send(player, MessageKey.GUI_CAPTCHA_VERIFIED);
} }
//force to string
} }
} }
} }
@@ -86,13 +103,13 @@ public class GuiCaptchaHandler implements Listener{
randomString = ""; randomString = "";
Player playerunreg = event.getPlayer(); Player playerunreg = event.getPlayer();
String name = playerunreg.getName(); String name = playerunreg.getName();
if (!authmeApi.isRegistered(name)) { if (!authmeApi.isRegistered(name) && !isNpc(playerunreg)) {
if (isBedrockPlayer(playerunreg.getUniqueId())) { if (isBedrockPlayer(playerunreg.getUniqueId())) {
closeReasonMap.put(playerunreg, "verified"); closeReasonMap.put(playerunreg, "verified");
playerunreg.sendMessage("§a基岩版自动验证完成"); messages.send(playerunreg, MessageKey.GUI_CAPTCHA_VERIFIED_AUTO_BEDROCK);
return; return;
} }
Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> { bukkitService.runTaskAsynchronously(() -> {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
howLongIsRandomString = (howManyRandom.nextInt(3) + 1); howLongIsRandomString = (howManyRandom.nextInt(3) + 1);
for (int i = 0; i < howLongIsRandomString; i++) { for (int i = 0; i < howLongIsRandomString; i++) {
@@ -106,71 +123,66 @@ public class GuiCaptchaHandler implements Listener{
sb.append(randomChar); sb.append(randomChar);
} }
Bukkit.getScheduler().runTask(this.plugin, () -> { bukkitService.runTask(() -> {
randomString = sb.toString(); randomString = sb.toString();
Random random_blockpos = new Random(); Random random_blockpos = new Random();
AtomicInteger random_num = new AtomicInteger(random_blockpos.nextInt(26)); AtomicInteger random_num = new AtomicInteger(random_blockpos.nextInt(26));
Inventory menu = Bukkit.createInventory(playerunreg, 27, randomString + "请验证你是真人"); Inventory menu = Bukkit.createInventory(playerunreg, 27, messages.retrieveSingle(playerunreg, MessageKey.GUI_CAPTCHA_WINDOW_NAME, randomString));
ItemStack item = new ItemStack(Material.REDSTONE_BLOCK); ItemStack item = new ItemStack(Material.REDSTONE_BLOCK);
ItemMeta meta = item.getItemMeta(); ItemMeta meta = item.getItemMeta();
try { try {
if (meta != null) { if (meta != null) {
meta.setDisplayName("§a" + randomString + "§a我是真人"); meta.setDisplayName(messages.retrieveSingle(playerunreg, MessageKey.GUI_CAPTCHA_CLICKABLE_NAME, randomString));
item.setItemMeta(meta); item.setItemMeta(meta);
} }
} catch (NullPointerException e) { } catch (NullPointerException e) {
getLogger().log(Level.WARNING, "Unexpected error occurred while setting item meta."); getLogger().log(Level.WARNING, "Unexpected error occurred while setting item meta.");
} }
Bukkit.getScheduler().runTask(this.plugin, () -> {
menu.setItem(random_num.get(), item);
});
menu.setItem(random_num.get(), item); menu.setItem(random_num.get(), item);
Bukkit.getScheduler().runTask(this.plugin, () -> { playerunreg.openInventory(menu);
playerunreg.openInventory(menu);
});
if (AuthMe.settings.getProperty(SecuritySettings.GUI_CAPTCHA_TIMEOUT) > 0) { if (AuthMe.settings.getProperty(SecuritySettings.GUI_CAPTCHA_TIMEOUT) > 0) {
long timeOut = AuthMe.settings.getProperty(SecuritySettings.GUI_CAPTCHA_TIMEOUT); long timeOut = AuthMe.settings.getProperty(SecuritySettings.GUI_CAPTCHA_TIMEOUT);
if (AuthMe.settings.getProperty(SecuritySettings.GUI_CAPTCHA_TIMEOUT) > AuthMe.settings.getProperty(RestrictionSettings.TIMEOUT)) { if (AuthMe.settings.getProperty(SecuritySettings.GUI_CAPTCHA_TIMEOUT) > AuthMe.settings.getProperty(RestrictionSettings.TIMEOUT)) {
Bukkit.getScheduler().runTask(this.plugin, () -> { bukkitService.runTask(() -> {
getLogger().warning("AuthMe detected that your GUI captcha timeout seconds(" + AuthMe.settings.getProperty(SecuritySettings.GUI_CAPTCHA_TIMEOUT) + ") is bigger than the Login timeout seconds(" + getLogger().warning("AuthMe detected that your GUI captcha timeout seconds(" + AuthMe.settings.getProperty(SecuritySettings.GUI_CAPTCHA_TIMEOUT) + ") is bigger than the Login timeout seconds(" +
AuthMe.settings.getProperty(RestrictionSettings.TIMEOUT) + "). To prevent issues, we will let the GUI captcha follow the Login timeout seconds, please check and modify your config."); AuthMe.settings.getProperty(RestrictionSettings.TIMEOUT) + "). To prevent issues, we will let the GUI captcha follow the Login timeout seconds, please check and modify your config.");
}); });
timeOut = AuthMe.settings.getProperty(RestrictionSettings.TIMEOUT); timeOut = AuthMe.settings.getProperty(RestrictionSettings.TIMEOUT);
} }
long finalTimeOut = timeOut; long finalTimeOut = timeOut;
Bukkit.getScheduler().runTask(this.plugin, () -> { bukkitService.runTask(() -> {
Bukkit.getScheduler().runTaskLater(this.plugin, () -> { bukkitService.runTaskLater(() -> {
if (!closeReasonMap.containsKey(playerunreg) && !authmeApi.isRegistered(playerunreg.getName())) { if (!closeReasonMap.containsKey(playerunreg) && !authmeApi.isRegistered(playerunreg.getName())) {
playerunreg.kickPlayer("§c验证超时"); playerunreg.kickPlayer(service.retrieveSingleMessage(playerunreg, MessageKey.GUI_CAPTCHA_KICK_TIMEOUT));
timesLeft = 3; // Reset the attempt counter timesLeft = 3; // Reset the attempt counter
} }
}, finalTimeOut * 20L); }, finalTimeOut * 20L);
}); });
} }
Bukkit.getScheduler().runTask(this.plugin, () -> { bukkitService.runTask(() -> {
windowPacketListener = new PacketAdapter(this.plugin, ListenerPriority.HIGHEST, PacketType.Play.Client.CLOSE_WINDOW) { windowPacketListener = new PacketAdapter(this.plugin, ListenerPriority.HIGHEST, PacketType.Play.Client.CLOSE_WINDOW) {
@Override @Override
public void onPacketReceiving(PacketEvent event) { public void onPacketReceiving(PacketEvent event) {
if (event.getPlayer() == playerunreg && !closeReasonMap.containsKey(playerunreg) && !authmeApi.isRegistered(playerunreg.getName())) { if (event.getPlayer() == playerunreg && !closeReasonMap.containsKey(playerunreg) && !authmeApi.isRegistered(playerunreg.getName())) {
if (timesLeft <= 0) { if (timesLeft <= 0) {
Bukkit.getScheduler().runTask(this.plugin, () -> { bukkitService.runTask(() -> {
playerunreg.kickPlayer("§c请先完成人机验证!"); playerunreg.kickPlayer(service.retrieveSingleMessage(playerunreg, MessageKey.GUI_CAPTCHA_KICK_FAILED));
}); });
timesLeft = 3; timesLeft = 3;
} else { } else {
--timesLeft; --timesLeft;
if (timesLeft <= 0) { if (timesLeft <= 0) {
Bukkit.getScheduler().runTask(this.plugin, () -> { bukkitService.runTask(() -> {
playerunreg.kickPlayer("§c请先完成人机验证!"); playerunreg.kickPlayer(service.retrieveSingleMessage(playerunreg, MessageKey.GUI_CAPTCHA_KICK_FAILED));
}); });
timesLeft = 3; timesLeft = 3;
return; return;
} }
playerunreg.sendMessage("§c请先完成验证!,你还有" + timesLeft + "次机会"); messages.send(playerunreg, MessageKey.GUI_CAPTCHA_RETRY_MESSAGE, String.valueOf(timesLeft));
event.setCancelled(true); event.setCancelled(true);
random_num.set(random_blockpos.nextInt(26)); random_num.set(random_blockpos.nextInt(26));
Bukkit.getScheduler().runTask(plugin, () -> { bukkitService.runTask(() -> {
menu.clear(); menu.clear();
menu.setItem(random_num.get(), item); menu.setItem(random_num.get(), item);
playerunreg.openInventory(menu); playerunreg.openInventory(menu);
@@ -181,12 +193,12 @@ public class GuiCaptchaHandler implements Listener{
}; };
ProtocolLibrary.getProtocolManager().addPacketListener(windowPacketListener); ProtocolLibrary.getProtocolManager().addPacketListener(windowPacketListener);
}); });
Bukkit.getScheduler().runTask(this.plugin, () -> { bukkitService.runTask(() -> {
chatPacketListener = new PacketAdapter(this.plugin, ListenerPriority.HIGHEST, PacketType.Play.Client.CHAT) { chatPacketListener = new PacketAdapter(this.plugin, ListenerPriority.HIGHEST, PacketType.Play.Client.CHAT) {
@Override @Override
public void onPacketReceiving(PacketEvent event) { public void onPacketReceiving(PacketEvent event) {
if (event.getPlayer() == playerunreg && !closeReasonMap.containsKey(playerunreg) && !authmeApi.isRegistered(playerunreg.getName())) { if (event.getPlayer() == playerunreg && !closeReasonMap.containsKey(playerunreg) && !authmeApi.isRegistered(playerunreg.getName())) {
playerunreg.sendMessage("§c请先完成验证!"); messages.send(playerunreg, MessageKey.GUI_CAPTCHA_DENIED_MESSAGE);
event.setCancelled(true); event.setCancelled(true);
} }
} }
@@ -235,18 +247,16 @@ public class GuiCaptchaHandler implements Listener{
if (!authmeApi.isRegistered(name)) { if (!authmeApi.isRegistered(name)) {
if (AuthMe.settings.getProperty(SecuritySettings.DELETE_UNVERIFIED_PLAYER_DATA) && !closeReasonMap.containsKey(player)) { if (AuthMe.settings.getProperty(SecuritySettings.DELETE_UNVERIFIED_PLAYER_DATA) && !closeReasonMap.containsKey(player)) {
closeReasonMap.remove(player); closeReasonMap.remove(player);
Bukkit.getScheduler().runTaskLater(this.plugin, () -> { bukkitService.runTaskLater(() -> {
if (!player.isOnline()) { if (!player.isOnline()) {
deletePlayerData(playerUUID); deletePlayerData(playerUUID);
deletePlayerStats(playerUUID); deletePlayerStats(playerUUID);
} }
}, 100L); }, 100L);
ProtocolLibrary.getProtocolManager().removePacketListener(windowPacketListener); removePacketListeners();
ProtocolLibrary.getProtocolManager().removePacketListener(chatPacketListener);
return; return;
} }
ProtocolLibrary.getProtocolManager().removePacketListener(windowPacketListener); removePacketListeners();
ProtocolLibrary.getProtocolManager().removePacketListener(chatPacketListener);
closeReasonMap.remove(player); closeReasonMap.remove(player);
} }
} }
@@ -36,7 +36,6 @@ public class LoginLocationFixListener implements Listener {
materialPortal = Material.matchMaterial("NETHER_PORTAL"); materialPortal = Material.matchMaterial("NETHER_PORTAL");
} }
} }
} }
@EventHandler @EventHandler
@@ -4,13 +4,59 @@ package fr.xephi.authme.message;
* Keys for translatable messages managed by {@link Messages}. * Keys for translatable messages managed by {@link Messages}.
*/ */
public enum MessageKey { public enum MessageKey {
/** In order to use this command you must be authenticated! */ /**
* %random Verification
*/
GUI_CAPTCHA_WINDOW_NAME("gui_captcha.captcha_window_name", "%random"),
/**
* %random I am human
*/
GUI_CAPTCHA_CLICKABLE_NAME("gui_captcha.captcha_clickable_name", "%random"),
/**
* Verification failed, you have %times retries left
*/
GUI_CAPTCHA_RETRY_MESSAGE("gui_captcha.message_on_retry", "%times"),
/**
* Bedrock verification success!
*/
GUI_CAPTCHA_VERIFIED_AUTO_BEDROCK("gui_captcha.bedrock_auto_verify_success"),
/**
* Please be verified before chatting!
*/
GUI_CAPTCHA_DENIED_MESSAGE("gui_captcha.denied_message_sending"),
/**
* Verification timed out!
*/
GUI_CAPTCHA_KICK_TIMEOUT("gui_captcha.kick_on_timeout"),
/**
* Please complete the verification!
*/
GUI_CAPTCHA_KICK_FAILED("gui_captcha.kick_on_failed"),
/**
* Verification success!
*/
GUI_CAPTCHA_VERIFIED("gui_captcha.success"),
/**
* In order to use this command you must be authenticated!
*/
DENIED_COMMAND("error.denied_command"), DENIED_COMMAND("error.denied_command"),
/** A player with the same IP is already in game! */ /**
* A player with the same IP is already in game!
*/
SAME_IP_ONLINE("on_join_validation.same_ip_online"), SAME_IP_ONLINE("on_join_validation.same_ip_online"),
/** In order to chat you must be authenticated! */ /**
* In order to chat you must be authenticated!
*/
DENIED_CHAT("error.denied_chat"), DENIED_CHAT("error.denied_chat"),
/** AntiBot protection mode is enabled! You have to wait some minutes before joining the server. */ /** AntiBot protection mode is enabled! You have to wait some minutes before joining the server. */
@@ -149,6 +149,7 @@ public class MessageUpdater {
.put("verification", "Verification code") .put("verification", "Verification code")
.put("time", "Time units") .put("time", "Time units")
.put("two_factor", "Two-factor authentication") .put("two_factor", "Two-factor authentication")
.put("gui_captcha", "3rd party features: GUI Captcha")
.build(); .build();
Set<String> addedKeys = new HashSet<>(); Set<String> addedKeys = new HashSet<>();
@@ -155,3 +155,14 @@ time:
hours: 'hours' hours: 'hours'
day: 'day' day: 'day'
days: 'days' days: 'days'
# 3rd party features: GUI Captcha
gui_captcha:
success: '&aVerification success!'
bedrock_auto_verify_success: '&aBedrock verification success!'
captcha_window_name: '%random Verification'
captcha_clickable_name: '%random I am human'
message_on_retry: '&cVerification failed, you have %times retries left'
denied_message_sending: '&cPlease be verified before chatting!'
kick_on_failed: '&cPlease complete the verification!'
kick_on_timeout: '&cVerification timed out!'
+21 -10
View File
@@ -154,13 +154,24 @@ time:
# Two-factor authentication # Two-factor authentication
two_factor: two_factor:
code_created: '&7您正在激活双重验证, 请打开 &a%url &7扫描二维码' code_created: '&7您正在激活双重验证, 请打开 &a%url &7扫描二维码'
confirmation_required: '&7请输入“/totp confirm <验证码>”来确认激活双重验证' confirmation_required: '&7请输入“/totp confirm <验证码>”来确认激活双重验证'
code_required: '&c请输入“/totp code <验证码>”来提交验证码' code_required: '&c请输入“/totp code <验证码>”来提交验证码'
already_enabled: '&a双重验证已启用' already_enabled: '&a双重验证已启用'
enable_error_no_code: '&c验证码丢失' enable_error_no_code: '&c验证码丢失'
enable_success: '&a已成功启用双重验证' enable_success: '&a已成功启用双重验证'
enable_error_wrong_code: '&c验证码错误或者已经过期,请重新执行“/totp add”' enable_error_wrong_code: '&c验证码错误或者已经过期,请重新执行“/totp add”'
not_enabled_error: '&c双重验证未在您的账号上启用,请使用“/totp add”来启用' not_enabled_error: '&c双重验证未在您的账号上启用,请使用“/totp add”来启用'
removed_success: '&c双重验证已从您的账号上禁用' removed_success: '&c双重验证已从您的账号上禁用'
invalid_code: '&c无效的验证码' invalid_code: '&c无效的验证码'
# 3rd party features: GUI Captcha
gui_captcha:
success: '&a*** 验证完成 ***'
bedrock_auto_verify_success: '&a*** 基岩版自动验证完成 ***'
captcha_window_name: '&k%random&r&n请验证你是真人'
captcha_clickable_name: '&k%random&r&n我是真人'
message_on_retry: '&c验证失败,你还有 %times 次机会'
denied_message_sending: '&c请先完成验证再聊天!'
kick_on_failed: '&c请先完成验证!'
kick_on_timeout: '&c验证超时'
+1 -1
View File
@@ -3,7 +3,7 @@ authors: [${pluginDescription.authors}]
website: http://github.com/HaHaWTH/AuthMeReReloaded/ website: http://github.com/HaHaWTH/AuthMeReReloaded/
description: A fork of AuthMeReloaded that contains bug fixes description: A fork of AuthMeReloaded that contains bug fixes
main: ${pluginDescription.main} main: ${pluginDescription.main}
version: 5.6.0-FORK-b30 version: 5.6.0-FORK-b31
api-version: 1.13 api-version: 1.13
softdepend: softdepend:
- Vault - Vault