aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Server/Access/BanManager.h
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.Server/Access/BanManager.h')
-rw-r--r--Minecraft.Server/Access/BanManager.h106
1 files changed, 106 insertions, 0 deletions
diff --git a/Minecraft.Server/Access/BanManager.h b/Minecraft.Server/Access/BanManager.h
new file mode 100644
index 00000000..59103bec
--- /dev/null
+++ b/Minecraft.Server/Access/BanManager.h
@@ -0,0 +1,106 @@
+#pragma once
+
+#include <string>
+#include <vector>
+
+namespace ServerRuntime
+{
+ namespace Access
+ {
+ /**
+ * Information shared with player bans and IP bans
+ * プレイヤーBANとIP BANで共有する情報
+ */
+ struct BanMetadata
+ {
+ std::string created;
+ std::string source;
+ std::string expires;
+ std::string reason;
+ };
+
+ struct BannedPlayerEntry
+ {
+ std::string xuid;
+ std::string name;
+ BanMetadata metadata;
+ };
+
+ struct BannedIpEntry
+ {
+ std::string ip;
+ BanMetadata metadata;
+ };
+
+ /**
+ * Dedicated server BAN file manager.
+ *
+ * Files:
+ * - banned-players.json
+ * - banned-ips.json
+ *
+ * This class only handles storage/caching.
+ * Connection-time hooks are wired separately.
+ */
+ class BanManager
+ {
+ public:
+ /**
+ * **Create Ban Manager**
+ *
+ * Binds the manager to the directory that stores the dedicated-server access files
+ * Dedicated Server のアクセスファイル配置先を設定する
+ */
+ explicit BanManager(const std::string &baseDirectory = ".");
+
+ /**
+ * Creates empty JSON array files when the dedicated server starts without persisted access data
+ * BANファイルが無い初回起動時に空JSONを用意する
+ */
+ bool EnsureBanFilesExist() const;
+ bool Reload();
+ bool Save() const;
+
+ bool LoadPlayers(std::vector<BannedPlayerEntry> *outEntries) const;
+ bool LoadIps(std::vector<BannedIpEntry> *outEntries) const;
+ bool SavePlayers(const std::vector<BannedPlayerEntry> &entries) const;
+ bool SaveIps(const std::vector<BannedIpEntry> &entries) const;
+
+ const std::vector<BannedPlayerEntry> &GetBannedPlayers() const;
+ const std::vector<BannedIpEntry> &GetBannedIps() const;
+ /**
+ * Copies only currently active player BAN entries so expired metadata does not leak into command output
+ * 期限切れを除いた有効なプレイヤーBAN一覧を複製取得する
+ */
+ bool SnapshotBannedPlayers(std::vector<BannedPlayerEntry> *outEntries) const;
+ /**
+ * Copies only currently active IP BAN entries so expired metadata does not leak into command output
+ * 期限切れを除いた有効なIP BAN一覧を複製取得する
+ */
+ bool SnapshotBannedIps(std::vector<BannedIpEntry> *outEntries) const;
+
+ bool IsPlayerBannedByXuid(const std::string &xuid) const;
+ bool IsIpBanned(const std::string &ip) const;
+
+ bool AddPlayerBan(const BannedPlayerEntry &entry);
+ bool AddIpBan(const BannedIpEntry &entry);
+ bool RemovePlayerBanByXuid(const std::string &xuid);
+ bool RemoveIpBan(const std::string &ip);
+
+ std::string GetBannedPlayersFilePath() const;
+ std::string GetBannedIpsFilePath() const;
+
+ static BanMetadata BuildDefaultMetadata(const char *source = "Server");
+
+ private:
+ static void NormalizeMetadata(BanMetadata *metadata);
+
+ std::string BuildPath(const char *fileName) const;
+
+ private:
+ std::string m_baseDirectory;
+ std::vector<BannedPlayerEntry> m_bannedPlayers;
+ std::vector<BannedIpEntry> m_bannedIps;
+ };
+ }
+}