diff --git a/src/main/java/com/lenis0012/bukkit/loginsecurity/LoginSecurityConfig.java b/src/main/java/com/lenis0012/bukkit/loginsecurity/LoginSecurityConfig.java index 1896a8b4..77daa7cc 100644 --- a/src/main/java/com/lenis0012/bukkit/loginsecurity/LoginSecurityConfig.java +++ b/src/main/java/com/lenis0012/bukkit/loginsecurity/LoginSecurityConfig.java @@ -43,6 +43,13 @@ public class LoginSecurityConfig extends AbstractConfig { @ConfigKey(path="password-max-length") private int passwordMaxLength = 32; + /** + * accounts limit + */ + @ConfigHeader("limit of accounts that can be registered from an IP") + @ConfigKey(path="Accounts.LimitAccounts") + private int LimitAccounts = 2; + /** * Join settings. */ diff --git a/src/main/java/com/lenis0012/bukkit/loginsecurity/database/ProfileRepository.java b/src/main/java/com/lenis0012/bukkit/loginsecurity/database/ProfileRepository.java index 15a10a23..833d020a 100644 --- a/src/main/java/com/lenis0012/bukkit/loginsecurity/database/ProfileRepository.java +++ b/src/main/java/com/lenis0012/bukkit/loginsecurity/database/ProfileRepository.java @@ -8,6 +8,7 @@ import javax.sql.DataSource; import java.sql.*; import java.time.Instant; +import java.util.ArrayList; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; @@ -241,4 +242,19 @@ private void resolveError(Consumer> callback, Exception error Bukkit.getScheduler().runTask(loginSecurity, () -> callback.accept(new AsyncResult(false, null, error))); } + + public ArrayList SearchUsersByIP(String ip) throws SQLException { + ArrayList r = new ArrayList<>(); + try(Connection connection = dataSource.getConnection()) { + try(PreparedStatement statement = connection.prepareStatement("SELECT * FROM ls_players WHERE ip_address=?;")) { + statement.setString(1, ip); + try(ResultSet result = statement.executeQuery()) { + while(result.next()) { + r.add(parseResultSet(result)); + } + } + } + } + return r; + } } diff --git a/src/main/java/com/lenis0012/bukkit/loginsecurity/modules/general/PlayerListener.java b/src/main/java/com/lenis0012/bukkit/loginsecurity/modules/general/PlayerListener.java index d83dd5a3..cc10a4dc 100644 --- a/src/main/java/com/lenis0012/bukkit/loginsecurity/modules/general/PlayerListener.java +++ b/src/main/java/com/lenis0012/bukkit/loginsecurity/modules/general/PlayerListener.java @@ -23,6 +23,7 @@ import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.entity.FoodLevelChangeEvent; import org.bukkit.event.inventory.InventoryOpenEvent; @@ -97,6 +98,16 @@ public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event) { } } + @EventHandler(priority = EventPriority.MONITOR) + public void PlayerPickupItem(EntityPickupItemEvent event){ + final Player player = (Player) event.getEntity(); + if(isInvalidPlayer(player)) return; + final PlayerSession session = LoginSecurity.getSessionManager().getPlayerSession(player); + if(session.isAuthorized()) return; + + event.setCancelled(true); + } + @EventHandler(priority = EventPriority.MONITOR) public void onPlayerQuit(PlayerQuitEvent event) { // Unload player diff --git a/src/main/java/com/lenis0012/bukkit/loginsecurity/session/action/RegisterAction.java b/src/main/java/com/lenis0012/bukkit/loginsecurity/session/action/RegisterAction.java index 32ebe954..c4e38f6d 100644 --- a/src/main/java/com/lenis0012/bukkit/loginsecurity/session/action/RegisterAction.java +++ b/src/main/java/com/lenis0012/bukkit/loginsecurity/session/action/RegisterAction.java @@ -1,12 +1,14 @@ package com.lenis0012.bukkit.loginsecurity.session.action; import com.lenis0012.bukkit.loginsecurity.LoginSecurity; +import com.lenis0012.bukkit.loginsecurity.LoginSecurityConfig; import com.lenis0012.bukkit.loginsecurity.hashing.Algorithm; import com.lenis0012.bukkit.loginsecurity.session.*; import com.lenis0012.bukkit.loginsecurity.session.exceptions.ProfileRefreshException; import com.lenis0012.bukkit.loginsecurity.storage.PlayerProfile; import java.sql.SQLException; +import java.util.ArrayList; import java.util.logging.Level; public class RegisterAction extends AuthAction { @@ -32,7 +34,17 @@ public AuthMode run(PlayerSession session, ActionResponse response) { final String hash = Algorithm.BCRYPT.hash(password); profile.setPassword(hash); profile.setHashingAlgorithm(Algorithm.BCRYPT.getId()); + profile.setIpAddress(session.getPlayer().getAddress().getAddress().toString()); try { + LoginSecurityConfig config = LoginSecurity.getConfiguration(); + ArrayList ListByIp = plugin.datastore().getProfileRepository().SearchUsersByIP(profile.getIpAddress()); + String ListUsersByIp = ""; + for (PlayerProfile user : ListByIp) { ListUsersByIp += user.getLastName()+" ";} + if (ListByIp.size() >= config.getLimitAccounts()){ + response.setSuccess(false); + response.setErrorMessage( "Accounts limit: "+config.getLimitAccounts()+" \n Registered accounts: "+ListByIp.size()+" \n You have reached the accounts limit, you can enter with: "+ListUsersByIp); + return null; + } plugin.datastore().getProfileRepository().insertBlocking(profile); } catch (SQLException e) { plugin.getLogger().log(Level.SEVERE, "Failed to register user", e);