/* * This file is part of Applied Energistics 2. * Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved. * * Applied Energistics 2 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. * * Applied Energistics 2 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 Applied Energistics 2. If not, see . */ package appeng.me.cache; import java.util.ArrayList; import java.util.EnumSet; import java.util.HashMap; import java.util.List; import com.google.common.base.Preconditions; import com.mojang.authlib.GameProfile; import net.minecraft.entity.player.PlayerEntity; import appeng.api.config.SecurityPermissions; import appeng.api.networking.IGrid; import appeng.api.networking.IGridHost; import appeng.api.networking.IGridNode; import appeng.api.networking.IGridStorage; import appeng.api.networking.events.MENetworkEventSubscribe; import appeng.api.networking.events.MENetworkSecurityChange; import appeng.api.networking.security.ISecurityGrid; import appeng.api.networking.security.ISecurityProvider; import appeng.core.worlddata.WorldData; import appeng.me.GridNode; public class SecurityCache implements ISecurityGrid { private final IGrid myGrid; private final List securityProvider = new ArrayList<>(); private final HashMap> playerPerms = new HashMap<>(); private long securityKey = -1; public SecurityCache(final IGrid g) { this.myGrid = g; } @MENetworkEventSubscribe public void updatePermissions(final MENetworkSecurityChange ev) { this.playerPerms.clear(); if (this.securityProvider.isEmpty()) { return; } this.securityProvider.get(0).readPermissions(this.playerPerms); } public long getSecurityKey() { return this.securityKey; } @Override public void onUpdateTick() { } @Override public void removeNode(final IGridNode gridNode, final IGridHost machine) { if (machine instanceof ISecurityProvider) { this.securityProvider.remove(machine); this.updateSecurityKey(); } } private void updateSecurityKey() { final long lastCode = this.securityKey; if (this.securityProvider.size() == 1) { this.securityKey = this.securityProvider.get(0).getSecurityKey(); } else { this.securityKey = -1; } if (lastCode != this.securityKey) { this.getGrid().postEvent(new MENetworkSecurityChange()); for (final IGridNode n : this.getGrid().getNodes()) { ((GridNode) n).setLastSecurityKey(this.securityKey); } } } @Override public void addNode(final IGridNode gridNode, final IGridHost machine) { if (machine instanceof ISecurityProvider) { this.securityProvider.add((ISecurityProvider) machine); this.updateSecurityKey(); } else { ((GridNode) gridNode).setLastSecurityKey(this.securityKey); } } @Override public void onSplit(final IGridStorage destinationStorage) { } @Override public void onJoin(final IGridStorage sourceStorage) { } @Override public void populateGridStorage(final IGridStorage destinationStorage) { } @Override public boolean isAvailable() { return this.securityProvider.size() == 1 && this.securityProvider.get(0).isSecurityEnabled(); } @Override public boolean hasPermission(final PlayerEntity player, final SecurityPermissions perm) { Preconditions.checkNotNull(player); Preconditions.checkNotNull(perm); final GameProfile profile = player.getGameProfile(); final int playerID = WorldData.instance().playerData().getMePlayerId(profile); return this.hasPermission(playerID, perm); } @Override public boolean hasPermission(final int playerID, final SecurityPermissions perm) { if (this.isAvailable()) { final EnumSet perms = this.playerPerms.get(playerID); if (perms == null) { if (playerID == -1) // no default? { return false; } else { return this.hasPermission(-1, perm); } } return perms.contains(perm); } return true; } @Override public int getOwner() { if (this.isAvailable()) { return this.securityProvider.get(0).getOwner(); } return -1; } public IGrid getGrid() { return this.myGrid; } }