From bf65a1f9ae309f798b2e11fbf953131efc59a007 Mon Sep 17 00:00:00 2001 From: loki Date: Thu, 9 Apr 2026 00:34:12 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BA=D1=80=D0=B8=D1=82=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D0=B1=D0=B0=D0=B3=D0=B8=20HIG?= =?UTF-8?q?H=20=D0=BF=D1=80=D0=B8=D0=BE=D1=80=D0=B8=D1=82=D0=B5=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Исправлены утечки ResultSet в SQLiteDatabaseManager и PostgreSQLDatabaseManager Все ResultSet теперь закрываются в try-with-resources блоках - Добавлена валидация входных данных reason в ReportCommand Проверка на пустую строку и максимальную длину 500 символов - Исправлен integer overflow в PaginationUtil.calculateStartIndex Добавлена проверка на переполнение при умножении page * pageSize - Добавлены null-проверки в ConfigManager.getMessage Защита от NPE при null элементах в массиве replacements --- .../dev/loki/lorep/command/ReportCommand.java | 13 +++- .../dev/loki/lorep/config/ConfigManager.java | 7 ++- .../database/PostgreSQLDatabaseManager.java | 60 +++++++++--------- .../lorep/database/SQLiteDatabaseManager.java | 62 ++++++++++--------- .../dev/loki/lorep/util/PaginationUtil.java | 10 +++ 5 files changed, 93 insertions(+), 59 deletions(-) diff --git a/src/main/java/dev/loki/lorep/command/ReportCommand.java b/src/main/java/dev/loki/lorep/command/ReportCommand.java index 4f20bf7..9637a1e 100644 --- a/src/main/java/dev/loki/lorep/command/ReportCommand.java +++ b/src/main/java/dev/loki/lorep/command/ReportCommand.java @@ -57,7 +57,18 @@ public class ReportCommand implements CommandExecutor, TabCompleter { String targetName = args[0]; String reason = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); - + + // Validate reason + if (reason.trim().isEmpty()) { + player.sendMessage(plugin.getConfigManager().getMessage("usage")); + return true; + } + + if (reason.length() > 500) { + player.sendMessage("§cПричина слишком длинная! Максимум 500 символов."); + return true; + } + return handleReport(player, targetName, reason); } diff --git a/src/main/java/dev/loki/lorep/config/ConfigManager.java b/src/main/java/dev/loki/lorep/config/ConfigManager.java index e47ad46..c0ac690 100644 --- a/src/main/java/dev/loki/lorep/config/ConfigManager.java +++ b/src/main/java/dev/loki/lorep/config/ConfigManager.java @@ -63,8 +63,13 @@ public class ConfigManager { public String getMessage(String key, String... replacements) { String message = getMessage(key); + if (replacements == null || replacements.length == 0) { + return message; + } for (int i = 0; i < replacements.length - 1; i += 2) { - message = message.replace(replacements[i], replacements[i + 1]); + if (replacements[i] != null && replacements[i + 1] != null) { + message = message.replace(replacements[i], replacements[i + 1]); + } } return message; } diff --git a/src/main/java/dev/loki/lorep/database/PostgreSQLDatabaseManager.java b/src/main/java/dev/loki/lorep/database/PostgreSQLDatabaseManager.java index c3693d9..ed27071 100644 --- a/src/main/java/dev/loki/lorep/database/PostgreSQLDatabaseManager.java +++ b/src/main/java/dev/loki/lorep/database/PostgreSQLDatabaseManager.java @@ -114,18 +114,19 @@ public class PostgreSQLDatabaseManager implements DatabaseManager { public List getReportsForTarget(UUID targetUuid) { String sql = "SELECT * FROM reports WHERE target_uuid = ? ORDER BY created_at DESC"; List reports = new ArrayList<>(); - + try (Connection conn = dataSource.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setString(1, targetUuid.toString()); - ResultSet rs = stmt.executeQuery(); - while (rs.next()) { - reports.add(mapReport(rs)); + try (ResultSet rs = stmt.executeQuery()) { + while (rs.next()) { + reports.add(mapReport(rs)); + } } } catch (SQLException e) { logger.log(Level.SEVERE, "Failed to get reports for target", e); } - + return reports; } @@ -133,54 +134,56 @@ public class PostgreSQLDatabaseManager implements DatabaseManager { public List getAllReports() { String sql = "SELECT * FROM reports ORDER BY created_at DESC"; List reports = new ArrayList<>(); - + try (Connection conn = dataSource.getConnection(); - PreparedStatement stmt = conn.prepareStatement(sql)) { - ResultSet rs = stmt.executeQuery(); + PreparedStatement stmt = conn.prepareStatement(sql); + ResultSet rs = stmt.executeQuery()) { while (rs.next()) { reports.add(mapReport(rs)); } } catch (SQLException e) { logger.log(Level.SEVERE, "Failed to get all reports", e); } - + return reports; } @Override public int getReportCount(UUID targetUuid) { String sql = "SELECT COUNT(*) FROM reports WHERE target_uuid = ?"; - + try (Connection conn = dataSource.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setString(1, targetUuid.toString()); - ResultSet rs = stmt.executeQuery(); - if (rs.next()) { - return rs.getInt(1); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return rs.getInt(1); + } } } catch (SQLException e) { logger.log(Level.SEVERE, "Failed to get report count", e); } - + return 0; } @Override public boolean hasReported(UUID reporterUuid, UUID targetUuid) { String sql = "SELECT COUNT(*) FROM reports WHERE reporter_uuid = ? AND target_uuid = ?"; - + try (Connection conn = dataSource.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setString(1, reporterUuid.toString()); stmt.setString(2, targetUuid.toString()); - ResultSet rs = stmt.executeQuery(); - if (rs.next()) { - return rs.getInt(1) > 0; + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return rs.getInt(1) > 0; + } } } catch (SQLException e) { logger.log(Level.SEVERE, "Failed to check if reported", e); } - + return false; } @@ -188,36 +191,37 @@ public class PostgreSQLDatabaseManager implements DatabaseManager { public List getReportsPaginated(int page, int pageSize) { String sql = "SELECT * FROM reports ORDER BY created_at DESC LIMIT ? OFFSET ?"; List reports = new ArrayList<>(); - + try (Connection conn = dataSource.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setInt(1, pageSize); stmt.setInt(2, page * pageSize); - ResultSet rs = stmt.executeQuery(); - while (rs.next()) { - reports.add(mapReport(rs)); + try (ResultSet rs = stmt.executeQuery()) { + while (rs.next()) { + reports.add(mapReport(rs)); + } } } catch (SQLException e) { logger.log(Level.SEVERE, "Failed to get paginated reports", e); } - + return reports; } @Override public int getTotalReportCount() { String sql = "SELECT COUNT(*) FROM reports"; - + try (Connection conn = dataSource.getConnection(); - PreparedStatement stmt = conn.prepareStatement(sql)) { - ResultSet rs = stmt.executeQuery(); + PreparedStatement stmt = conn.prepareStatement(sql); + ResultSet rs = stmt.executeQuery()) { if (rs.next()) { return rs.getInt(1); } } catch (SQLException e) { logger.log(Level.SEVERE, "Failed to get total report count", e); } - + return 0; } diff --git a/src/main/java/dev/loki/lorep/database/SQLiteDatabaseManager.java b/src/main/java/dev/loki/lorep/database/SQLiteDatabaseManager.java index 2f40280..fc348a0 100644 --- a/src/main/java/dev/loki/lorep/database/SQLiteDatabaseManager.java +++ b/src/main/java/dev/loki/lorep/database/SQLiteDatabaseManager.java @@ -96,17 +96,18 @@ public class SQLiteDatabaseManager implements DatabaseManager { public List getReportsForTarget(UUID targetUuid) { String sql = "SELECT * FROM reports WHERE target_uuid = ? ORDER BY created_at DESC"; List reports = new ArrayList<>(); - - try (PreparedStatement stmt = connection.prepareStatement(sql)) { + + try (PreparedStatement stmt = connection.prepareStatement(sql);) { stmt.setString(1, targetUuid.toString()); - ResultSet rs = stmt.executeQuery(); - while (rs.next()) { - reports.add(mapReport(rs)); + try (ResultSet rs = stmt.executeQuery()) { + while (rs.next()) { + reports.add(mapReport(rs)); + } } } catch (SQLException e) { logger.log(Level.SEVERE, "Failed to get reports for target", e); } - + return reports; } @@ -114,51 +115,53 @@ public class SQLiteDatabaseManager implements DatabaseManager { public List getAllReports() { String sql = "SELECT * FROM reports ORDER BY created_at DESC"; List reports = new ArrayList<>(); - - try (PreparedStatement stmt = connection.prepareStatement(sql)) { - ResultSet rs = stmt.executeQuery(); + + try (PreparedStatement stmt = connection.prepareStatement(sql); + ResultSet rs = stmt.executeQuery()) { while (rs.next()) { reports.add(mapReport(rs)); } } catch (SQLException e) { logger.log(Level.SEVERE, "Failed to get all reports", e); } - + return reports; } @Override public int getReportCount(UUID targetUuid) { String sql = "SELECT COUNT(*) FROM reports WHERE target_uuid = ?"; - + try (PreparedStatement stmt = connection.prepareStatement(sql)) { stmt.setString(1, targetUuid.toString()); - ResultSet rs = stmt.executeQuery(); - if (rs.next()) { - return rs.getInt(1); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return rs.getInt(1); + } } } catch (SQLException e) { logger.log(Level.SEVERE, "Failed to get report count", e); } - + return 0; } @Override public boolean hasReported(UUID reporterUuid, UUID targetUuid) { String sql = "SELECT COUNT(*) FROM reports WHERE reporter_uuid = ? AND target_uuid = ?"; - + try (PreparedStatement stmt = connection.prepareStatement(sql)) { stmt.setString(1, reporterUuid.toString()); stmt.setString(2, targetUuid.toString()); - ResultSet rs = stmt.executeQuery(); - if (rs.next()) { - return rs.getInt(1) > 0; + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return rs.getInt(1) > 0; + } } } catch (SQLException e) { logger.log(Level.SEVERE, "Failed to check if reported", e); } - + return false; } @@ -166,34 +169,35 @@ public class SQLiteDatabaseManager implements DatabaseManager { public List getReportsPaginated(int page, int pageSize) { String sql = "SELECT * FROM reports ORDER BY created_at DESC LIMIT ? OFFSET ?"; List reports = new ArrayList<>(); - + try (PreparedStatement stmt = connection.prepareStatement(sql)) { stmt.setInt(1, pageSize); stmt.setInt(2, page * pageSize); - ResultSet rs = stmt.executeQuery(); - while (rs.next()) { - reports.add(mapReport(rs)); + try (ResultSet rs = stmt.executeQuery()) { + while (rs.next()) { + reports.add(mapReport(rs)); + } } } catch (SQLException e) { logger.log(Level.SEVERE, "Failed to get paginated reports", e); } - + return reports; } @Override public int getTotalReportCount() { String sql = "SELECT COUNT(*) FROM reports"; - - try (PreparedStatement stmt = connection.prepareStatement(sql)) { - ResultSet rs = stmt.executeQuery(); + + try (PreparedStatement stmt = connection.prepareStatement(sql); + ResultSet rs = stmt.executeQuery()) { if (rs.next()) { return rs.getInt(1); } } catch (SQLException e) { logger.log(Level.SEVERE, "Failed to get total report count", e); } - + return 0; } diff --git a/src/main/java/dev/loki/lorep/util/PaginationUtil.java b/src/main/java/dev/loki/lorep/util/PaginationUtil.java index 95eb3eb..d02c549 100644 --- a/src/main/java/dev/loki/lorep/util/PaginationUtil.java +++ b/src/main/java/dev/loki/lorep/util/PaginationUtil.java @@ -3,11 +3,21 @@ package dev.loki.lorep.util; public class PaginationUtil { public static int calculateTotalPages(int totalItems, int pageSize) { + if (pageSize <= 0) { + throw new IllegalArgumentException("pageSize must be positive"); + } if (totalItems <= 0) return 1; return (int) Math.ceil((double) totalItems / pageSize); } public static int calculateStartIndex(int page, int pageSize) { + if (page < 0 || pageSize <= 0) { + return 0; + } + // Check for overflow + if (page > Integer.MAX_VALUE / pageSize) { + return Integer.MAX_VALUE; + } return page * pageSize; }