From c8ab85631325f10371cfcec9c33ea6b8225a53f1 Mon Sep 17 00:00:00 2001 From: Ziggeh Date: Mon, 11 Aug 2014 08:28:38 +0200 Subject: [PATCH] Changed admin system --- accesslevels/dev.txt | 5 ++ nge.backup | Bin 59392 -> 37072 bytes scripts/commands/giveitem.py | 5 +- scripts/commands/setgodmode.py | 10 --- .../terminal/city_maintenance_terminal.py | 2 +- src/main/NGECore.java | 8 +-- src/protocol/swg/LoginClusterStatus.java | 10 ++- src/resources/common/Forager.java | 2 +- .../objects/building/BuildingObject.java | 2 +- src/services/AdminService.java | 68 ++++++++++++++++++ src/services/CharacterService.java | 3 +- src/services/ConnectionService.java | 2 - src/services/LoginService.java | 28 -------- src/services/command/BaseSWGCommand.java | 5 +- src/services/command/CommandService.java | 59 +++++++++++---- src/services/housing/HousingService.java | 2 +- src/services/resources/HarvesterService.java | 2 +- 17 files changed, 140 insertions(+), 73 deletions(-) create mode 100644 accesslevels/dev.txt create mode 100644 src/services/AdminService.java diff --git a/accesslevels/dev.txt b/accesslevels/dev.txt new file mode 100644 index 00000000..048df7ed --- /dev/null +++ b/accesslevels/dev.txt @@ -0,0 +1,5 @@ +findplayer +killplayer +setgodmode +invulnerable +server \ No newline at end of file diff --git a/nge.backup b/nge.backup index 1a761380f87a73eae814d2f3906a127c788c71a3..3091c7ffae44ec37c804aef0255c8ce44714baf7 100644 GIT binary patch delta 23093 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 L57cD<00000gR4(L literal 59392 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 1: arg2 = commandArgs[1] - - if actor.getClient() and actor.getClient().isGM() == False: - return - + if not commandString.startswith('object/tangible') and not commandString.startswith('object/weapon'): return diff --git a/scripts/commands/setgodmode.py b/scripts/commands/setgodmode.py index 49f3cf40..dd42674f 100644 --- a/scripts/commands/setgodmode.py +++ b/scripts/commands/setgodmode.py @@ -36,16 +36,6 @@ def run(core, actor, target, commandString): if len(commandArgs) > 5: arg5 = commandArgs[5] - if not command: - return - - if actor.getClient().isGM() is False: - return - - if playerObject.getGodLevel() == 0: - actor.addAbility("admin") - playerObject.setGodLevel(50) - if command == 'giveExperience' and arg1: core.playerService.giveExperience(actor, int(arg1)) diff --git a/scripts/radial/terminal/city_maintenance_terminal.py b/scripts/radial/terminal/city_maintenance_terminal.py index 50259cfa..b16bb4be 100644 --- a/scripts/radial/terminal/city_maintenance_terminal.py +++ b/scripts/radial/terminal/city_maintenance_terminal.py @@ -34,7 +34,7 @@ def createRadial(core, owner, target, radials): if owner.getPlayerObject().getCitizenship() != 3 and core.playerCityService.getPlayerCity(owner) == city: radials.add(RadialOptions(2, 230, 0, '@city/city:revoke_citizenship')) - if owner.getClient().isGM(): + if core.adminService.getAccessLevelFromDB(actor.getClient().getAccountId()) is not None: radials.add(RadialOptions(2, 231, 0, 'Add 10 citizens')) radials.add(RadialOptions(2, 232, 0, 'Deduct 10 citizens')) diff --git a/src/main/NGECore.java b/src/main/NGECore.java index 990371b9..1bde5b9e 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -65,6 +65,7 @@ import services.ConversationService; import services.EntertainmentService; import services.GroupService; import services.housing.HousingService; +import services.AdminService; import services.BrowserService; import services.InstanceService; import services.LoginService; @@ -216,6 +217,7 @@ public class NGECore { public BrowserService browserService; //public BattlefieldService battlefieldService; public InvasionService invasionService; + public AdminService adminService; // Login Server public NetworkDispatch loginDispatch; @@ -503,10 +505,7 @@ public class NGECore { terrainService.addPlanet(43, "space_tatooine", "terrain/space_tatooine.trn", true); terrainService.addPlanet(44, "space_tatooine_2", "terrain/space_tatooine_2.trn", true); terrainService.addPlanet(45, "space_yavin4", "terrain/space_yavin4.trn", true);*/ - //PSWG New Content Terrains (WARNING Keep commented out unless you have the current build of kaas!) - - //terrainService.addPlanet(46, "kaas", "terrain/kaas.trn", true); - + //end terrainList if (options.getInt("LOAD.RESOURCE.SYSTEM") > 0) { @@ -567,6 +566,7 @@ public class NGECore { browserService = new BrowserService(this); //battlefieldService = new BattlefieldService(this); + adminService = new AdminService(this); DevLogQueuer devLogQueuer = new DevLogQueuer(); diff --git a/src/protocol/swg/LoginClusterStatus.java b/src/protocol/swg/LoginClusterStatus.java index 725a8c8b..4b6bf5ec 100644 --- a/src/protocol/swg/LoginClusterStatus.java +++ b/src/protocol/swg/LoginClusterStatus.java @@ -22,8 +22,13 @@ package protocol.swg; import java.nio.ByteOrder; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.TimeZone; +import main.NGECore; + import org.apache.mina.core.buffer.IoBuffer; import engine.clients.Client; @@ -50,8 +55,8 @@ public class LoginClusterStatus extends SWGMessage { } public void addServer(int galaxyID, String serverIP, int serverPort, int pingPort, int maxCharacters, int status, int recommended, int population, Client client) { IoBuffer result = IoBuffer.allocate(39 + serverIP.length()).order(ByteOrder.LITTLE_ENDIAN); - int populationStatus = 0; + result.putInt(galaxyID); result.put(getAsciiString(serverIP)); result.putShort((short)serverPort); @@ -66,11 +71,10 @@ public class LoginClusterStatus extends SWGMessage { populationStatus = 6; status = 3; } - if(status == 3 && client.isGM()) + if(status == 3 && !NGECore.getInstance().adminService.getAccessLevelFromDB(client.getAccountId()).equals(null)) // Ziggy - admins can enter Locked galaxies status = 2; result.putInt(populationStatus); // 0 = very light, 1 = light, 2 = medium , 3 = heavy, 4 = very heavy, 5 = extremely heavy, 6 = full result.putInt(maxCharacters); - //result.putInt(0xFFFF8F80); // Distance? result.putInt(timeZone.getRawOffset() / 3600000); result.putInt(status); result.put((byte)recommended); diff --git a/src/resources/common/Forager.java b/src/resources/common/Forager.java index 48a26ca5..f2cb383d 100644 --- a/src/resources/common/Forager.java +++ b/src/resources/common/Forager.java @@ -180,7 +180,7 @@ public class Forager { } // chosenObject = 5; // To test TMs - if(forager.getClient().isGM()) // Always yield a TM for testing + if(!NGECore.getInstance().adminService.getAccessLevelFromDB(forager.getClient().getAccountId()).equals(null)) // Always yield a TM for testing chosenObject = 5; //forager.sendSystemMessage("chosenObject " + chosenObject,(byte) 0); diff --git a/src/resources/objects/building/BuildingObject.java b/src/resources/objects/building/BuildingObject.java index fa44577f..cb7cd87a 100644 --- a/src/resources/objects/building/BuildingObject.java +++ b/src/resources/objects/building/BuildingObject.java @@ -403,7 +403,7 @@ public class BuildingObject extends TangibleObject implements IPersistent, Seria } public boolean canEnter(SWGObject object) { - return (getPrivacy() == PRIVATE && (entryList.contains(object.getObjectID()) || adminList.contains(object.getObjectID()))) || !banList.contains(object.getObjectID()) || object.getClient().isGM(); + return (getPrivacy() == PRIVATE && (entryList.contains(object.getObjectID()) || adminList.contains(object.getObjectID()))) || !banList.contains(object.getObjectID()) || !NGECore.getInstance().adminService.getAccessLevelFromDB(object.getClient().getAccountId()).equals(null); } public void updateCellPermissions(SWGObject obj) { diff --git a/src/services/AdminService.java b/src/services/AdminService.java new file mode 100644 index 00000000..3763a874 --- /dev/null +++ b/src/services/AdminService.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright (c) 2013 + * + * This File is part of NGECore2. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. + * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. + ******************************************************************************/ +package services; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Map; +import java.sql.PreparedStatement; + +import main.NGECore; +import engine.resources.service.INetworkDispatch; +import engine.resources.service.INetworkRemoteEvent; + +public class AdminService implements INetworkDispatch { + + private NGECore core; + + public AdminService(NGECore core) { + this.core = core; + + } + + public String getAccessLevelFromDB(long id) { + String accessLevel = null; + PreparedStatement preparedStatement; + + try { + preparedStatement = NGECore.getInstance().getDatabase1().preparedStatement("SELECT * FROM accounts WHERE id=" + id + ""); + ResultSet resultSet = preparedStatement.executeQuery(); + if(resultSet.next()) + accessLevel = resultSet.getString("accessLevel"); + } catch (SQLException e) { + e.printStackTrace(); + } + + return accessLevel; + } + + @Override + public void insertOpcodes(Map arg0, Map arg1) { + + } + + @Override + public void shutdown() { + + } + +} diff --git a/src/services/CharacterService.java b/src/services/CharacterService.java index 7488e77c..a1fff102 100644 --- a/src/services/CharacterService.java +++ b/src/services/CharacterService.java @@ -366,7 +366,7 @@ public class CharacterService implements INetworkDispatch { System.out.println("Saving character with name: " + object.getCustomName()); core.getSWGObjectODB().put(object.getObjectID(), object); - PreparedStatement ps = databaseConnection.preparedStatement("INSERT INTO characters (id, \"firstName\", \"lastName\", \"accountId\", \"galaxyId\", \"statusId\", appearance, gmflag) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); + PreparedStatement ps = databaseConnection.preparedStatement("INSERT INTO characters (id, \"firstName\", \"lastName\", \"accountId\", \"galaxyId\", \"statusId\", appearance) VALUES (?, ?, ?, ?, ?, ?, ?)"); ps.setLong(1, object.getObjectID()); ps.setString(2, clientCreateCharacter.getFirstName()); ps.setString(3, clientCreateCharacter.getLastName()); @@ -374,7 +374,6 @@ public class CharacterService implements INetworkDispatch { ps.setInt(5, galaxyId); ps.setInt(6, 1); ps.setInt(7, CRC.StringtoCRC(raceTemplate)); - ps.setBoolean(8, false); ps.executeUpdate(); ps.close(); CreateCharacterSuccess success = new CreateCharacterSuccess(object.getObjectID()); diff --git a/src/services/ConnectionService.java b/src/services/ConnectionService.java index 4e8ce362..246501fd 100644 --- a/src/services/ConnectionService.java +++ b/src/services/ConnectionService.java @@ -137,7 +137,6 @@ public class ConnectionService implements INetworkDispatch { if (resultSet.next()) { client.setAccountId(resultSet.getLong("accountId")); client.setSessionKey(clientIdMsg.getSessionKey()); - client.setGM(core.loginService.checkForGmPermission((int) resultSet.getLong("accountId"))); AccountFeatureBits accountFeatureBits = new AccountFeatureBits(); ClientPermissionsMessage clientPermissionsMessage = new ClientPermissionsMessage(maxNumberOfCharacters - core.characterService.getNumberOfCharacters((int) resultSet.getLong("accountId"))); session.write(new HeartBeatMessage().serialize()); @@ -340,7 +339,6 @@ public class ConnectionService implements INetworkDispatch { } ghost.toggleFlag(PlayerFlags.LD); - object.setPerformanceListenee(null); object.setPerformanceWatchee(null); object.setAttachment("disconnectTask", null); diff --git a/src/services/LoginService.java b/src/services/LoginService.java index cdd65984..437970d5 100644 --- a/src/services/LoginService.java +++ b/src/services/LoginService.java @@ -140,9 +140,7 @@ public class LoginService implements INetworkDispatch{ client.setPassword(pass); client.setSessionKey(generateSessionKey()); client.setAccountId(id); - //client.setAccountEmail(email); client.setSession(session); - client.setGM(checkForGmPermission(id)); core.addClient(session, client); @@ -156,9 +154,6 @@ public class LoginService implements INetworkDispatch{ System.out.println(client.getAccountName() + " was not added to active connections map."); return; } - /*if(!checkIfAccountExistInGameDB(id)) { - createAccountForGameDB(id, user, email, encryptPass); - }*/ persistSession(client); @@ -269,29 +264,6 @@ public class LoginService implements INetworkDispatch{ } - public boolean checkForGmPermission(int id) { - try { - if (core.getConfig().getInt("ADMIN") > 0) { - return true; - } - } catch (Exception e) { - - } - - PreparedStatement preparedStatement; - - try { - preparedStatement = databaseConnection1.preparedStatement("SELECT * FROM accounts WHERE id=" + id + ""); - ResultSet resultSet = preparedStatement.executeQuery(); - if(resultSet.next()) - return resultSet.getBoolean("gmflag"); - } catch (SQLException e) { - e.printStackTrace(); - } - - return false; - } - /** * Saves session data to DB so Zone Server can link sessions to accounts. * @param client Client that needs a session save. diff --git a/src/services/command/BaseSWGCommand.java b/src/services/command/BaseSWGCommand.java index 5025939d..87dff513 100644 --- a/src/services/command/BaseSWGCommand.java +++ b/src/services/command/BaseSWGCommand.java @@ -76,7 +76,10 @@ public class BaseSWGCommand implements Cloneable { if (((String) visitor2.getObject(i, 0)).equalsIgnoreCase(commandName)) { int sub = 0; // Subtract due to command table structures being different - characterAbility = (String) visitor2.getObject(i, 7); + if(((String) visitor2.getObject(i, 7)).equals("admin")) + characterAbility = ""; + else + characterAbility = (String) visitor2.getObject(i, 7); for (int l = (8 - sub); l <= (29 - sub); l++) { if (!((Boolean) visitor2.getObject(i, l))) { diff --git a/src/services/command/CommandService.java b/src/services/command/CommandService.java index 7ae337d2..63bcabd7 100644 --- a/src/services/command/CommandService.java +++ b/src/services/command/CommandService.java @@ -21,9 +21,14 @@ ******************************************************************************/ package services.command; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.ByteOrder; import java.util.Map; +import java.util.Scanner; import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; @@ -31,6 +36,7 @@ import java.util.concurrent.ScheduledExecutorService; import main.NGECore; +import org.apache.commons.io.FileUtils; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; @@ -71,29 +77,23 @@ public class CommandService implements INetworkDispatch { public boolean callCommand(CreatureObject actor, SWGObject target, BaseSWGCommand command, int actionCounter, String commandArgs) { - if (actor == null) { + if (actor == null) return false; - } - if (command == null) { + if (actor.getClient().equals(null)) return false; - } - if (command.getCharacterAbility().length() > 0 && !actor.hasAbility(command.getCharacterAbility()) && actor.getClient() != null) { + if (command == null) return false; - } - if (command.isDisabled()) { + if (command.getCharacterAbility().length() > 0 && !actor.hasAbility(command.getCharacterAbility()) && !command.getCharacterAbility().equals("admin")) return false; - } - if (actor.getClient() != null && command.getGodLevel() > actor.getPlayerObject().getGodLevel()) { + if (command.isDisabled()) return false; - } - if (actor.hasCooldown(command.getCooldownGroup()) || actor.hasCooldown(command.getCommandName())) { + if (actor.hasCooldown(command.getCooldownGroup()) || actor.hasCooldown(command.getCommandName())) return false; - } // Causes this service method to return with false after equipping a rifle, not allowing to unequip it anymore // because the client seems to consider rifles invalidweapons for an unkown reason @@ -687,19 +687,50 @@ public class CommandService implements INetworkDispatch { } public void processCommand(CreatureObject actor, SWGObject target, BaseSWGCommand command, int actionCounter, String commandArgs) { + System.out.println("characterAbility: " + command.getCharacterAbility()); + if (command.getGodLevel() > 0 || command.getCommandName().equals("setgodmode")) { // TODO: When loading commands, simply don't put the "admin" characterAbility into the commands + String accessLevel = core.adminService.getAccessLevelFromDB(actor.getClient().getAccountId()); + + if(accessLevel != null) { + Scanner scanner; + try { + scanner = new Scanner(new File("accesslevels/" + accessLevel + ".txt")); + boolean levelHasCommand = false; + + while(scanner.hasNextLine()) { + String commandName = scanner.nextLine(); + if(command.getCommandName().equals(commandName)) { + levelHasCommand = true; + break; + } + } + + if (!levelHasCommand) { + actor.sendSystemMessage(" \\#FE2EF7 [GM] \\#FFFFFF " + command.getCommandName() + ": You do not have permission to use this command.", (byte) 0); + return; + } + + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + if (command.getCooldown() > 0f) { actor.addCooldown(command.getCooldownGroup(), command.getCooldown()); } if (command instanceof CombatCommand) { processCombatCommand(actor, target, (CombatCommand) command, actionCounter, commandArgs); - } else { + } else if (FileUtilities.doesFileExist("scripts/commands/" + command.getCommandName().toLowerCase() + ".py")) { core.scriptService.callScript("scripts/commands/", command.getCommandName().toLowerCase(), "run", core, actor, target, commandArgs); } else if (FileUtilities.doesFileExist("scripts/commands/combat/" + command.getCommandName().toLowerCase() + ".py")) { core.scriptService.callScript("scripts/commands/combat/", command.getCommandName().toLowerCase(), "run", core, actor, target, commandArgs); } - } + + } public void processCommandForInstallation(InstallationObject actor, SWGObject target, BaseSWGCommand command, int actionCounter, String commandArgs) { diff --git a/src/services/housing/HousingService.java b/src/services/housing/HousingService.java index 3d897d43..b70036c8 100644 --- a/src/services/housing/HousingService.java +++ b/src/services/housing/HousingService.java @@ -92,7 +92,7 @@ public class HousingService implements INetworkDispatch { public void enterStructureMode(CreatureObject actor, TangibleObject deed) { PlayerCity city = core.playerCityService.getCityObjectIsIn(actor); - if (!actor.getClient().isGM() && !core.terrainService.canBuildAtPosition(actor, actor.getWorldPosition().x, actor.getWorldPosition().z)) { + if (core.adminService.getAccessLevelFromDB(actor.getClient().getAccountId()).equals(null) && !core.terrainService.canBuildAtPosition(actor, actor.getWorldPosition().x, actor.getWorldPosition().z)) { actor.sendSystemMessage("You may not place a structure here.", (byte) 0); // should probably load this from an stf return; } diff --git a/src/services/resources/HarvesterService.java b/src/services/resources/HarvesterService.java index 63622849..5c473b15 100644 --- a/src/services/resources/HarvesterService.java +++ b/src/services/resources/HarvesterService.java @@ -1111,7 +1111,7 @@ public class HarvesterService implements INetworkDispatch { public void enterStructurePlacementMode(CreatureObject actor, SWGObject object){ - if (!actor.getClient().isGM() && !core.terrainService.canBuildAtPosition(actor,actor.getPosition().x,actor.getPosition().z)){ + if (core.adminService.getAccessLevelFromDB(actor.getClient().getAccountId()).equals(null) && !core.terrainService.canBuildAtPosition(actor,actor.getPosition().x,actor.getPosition().z)){ actor.sendSystemMessage("@player_structure:not_permitted", (byte) 0); return; }