From 66fba62b0fcd2a57d7b8a7712c8b81a31bde7aaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SvenjaRei=C3=9Faus?= Date: Tue, 12 Mar 2019 23:06:11 -0500 Subject: [PATCH] WIP: Not reviewed, but should fix Ownerships and Items useage bypass --- .../java/com/massivecraft/factions/Conf.java | 5 +- .../factions/cmd/CmdShowClaims.java | 3 - .../listeners/FactionsBlockListener.java | 43 +++++++++----- .../listeners/FactionsChatListener.java | 1 + .../listeners/FactionsPlayerListener.java | 59 ++++++++++--------- 5 files changed, 65 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/massivecraft/factions/Conf.java b/src/main/java/com/massivecraft/factions/Conf.java index e8ac8413..e52ae0d6 100644 --- a/src/main/java/com/massivecraft/factions/Conf.java +++ b/src/main/java/com/massivecraft/factions/Conf.java @@ -333,16 +333,17 @@ public class Conf { public static transient char[] mapKeyChrs = "\\/#$%=&^ABCDEFGHJKLMNOPQRSTUVWXYZ1234567890abcdeghjmnopqrsuvwxyz?".toCharArray(); - // Default Options + // Default Options - Is this even shown on the Conf.json? public static boolean useCustomDefaultPermissions = false; public static boolean usePermissionHints = false; public static HashMap defaultFactionPermissions = new HashMap<>(); - // Custom Ranks + // Custom Ranks - Oof I forgot I was doing this _SvenjaReissaus_ //public static boolean enableCustomRanks = false; // We will disable it by default to avoid any migration error //public static int maxCustomRanks = 2; // Setting this to -1 will allow unlimited custom ranks // -------------------------------------------- // // Persistance // -------------------------------------------- // + private static transient Conf i = new Conf(); static { diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdShowClaims.java b/src/main/java/com/massivecraft/factions/cmd/CmdShowClaims.java index f51f662b..20b6a2b2 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdShowClaims.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdShowClaims.java @@ -18,9 +18,6 @@ public class CmdShowClaims extends FCommand { this.senderMustBePlayer = true; this.senderMustBeMember = true; this.senderMustBeModerator = false; - this.senderMustBePlayer = true; - - } @Override diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsBlockListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsBlockListener.java index 1d7709b2..781a5294 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsBlockListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsBlockListener.java @@ -133,20 +133,7 @@ public class FactionsBlockListener implements Listener { } // Check the permission just after making sure the land isn't owned by someone else to avoid bypass. - - if (access != Access.ALLOW && me.getRole() != Role.LEADER) { - // TODO: Update this once new access values are added other than just allow / deny. - if (access == Access.DENY) { - if (!justCheck) - me.msg(TL.GENERIC_NOPERMISSION, action); - return false; - } else if (myFaction.getOwnerListString(loc) != null && !myFaction.getOwnerListString(loc).isEmpty() && !myFaction.getOwnerListString(loc).contains(player.getName())) { - if (!justCheck) - me.msg("You can't " + action + " in this territory, it is owned by: " + myFaction.getOwnerListString(loc)); - return false; - } - } - return true; + return CheckPlayerAccess(player, me, loc, myFaction, access, PermissableAction.fromString(action)); } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) @@ -519,4 +506,32 @@ public class FactionsBlockListener implements Listener { } } } + + /// + /// This checks if the current player can execute an action based on it's factions access and surroundings + /// It will grant access in the following priorities: + /// - If Faction Land is Owned and the Owner is the current player, or player is faction leader. + /// - If Faction Land is not Owned and my access value is not set to DENY + /// - If none of the filters above matches, then we consider access is set to ALLOW|UNDEFINED + /// This check does not performs any kind of bypass check (i.e.: me.isAdminBypassing()) + /// + /// The player entity which the check will be made upon + /// The Faction player object related to the player + /// The World location where the action is being executed + /// The faction of the player being checked + /// The current's faction access permission for the action + private static boolean CheckPlayerAccess(Player player, FPlayer me, FLocation loc, Faction myFaction, Access access, PermissableAction action) { + if (access == null) access = Access.DENY; // Let's deny by default + boolean landOwned = (myFaction.doesLocationHaveOwnersSet(loc) && !myFaction.getOwnerList(loc).isEmpty()); + if (landOwned && myFaction.getOwnerListString(loc).contains(player.getName()) || me.getRole() == Role.LEADER) return true; + else if (landOwned && !myFaction.getOwnerListString(loc).contains(player.getName())) { + me.msg("You can't " + action + " in this territory, it is owned by: " + myFaction.getOwnerListString(loc)); + return false; + } else if (!landOwned && access == Access.DENY) { // If land is not owned but access is set to DENY anyway + me.msg(TL.GENERIC_NOPERMISSION, action); + return false; + } + // We assume faction land is not owned, and the access is not set to DENY, so we allow to execute the action + return true; + } } diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsChatListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsChatListener.java index 36505c0c..e5a5065a 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsChatListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsChatListener.java @@ -60,6 +60,7 @@ public class FactionsChatListener implements Listener { // Just in case player gets demoted while in faction chat. me.msg(TL.COMMAND_CHAT_MOD_ONLY); event.setCancelled(true); + me.setChatMode(ChatMode.FACTION); return; } diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java index 1b5b236c..be655413 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java @@ -148,20 +148,7 @@ public class FactionsPlayerListener implements Listener { } Access access = otherFaction.getAccess(me, PermissableAction.ITEM); - if (access != null && access != Access.UNDEFINED) { - // TODO: Update this once new access values are added other than just allow / deny. - if ((myFaction.getOwnerListString(loc) != null && !myFaction.getOwnerListString(loc).isEmpty() && myFaction.getOwnerListString(loc).contains(player.getName()))) { - return true; - } else if (myFaction.getOwnerListString(loc) != null && !myFaction.getOwnerListString(loc).isEmpty() && !myFaction.getOwnerListString(loc).contains(player.getName())) { - me.msg("You can't use items in this territory, it is owned by: " + myFaction.getOwnerListString(loc)); - return false; - } else if (access == Access.DENY) { - me.msg(TL.GENERIC_NOPERMISSION, PermissableAction.ITEM); - return false; - } - } - - return true; + return CheckPlayerAccess(player, me, loc, myFaction, access, PermissableAction.ITEM); } @SuppressWarnings("deprecation") @@ -356,21 +343,10 @@ public class FactionsPlayerListener implements Listener { } } - if (access != Access.ALLOW && me.getRole() != Role.LEADER) { - // TODO: Update this once new access values are added other than just allow / deny. - if ((myFaction.getOwnerListString(loc) != null && !myFaction.getOwnerListString(loc).isEmpty() && myFaction.getOwnerListString(loc).contains(player.getName()))) { - return true; - } else if (myFaction.getOwnerListString(loc) != null && !myFaction.getOwnerListString(loc).isEmpty() && !myFaction.getOwnerListString(loc).contains(player.getName())) { - me.msg("You can't " + action + " in this territory, it is owned by: " + myFaction.getOwnerListString(loc)); - return false; - } else if (access == Access.DENY) { - me.msg(TL.GENERIC_NOPERMISSION, action); - return false; - } - } - return true; + return CheckPlayerAccess(player, me, loc, myFaction, access, PermissableAction.CONTAINER); } + public static boolean preventCommand(String fullCmd, Player player) { if ((Conf.territoryNeutralDenyCommands.isEmpty() && Conf.territoryEnemyDenyCommands.isEmpty() && Conf.permanentFactionMemberDenyCommands.isEmpty() && Conf.warzoneDenyCommands.isEmpty())) { return false; @@ -1070,4 +1046,33 @@ public class FactionsPlayerListener implements Listener { return attempts; } } + /// + /// This checks if the current player can execute an action based on it's factions access and surroundings + /// It will grant access in the following priorities: + /// - If Faction Land is Owned and the Owner is the current player, or player is faction leader. + /// - If Faction Land is not Owned and my access value is not set to DENY + /// - If none of the filters above matches, then we consider access is set to ALLOW|UNDEFINED + /// This check does not performs any kind of bypass check (i.e.: me.isAdminBypassing()) + /// + /// The player entity which the check will be made upon + /// The Faction player object related to the player + /// The World location where the action is being executed + /// The faction of the player being checked + /// The current's faction access permission for the action + private static boolean CheckPlayerAccess(Player player, FPlayer me, FLocation loc, Faction myFaction, Access access, PermissableAction action) { + if (access != null && access != Access.UNDEFINED) { + // TODO: Update this once new access values are added other than just allow / deny. + boolean landOwned = (myFaction.doesLocationHaveOwnersSet(loc) && !myFaction.getOwnerList(loc).isEmpty()); + if (landOwned && myFaction.getOwnerListString(loc).contains(player.getName()) || me.getRole() == Role.LEADER) return true; + else if (landOwned && !myFaction.getOwnerListString(loc).contains(player.getName())) { + me.msg("You can't do that in this territory, it is owned by: " + myFaction.getOwnerListString(loc)); + return false; + } else if (!landOwned && access != Access.DENY) return true; + else { + me.msg(TL.GENERIC_NOPERMISSION, action); + return false; + } + } + return true; + } }