From dbb7d2ec5c6d4ff57156454a081e87f0ffb72e8e Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Sat, 17 Dec 2016 00:34:59 +0100 Subject: [PATCH] Finished the security feature --- .../api/network/INetworkMaster.java | 14 ++-- .../api/network/security/ISecurityCard.java | 19 ++++++ .../security/ISecurityCardContainer.java | 13 ++++ .../network/security/ISecurityManager.java | 20 ++++++ .../network/{ => security}/Permission.java | 12 ++-- .../apiimpl/network/NetworkListener.java | 6 +- .../network/grid/FluidGridHandler.java | 6 +- .../apiimpl/network/grid/ItemGridHandler.java | 14 ++-- .../NetworkItemWirelessCraftingMonitor.java | 4 +- .../network/item/NetworkItemWirelessGrid.java | 4 +- .../network/security/SecurityCard.java | 31 +++++++++ .../network/security/SecurityManager.java | 50 ++++++++++++++ .../refinedstorage/block/BlockBase.java | 4 +- .../block/BlockCraftingMonitor.java | 4 +- .../block/BlockFluidInterface.java | 2 +- .../refinedstorage/block/BlockInterface.java | 2 +- .../block/BlockSecurityManager.java | 2 +- .../container/ContainerSecurityManager.java | 2 +- .../gui/GuiSecurityManager.java | 5 +- .../refinedstorage/item/ItemSecurityCard.java | 2 +- .../network/MessageGridCraftingClear.java | 4 +- .../network/MessageSecurityManagerUpdate.java | 2 +- .../refinedstorage/tile/TileController.java | 19 ++++-- .../tile/TileSecurityManager.java | 68 +++++++++++++++++-- .../refinedstorage/tile/grid/TileGrid.java | 4 +- .../assets/refinedstorage/lang/en_US.lang | 12 ++-- 26 files changed, 264 insertions(+), 61 deletions(-) create mode 100755 src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityCard.java create mode 100755 src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityCardContainer.java create mode 100755 src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityManager.java rename src/main/java/com/raoulvdberge/refinedstorage/api/network/{ => security}/Permission.java (72%) create mode 100755 src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/security/SecurityCard.java create mode 100755 src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/security/SecurityManager.java diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkMaster.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkMaster.java index 7fe7009ac..7b47def6c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkMaster.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkMaster.java @@ -6,10 +6,10 @@ import com.raoulvdberge.refinedstorage.api.network.grid.IFluidGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.IItemGridHandler; import com.raoulvdberge.refinedstorage.api.network.item.INetworkItemHandler; import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterChannel; +import com.raoulvdberge.refinedstorage.api.network.security.ISecurityManager; import com.raoulvdberge.refinedstorage.api.storage.IStorageCache; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.apiimpl.API; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; @@ -39,18 +39,16 @@ public interface INetworkMaster { */ boolean canRun(); - /** - * @param permission the permission to check for - * @param player the player to check that permission for - * @return whether the player has the given permission - */ - boolean hasPermission(Permission permission, EntityPlayer player); - /** * @return a graph of connected nodes to this network */ INetworkNodeGraph getNodeGraph(); + /** + * @return the {@link ISecurityManager} of this network + */ + ISecurityManager getSecurityManager(); + /** * @return the {@link IItemGridHandler} of this network */ diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityCard.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityCard.java new file mode 100755 index 000000000..495b58327 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityCard.java @@ -0,0 +1,19 @@ +package com.raoulvdberge.refinedstorage.api.network.security; + +import java.util.UUID; + +/** + * Represents a security card. + */ +public interface ISecurityCard { + /** + * @return the UUID that this security card is bound to + */ + UUID getBound(); + + /** + * @param permission the permission to check for + * @return whether the bound player has the given permission + */ + boolean hasPermission(Permission permission); +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityCardContainer.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityCardContainer.java new file mode 100755 index 000000000..a3ebeed9c --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityCardContainer.java @@ -0,0 +1,13 @@ +package com.raoulvdberge.refinedstorage.api.network.security; + +import java.util.List; + +/** + * A tile that contains security cards. + */ +public interface ISecurityCardContainer { + /** + * @return the security cards in this container + */ + List getCards(); +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityManager.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityManager.java new file mode 100755 index 000000000..b09fb1f71 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityManager.java @@ -0,0 +1,20 @@ +package com.raoulvdberge.refinedstorage.api.network.security; + +import net.minecraft.entity.player.EntityPlayer; + +/** + * The security manager of a network. + */ +public interface ISecurityManager { + /** + * @param permission the permission to check for + * @param player the player to check that permission for + * @return whether the player has the given permission + */ + boolean hasPermission(Permission permission, EntityPlayer player); + + /** + * Rebuilds the security list. + */ + void rebuild(); +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/Permission.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/Permission.java similarity index 72% rename from src/main/java/com/raoulvdberge/refinedstorage/api/network/Permission.java rename to src/main/java/com/raoulvdberge/refinedstorage/api/network/security/Permission.java index 889501682..32930d24f 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/Permission.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/Permission.java @@ -1,4 +1,4 @@ -package com.raoulvdberge.refinedstorage.api.network; +package com.raoulvdberge.refinedstorage.api.network.security; /** * The various permissions a player can have in a network. @@ -15,15 +15,19 @@ public enum Permission { /** * Whether the player can start, cancel or view an autocrafting task. */ - AUTOCRAFT(2), + AUTOCRAFTING(2), /** - * Whether the player can open network GUIs and can place or break network blocks. + * Whether the player can open network GUIs. */ MODIFY(3), + /** + * Whether the player can add or remove network blocks. + */ + BUILD(4), /** * Whether the player can manage the security options for a network. */ - SECURITY(4); + SECURITY(5); private final int id; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkListener.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkListener.java index c94e871bd..8df6e1642 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkListener.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkListener.java @@ -2,7 +2,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.network; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.network.INetworkNode; -import com.raoulvdberge.refinedstorage.api.network.Permission; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.proxy.CapabilityNetworkNode; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; @@ -19,7 +19,7 @@ public class NetworkListener { if (tile != null && tile.hasCapability(CapabilityNetworkNode.NETWORK_NODE_CAPABILITY, facing.getOpposite())) { INetworkNode node = tile.getCapability(CapabilityNetworkNode.NETWORK_NODE_CAPABILITY, facing.getOpposite()); - if (node.getNetwork() != null && !node.getNetwork().hasPermission(Permission.MODIFY, e.getPlayer())) { + if (node.getNetwork() != null && !node.getNetwork().getSecurityManager().hasPermission(Permission.BUILD, e.getPlayer())) { RSUtils.sendNoPermissionMessage(e.getPlayer()); e.setCanceled(true); @@ -40,7 +40,7 @@ public class NetworkListener { INetworkNode node = tile.getCapability(CapabilityNetworkNode.NETWORK_NODE_CAPABILITY, null); - if (node.getNetwork() != null && !node.getNetwork().hasPermission(Permission.MODIFY, e.getPlayer())) { + if (node.getNetwork() != null && !node.getNetwork().getSecurityManager().hasPermission(Permission.BUILD, e.getPlayer())) { RSUtils.sendNoPermissionMessage(e.getPlayer()); e.setCanceled(true); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/FluidGridHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/FluidGridHandler.java index 72c9561da..2f27279fa 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/FluidGridHandler.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/FluidGridHandler.java @@ -2,8 +2,8 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.grid; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; -import com.raoulvdberge.refinedstorage.api.network.Permission; import com.raoulvdberge.refinedstorage.api.network.grid.IFluidGridHandler; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.apiimpl.API; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.InventoryHelper; @@ -27,7 +27,7 @@ public class FluidGridHandler implements IFluidGridHandler { public void onExtract(EntityPlayerMP player, int hash, boolean shift) { FluidStack stack = network.getFluidStorageCache().getList().get(hash); - if (stack == null || stack.amount < Fluid.BUCKET_VOLUME || !network.hasPermission(Permission.EXTRACT, player)) { + if (stack == null || stack.amount < Fluid.BUCKET_VOLUME || !network.getSecurityManager().hasPermission(Permission.EXTRACT, player)) { return; } @@ -68,7 +68,7 @@ public class FluidGridHandler implements IFluidGridHandler { @Nullable @Override public ItemStack onInsert(EntityPlayerMP player, ItemStack container) { - if (!network.hasPermission(Permission.INSERT, player)) { + if (!network.getSecurityManager().hasPermission(Permission.INSERT, player)) { return container; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/ItemGridHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/ItemGridHandler.java index be871e911..d43b893d1 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/ItemGridHandler.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/ItemGridHandler.java @@ -5,9 +5,9 @@ import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; -import com.raoulvdberge.refinedstorage.api.network.Permission; import com.raoulvdberge.refinedstorage.api.network.grid.IItemGridHandler; import com.raoulvdberge.refinedstorage.api.network.item.INetworkItem; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.api.util.IStackList; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.CraftingTask; @@ -32,7 +32,7 @@ public class ItemGridHandler implements IItemGridHandler { public void onExtract(EntityPlayerMP player, int hash, int flags) { ItemStack item = network.getItemStorageCache().getList().get(hash); - if (item == null || !network.hasPermission(Permission.EXTRACT, player)) { + if (item == null || !network.getSecurityManager().hasPermission(Permission.EXTRACT, player)) { return; } @@ -100,7 +100,7 @@ public class ItemGridHandler implements IItemGridHandler { @Override public ItemStack onInsert(EntityPlayerMP player, ItemStack stack) { - if (!network.hasPermission(Permission.INSERT, player)) { + if (!network.getSecurityManager().hasPermission(Permission.INSERT, player)) { return stack; } @@ -117,7 +117,7 @@ public class ItemGridHandler implements IItemGridHandler { @Override public void onInsertHeldItem(EntityPlayerMP player, boolean single) { - if (player.inventory.getItemStack().isEmpty() || !network.hasPermission(Permission.INSERT, player)) { + if (player.inventory.getItemStack().isEmpty() || !network.getSecurityManager().hasPermission(Permission.INSERT, player)) { return; } @@ -149,7 +149,7 @@ public class ItemGridHandler implements IItemGridHandler { @Override public void onCraftingPreviewRequested(EntityPlayerMP player, int hash, int quantity) { - if (!network.hasPermission(Permission.AUTOCRAFT, player)) { + if (!network.getSecurityManager().hasPermission(Permission.AUTOCRAFTING, player)) { return; } @@ -180,7 +180,7 @@ public class ItemGridHandler implements IItemGridHandler { @Override public void onCraftingRequested(EntityPlayerMP player, ItemStack stack, int quantity) { - if (quantity <= 0 || !network.hasPermission(Permission.AUTOCRAFT, player)) { + if (quantity <= 0 || !network.getSecurityManager().hasPermission(Permission.AUTOCRAFTING, player)) { return; } @@ -197,7 +197,7 @@ public class ItemGridHandler implements IItemGridHandler { @Override public void onCraftingCancelRequested(EntityPlayerMP player, int id) { - if (!network.hasPermission(Permission.AUTOCRAFT, player)) { + if (!network.getSecurityManager().hasPermission(Permission.AUTOCRAFTING, player)) { return; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessCraftingMonitor.java index 5e83662e7..1121ba884 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessCraftingMonitor.java @@ -4,9 +4,9 @@ import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; -import com.raoulvdberge.refinedstorage.api.network.Permission; import com.raoulvdberge.refinedstorage.api.network.item.INetworkItem; import com.raoulvdberge.refinedstorage.api.network.item.INetworkItemHandler; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.item.ItemWirelessCraftingMonitor; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -38,7 +38,7 @@ public class NetworkItemWirelessCraftingMonitor implements INetworkItem { return false; } - if (!network.hasPermission(Permission.AUTOCRAFT, player)) { + if (!network.getSecurityManager().hasPermission(Permission.AUTOCRAFTING, player)) { RSUtils.sendNoPermissionMessage(player); return false; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessGrid.java index a8049f7ad..731352268 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessGrid.java @@ -4,9 +4,9 @@ import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; -import com.raoulvdberge.refinedstorage.api.network.Permission; import com.raoulvdberge.refinedstorage.api.network.item.INetworkItem; import com.raoulvdberge.refinedstorage.api.network.item.INetworkItemHandler; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.item.ItemWirelessGrid; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -38,7 +38,7 @@ public class NetworkItemWirelessGrid implements INetworkItem { return false; } - if (!network.hasPermission(Permission.MODIFY, player)) { + if (!network.getSecurityManager().hasPermission(Permission.MODIFY, player)) { RSUtils.sendNoPermissionMessage(player); return false; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/security/SecurityCard.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/security/SecurityCard.java new file mode 100755 index 000000000..1384ff0a3 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/security/SecurityCard.java @@ -0,0 +1,31 @@ +package com.raoulvdberge.refinedstorage.apiimpl.network.security; + +import com.raoulvdberge.refinedstorage.api.network.security.ISecurityCard; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class SecurityCard implements ISecurityCard { + private UUID bound; + private Map permissions = new HashMap<>(); + + public SecurityCard(UUID bound) { + this.bound = bound; + } + + public Map getPermissions() { + return permissions; + } + + @Override + public UUID getBound() { + return bound; + } + + @Override + public boolean hasPermission(Permission permission) { + return permissions.get(permission); + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/security/SecurityManager.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/security/SecurityManager.java new file mode 100755 index 000000000..182b01abc --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/security/SecurityManager.java @@ -0,0 +1,50 @@ +package com.raoulvdberge.refinedstorage.apiimpl.network.security; + +import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; +import com.raoulvdberge.refinedstorage.api.network.INetworkNode; +import com.raoulvdberge.refinedstorage.api.network.security.ISecurityCard; +import com.raoulvdberge.refinedstorage.api.network.security.ISecurityCardContainer; +import com.raoulvdberge.refinedstorage.api.network.security.ISecurityManager; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; +import net.minecraft.entity.player.EntityPlayer; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class SecurityManager implements ISecurityManager { + private INetworkMaster network; + private Map cards = new HashMap<>(); + + public SecurityManager(INetworkMaster network) { + this.network = network; + } + + @Override + public boolean hasPermission(Permission permission, EntityPlayer player) { + if (cards.isEmpty()) { + return true; + } + + UUID uuid = player.getGameProfile().getId(); + + if (!cards.containsKey(uuid)) { + return false; + } + + return cards.get(uuid).hasPermission(permission); + } + + @Override + public void rebuild() { + cards.clear(); + + for (INetworkNode node : network.getNodeGraph().all()) { + if (node instanceof ISecurityCardContainer) { + for (ISecurityCard card : ((ISecurityCardContainer) node).getCards()) { + cards.put(card.getBound(), card); + } + } + } + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockBase.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockBase.java index a0a0e5445..69715346a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockBase.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockBase.java @@ -3,7 +3,7 @@ package com.raoulvdberge.refinedstorage.block; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.network.INetworkNode; -import com.raoulvdberge.refinedstorage.api.network.Permission; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.item.ItemBlockBase; import com.raoulvdberge.refinedstorage.proxy.CapabilityNetworkNode; import com.raoulvdberge.refinedstorage.tile.TileBase; @@ -144,7 +144,7 @@ public abstract class BlockBase extends Block { if (node.getNetwork() != null) { for (Permission permission : permissions) { - if (!node.getNetwork().hasPermission(permission, player)) { + if (!node.getNetwork().getSecurityManager().hasPermission(permission, player)) { RSUtils.sendNoPermissionMessage(player); return false; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCraftingMonitor.java index ee39bac93..11f26b9b1 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCraftingMonitor.java @@ -1,7 +1,7 @@ package com.raoulvdberge.refinedstorage.block; import com.raoulvdberge.refinedstorage.RSGui; -import com.raoulvdberge.refinedstorage.api.network.Permission; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; @@ -23,7 +23,7 @@ public class BlockCraftingMonitor extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { - if (!world.isRemote && tryOpenNetworkGui(RSGui.CRAFTING_MONITOR, player, world, pos, side, Permission.MODIFY, Permission.AUTOCRAFT)) { + if (!world.isRemote && tryOpenNetworkGui(RSGui.CRAFTING_MONITOR, player, world, pos, side, Permission.MODIFY, Permission.AUTOCRAFTING)) { ((TileCraftingMonitor) world.getTileEntity(pos)).onOpened(player); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockFluidInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockFluidInterface.java index 102b98bc0..85dfb77de 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockFluidInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockFluidInterface.java @@ -1,7 +1,7 @@ package com.raoulvdberge.refinedstorage.block; import com.raoulvdberge.refinedstorage.RSGui; -import com.raoulvdberge.refinedstorage.api.network.Permission; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.tile.TileFluidInterface; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockInterface.java index 5388a9af0..be1c36224 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockInterface.java @@ -1,7 +1,7 @@ package com.raoulvdberge.refinedstorage.block; import com.raoulvdberge.refinedstorage.RSGui; -import com.raoulvdberge.refinedstorage.api.network.Permission; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.tile.TileInterface; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockSecurityManager.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockSecurityManager.java index 30f4b8f42..0e20066c2 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockSecurityManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockSecurityManager.java @@ -1,7 +1,7 @@ package com.raoulvdberge.refinedstorage.block; import com.raoulvdberge.refinedstorage.RSGui; -import com.raoulvdberge.refinedstorage.api.network.Permission; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.tile.TileSecurityManager; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerSecurityManager.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerSecurityManager.java index 162d9d140..3aa4a9be4 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerSecurityManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerSecurityManager.java @@ -14,7 +14,7 @@ public class ContainerSecurityManager extends ContainerBase { int y = 20; for (int i = 0; i < 9 * 2; ++i) { - addSlotToContainer(new SlotItemHandler(tile.getCards(), i, x, y)); + addSlotToContainer(new SlotItemHandler(tile.getCardsItems(), i, x, y)); if (((i + 1) % 9) == 0) { x = 8; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiSecurityManager.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiSecurityManager.java index c1e3017fc..dc5cb2f54 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiSecurityManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiSecurityManager.java @@ -1,7 +1,7 @@ package com.raoulvdberge.refinedstorage.gui; import com.raoulvdberge.refinedstorage.RS; -import com.raoulvdberge.refinedstorage.api.network.Permission; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.container.ContainerSecurityManager; import com.raoulvdberge.refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import com.raoulvdberge.refinedstorage.item.ItemSecurityCard; @@ -33,8 +33,9 @@ public class GuiSecurityManager extends GuiBase { permissions[0] = addCheckBox(x + 7, y + 93, I18n.format("gui.refinedstorage:security_manager.permission.0"), false); permissions[1] = addCheckBox(permissions[0].xPosition, permissions[0].yPosition + padding, I18n.format("gui.refinedstorage:security_manager.permission.1"), false); permissions[2] = addCheckBox(permissions[1].xPosition, permissions[1].yPosition + padding, I18n.format("gui.refinedstorage:security_manager.permission.2"), false); - permissions[3] = addCheckBox(permissions[0].xPosition + 80, permissions[0].yPosition, I18n.format("gui.refinedstorage:security_manager.permission.3"), false); + permissions[3] = addCheckBox(permissions[0].xPosition + 90, permissions[0].yPosition, I18n.format("gui.refinedstorage:security_manager.permission.3"), false); permissions[4] = addCheckBox(permissions[3].xPosition, permissions[3].yPosition + padding, I18n.format("gui.refinedstorage:security_manager.permission.4"), false); + permissions[5] = addCheckBox(permissions[4].xPosition, permissions[4].yPosition + padding, I18n.format("gui.refinedstorage:security_manager.permission.5"), false); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemSecurityCard.java b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemSecurityCard.java index 2e79a8b2c..1a53347df 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemSecurityCard.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemSecurityCard.java @@ -1,6 +1,6 @@ package com.raoulvdberge.refinedstorage.item; -import com.raoulvdberge.refinedstorage.api.network.Permission; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageGridCraftingClear.java b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageGridCraftingClear.java index c06145a49..4a0aa4e0e 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageGridCraftingClear.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageGridCraftingClear.java @@ -1,7 +1,7 @@ package com.raoulvdberge.refinedstorage.network; import com.raoulvdberge.refinedstorage.RSUtils; -import com.raoulvdberge.refinedstorage.api.network.Permission; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.block.EnumGridType; import com.raoulvdberge.refinedstorage.tile.grid.TileGrid; import io.netty.buffer.ByteBuf; @@ -47,7 +47,7 @@ public class MessageGridCraftingClear extends MessageHandlerPlayerToServer itemStorage = new StorageCacheItem(this); private IStorageCache fluidStorage = new StorageCacheFluid(this); @@ -214,13 +218,13 @@ public class TileController extends TileBase implements INetworkMaster, IRedston } @Override - public boolean hasPermission(Permission permission, EntityPlayer player) { - return true; + public INetworkNodeGraph getNodeGraph() { + return nodeGraph; } @Override - public INetworkNodeGraph getNodeGraph() { - return nodeGraph; + public ISecurityManager getSecurityManager() { + return securityManager; } @Override @@ -308,6 +312,7 @@ public class TileController extends TileBase implements INetworkMaster, IRedston couldRun = canRun(); nodeGraph.rebuild(); + securityManager.rebuild(); } if (getEnergyScaledForDisplay() != lastEnergyDisplay) { @@ -472,7 +477,7 @@ public class TileController extends TileBase implements INetworkMaster, IRedston @Override public void sendItemStorageToClient(EntityPlayerMP player) { - RS.INSTANCE.network.sendTo(new MessageGridItemUpdate(this, hasPermission(Permission.AUTOCRAFT, player)), player); + RS.INSTANCE.network.sendTo(new MessageGridItemUpdate(this, securityManager.hasPermission(Permission.AUTOCRAFTING, player)), player); } @Override @@ -491,7 +496,7 @@ public class TileController extends TileBase implements INetworkMaster, IRedston @Override public void sendFluidStorageToClient(EntityPlayerMP player) { - RS.INSTANCE.network.sendTo(new MessageGridFluidUpdate(this, hasPermission(Permission.AUTOCRAFT, player)), player); + RS.INSTANCE.network.sendTo(new MessageGridFluidUpdate(this, securityManager.hasPermission(Permission.AUTOCRAFTING, player)), player); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileSecurityManager.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileSecurityManager.java index 8086a8632..2848afc92 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileSecurityManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileSecurityManager.java @@ -3,15 +3,37 @@ package com.raoulvdberge.refinedstorage.tile; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSItems; import com.raoulvdberge.refinedstorage.RSUtils; -import com.raoulvdberge.refinedstorage.api.network.Permission; +import com.raoulvdberge.refinedstorage.api.network.security.ISecurityCard; +import com.raoulvdberge.refinedstorage.api.network.security.ISecurityCardContainer; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; +import com.raoulvdberge.refinedstorage.apiimpl.network.security.SecurityCard; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic; import com.raoulvdberge.refinedstorage.inventory.ItemValidatorBasic; import com.raoulvdberge.refinedstorage.item.ItemSecurityCard; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -public class TileSecurityManager extends TileNode { - private ItemHandlerBasic cards = new ItemHandlerBasic(9 * 2, this, new ItemValidatorBasic(RSItems.SECURITY_CARD)); +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class TileSecurityManager extends TileNode implements ISecurityCardContainer { + private List actualCards = new ArrayList<>(); + + private ItemHandlerBasic cards = new ItemHandlerBasic(9 * 2, this, new ItemValidatorBasic(RSItems.SECURITY_CARD)) { + @Override + protected void onContentsChanged(int slot) { + super.onContentsChanged(slot); + + if (getWorld() != null && !getWorld().isRemote) { + rebuildCards(); + } + + if (network != null) { + network.getSecurityManager().rebuild(); + } + } + }; private ItemHandlerBasic editCard = new ItemHandlerBasic(1, this, new ItemValidatorBasic(RSItems.SECURITY_CARD)); @Override @@ -27,11 +49,44 @@ public class TileSecurityManager extends TileNode { return usage; } + @Override + public void update() { + if (!getWorld().isRemote && ticks == 0) { + rebuildCards(); + } + + super.update(); + } + @Override public void updateNode() { // NO OP } + private void rebuildCards() { + actualCards.clear(); + + for (int i = 0; i < cards.getSlots(); ++i) { + ItemStack stack = cards.getStackInSlot(i); + + if (!stack.isEmpty()) { + UUID uuid = ItemSecurityCard.getBound(stack); + + if (uuid == null) { + continue; + } + + SecurityCard card = new SecurityCard(uuid); + + for (Permission permission : Permission.values()) { + card.getPermissions().put(permission, ItemSecurityCard.hasPermission(stack, permission)); + } + + actualCards.add(card); + } + } + } + @Override public void read(NBTTagCompound tag) { super.read(tag); @@ -50,7 +105,7 @@ public class TileSecurityManager extends TileNode { return tag; } - public ItemHandlerBasic getCards() { + public ItemHandlerBasic getCardsItems() { return cards; } @@ -65,4 +120,9 @@ public class TileSecurityManager extends TileNode { ItemSecurityCard.setPermission(card, permission, state); } } + + @Override + public List getCards() { + return actualCards; + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/TileGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/TileGrid.java index cdde00f5f..8a824e558 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/TileGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/TileGrid.java @@ -4,9 +4,9 @@ import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.RSItems; import com.raoulvdberge.refinedstorage.RSUtils; -import com.raoulvdberge.refinedstorage.api.network.Permission; import com.raoulvdberge.refinedstorage.api.network.grid.IFluidGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.IItemGridHandler; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.block.BlockGrid; import com.raoulvdberge.refinedstorage.block.EnumGridType; @@ -388,7 +388,7 @@ public class TileGrid extends TileNode implements IGrid { } public void onRecipeTransfer(EntityPlayer player, ItemStack[][] recipe) { - if (hasNetwork() && getType() == EnumGridType.CRAFTING && !network.hasPermission(Permission.EXTRACT, player)) { + if (hasNetwork() && getType() == EnumGridType.CRAFTING && !network.getSecurityManager().hasPermission(Permission.EXTRACT, player)) { return; } diff --git a/src/main/resources/assets/refinedstorage/lang/en_US.lang b/src/main/resources/assets/refinedstorage/lang/en_US.lang index 14db5de0c..82739a9e2 100755 --- a/src/main/resources/assets/refinedstorage/lang/en_US.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_US.lang @@ -62,12 +62,14 @@ gui.refinedstorage:security_manager.permission.0=Insert gui.refinedstorage:security_manager.permission.0.tooltip=Inserting items to the network gui.refinedstorage:security_manager.permission.1=Extract gui.refinedstorage:security_manager.permission.1.tooltip=Extracting items from the network -gui.refinedstorage:security_manager.permission.2=Autocraft -gui.refinedstorage:security_manager.permission.2.tooltip=Starting and cancelling crafting tasks +gui.refinedstorage:security_manager.permission.2=Autocrafting +gui.refinedstorage:security_manager.permission.2.tooltip=Starting, cancelling and viewing crafting tasks gui.refinedstorage:security_manager.permission.3=Modify -gui.refinedstorage:security_manager.permission.3.tooltip=Opening GUIs, adding or removing blocks from the network -gui.refinedstorage:security_manager.permission.4=Security -gui.refinedstorage:security_manager.permission.4.tooltip=Ability to change security options +gui.refinedstorage:security_manager.permission.3.tooltip=Opening block GUIs +gui.refinedstorage:security_manager.permission.4=Build +gui.refinedstorage:security_manager.permission.4.tooltip=Adding or removing devices to or from the network +gui.refinedstorage:security_manager.permission.5=Security +gui.refinedstorage:security_manager.permission.5.tooltip=Ability to change security options misc.refinedstorage:energy_stored=%d / %d RS misc.refinedstorage:energy_usage=Usage: %d RS/t