package games.strategy.engine.lobby.server;
import java.util.Date;
import games.strategy.engine.lobby.server.userDB.BannedMacController;
import games.strategy.engine.lobby.server.userDB.BannedUsernameController;
import games.strategy.engine.lobby.server.userDB.DBUser;
import games.strategy.engine.lobby.server.userDB.DBUserController;
import games.strategy.engine.lobby.server.userDB.MutedMacController;
import games.strategy.engine.lobby.server.userDB.MutedUsernameController;
import games.strategy.engine.message.MessageContext;
import games.strategy.engine.message.RemoteName;
import games.strategy.net.INode;
import games.strategy.net.IServerMessenger;
import games.strategy.net.Messengers;
import games.strategy.util.MD5Crypt;
public class ModeratorController extends AbstractModeratorController {
public ModeratorController(final IServerMessenger serverMessenger, final Messengers messengers) {
super(serverMessenger, messengers);
}
@Override
public void banUsername(final INode node, final Date banExpires) {
assertUserIsAdmin();
if (isPlayerAdmin(node)) {
throw new IllegalStateException("Can't ban an admin");
}
final INode modNode = MessageContext.getSender();
final String mac = getNodeMacAddress(node);
new BannedUsernameController().addBannedUsername(getRealName(node), banExpires);
final String banUntil = (banExpires == null ? "forever" : banExpires.toString());
s_logger.info(String.format(
"User was banned from the lobby(Username ban). "
+ "Username: %s IP: %s Mac: %s Mod Username: %s Mod IP: %s Mod Mac: %s Expires: %s",
node.getName(), node.getAddress().getHostAddress(), mac, modNode.getName(),
modNode.getAddress().getHostAddress(), getNodeMacAddress(modNode), banUntil));
}
@Override
public void banIp(final INode node, final Date banExpires) {
// TODO: remove once we confirm no backwards compat issues
}
@Override
public void banMac(final INode node, final Date banExpires) {
assertUserIsAdmin();
if (isPlayerAdmin(node)) {
throw new IllegalStateException("Can't ban an admin");
}
final INode modNode = MessageContext.getSender();
final String mac = getNodeMacAddress(node);
new BannedMacController().addBannedMac(mac, banExpires);
final String banUntil = (banExpires == null ? "forever" : banExpires.toString());
s_logger.info(String.format(
"User was banned from the lobby(Mac ban). "
+ "Username: %s IP: %s Mac: %s Mod Username: %s Mod IP: %s Mod Mac: %s Expires: %s",
node.getName(), node.getAddress().getHostAddress(), mac, modNode.getName(),
modNode.getAddress().getHostAddress(), getNodeMacAddress(modNode), banUntil));
}
@Override
public void banMac(final INode node, final String hashedMac, final Date banExpires) {
assertUserIsAdmin();
if (isPlayerAdmin(node)) {
throw new IllegalStateException("Can't ban an admin");
}
final INode modNode = MessageContext.getSender();
new BannedMacController().addBannedMac(hashedMac, banExpires);
final String banUntil = (banExpires == null ? "forever" : banExpires.toString());
s_logger.info(String.format(
"User was banned from the lobby(Mac ban). "
+ "Username: %s IP: %s Mac: %s Mod Username: %s Mod IP: %s Mod Mac: %s Expires: %s",
node.getName(), node.getAddress().getHostAddress(), hashedMac, modNode.getName(),
modNode.getAddress().getHostAddress(), getNodeMacAddress(modNode), banUntil));
}
@Override
public void muteUsername(final INode node, final Date muteExpires) {
assertUserIsAdmin();
if (isPlayerAdmin(node)) {
throw new IllegalStateException("Can't mute an admin");
}
final INode modNode = MessageContext.getSender();
final String mac = getNodeMacAddress(node);
final String realName = getRealName(node);
new MutedUsernameController().addMutedUsername(realName, muteExpires);
m_serverMessenger.NotifyUsernameMutingOfPlayer(realName, muteExpires);
final String muteUntil = (muteExpires == null ? "forever" : muteExpires.toString());
s_logger.info(String.format(
"User was muted on the lobby(Username mute). "
+ "Username: %s IP: %s Mac: %s Mod Username: %s Mod IP: %s Mod Mac: %s Expires: %s",
node.getName(), node.getAddress().getHostAddress(), mac, modNode.getName(),
modNode.getAddress().getHostAddress(), getNodeMacAddress(modNode), muteUntil));
}
@Override
public void muteIp(final INode node, final Date muteExpires) {
// TODO: remove once we confirm no backwards compat issues
}
@Override
public void muteMac(final INode node, final Date muteExpires) {
assertUserIsAdmin();
if (isPlayerAdmin(node)) {
throw new IllegalStateException("Can't mute an admin");
}
final INode modNode = MessageContext.getSender();
final String mac = getNodeMacAddress(node);
new MutedMacController().addMutedMac(mac, muteExpires);
m_serverMessenger.NotifyMacMutingOfPlayer(mac, muteExpires);
final String muteUntil = (muteExpires == null ? "forever" : muteExpires.toString());
s_logger.info(String.format(
"User was muted on the lobby(Mac mute). "
+ "Username: %s IP: %s Mac: %s Mod Username: %s Mod IP: %s Mod Mac: %s Expires: %s",
node.getName(), node.getAddress().getHostAddress(), mac, modNode.getName(),
modNode.getAddress().getHostAddress(), getNodeMacAddress(modNode), muteUntil));
}
@Override
public void boot(final INode node) {
assertUserIsAdmin();
// You can't boot the server node
if (m_serverMessenger.getServerNode().equals(node)) {
throw new IllegalStateException("Cannot boot server node");
}
final INode modNode = MessageContext.getSender();
final String mac = getNodeMacAddress(node);
m_serverMessenger.removeConnection(node);
s_logger.info(String.format(
"User was booted from the lobby. Username: %s IP: %s Mac: %s Mod Username: %s Mod IP: %s Mod Mac: %s",
node.getName(), node.getAddress().getHostAddress(), mac, modNode.getName(),
modNode.getAddress().getHostAddress(), getNodeMacAddress(modNode)));
}
@Override
public String getHeadlessHostBotSalt(final INode node) {
assertUserIsAdmin();
if (m_serverMessenger.getServerNode().equals(node)) {
throw new IllegalStateException("Cannot do this for server node");
}
final INode modNode = MessageContext.getSender();
final String mac = getNodeMacAddress(node);
s_logger.info(String.format(
"Getting salt for Headless HostBot. Host: %s IP: %s Mac: %s Mod Username: %s Mod IP: %s Mod Mac: %s",
node.getName(), node.getAddress().getHostAddress(), mac, modNode.getName(),
modNode.getAddress().getHostAddress(), getNodeMacAddress(modNode)));
final RemoteName remoteName = RemoteHostUtils.getRemoteHostUtilsName(node);
final IRemoteHostUtils remoteHostUtils =
(IRemoteHostUtils) m_allMessengers.getRemoteMessenger().getRemote(remoteName);
return remoteHostUtils.getSalt();
}
@Override
public String getChatLogHeadlessHostBot(final INode node, final String hashedPassword, final String salt) {
assertUserIsAdmin();
if (m_serverMessenger.getServerNode().equals(node)) {
throw new IllegalStateException("Cannot do this for server node");
}
final INode modNode = MessageContext.getSender();
final String mac = getNodeMacAddress(node);
final RemoteName remoteName = RemoteHostUtils.getRemoteHostUtilsName(node);
final IRemoteHostUtils remoteHostUtils =
(IRemoteHostUtils) m_allMessengers.getRemoteMessenger().getRemote(remoteName);
final String response = remoteHostUtils.getChatLogHeadlessHostBot(hashedPassword, salt);
s_logger.info(String.format(
((response == null || response.equals("Invalid password!")) ? "Failed" : "Successful")
+ " Remote get Chat Log of Headless HostBot. "
+ "Host: %s IP: %s Mac: %s Mod Username: %s Mod IP: %s Mod Mac: %s",
node.getName(), node.getAddress().getHostAddress(), mac, modNode.getName(),
modNode.getAddress().getHostAddress(), getNodeMacAddress(modNode)));
return response;
}
@Override
public String mutePlayerHeadlessHostBot(final INode node, final String playerNameToBeMuted, final int minutes,
final String hashedPassword, final String salt) {
assertUserIsAdmin();
if (m_serverMessenger.getServerNode().equals(node)) {
throw new IllegalStateException("Cannot do this for server node");
}
final INode modNode = MessageContext.getSender();
final String mac = getNodeMacAddress(node);
final RemoteName remoteName = RemoteHostUtils.getRemoteHostUtilsName(node);
final IRemoteHostUtils remoteHostUtils =
(IRemoteHostUtils) m_allMessengers.getRemoteMessenger().getRemote(remoteName);
final String response =
remoteHostUtils.mutePlayerHeadlessHostBot(playerNameToBeMuted, minutes, hashedPassword, salt);
s_logger.info(String.format(
(response == null ? "Successful" : "Failed (" + response + ")") + " Remote Mute of " + playerNameToBeMuted
+ " for " + minutes
+ " minutes In Headless HostBot. Host: %s IP: %s Mac: %s Mod Username: %s Mod IP: %s Mod Mac: %s",
node.getName(), node.getAddress().getHostAddress(), mac, modNode.getName(),
modNode.getAddress().getHostAddress(), getNodeMacAddress(modNode)));
return response;
}
@Override
public String bootPlayerHeadlessHostBot(final INode node, final String playerNameToBeBooted,
final String hashedPassword, final String salt) {
assertUserIsAdmin();
if (m_serverMessenger.getServerNode().equals(node)) {
throw new IllegalStateException("Cannot do this for server node");
}
final INode modNode = MessageContext.getSender();
final String mac = getNodeMacAddress(node);
final RemoteName remoteName = RemoteHostUtils.getRemoteHostUtilsName(node);
final IRemoteHostUtils remoteHostUtils =
(IRemoteHostUtils) m_allMessengers.getRemoteMessenger().getRemote(remoteName);
final String response = remoteHostUtils.bootPlayerHeadlessHostBot(playerNameToBeBooted, hashedPassword, salt);
s_logger.info(String.format(
(response == null ? "Successful" : "Failed (" + response + ")") + " Remote Boot of " + playerNameToBeBooted
+ " In Headless HostBot. Host: %s IP: %s Mac: %s Mod Username: %s Mod IP: %s Mod Mac: %s",
node.getName(), node.getAddress().getHostAddress(), mac, modNode.getName(),
modNode.getAddress().getHostAddress(), getNodeMacAddress(modNode)));
return response;
}
@Override
public String banPlayerHeadlessHostBot(final INode node, final String playerNameToBeBanned, final int hours,
final String hashedPassword, final String salt) {
assertUserIsAdmin();
if (m_serverMessenger.getServerNode().equals(node)) {
throw new IllegalStateException("Cannot do this for server node");
}
final INode modNode = MessageContext.getSender();
final String mac = getNodeMacAddress(node);
final RemoteName remoteName = RemoteHostUtils.getRemoteHostUtilsName(node);
final IRemoteHostUtils remoteHostUtils =
(IRemoteHostUtils) m_allMessengers.getRemoteMessenger().getRemote(remoteName);
final String response = remoteHostUtils.banPlayerHeadlessHostBot(playerNameToBeBanned, hours, hashedPassword, salt);
s_logger.info(String.format(
(response == null ? "Successful" : "Failed (" + response + ")") + " Remote Ban of " + playerNameToBeBanned
+ " for " + hours
+ "hours In Headless HostBot. Host: %s IP: %s Mac: %s Mod Username: %s Mod IP: %s Mod Mac: %s",
node.getName(), node.getAddress().getHostAddress(), mac, modNode.getName(),
modNode.getAddress().getHostAddress(), getNodeMacAddress(modNode)));
return response;
}
@Override
public String stopGameHeadlessHostBot(final INode node, final String hashedPassword, final String salt) {
assertUserIsAdmin();
if (m_serverMessenger.getServerNode().equals(node)) {
throw new IllegalStateException("Cannot do this for server node");
}
final INode modNode = MessageContext.getSender();
final String mac = getNodeMacAddress(node);
final RemoteName remoteName = RemoteHostUtils.getRemoteHostUtilsName(node);
final IRemoteHostUtils remoteHostUtils =
(IRemoteHostUtils) m_allMessengers.getRemoteMessenger().getRemote(remoteName);
final String response = remoteHostUtils.stopGameHeadlessHostBot(hashedPassword, salt);
s_logger.info(String.format(
(response == null ? "Successful" : "Failed (" + response + ")")
+ " Remote Stopgame of Headless HostBot. Host: %s IP: %s Mac: %s Mod Username: %s Mod IP: %s Mod Mac: %s",
node.getName(), node.getAddress().getHostAddress(), mac, modNode.getName(),
modNode.getAddress().getHostAddress(), getNodeMacAddress(modNode)));
return response;
}
@Override
public String shutDownHeadlessHostBot(final INode node, final String hashedPassword, final String salt) {
assertUserIsAdmin();
if (m_serverMessenger.getServerNode().equals(node)) {
throw new IllegalStateException("Cannot shutdown server node");
}
final INode modNode = MessageContext.getSender();
final String mac = getNodeMacAddress(node);
s_logger.info(String.format(
"Started Remote Shutdown of Headless HostBot. Host: %s IP: %s Mac: %s Mod Username: %s Mod IP: %s Mod Mac: %s",
node.getName(), node.getAddress().getHostAddress(), mac, modNode.getName(),
modNode.getAddress().getHostAddress(), getNodeMacAddress(modNode)));
final RemoteName remoteName = RemoteHostUtils.getRemoteHostUtilsName(node);
final IRemoteHostUtils remoteHostUtils =
(IRemoteHostUtils) m_allMessengers.getRemoteMessenger().getRemote(remoteName);
final String response = remoteHostUtils.shutDownHeadlessHostBot(hashedPassword, salt);
s_logger.info(String.format(
(response == null ? "Successful" : "Failed (" + response + ")")
+ " Remote Shutdown of Headless HostBot. "
+ "Username: %s IP: %s Mac: %s Mod Username: %s Mod IP: %s Mod Mac: %s",
node.getName(), node.getAddress().getHostAddress(), mac, modNode.getName(),
modNode.getAddress().getHostAddress(), getNodeMacAddress(modNode)));
return response;
}
private void assertUserIsAdmin() {
if (!isAdmin()) {
throw new IllegalStateException("Not an admin");
}
}
@Override
public boolean isAdmin() {
final INode node = MessageContext.getSender();
return isPlayerAdmin(node);
}
@Override
public boolean isPlayerAdmin(final INode node) {
final String name = getRealName(node);
final DBUserController controller = new DBUserController();
final DBUser user = controller.getUser(name);
if (user == null) {
return false;
}
return user.isAdmin();
}
@Override
public String getInformationOn(final INode node) {
assertUserIsAdmin();
final String mac = getNodeMacAddress(node);
final StringBuilder builder = new StringBuilder();
builder.append("Name: ").append(node.getName());
builder.append("\r\nHost Name: ").append(node.getAddress().getHostName());
builder.append("\r\nIP Address: ").append(node.getAddress().getHostAddress());
builder.append("\r\nPort: ").append(node.getPort());
builder.append("\r\nHashed Mac: ")
.append((mac != null && mac.startsWith(MD5Crypt.MAGIC + "MH$") ? mac.substring(6) : mac + " (Invalid)"));
builder.append("\r\nAliases: ").append(getAliasesFor(node));
return builder.toString();
}
@Override
public String getHostConnections(final INode node) {
assertUserIsAdmin();
if (m_serverMessenger.getServerNode().equals(node)) {
throw new IllegalStateException("Cannot do this for server node");
}
final RemoteName remoteName = RemoteHostUtils.getRemoteHostUtilsName(node);
final IRemoteHostUtils remoteHostUtils =
(IRemoteHostUtils) m_allMessengers.getRemoteMessenger().getRemote(remoteName);
final String response = remoteHostUtils.getConnections();
return response;
}
@Override
public String setPassword(final INode node, final String hashedPassword) {
// TODO: remove once we confirm no backwards compat issues
return "";
}
}