Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,19 @@ public class LoginSecurityConfig extends AbstractConfig {
@ConfigKey(path = "join.hide-inventory-safe")
private boolean hideInventory = false;

/**
* Ban settings.
*/
@ConfigHeader("When enabled, automatically bans IPs trying to join as already logged in users")
@ConfigKey(path = "join.ban.simultaneous-login")
private boolean banSimultaneous = false;
@ConfigHeader("Notifies OPs in chat about LoginSecurity autobans")
@ConfigKey(path = "join.ban.notify-ops")
private boolean banNotifyOps = true;
@ConfigHeader("When enabled, automatically bans IPs which exceed 4 login tries")
@ConfigKey(path = "join.ban.bruteforce-attempt")
private boolean banBruteforceAttempt = false;

/**
* Username settings.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@
import com.lenis0012.bukkit.loginsecurity.session.action.LoginAction;
import com.lenis0012.bukkit.loginsecurity.storage.PlayerProfile;
import com.lenis0012.bukkit.loginsecurity.util.MetaData;
import com.lenis0012.bukkit.loginsecurity.util.OpNotifier;
import com.lenis0012.pluginutils.command.Command;
import org.bukkit.Bukkit;
import org.bukkit.BanList;
import org.bukkit.entity.Player;

import java.util.logging.Level;
Expand All @@ -35,7 +37,18 @@ public void execute() {
LoginSecurityConfig config = LoginSecurity.getConfiguration();
int tries = MetaData.incrementAndGet(player, "ls_login_tries");
if(tries > config.getMaxLoginTries()) {
player.kickPlayer("[LoginSecurity] " + translate(LOGIN_TRIES_EXCEEDED).param("max", config.getMaxLoginTries()).toString());
if(config.isBanBruteforceAttempt()) {
if(config.isBanNotifyOps()) {
OpNotifier.notify("[LoginSecurity] " + player.getAddress().getHostString() +
" " + translate(BAN_BRUTEFORCE_ATTEMPT) + player.getName());
}
Bukkit.getBanList(BanList.Type.IP).addBan(player.getAddress().getHostString(),
translate(BAN_BRUTEFORCE_ATTEMPT).toString() + player.getName(),
null, "LoginSecurity");
player.kickPlayer("[LoginSecurity] " + translate(BAN_BRUTEFORCE_ATTEMPT) + player.getName());
} else {
player.kickPlayer("[LoginSecurity] " + translate(LOGIN_TRIES_EXCEEDED).param("max", config.getMaxLoginTries()).toString());
}
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@
import com.lenis0012.bukkit.loginsecurity.storage.PlayerProfile;
import com.lenis0012.bukkit.loginsecurity.util.MetaData;
import com.lenis0012.bukkit.loginsecurity.util.UserIdMode;
import com.lenis0012.bukkit.loginsecurity.util.OpNotifier;
import io.papermc.lib.PaperLib;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.BanList;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
Expand Down Expand Up @@ -66,21 +68,36 @@ public PlayerListener(GeneralModule general) {

@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event) {
final LoginSecurityConfig config = LoginSecurity.getConfiguration();
// Check if player already online
for(Player player : Bukkit.getOnlinePlayers()) {
if(player.getName().equalsIgnoreCase(event.getName())) {
PlayerSession session = LoginSecurity.getSessionManager().getPlayerSession(player);
if(session.isAuthorized()) {
event.setLoginResult(Result.KICK_OTHER);
event.setKickMessage("[LoginSecurity] " + translate(KICK_ALREADY_ONLINE));
if(config.isBanSimultaneous()) {
BanList banlist = Bukkit.getBanList(BanList.Type.IP);
if(!banlist.isBanned(event.getAddress().getHostAddress())) {
banlist.addBan(event.getAddress().getHostAddress(),
translate(BAN_ALREADY_ONLINE).toString() + player.getName(),
null, "LoginSecurity");
if(config.isBanNotifyOps()) {
OpNotifier.notify("[LoginSecurity] " + event.getAddress().getHostAddress() +
" " + translate(BAN_ALREADY_ONLINE) + player.getName());
}
}
event.setLoginResult(Result.KICK_BANNED);
event.setKickMessage("[LoginSecurity] " + translate(BAN_ALREADY_ONLINE) + player.getName());
} else {
event.setLoginResult(Result.KICK_OTHER);
event.setKickMessage("[LoginSecurity] " + translate(KICK_ALREADY_ONLINE));
}
return;
}
}
}

// Verify name
final String name = event.getName();
final LoginSecurityConfig config = LoginSecurity.getConfiguration();
if(config.isFilterSpecialChars() && !name.replaceAll("[^a-zA-Z0-9_]", "").equals(name)) {
event.setLoginResult(Result.KICK_OTHER);
event.setKickMessage("[LoginSecurity] " + translate(KICK_USERNAME_CHARS));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,12 @@ public enum LanguageKeys {
KICK_USERNAME_CHARS("kickUsernameChars"),
KICK_USERNAME_LENGTH("kickUsernameLength"),
KICK_TIME_OUT("kickTimeOut"),
KICK_USERNAME_REGISTERED("kickUsernameRegistered");
KICK_USERNAME_REGISTERED("kickUsernameRegistered"),
/**
* Ban messages
*/
BAN_ALREADY_ONLINE("banAlreadyOnline"),
BAN_BRUTEFORCE_ATTEMPT("banBruteforceAttempt");

private final String value;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.lenis0012.bukkit.loginsecurity.util;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;

public class OpNotifier {
/**
* Send out a message to all server OPs
*/
public static void notify(String message) {
for (Player p : Bukkit.getOnlinePlayers()) {
if (p.isOp()) {
p.sendMessage(message);
}
}
}
}