/******************************************************************************* * Copyright (c) 2015 /// Project SWG /// www.projectswg.com * * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * Our goal is to create an emulator which will provide a server for players to * continue playing a game similar to the one they used to play. We are basing * it on the final publish of the game prior to end-game events. * * This file is part of Holocore. * * -------------------------------------------------------------------------------- * * Holocore is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * Holocore 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Holocore. If not, see ******************************************************************************/ package resources.containers; import resources.objects.SWGObject; import java.io.Serializable; import java.util.*; /** * Structure for creating permission sets that will allow the object to be viewed/modified/added/removed by a requested * object depending on the implemented abstract methods. * @author Waverunner */ public abstract class ContainerPermissions implements Serializable { private static final long serialVersionUID = 1L; public static final WorldPermissions WORLD = new WorldPermissions(); public static final InventoryPermissions INVENTORY = new InventoryPermissions(); private Map permissionGroups; private List joinedGroups; public ContainerPermissions() { this.permissionGroups = new HashMap<>(); this.joinedGroups = new ArrayList<>(); } protected boolean hasPermissions(String group, Permission... permissions) { if (!hasPermissionGroup(group)) return false; EnumSet groupPermissions = Permission.getFlags(permissionGroups.get(group)); for (Permission permission : permissions) { if (!groupPermissions.contains(permission)) return false; } return true; } public boolean hasPermissions(List requesterGroups, Permission ... permission) { for (String group : requesterGroups) { if (hasPermissions(group, permission)) return true; } return false; } public void addPermissions(String group, Permission... permissions) { if (!hasPermissionGroup(group)) { permissionGroups.put(group, Permission.valueOf(permissions)); return; } EnumSet groupPermissions = Permission.getFlags(permissionGroups.get(group)); for (Permission permission : permissions) { groupPermissions.add(permission); } synchronized (permissionGroups) { permissionGroups.put(group, Permission.valueOf(groupPermissions)); } } public void removePermissions(String group, Permission... permissions) { if (!hasPermissionGroup(group)) return; EnumSet groupPermissions = Permission.getFlags(permissionGroups.get(group)); for (Permission permission : permissions) { groupPermissions.add(permission); } synchronized (permissionGroups) { permissionGroups.put(group, Permission.valueOf(groupPermissions)); } } public void clearPermissions(String group) { synchronized (permissionGroups) { if (permissionGroups.containsKey(group)) permissionGroups.put(group, 0); } } public boolean hasPermissionGroup(String group) { return permissionGroups.containsKey(group); } public Set getPermissionGroups() { synchronized(permissionGroups) { return permissionGroups.keySet(); } } public List getJoinedGroups() { return joinedGroups; } public void addDefaultWorldPermissions() { addPermissions("world", Permission.VIEW, Permission.ENTER); } public abstract boolean canView(SWGObject viewer, SWGObject container); public abstract boolean canEnter(SWGObject requester, SWGObject container); public abstract boolean canRemove(SWGObject requester, SWGObject container); public abstract boolean canMove(SWGObject requester, SWGObject container); public abstract boolean canAdd(SWGObject requester, SWGObject container); public enum Permission { VIEW(1), REMOVE(1<<1), ADD(1<<2), MOVE(1<<3), ENTER(1<<4); int bitmask; Permission(int bitmask) { this.bitmask = bitmask; } public static EnumSet getFlags(int bits) { EnumSet states = EnumSet.noneOf(Permission.class); for (Permission state : values()) { if ((state.bitmask & bits) != 0) states.add(state); } return states; } public static int valueOf(EnumSet bitmaskSet) { Permission[] permissions = bitmaskSet.toArray(new Permission[0]); return valueOf(permissions); } public static int valueOf(Permission... permissions) { int value = 0; for (Permission permission : permissions) { value += permission.bitmask; } return value; } } }