Skip to content
Merged
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 @@ -19,6 +19,7 @@
import me.confuser.banmanager.common.storage.global.*;
import me.confuser.banmanager.common.storage.mariadb.MariaDBDatabase;
import me.confuser.banmanager.common.storage.mysql.MySQLDatabase;
import me.confuser.banmanager.common.util.DriverManagerUtil;

import java.io.File;
import java.io.IOException;
Expand Down Expand Up @@ -282,6 +283,11 @@ public boolean setupConnections() throws SQLException {
globalConn = createConnection(config.getGlobalDb(), "bm-global");
}

// Deregister BanManager's relocated drivers from DriverManager to prevent
// other plugins from accidentally using them. HikariCP caches drivers internally
// so this won't affect reconnections.
DriverManagerUtil.deregisterRelocatedDrivers();

return true;
}

Expand Down Expand Up @@ -309,6 +315,7 @@ public ConnectionSource createConnection(DatabaseConfig dbConfig, String type) t
DatabaseType databaseType;

if (dbConfig.getStorageType().equals("mariadb")) {
ds.setDriverClassName("me.confuser.banmanager.common.mariadb.Driver");
databaseType = new MariaDBDatabase();
} else if (dbConfig.getStorageType().equals("mysql")) {
// Forcefully specify the newer driver
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import me.confuser.banmanager.common.ipaddr.IPAddress;
import me.confuser.banmanager.common.storage.conversion.AdvancedBan;
import me.confuser.banmanager.common.storage.conversion.H2;
import me.confuser.banmanager.common.storage.conversion.SimpleWarnings;
import me.confuser.banmanager.common.util.IPUtils;
import me.confuser.banmanager.common.util.Message;
import me.confuser.banmanager.common.util.UUIDUtils;
Expand All @@ -31,7 +30,6 @@ public class ImportCommand extends CommonCommand {
add("players");
add("ip");
add("ips");
add("simplewarnings");
add("advancedban");
add("h2");
}};
Expand Down Expand Up @@ -66,8 +64,6 @@ public boolean onCommand(CommonSender sender, CommandParser parser) {
finishedMessage = Message.getString("import.ip.finished");

importIps();
} else if (parser.args[0].startsWith("simplew")) {
new SimpleWarnings(getPlugin());
} else if (parser.args[0].startsWith("advancedb")) {
if (parser.args.length < 5) {
sender.sendMessage("/bmimport advancedban <host> <port> <databaseName> [username] [password]");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,45 +2,41 @@

import me.confuser.banmanager.common.BanManagerPlugin;
import me.confuser.banmanager.common.commands.BanIpCommand;
import me.confuser.banmanager.common.configs.DatabaseConfig;
import me.confuser.banmanager.common.data.*;
import me.confuser.banmanager.common.ipaddr.IPAddress;
import me.confuser.banmanager.common.ormlite.dao.CloseableIterator;
import me.confuser.banmanager.common.ormlite.jdbc.JdbcPooledConnectionSource;
import me.confuser.banmanager.common.ormlite.stmt.StatementBuilder;
import me.confuser.banmanager.common.ormlite.support.ConnectionSource;
import me.confuser.banmanager.common.ormlite.support.DatabaseConnection;
import me.confuser.banmanager.common.ormlite.support.DatabaseResults;
import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig;

import java.io.File;
import java.sql.SQLException;
import java.util.HashMap;

public class AdvancedBan implements IConverter {
private JdbcPooledConnectionSource connection;
private ConnectionSource connection;
private BanManagerPlugin plugin;
private String host;
private String port;
private String database;
private String username;
private String password;

public AdvancedBan(BanManagerPlugin plugin, String[] args) {
this.plugin = plugin;
this.host = args[1];
this.port = args[2];
this.database = args[3];
this.username = args[4];

if (args.length == 6) this.password = args[5];
String host = args[1];
int port = Integer.parseInt(args[2]);
String database = args[3];
String username = args[4];
String password = args.length == 6 ? args[5] : "";

try {
connection = new JdbcPooledConnectionSource("jdbc:mysql://" + host + ":" + port + "/" + database, username, password);
} catch (SQLException e) {
e.printStackTrace();
plugin.getLogger().severe("Failed to connect to AdvancedBan database");
return;
}
AdvancedBanConfig config = new AdvancedBanConfig(
"mysql", host, port, database, username, password,
false, false, true, true, 2, 0, 1800000, 30000,
new HashMap<>(), plugin.getDataFolder()
);

connection.setMaxConnectionsFree(1);
try {
connection.initialize();
connection = plugin.createConnection(config, "advancedban-import");
} catch (SQLException e) {
e.printStackTrace();
plugin.getLogger().severe("Failed to connect to AdvancedBan database");
Expand Down Expand Up @@ -189,4 +185,17 @@ public void importIpBans() {
@Override
public void importIpRangeBans() {
}

/**
* Config class for AdvancedBan database connection.
*/
static class AdvancedBanConfig extends DatabaseConfig {
public AdvancedBanConfig(String storageType, String host, int port, String name, String user, String password,
boolean useSSL, boolean verifyServerCertificate, boolean allowPublicKeyRetrieval,
boolean isEnabled, int maxConnections, int leakDetection, int maxLifetime,
int connectionTimeout, HashMap<String, DatabaseTableConfig<?>> tables, File dataFolder) {
super(storageType, host, port, name, user, password, useSSL, verifyServerCertificate, allowPublicKeyRetrieval,
isEnabled, maxConnections, leakDetection, maxLifetime, connectionTimeout, tables, dataFolder);
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package me.confuser.banmanager.common.util;

import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

/**
* Utility class to manage JDBC driver registration.
* Prevents BanManager's relocated drivers from leaking into the global DriverManager
* where other plugins might accidentally use them.
*/
public class DriverManagerUtil {

private static final String BM_DRIVER_PREFIX = "me.confuser.banmanager.common.";

/**
* Deregisters all BanManager relocated drivers from DriverManager.
* This should be called after HikariCP pools are initialized, as HikariCP
* caches the driver internally and doesn't need DriverManager for reconnections.
*/
public static void deregisterRelocatedDrivers() {
// Collect drivers to deregister first to avoid concurrent modification
List<Driver> driversToDeregister = new ArrayList<>();
Enumeration<Driver> drivers = DriverManager.getDrivers();

while (drivers.hasMoreElements()) {
Driver driver = drivers.nextElement();
String driverClassName = driver.getClass().getName();

if (driverClassName.startsWith(BM_DRIVER_PREFIX)) {
driversToDeregister.add(driver);
}
}

// Now deregister collected drivers
for (Driver driver : driversToDeregister) {
try {
DriverManager.deregisterDriver(driver);
} catch (SQLException e) {
// Silently ignore - driver may have already been deregistered
}
}
}
}