diff --git a/CHANGELOG.md b/CHANGELOG.md index a02fae20a..25c4b28c9 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ - Fixed Crafting Manager displaying wrong name for chained crafters connected to some blocks (raoulvdberge) - Removed handling of reusable items in autocrafting, to avoid problems (raoulvdberge) - You can no longer start a crafting task if it has missing items or fluids (raoulvdberge) +- The Security Manager now supports Security Cards that have no player assigned to them. It is the default security card for players that aren't configured (raoulvdberge) +- If no default Security Card is configured in the Security Manager, an unconfigured player is allowed to do everything in the network. Create a default Security Card (craft a Security Craft and don't assign it to a player, it acts as a fallback) to handle unconfigured players (raoulvdberge) ### 1.6.5 - Fixed Refined Storage silicon's oredict entry being registered too late (raoulvdberge) 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 index ee49ac72e..921bf3dcf 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityCard.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityCard.java @@ -1,5 +1,6 @@ package com.raoulvdberge.refinedstorage.api.network.security; +import javax.annotation.Nullable; import java.util.UUID; /** @@ -7,8 +8,9 @@ import java.util.UUID; */ public interface ISecurityCard { /** - * @return the owner of this card + * @return the owner of this card, or null if this is a global card */ + @Nullable UUID getOwner(); /** 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 index d3ca2ee68..12b9b86a4 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityCardContainer.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityCardContainer.java @@ -1,5 +1,6 @@ package com.raoulvdberge.refinedstorage.api.network.security; +import javax.annotation.Nullable; import java.util.List; /** @@ -7,7 +8,13 @@ import java.util.List; */ public interface ISecurityCardContainer { /** - * @return the security cards in this container + * @return the security cards in this container, {@link ISecurityCard#getOwner()} CANNOT be null for any card in this list! */ List getCards(); + + /** + * @return the global security card in this container, or null if there is none, {@link ISecurityCard#getOwner()}) can be null! + */ + @Nullable + ISecurityCard getGlobalCard(); } 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 index 693eed3c9..9400d4bb3 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/security/ISecurityManager.java @@ -14,7 +14,7 @@ public interface ISecurityManager { boolean hasPermission(Permission permission, EntityPlayer player); /** - * Rebuilds the security list. + * Invalidates the security list. */ - void rebuild(); + void invalidate(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeSecurityManager.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeSecurityManager.java index 0148bcf6d..7bbc0b7d0 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeSecurityManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeSecurityManager.java @@ -19,6 +19,7 @@ import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.CombinedInvWrapper; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -26,19 +27,20 @@ import java.util.UUID; public class NetworkNodeSecurityManager extends NetworkNode implements ISecurityCardContainer { public static final String ID = "security_manager"; - private List actualCards = new ArrayList<>(); + private List cards = new ArrayList<>(); + private ISecurityCard globalCard; - private ItemHandlerBase cards = new ItemHandlerBase(9 * 2, new ListenerNetworkNode(this), new ItemValidatorBasic(RSItems.SECURITY_CARD)) { + private ItemHandlerBase cardsInv = new ItemHandlerBase(9 * 2, new ListenerNetworkNode(this), new ItemValidatorBasic(RSItems.SECURITY_CARD)) { @Override protected void onContentsChanged(int slot) { super.onContentsChanged(slot); if (!world.isRemote) { - rebuildCards(); + invalidate(); } if (network != null) { - network.getSecurityManager().rebuild(); + network.getSecurityManager().invalidate(); } } }; @@ -52,8 +54,8 @@ public class NetworkNodeSecurityManager extends NetworkNode implements ISecurity public int getEnergyUsage() { int usage = RS.INSTANCE.config.securityManagerUsage; - for (int i = 0; i < cards.getSlots(); ++i) { - if (!cards.getStackInSlot(i).isEmpty()) { + for (int i = 0; i < cardsInv.getSlots(); ++i) { + if (!cardsInv.getStackInSlot(i).isEmpty()) { usage += RS.INSTANCE.config.securityManagerPerSecurityCardUsage; } } @@ -66,39 +68,46 @@ public class NetworkNodeSecurityManager extends NetworkNode implements ISecurity super.update(); if (ticks == 1) { - rebuildCards(); + invalidate(); } } - private void rebuildCards() { - actualCards.clear(); + private void invalidate() { + this.cards.clear(); + this.globalCard = null; - for (int i = 0; i < cards.getSlots(); ++i) { - ItemStack stack = cards.getStackInSlot(i); + for (int i = 0; i < cardsInv.getSlots(); ++i) { + ItemStack stack = cardsInv.getStackInSlot(i); if (!stack.isEmpty()) { UUID uuid = ItemSecurityCard.getOwner(stack); if (uuid == null) { + this.globalCard = createCard(stack, null); + continue; } - SecurityCard card = new SecurityCard(uuid); - - for (Permission permission : Permission.values()) { - card.getPermissions().put(permission, ItemSecurityCard.hasPermission(stack, permission)); - } - - actualCards.add(card); + this.cards.add(createCard(stack, uuid)); } } } + private ISecurityCard createCard(ItemStack stack, @Nullable UUID uuid) { + SecurityCard card = new SecurityCard(uuid); + + for (Permission permission : Permission.values()) { + card.getPermissions().put(permission, ItemSecurityCard.hasPermission(stack, permission)); + } + + return card; + } + @Override public void read(NBTTagCompound tag) { super.read(tag); - StackUtils.readItems(cards, 0, tag); + StackUtils.readItems(cardsInv, 0, tag); StackUtils.readItems(editCard, 1, tag); } @@ -111,7 +120,7 @@ public class NetworkNodeSecurityManager extends NetworkNode implements ISecurity public NBTTagCompound write(NBTTagCompound tag) { super.write(tag); - StackUtils.writeItems(cards, 0, tag); + StackUtils.writeItems(cardsInv, 0, tag); StackUtils.writeItems(editCard, 1, tag); return tag; @@ -121,11 +130,11 @@ public class NetworkNodeSecurityManager extends NetworkNode implements ISecurity public void onConnectedStateChange(INetwork network, boolean state) { super.onConnectedStateChange(network, state); - network.getSecurityManager().rebuild(); + network.getSecurityManager().invalidate(); } public ItemHandlerBase getCardsItems() { - return cards; + return cardsInv; } public ItemHandlerBase getEditCard() { @@ -142,12 +151,18 @@ public class NetworkNodeSecurityManager extends NetworkNode implements ISecurity @Override public List getCards() { - return actualCards; + return cards; + } + + @Nullable + @Override + public ISecurityCard getGlobalCard() { + return globalCard; } @Override public IItemHandler getDrops() { - return new CombinedInvWrapper(cards, editCard); + return new CombinedInvWrapper(cardsInv, editCard); } @Override 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 index fd3c82342..966836833 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/security/SecurityCard.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/security/SecurityCard.java @@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.security; import com.raoulvdberge.refinedstorage.api.network.security.ISecurityCard; import com.raoulvdberge.refinedstorage.api.network.security.Permission; +import javax.annotation.Nullable; import java.util.HashMap; import java.util.Map; import java.util.UUID; @@ -11,7 +12,7 @@ public class SecurityCard implements ISecurityCard { private UUID owner; private Map permissions = new HashMap<>(); - public SecurityCard(UUID owner) { + public SecurityCard(@Nullable UUID owner) { this.owner = owner; } @@ -20,6 +21,7 @@ public class SecurityCard implements ISecurityCard { } @Override + @Nullable public UUID getOwner() { return owner; } 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 index beea8df81..881c20a80 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/security/SecurityManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/security/SecurityManager.java @@ -17,6 +17,7 @@ import java.util.UUID; public class SecurityManager implements ISecurityManager { private INetwork network; private Map cards = new HashMap<>(); + private ISecurityCard globalCard; public SecurityManager(INetwork network) { this.network = network; @@ -26,27 +27,42 @@ public class SecurityManager implements ISecurityManager { public boolean hasPermission(Permission permission, EntityPlayer player) { UserListOps ops = FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getOppedPlayers(); - if (cards.isEmpty() || ops.getEntry(player.getGameProfile()) != null) { + if (ops.getEntry(player.getGameProfile()) != null) { return true; } UUID uuid = player.getGameProfile().getId(); if (!cards.containsKey(uuid)) { - return false; + if (globalCard != null) { + return globalCard.hasPermission(permission); + } + + return true; } return cards.get(uuid).hasPermission(permission); } @Override - public void rebuild() { - cards.clear(); + public void invalidate() { + this.cards.clear(); + this.globalCard = null; for (INetworkNode node : network.getNodeGraph().all()) { if (node instanceof ISecurityCardContainer && node.canUpdate()) { - for (ISecurityCard card : ((ISecurityCardContainer) node).getCards()) { - cards.put(card.getOwner(), card); + ISecurityCardContainer container = (ISecurityCardContainer) node; + + for (ISecurityCard card : container.getCards()) { + if (card.getOwner() == null) { + throw new IllegalStateException("Owner in #getCards() cannot be null!"); + } + + this.cards.put(card.getOwner(), card); + } + + if (container.getGlobalCard() != null) { + this.globalCard = container.getGlobalCard(); } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockNodeProxy.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockNodeProxy.java index 7cc80794c..fbf28bd9b 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockNodeProxy.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockNodeProxy.java @@ -73,7 +73,7 @@ public abstract class BlockNodeProxy extends BlockBase { if (!node.getNetwork().getSecurityManager().hasPermission(permission, player)) { WorldUtils.sendNoPermissionMessage(player); - return false; + return true; // Avoid placing blocks } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemSecurityCard.java b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemSecurityCard.java index f2d87c6aa..0f1c9beac 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemSecurityCard.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemSecurityCard.java @@ -93,5 +93,11 @@ public class ItemSecurityCard extends ItemBase { if (stack.hasTagCompound() && stack.getTagCompound().hasKey(NBT_OWNER_NAME)) { tooltip.add(I18n.format("item.refinedstorage:security_card.owner", stack.getTagCompound().getString(NBT_OWNER_NAME))); } + + for (Permission permission : Permission.values()) { + if (hasPermission(stack, permission)) { + tooltip.add("- " + I18n.format("gui.refinedstorage:security_manager.permission." + permission.getId())); + } + } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java index be940f035..77f2363dc 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java @@ -232,7 +232,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe throttlingDisabled = false; nodeGraph.rebuild(); - securityManager.rebuild(); + securityManager.invalidate(); } } else { ticksSinceUpdateChanged = 0;