Author: adrianc
Date: Sat Oct 12 22:24:13 2013
New Revision: 1531602

URL: http://svn.apache.org/r1531602
Log:
Refactored SecurityFactory implementation - make OFBizSecurity an inner private 
class, plus some code cleanup.

Removed:
    ofbiz/trunk/framework/security/src/org/ofbiz/security/OFBizSecurity.java
Modified:
    ofbiz/trunk/framework/security/src/org/ofbiz/security/SecurityFactory.java

Modified: 
ofbiz/trunk/framework/security/src/org/ofbiz/security/SecurityFactory.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/security/src/org/ofbiz/security/SecurityFactory.java?rev=1531602&r1=1531601&r2=1531602&view=diff
==============================================================================
--- ofbiz/trunk/framework/security/src/org/ofbiz/security/SecurityFactory.java 
(original)
+++ ofbiz/trunk/framework/security/src/org/ofbiz/security/SecurityFactory.java 
Sat Oct 12 22:24:13 2013
@@ -18,13 +18,28 @@
  
*******************************************************************************/
 package org.ofbiz.security;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import java.util.ServiceLoader;
 
+import javax.servlet.http.HttpSession;
+
 import org.ofbiz.base.util.Assert;
 import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilMisc;
+import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.base.util.cache.UtilCache;
 import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.GenericEntityException;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.condition.EntityCondition;
+import org.ofbiz.entity.condition.EntityConditionList;
+import org.ofbiz.entity.condition.EntityExpr;
+import org.ofbiz.entity.condition.EntityOperator;
+import org.ofbiz.entity.util.EntityUtil;
 
 /**
  * A <code>Security</code> factory.
@@ -67,4 +82,202 @@ public final class SecurityFactory {
     }
 
     private SecurityFactory() {}
+
+    @SuppressWarnings("deprecation")
+    private static final class OFBizSecurity implements Security {
+
+        private Delegator delegator = null;
+
+        protected static final Map<String, Map<String, String>> 
simpleRoleEntity = UtilMisc.toMap(
+            "ORDERMGR", UtilMisc.<String, String>toMap("name", "OrderRole", 
"pkey", "orderId"),
+            "FACILITY", UtilMisc.<String, String>toMap("name", 
"FacilityParty", "pkey", "facilityId"),
+            "MARKETING", UtilMisc.<String, String>toMap("name", 
"MarketingCampaignRole", "pkey", "marketingCampaignId"));
+
+        private OFBizSecurity() {}
+
+        @Override
+        public void clearUserData(GenericValue userLogin) {
+            if (userLogin != null) {
+                delegator.getCache().remove("UserLoginSecurityGroup", 
EntityCondition.makeCondition("userLoginId", EntityOperator.EQUALS, 
userLogin.getString("userLoginId")));
+            }
+        }
+
+        @Override
+        public Iterator<GenericValue> 
findUserLoginSecurityGroupByUserLoginId(String userLoginId) {
+            try {
+                List<GenericValue> collection = 
EntityUtil.filterByDate(delegator.findByAnd("UserLoginSecurityGroup", 
UtilMisc.toMap("userLoginId", userLoginId), null, true));
+                return collection.iterator();
+            } catch (GenericEntityException e) {
+                Debug.logWarning(e, module);
+                return Collections.<GenericValue>emptyList().iterator();
+            }
+        }
+
+        @Override
+        public Delegator getDelegator() {
+            return this.delegator;
+        }
+
+        @Override
+        public boolean hasEntityPermission(String entity, String action, 
GenericValue userLogin) {
+            if (userLogin == null) return false;
+            String permission = entity.concat(action);
+            String adminPermission = entity.concat("_ADMIN");
+            Iterator<GenericValue> iterator = 
findUserLoginSecurityGroupByUserLoginId(userLogin.getString("userLoginId"));
+            while (iterator.hasNext()) {
+                GenericValue userLoginSecurityGroup = iterator.next();
+                if 
(securityGroupPermissionExists(userLoginSecurityGroup.getString("groupId"), 
permission))
+                    return true;
+                if 
(securityGroupPermissionExists(userLoginSecurityGroup.getString("groupId"), 
adminPermission))
+                    return true;
+            }
+
+            return false;
+        }
+
+        @Override
+        public boolean hasEntityPermission(String entity, String action, 
HttpSession session) {
+            if (session == null) {
+                return false;
+            }
+            GenericValue userLogin = (GenericValue) 
session.getAttribute("userLogin");
+            if (userLogin == null) {
+                return false;
+            }
+            return hasEntityPermission(entity, action, userLogin);
+        }
+
+        @Override
+        public boolean hasPermission(String permission, GenericValue 
userLogin) {
+            if (userLogin == null) {
+                return false;
+            }
+            Iterator<GenericValue> iterator = 
findUserLoginSecurityGroupByUserLoginId(userLogin.getString("userLoginId"));
+            GenericValue userLoginSecurityGroup = null;
+            while (iterator.hasNext()) {
+                userLoginSecurityGroup = iterator.next();
+                if 
(securityGroupPermissionExists(userLoginSecurityGroup.getString("groupId"), 
permission)) return true;
+            }
+            return false;
+        }
+
+        @Override
+        public boolean hasPermission(String permission, HttpSession session) {
+            GenericValue userLogin = (GenericValue) 
session.getAttribute("userLogin");
+            if (userLogin == null) {
+                return false;
+            }
+            return hasPermission(permission, userLogin);
+        }
+
+        /**
+         * Like hasEntityPermission above, this checks the specified action, 
as well as for "_ADMIN" to allow for simplified
+         * general administration permission, but also checks action_ROLE and 
validates the user is a member for the
+         * application.
+         *
+         * @param application The name of the application corresponding to the 
desired permission.
+         * @param action The action on the application corresponding to the 
desired permission.
+         * @param entityName The name of the role entity to use for validation.
+         * @param condition EntityCondition used to query the entityName.
+         * @param userLogin The userLogin object for user to check against.
+         * @return Returns true if the currently logged in userLogin has the 
specified permission, otherwise returns false.
+         */
+        private boolean hasRolePermission(String application, String action, 
String entityName, EntityCondition condition, GenericValue userLogin) {
+            if (userLogin == null) {
+                return false;
+            }
+            // first check the standard permission
+            if (hasEntityPermission(application, action, userLogin)) {
+                return true;
+            }
+            // make sure we have what's needed for role security
+            if (entityName == null || condition == null) {
+                return false;
+            }
+            // now check the user for the role permission
+            if (hasEntityPermission(application + "_ROLE", action, userLogin)) 
{
+                // we have the permission now, we check to make sure we are 
allowed access
+                try {
+                    List<GenericValue> roleTest = 
delegator.findList(entityName, condition, null, null, null, false);
+                    if (!roleTest.isEmpty()) {
+                        return true;
+                    }
+                } catch (GenericEntityException e) {
+                    Debug.logError(e, "Problems doing role security lookup on 
entity [" + entityName + "] using [" + condition + "]", module);
+                    return false;
+                }
+            }
+            return false;
+        }
+
+        @Override
+        public boolean hasRolePermission(String application, String action, 
String primaryKey, List<String> roles, GenericValue userLogin) {
+            if (userLogin == null) {
+                return false;
+            }
+            if (primaryKey.equals("") && roles == null) {
+                if (hasEntityPermission(application, action, userLogin)) 
return true;
+                if (hasEntityPermission(application + "_ROLE", action, 
userLogin)) return true;
+            }
+            String entityName = null;
+            EntityCondition condition = null;
+            Map<String, String> simpleRoleMap = 
OFBizSecurity.simpleRoleEntity.get(application);
+            if (simpleRoleMap != null && roles != null) {
+                entityName = simpleRoleMap.get("name");
+                String pkey = simpleRoleMap.get("pkey");
+                if (pkey != null) {
+                    List<EntityExpr> expressions = new ArrayList<EntityExpr>();
+                    for (String role: roles) {
+                        
expressions.add(EntityCondition.makeCondition("roleTypeId", 
EntityOperator.EQUALS, role));
+                    }
+                    EntityConditionList<EntityExpr> exprList = 
EntityCondition.makeCondition(expressions, EntityOperator.OR);
+                    EntityExpr keyExpr = EntityCondition.makeCondition(pkey, 
primaryKey);
+                    EntityExpr partyExpr = 
EntityCondition.makeCondition("partyId", userLogin.getString("partyId"));
+                    condition = EntityCondition.makeCondition(exprList, 
keyExpr, partyExpr);
+                }
+
+            }
+            return hasRolePermission(application, action, entityName, 
condition, userLogin);
+        }
+
+        @Override
+        public boolean hasRolePermission(String application, String action, 
String primaryKey, List<String> roles, HttpSession session) {
+            GenericValue userLogin = (GenericValue) 
session.getAttribute("userLogin");
+            return hasRolePermission(application, action, primaryKey, roles, 
userLogin);
+        }
+
+        @Override
+        public boolean hasRolePermission(String application, String action, 
String primaryKey, String role, GenericValue userLogin) {
+            List<String> roles = null;
+            if (role != null && !role.equals("")) {
+                roles = UtilMisc.toList(role);
+            }
+            return hasRolePermission(application, action, primaryKey, roles, 
userLogin);
+        }
+
+        @Override
+        public boolean hasRolePermission(String application, String action, 
String primaryKey, String role, HttpSession session) {
+            GenericValue userLogin = (GenericValue) 
session.getAttribute("userLogin");
+            return hasRolePermission(application, action, primaryKey, role, 
userLogin);
+        }
+
+        @Override
+        public boolean securityGroupPermissionExists(String groupId, String 
permission) {
+            try {
+                return delegator.findOne("SecurityGroupPermission",  
UtilMisc.toMap("groupId", groupId, "permissionId", permission), true) != null;
+            } catch (GenericEntityException e) {
+                Debug.logWarning(e, module);
+                return false;
+            }
+        }
+
+        @Override
+        public void setDelegator(Delegator delegator) {
+            if (this.delegator != null) {
+                throw new IllegalStateException("This object has been 
initialized already.");
+            }
+            Assert.notNull("delegator", delegator);
+            this.delegator = delegator;
+        }
+    }
 }


Reply via email to