Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * This program is free software; you can redistribute it and/or modify it under the
   * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
   * Foundation.
   *
   * You should have received a copy of the GNU Lesser General Public License along with this
   * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
   * or from the Free Software Foundation, Inc.,
   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
  * 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.
  *
  * Copyright (c) 2009 Pentaho Corporation.  All rights reserved.
  */
 package org.pentaho.pms.schema.security;
 
 import java.util.List;
 import java.util.Map;
 
 import  org.pentaho.di.core.xml.XMLHandler;
Stores constraints that are used to filter rows. Row level security is specified at the business model level.

Deprecated:
as of metadata 3.0. please use org.pentaho.metadata.model.concept.security.RowLevelSecurity
Author(s):
mlowery
 
 public class RowLevelSecurity implements Cloneable {
 
   private static final String ATTR_VALUE_NONE = "none";
 
   private static final String ATTR_VALUE_ROLE_BASED = "role-based";
 
   private static final String ATTR_VALUE_GLOBAL = "global";
 
   private static final String EQUALS = "=";
 
   private static final String SPACE = " ";
 
   private static final Log logger = LogFactory.getLog(RowLevelSecurity.class);
 
   public static enum Type {
     NONE, GLOBAL, ROLEBASED
   }
 
   private static final String EMPTY_STRING = "";
 
   private static final String CDATA_END = "]]>";
 
   private static final String CDATA_BEGIN = "<![CDATA[";
 
   private static final String EMPTY_ELEM_NAME_END = " />";
 
   private static final String FINISH_ELEM_NAME_BEGIN = "</";
 
   private static final String ELEM_NAME_END = ">";
 
   private static final String START_ELEM_NAME_BEGIN = "<";
 
   private static final String ELEM_FORMULA = "formula";
 
   private static final String ELEM_ROW_LEVEL_SECURITY = "row-level-security";
 
   private static final String ELEM_ENTRIES = "entries";
 
   private static final String ELEM_ENTRY = "entry";
 
   private static final String ELEM_OWNER = "owner";
 
   private static final String FUNC_AND = "AND";
 
   private static final String FUNC_OR = "OR";
 
   private static final String FUNC_IN = "IN";
 
   private static final String PARAM_LIST_BEGIN = "(";
 
   private static final String PARAM_LIST_END = ")";
 
   private static final String PARAM_SEPARATOR = ";";
 
   private static final String FUNC_ROLES = "ROLES()";
 
   private static final String FUNC_USER = "USER()";
 
   private static final String ATTR_TYPE = "type";
 
  private static final String ATTR_QUOTE = "\"";
  private static final String PARAM_QUOTE = "\"";
  private Type type;

  
See getType(). Type will tell you which of three options are in effect: no RLS, global, or role-based.
  private String globalConstraint = ;

  
See getType(). Type will tell you which of three options are in effect: no RLS, global, or role-based.
  public RowLevelSecurity(String globalConstraint) {
    this(.globalConstraintnull);
  }
  public RowLevelSecurity(Map<SecurityOwnerStringroleBasedConstraintMap) {
    this(.nullroleBasedConstraintMap);
  }
  public RowLevelSecurity() {
    this(.nullnull);
  }
  public RowLevelSecurity(Type typeString globalConstraintMap<SecurityOwnerStringroleBasedConstraintMap) {
    setGlobalConstraint(globalConstraint);
    setRoleBasedConstraintMap(roleBasedConstraintMap);
    this. = type;
  }
  public Object clone() throws CloneNotSupportedException {
    return new RowLevelSecurity(,
  }
    Map<SecurityOwnerStringcopy = new HashMap<SecurityOwnerString>();
    for (Map.Entry<SecurityOwnerStringentry : map.entrySet()) {
      SecurityOwner clonedOwner = (SecurityOwnerentry.getKey().clone();
      copy.put(clonedOwnerentry.getValue());
    }
    return copy;
  }
  public boolean equals(Object obj) {
    if (obj instanceof RowLevelSecurity == false) {
      return false;
    }
    if (this == obj) {
      return true;
    }
    RowLevelSecurity rhs = (RowLevelSecurityobj;
    return new EqualsBuilder().append(rhs.type).append(rhs.globalConstraint).append(
        rhs.roleBasedConstraintMap).isEquals();
  }
  public int hashCode() {
        .toHashCode();
  }
  public String toString() {
    return new ToStringBuilder(this).append("type").append("globalConstraint").append(
        "roleBasedConstraintMap").toString();
  }
  public String toXML() {
    StringBuilder xml = new StringBuilder();
    // print rls begin element
    if (isGlobal()) {
    } else if (isRoleBased()) {
    } else {
    }
    xml.append();
    // print global
    // print role-based
      SecurityOwner owner = entry.getKey();
      String formula = entry.getValue();
      xml.append(owner.toXML());
      xml.append().append(formula).append();
    }
    // print rls end element
    return xml.toString();
  }
  public RowLevelSecurity(Node rlsNodethrows Exception {
    String typeString = rlsNode.getAttributes().getNamedItem().getTextContent();
    if (.equals(typeString)) {
       = .;
    } else if (.equals(typeString)) {
       = .;
    } else {
       = .;
    }
    // global
    Node globalFormulaNode = XMLHandler.getSubNode(rlsNode);
     = globalFormulaNode.getTextContent();
    // role-based
    Map<SecurityOwnerStringmap = new HashMap<SecurityOwnerString>();
    Node entriesNode = XMLHandler.getSubNode(rlsNode);
    int entryCount = XMLHandler.countNodes(entriesNode);
    for (int i = 0; i < entryCounti++) {
      Node entryNode = XMLHandler.getSubNodeByNr(entriesNodei);
      Node ownerNode = XMLHandler.getSubNode(entryNode);
      // build owner using its node constructor
      SecurityOwner owner = new SecurityOwner(ownerNode);
      Node formulaNode = XMLHandler.getSubNode(entryNode);
      String formula = formulaNode.getTextContent();
      map.put(ownerformula);
    }
     = map;
  }
  public static RowLevelSecurity fromXML(String valuethrows Exception {
    Document doc = XMLHandler.loadXMLString(value);
    return new RowLevelSecurity(XMLHandler.getSubNode(doc)); //$NON-NLS-1$
  }
  public boolean isGlobal() {
    return  == .;
  }
  public boolean isRoleBased() {
    return  == .;
  }

  
this method returns an OR'ed list of all the constraints that pertain to a specific user/role list

Parameters:
user current user
roles current roles
Returns:
OR'ed list of constraints that apply to this user.
  protected String generateRuleBasedConstraint(String userList<Stringroles) {
    
    List<Stringpieces = new ArrayList<String>();
      SecurityOwner owner = entry.getKey();
      String formula = entry.getValue();
      
      // if the user or a user role matches this constraint
      // add it to the pieces list
      
      if ((owner.getOwnerType() == . && 
          owner.getOwnerName().equals(user)) ||
          (roles != null && 
          owner.getOwnerType() == . &&
          roles.contains(owner.getOwnerName()))) {
        pieces.add(formula);
      }
    }
    
    if (pieces.size() == 0) {
      return "FALSE()";
    } else if (pieces.size() == 1) {
      return pieces.get(0);
    } else {
      
      // generate an OR(PIECE0;PIECE1;...) list
      
      StringBuilder buf = new StringBuilder();
      buf.append();
      buf.append();
      int index = 0;
      for (String piece : pieces) {
        if (index > 0) {
          buf.append();
        }
        buf.append(piece);
        index++;
      }
      buf.append();
      return buf.toString();
    }
    
  }

  
WG: Note, this method is not used at the moment, we may in the future use this if MQL is partially executed before passing down the SQL to database engines.
  protected String getIntermediateFormula() {
    if (isGlobal()) {
      return ;
    } else if (isRoleBased()) {
      return roleMapToFormula();
    } else {
      // rls is disabled
      return ;
    }
  }
  
  
WG: Note, this method is not used at the moment, we may in the future use this if MQL is partially executed before passing down the SQL to database engines.
  protected String roleMapToFormula() {
    List<Stringpieces = new ArrayList<String>();
      SecurityOwner owner = entry.getKey();
      String formula = entry.getValue();
      StringBuilder formulaBuf = new StringBuilder();
              owner.getOwnerType() == . ?  : ).append()
          .append().append(formula).append();
      pieces.add(formulaBuf.toString());
    }
    StringBuilder buf = new StringBuilder();
    buf.append();
    int index = 0;
    for (String piece : pieces) {
      if (index > 0) {
        buf.append();
      }
      buf.append(piece);
      index++;
    }
    .debug("singleFormula: " + buf);
    return buf.toString();
  }
  
  public String getMQLFormula(String userList<Stringroles) {
    if (isGlobal()) {
      return expandFunctions(userroles);
    } else if (isRoleBased()) {
      return generateRuleBasedConstraint(userroles);
    } else {
      // rls is disabled
      return ;
    }
  }
  protected String expandFunctions(String formulaString userList<Stringroles) {
    // "expand" USER() function (regex: escape parentheses and escape backslash that escapes parentheses
    formula = formula.replaceAll("USER\\(\\)", String.format("\"%s\""user));
    // "expand" ROLES() function (regex: escape parentheses and escape backslash that escapes parentheses
    StringBuilder buf = new StringBuilder();
    int i = 0;
    for (String role : roles) {
      if (i > 0) {
        buf.append(";");
      }
      buf.append(String.format("\"%s\""role));
      i++;
    }
    return formula.replaceAll("ROLES\\(\\)"buf.toString());
  }
  public Type getType() {
    return ;
  }
  public void setType(Type type) {
    this. = type;
  }
  public String getGlobalConstraint() {
    return ;
  }
  public void setGlobalConstraint(String globalConstraint) {
    if (globalConstraint != null) {
      this. = globalConstraint;
    } else {
      this. = ;
    }
  }
    return ;
  }
  public void setRoleBasedConstraintMap(Map<SecurityOwnerStringroleBasedConstraintMap) {
    if (roleBasedConstraintMap != null) {
      this. = roleBasedConstraintMap;
    } else {
      this. = new HashMap<SecurityOwnerString>();
    }
  }
  
  public static void main(String[] args) {
    String formula = "OR(AND(IN(\"suzy\";USER());[BT_CUSTOMER_W_TER_CUSTOMER_W_TER.BC_CUSTOMER_W_TER_COUNTRY] = \"USA\"))";
    // "expand" USER() function (regex: escape parentheses and escape backslash that escapes parentheses
    formula = formula.replaceAll("USER\\(\\)", String.format("\"%s\"""whatever"));
    ..println(formula);
  }
New to GrepCode? Check out our FAQ X