Package ch.entwine.weblounge.common.impl.security

Source Code of ch.entwine.weblounge.common.impl.security.SecuredObject

/*
*  Weblounge: Web Content Management System
*  Copyright (c) 2003 - 2011 The Weblounge Team
*  http://entwinemedia.com/weblounge
*
*  This program 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 2
*  of the License, or (at your option) any later version.
*
*  This program 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 this program; if not, write to the Free Software Foundation
*  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

package ch.entwine.weblounge.common.impl.security;

import ch.entwine.weblounge.common.security.Authority;
import ch.entwine.weblounge.common.security.Permission;
import ch.entwine.weblounge.common.security.PermissionSet;
import ch.entwine.weblounge.common.security.Securable;
import ch.entwine.weblounge.common.security.SecurityListener;
import ch.entwine.weblounge.common.security.User;

import java.util.ArrayList;
import java.util.List;

/**
* This is the base implementation for secured objects.
*/
public class SecuredObject implements Securable {

  /** The security context */
  protected SecurityContextImpl securityCtx = null;

  /** Security listener */
  protected List<SecurityListener> listeners = null;

  /**
   * Creates a secured object with no security constraints applied to it, except
   * that the owner may do anything with the object.
   *
   * @param owner
   *          the object owner
   */
  public SecuredObject(User owner) {
    securityCtx = new SecurityContextImpl(owner);
  }

  /**
   * Creates a secured object with no security constraints applied to it.
   */
  public SecuredObject() {
    securityCtx = new SecurityContextImpl();
  }

  /**
   * Returns the associated security context.
   *
   * @return the security context
   */
  public SecurityContextImpl getSecurityContext() {
    return securityCtx;
  }

  /**
   * Sets a new owner for this context.
   *
   * @param owner
   *          the context owner
   */
  public void setOwner(User owner) {
    User oldOwner = securityCtx.getOwner();
    securityCtx.setOwner(owner);
    fireOwnerChanged(owner, oldOwner);
  }

  /**
   * Returns the context owner.
   *
   * @return the owner
   */
  public User getOwner() {
    return securityCtx.getOwner();
  }

  /**
   * Checks whether the authorization satisfy the constraints of this context on
   * the given permission.
   *
   * @param permission
   *          the permission to obtain
   * @param authorization
   *          the object used to obtain the permission
   * @return <code>true</code> if the authorization is sufficient
   */
  public boolean check(Permission permission, Authority authorization) {
    return securityCtx.check(permission, authorization);
  }

  /**
   * Returns <code>true</code> if the authorization <code>authorization</code>
   * is sufficient to act on the secured object in a way that requires the given
   * permissionset <code>p</code>.
   *
   * @param permissions
   *          the required set of permissions
   * @param authorization
   *          the object claiming the permissions
   * @return <code>true</code> if the object may obtain the permissions
   */
  public boolean check(PermissionSet permissions, Authority authorization) {
    return securityCtx.check(permissions, authorization);
  }

  /**
   * Checks whether at least one of the given authorities pass with respect to
   * the given permission.
   *
   * @param permission
   *          the permission to obtain
   * @param authorities
   *          the object claiming the permission
   * @return <code>true</code> if all authorities pass
   */
  public boolean checkOne(Permission permission, Authority[] authorities) {
    if (authorities == null || authorities.length == 0)
      return true;
    for (Authority authority : authorities) {
      if (check(permission, authority))
        return true;
    }
    return false;
  }

  /**
   * Checks whether all of the given authorities pass with respect to the given
   * permission.
   *
   * @param permission
   *          the permission to obtain
   * @param authorities
   *          the object claiming the permission
   * @return <code>true</code> if all authorities pass
   */
  public boolean checkAll(Permission permission, Authority[] authorities) {
    if (authorities == null || authorities.length == 0)
      return true;
    for (Authority authority : authorities) {
      if (!check(permission, authority))
        return false;
    }
    return true;
  }

  /**
   * Returns the permissions that may be acquired on this object.
   *
   * @return the available permissions
   */
  public Permission[] permissions() {
    return securityCtx.permissions();
  }

  /**
   * Sets the permission <code>permission</code> to require the object
   * <code>item</code>.
   *
   * @param permission
   *          the permission
   * @param authorization
   *          the item that is allowed to obtain the permission
   */
  public void allow(Permission permission, Authority authorization) {
    if (permission == null)
      throw new IllegalArgumentException("permission");
    securityCtx.allow(permission, authorization);
    firePermissionChanged(permission);
  }

  /**
   * Removes the permission and any associated role requirements from this
   * context.
   *
   * @param permission
   *          the permission
   */
  public void deny(Permission permission, Authority authorization) {
    securityCtx.deny(permission, authorization);
    firePermissionChanged(permission);
  }

  /**
   * Adds <code>listener</code> to the list of security listeners that will be
   * notified in case of ownership or permission changes.
   *
   * @param listener
   *          the new security listener
   */
  public void addSecurityListener(SecurityListener listener) {
    if (listeners == null)
      listeners = new ArrayList<SecurityListener>();
    listeners.add(listener);
  }

  /**
   * Removes <code>listener</code> from the list of security listeners.
   *
   * @param listener
   *          the security listener to be removed
   */
  public void removeSecurityListener(SecurityListener listener) {
    if (listeners == null)
      return;
    listeners.remove(listener);
  }

  /**
   * Fires the <code>ownerChanged</code> event to all registered security
   * listeners.
   *
   * @param newOwner
   *          the new owner of this object
   * @param oldOwner
   *          the former object owner
   */
  protected void fireOwnerChanged(User newOwner, User oldOwner) {
    if (listeners == null)
      return;
    for (int i = 0; i < listeners.size(); i++) {
      (listeners.get(i)).ownerChanged(this, newOwner, oldOwner);
    }
  }

  /**
   * Fires the <code>permissionChanged</code> event to all registered security
   * listeners.
   *
   * @param p
   *          the changing permission
   */
  protected void firePermissionChanged(Permission p) {
    if (listeners == null)
      return;
    for (int i = 0; i < listeners.size(); i++) {
      (listeners.get(i)).permissionChanged(this, p);
    }
  }

}
TOP

Related Classes of ch.entwine.weblounge.common.impl.security.SecuredObject

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.