/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package Sirius.server.newuser.permission; import Sirius.server.newuser.UserGroup; import Sirius.util.Mapable; import org.apache.log4j.Logger; import java.io.Serializable; import de.cismet.tools.CurrentStackTrace; import de.cismet.tools.collections.MultiMap; /** * Bei der Intstanzierung eines PermissionHolders erlaubt dieser zunaechst jeglichen Zugriff (hasPermission ist immer * wahr) Sobald ein Recht für ein PermissionHolder Objekt gesetzt wird (addPermission), werden allen anderen Schluesseln * die Rechte entzogen (restricted = true). * * @version $Revision$, $Date$ */ public final class PermissionHolder implements Serializable { //~ Static fields/initializers --------------------------------------------- private static final transient Logger LOG = Logger.getLogger( PermissionHolder.class); public static final int READ = 0; public static final int WRITE = 1; public static final Permission READPERMISSION = new Permission(READ, "read"); // NOI18N public static final Permission WRITEPERMISSION = new Permission(WRITE, "write"); // NOI18N //~ Instance fields -------------------------------------------------------- /** usergroup maps visible yes/no. */ private final MultiMap permissions; private Policy policy; //~ Constructors ----------------------------------------------------------- /** * Creates a new PermissionHolder object. * * @param policy DOCUMENT ME! */ public PermissionHolder(final Policy policy) { this.policy = policy; permissions = new MultiMap(); } /** * Creates a new PermissionHolder object. */ private PermissionHolder() { permissions = new MultiMap(); } //~ Methods ---------------------------------------------------------------- /** * adds an permission reference by lsname+class or method or attribute id. * * @param m DOCUMENT ME! */ public void addPermission(final Mapable m) { permissions.put(m.getKey().toString(), READPERMISSION); } /** * DOCUMENT ME! * * @param perms DOCUMENT ME! */ public void addPermissions(final PermissionHolder perms) { this.permissions.putAll(perms.permissions); } /** * DOCUMENT ME! * * @param ug DOCUMENT ME! * @param perm DOCUMENT ME! */ public void addPermission(final UserGroup ug, final Permission perm) { addPermission(ug.getKey().toString(), perm); } /** * DOCUMENT ME! * * @param m DOCUMENT ME! * @param perm DOCUMENT ME! */ public void addPermission(final Mapable m, final Permission perm) { addPermission(m.getKey().toString(), perm); } /** * DOCUMENT ME! * * @param key DOCUMENT ME! * @param perm DOCUMENT ME! */ public void addPermission(final Object key, final Permission perm) { permissions.put(key.toString(), perm); } /** * DOCUMENT ME! * * @param ug DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean hasReadPermission(final UserGroup ug) { try { return hasPermission(ug.getKey().toString(), READPERMISSION); } catch (final Exception e) { LOG.error("error in hasReadPermission (ug = " // NOI18N + ug + "). Will return false.", e); // NOI18N return false; } } /** * DOCUMENT ME! * * @param ug DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean hasWritePermission(final UserGroup ug) { try { return hasPermission(ug.getKey().toString(), WRITEPERMISSION); } catch (final Exception e) { LOG.error("Error in hasWritePermission (ug = " // NOI18N + ug + "). Will return false.", e); // NOI18N return false; } } /** * checks if theres a Permission for an ordered pair of lsname+id. * * @param key DOCUMENT ME! * @param perm DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean hasPermission(final Object key, final Permission perm) { if (getPolicy() == null) { LOG.warn( "No Policy was set. Set PARANOID Policy. " // NOI18N + "Attention. This could lead to something " // NOI18N + "that you not want.", // NOI18N new CurrentStackTrace()); setPolicy(Policy.createParanoidPolicy()); } if (containsPermission(key, perm)) { return !getPolicy().getDecisionIfNoEntryIsFound(perm); } else { return getPolicy().getDecisionIfNoEntryIsFound(perm); } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public Policy getPolicy() { return policy; } /** * DOCUMENT ME! * * @param policy DOCUMENT ME! */ public void setPolicy(final Policy policy) { this.policy = policy; } /** * DOCUMENT ME! * * @param key DOCUMENT ME! * @param perm DOCUMENT ME! * * @return DOCUMENT ME! */ private boolean containsPermission(final Object key, final Permission perm) { return permissions.contains(key, perm); } }