Author: jaz
Date: Fri Feb 16 12:42:33 2007 New Revision: 508571 URL: http://svn.apache.org/viewvc?view=rev&rev=508571 Log: major revision of content permission services Modified: ofbiz/trunk/applications/content/script/org/ofbiz/content/permission/ContentPermissionServices.xml Modified: ofbiz/trunk/applications/content/script/org/ofbiz/content/permission/ContentPermissionServices.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/content/script/org/ofbiz/content/permission/ContentPermissionServices.xml?view=diff&rev=508571&r1=508570&r2=508571 ============================================================================== --- ofbiz/trunk/applications/content/script/org/ofbiz/content/permission/ContentPermissionServices.xml (original) +++ ofbiz/trunk/applications/content/script/org/ofbiz/content/permission/ContentPermissionServices.xml Fri Feb 16 12:42:33 2007 @@ -28,6 +28,22 @@ <set field="primaryPermission" value="CONTENTMGR"/> <call-simple-method method-name="genericBasePermissionCheck" xml-resource="org/ofbiz/common/permission/CommonPermissionServices.xml"/> + <!-- here we can use contentIdTo to check parent(s) ownership --> + <if> + <condition> + <and> + <if-empty field-name="parameters.ownerContentId"/> + <not> + <if-empty field-name="parameters.contentIdTo"/> + </not> + </and> + </condition> + <then> + <set field="ownerContentId" from-field="parameters.contentIdTo"/> + </then> + </if> + + <!-- mainAction based call outs --> <if> <condition> <not> @@ -49,6 +65,10 @@ <if-compare field-name="parameters.mainAction" value="CREATE" operator="equals"/> </condition> <then> + <!-- setup default operation --> + <if-empty field-name="parameters.contentOperationId"> + <set field="contentOperationId" value="CONTENT_CREATE"/> + </if-empty> <call-simple-method method-name="createContentPermission"/> </then> </else-if> @@ -58,13 +78,23 @@ <if-compare field-name="parameters.mainAction" value="UPDATE" operator="equals"/> </condition> <then> + <!-- setup default operation --> + <if-empty field-name="parameters.contentOperationId"> + <set field="contentOperationId" value="CONTENT_UPDATE"/> + </if-empty> <call-simple-method method-name="updateContentPermission"/> </then> </else-if> <!-- all other actions use main base check --> </if> </then> + <else> + <log level="always" message="Admin permission found: ${primaryPermission}_${mainAction}"/> + </else> </if> + + <log level="always" message="Permission service [${mainAction} / ${parameters.contentId}] completed; returning hasPermission = ${hasPermission}"/> + <field-to-result field-name="hasPermission"/> </simple-method> <simple-method method-name="viewContentPermission" short-description="Check user can view content"> @@ -140,6 +170,8 @@ <if-compare field-name="hasPermission" value="true" type="Boolean" operator="equals"/> </condition> <then> + <log level="verbose" message="Found necessary ROLE permission: ${primaryPermission}_${mainAction} :: ${contentOperationId}"/> + <!-- if an operation is passed, check the operation security --> <if> <condition> @@ -147,7 +179,8 @@ <if-empty field-name="contentOperationId"/> </not> </condition> - <then> + <then> + <set field="checkContentId" from-field="ownerContentId"/> <call-simple-method method-name="checkContentOperationSecurity"/> </then> @@ -160,7 +193,9 @@ </not> </condition> <then> + <log level="verbose" message="No operation found; but ownerContentId [${ownerContentId}] was; checking ownership"/> <set field="checkContentId" from-field="ownerContentId"/> + <log level="verbose" message="Checking Parent Ownership [${checkContentId}]"/> <call-simple-method method-name="checkContentOwnership"/> <if> <condition> @@ -190,6 +225,7 @@ </condition> <then> <set field="checkContentId" from-field="currentContent.ownerContentId"/> + <log level="verbose" message="Checking Parent(s) Ownership [${checkContentId}]"/> <call-simple-method method-name="checkContentOwnership"/> </then> @@ -201,6 +237,9 @@ </then> </while> </then> + <else> + <log level="verbose" message="Permission set to TRUE; granting access"/> + </else> </if> </then> </if> @@ -220,17 +259,12 @@ </if-empty> <!-- contentId is required for update checking --> - <if> - <condition> - <and> - <if-empty field-name="parameters.contentId"/> - <if-empty field-name="contentId"/> - </and> - </condition> - <then> - <add-error><fail-message message="Content Permission Service UPDATE requires a contentId!"/></add-error> - </then> - </if> + <if-empty field-name="contentId"> + <set field="contentId" from-field="parameters.contentId"/> + </if-empty> + <if-empty field-name="contentId"> + <add-error><fail-message message="Content Permission Service UPDATE requires a contentId!"/></add-error> + </if-empty> <check-errors/> <!-- ownerContentId can be set from a calling method --> @@ -254,6 +288,17 @@ <if-compare field-name="hasPermission" value="true" type="Boolean" operator="equals"/> </condition> <then> + <log level="verbose" message="Found necessary ROLE permission: ${primaryPermission}_${mainAction}"/> + + <!-- obtain the current content record --> + <entity-one entity-name="Content" value-name="thisContent"> + <field-map field-name="contentId"/> + </entity-one> + <if-empty field-name="thisContent"> + <add-error><fail-message message="Content record not found for ID [${contentId}]"/></add-error> + <check-errors/> + </if-empty> + <!-- check the operation --> <if> <condition> @@ -262,11 +307,24 @@ </not> </condition> <then> + <log level="verbose" message="Checking content operation for UPDATE: ${contentOperationId}"/> + <set field="checkContentId" from-field="contentId"/> <call-simple-method method-name="checkContentOperationSecurity"/> </then> + </if> - <!-- if no operation is passed; check ownership for permission --> - <else> + <!-- check if there was no operation; or if the operation check failed --> + <if> + <condition> + <or> + <if-empty field-name="contentOperationId"/> + <if-compare field-name="hasPermission" value="false" type="Boolean" operator="equals"/> + </or> + </condition> + + <!-- if no valid operation is passed; check ownership for permission --> + <then> + <log level="verbose" message="No valid operation for UPDATE; checking ownership instead!"/> <set field="checkContentId" from-field="contentId"/> <call-simple-method method-name="checkContentOwnership"/> @@ -274,13 +332,14 @@ <if> <condition> <and> - <if-compare field-name="hasPermission" value="true" type="Boolean" operator="equals"/> <not> <if-empty field-name="ownerContentId"/> </not> + <if-compare-field field-name="ownerContentId" operator="not-equals" to-field-name="ownerContentId" map-name="thisContent"/> </and> </condition> <then> + <log level="verbose" message="Updating content ownership; need to verify permision on parent(s)"/> <set field="checkContentId" from-field="ownerContentId"/> <call-simple-method method-name="checkContentOwnership"/> <if> @@ -325,7 +384,7 @@ </if> </then> </if> - </else> + </then> </if> </then> </if> @@ -334,6 +393,7 @@ <!-- method to check operation security --> <simple-method method-name="checkContentOperationSecurity" short-description="Checks for Operation defined security"> + <!-- resetting the permission flag --> <set field="hasPermission" type="Boolean" value="false"/> <if-empty field-name="contentOperationId"> @@ -341,6 +401,9 @@ </if-empty> <if-empty field-name="contentPurposeTypeId"> + <set field="contentPurposeTypeId" from-field="parameters.contentPurposeTypeId"/> + </if-empty> + <if-empty field-name="contentPurposeTypeId"> <set field="contentPurposeTypeId" value="_NA_"/> </if-empty> @@ -350,18 +413,21 @@ </if-not-empty> </if-empty> - <entity-and entity-name="ContentPurposeOperation" list-name="operations"> - <field-map field-name="contentPurposeTypeId"/> - <field-map field-name="contentOperationId"/> - </entity-and> - <if-empty field-name="operations"> - <if-compare field-name="contentPurposeTypeId" value="_NA_" operator="not-equals"> - <entity-and entity-name="ContentPurposeOperation" list-name="operations"> - <field-map field-name="contentPurposeTypeId" value="_NA_"/> - <field-map field-name="contentOperationId"/> - </entity-and> - </if-compare> - </if-empty> + <!-- check both the purpose and the _NA_ purpose --> + <entity-condition entity-name="ContentPurposeOperation" list-name="operations"> + <condition-list combine="and"> + <condition-list combine="or"> + <condition-expr field-name="contentPurposeTypeId" operator="equals" env-name="contentPurposeTypeId"/> + <condition-expr field-name="contentPurposeTypeId" operator="equals" value="_NA_"/> + </condition-list> + <condition-expr field-name="contentOperationId" operator="equals" env-name="contentOperationId"/> + </condition-list> + <order-by field-name="contentPurposeTypeId"/> + </entity-condition> + + <!-- place holder for the content ID --> + <set field="toCheckContentId" from-field="checkContentId"/> + <log level="verbose" message="[${checkContentId}] Found Operations [${contentPurposeTypeId}/${contentOperationId}] :: ${operations}"/> <if> <condition> @@ -369,6 +435,7 @@ </condition> <!-- there are no ContentPurposeOperation entries for this operation/purpose; default is approve permission --> <then> + <log level="verbose" message="No operations found; permission granted!"/> <set field="hasPermission" type="Boolean" value="true"/> </then> <!-- there are requirements to test --> @@ -378,6 +445,23 @@ <!-- check each operation security --> <iterate entry-name="operation" list-name="operations"> + <!-- reset the checkContentId if needed --> + <if> + <condition> + <and> + <if-empty field-name="checkContentId"/> + <not> + <if-empty field-name="toCheckContentId"/> + </not> + </and> + </condition> + <then> + <set field="checkContentId" from-field="toCheckContentId"/> + </then> + </if> + + <log level="verbose" message="Testing OPERATION: ${operation}"/> + <!-- check statusId --> <if> <condition> @@ -395,9 +479,56 @@ <!-- first check passed; now we test for the role membership(s) --> <iterate entry-name="thisPartyId" list-name="partyIdList"> <if-compare field-name="hasPermission" value="false" type="Boolean" operator="equals"> - <set field="roleTypeId" from-field="operation.roleTypeId"/> - <set field="partyId" from-field="thisPartyId"/> + <set field="checkRoleTypeId" from-field="operation.roleTypeId"/> + <set field="checkPartyId" from-field="thisPartyId"/> <call-simple-method method-name="checkContentRoleSecurity"/> + + <!-- check the parent(s) for permission --> + <if> + <condition> + <and> + <if-compare field-name="hasPermission" value="false" type="Boolean" operator="equals"/> + <not> + <if-empty field-name="checkContentId"/> + </not> + </and> + </condition> + <then> + <log level="verbose" message="Starting loop; checking operation: ${operation.contentOperationId}"/> + <while> + <condition> + <!-- iterate until either we have permission or there are no more parents --> + <and> + <if-compare field-name="hasPermission" value="false" type="Boolean" operator="equals"/> + <not> + <if-empty field-name="checkContentId"/> + </not> + </and> + </condition> + <then> + <entity-one entity-name="Content" value-name="currentContent"> + <field-map field-name="contentId" env-name="checkContentId"/> + </entity-one> + <if> + <condition> + <not> + <if-empty field-name="currentContent.ownerContentId"/> + </not> + </condition> + <then> + <set field="checkContentId" from-field="currentContent.ownerContentId"/> + <call-simple-method method-name="checkContentRoleSecurity"/> + </then> + + <!-- no parent record found; time to stop recursion --> + <else> + <clear-field field-name="checkContentId"/> + </else> + </if> + </then> + </while> + </then> + </if> </if-compare> </iterate> </then> @@ -409,6 +540,7 @@ <!-- method to check content ownership --> <simple-method method-name="checkContentOwnership" short-description="Checks the ownership of a content record"> + <!-- resetting the permission flag --> <set field="hasPermission" type="Boolean" value="false"/> <if-empty field-name="checkContentId"> @@ -419,65 +551,106 @@ </if-empty> <check-errors/> + <!-- get all the associated parties (this user + all group memberships) --> <call-simple-method method-name="findAllAssociatedPartyIds"/> - <set field="roleTypeId" value="OWNER"/> - <iterate entry-name="thisPartyId" list-name="partyIdList"> - <if-compare field-name="hasPermission" value="true" type="Boolean" operator="not-equals"> - <set field="partyId" from-field="thisPartyId"/> - <call-simple-method method-name="checkContentRoleSecurity"/> - </if-compare> + + <!-- ownership role --> + <set field="checkRoleTypeId" value="OWNER"/> + + <!-- check to see if any of the parties are owner of the content --> + <iterate entry-name="thisPartyId" list-name="partyIdList"> + <if> + <condition> + <not> + <if-compare field-name="hasPermission" value="true" operator="equals"/> + </not> + </condition> + <then> + <log level="verbose" message="Checking to see if party [${thisPartyId}] has ownership of ${checkContentId} :: ${hasPermission}"/> + <set field="checkPartyId" from-field="thisPartyId"/> + <call-simple-method method-name="checkContentRoleSecurity"/> + </then> + <else> + <log level="verbose" message="Field hasPermission is TRUE [${hasPermission}] did not test!"/> + </else> + </if> </iterate> </simple-method> <!-- method the check Content Role associations --> - <simple-method method-name="checkContentRoleSecurity" short-description="Check user has Ownership of the content"> + <simple-method method-name="checkContentRoleSecurity" short-description="Check users role associations with Content"> + <!-- resetting the permission flag --> <set field="hasPermission" type="Boolean" value="false"/> + <log level="verbose" message="checkContentRoleSecurity: just reset hasPermission value to false!"/> <!-- setting the env field contentId is required for this simple method --> <if-empty field-name="checkContentId"> <add-error><fail-message message="Required field 'checkContentId' is missing in simple method call [checkContentRoleSecurity]"/></add-error> </if-empty> - <if-empty field-name="partyId"> - <add-error><fail-message message="Required field 'partyId' is missing in simple method call [checkContentRoleSecurity]"/></add-error> + <if-empty field-name="checkPartyId"> + <add-error><fail-message message="Required field 'checkPartyId' is missing in simple method call [checkContentRoleSecurity]"/></add-error> </if-empty> <check-errors/> - <if> - <condition> - <not> - <if-empty field-name="roleTypeId"/> - </not> - </condition> - <then> - <!-- looking up a specific role --> - <entity-and entity-name="ContentRole" list-name="foundRoles"> - <field-map field-name="contentId" env-name="checkContentId"/> - <field-map field-name="roleTypeId" env-name="roleTypeId"/> - <field-map field-name="partyId" env-name="partyId"/> - </entity-and> - </then> - <else> - <!-- looking up any role --> - <entity-and entity-name="ContentRole" list-name="foundRoles"> - <field-map field-name="contentId" env-name="checkContentId"/> - <field-map field-name="partyId" env-name="partyId"/> - </entity-and> - </else> - </if> + <log level="verbose" message="About to test of checkRoleTypeId is empty... ${checkRoleTypeId}"/> - <!-- the return should contain some entry if the user is a member --> <if> <condition> - <not> - <if-empty field-name="foundRoles"/> - </not> + <and> + <not> + <if-empty field-name="checkRoleTypeId"/> + </not> + <if-compare field-name="checkRoleTypeId" value="_NA_" operator="equals"/> + </and> </condition> <then> + <!-- _NA_ role means anyone (logged in) has permission --> <set field="hasPermission" type="Boolean" value="true"/> </then> + + <!-- not _NA_ so do the actual role check --> + <else> + <if> + <condition> + <not> + <if-empty field-name="checkRoleTypeId"/> + </not> + </condition> + <then> + <log level="verbose" message="Doing lookup with roleTypeId : ${checkRoleTypeId}"/> + <!-- looking up a specific role --> + <entity-and entity-name="ContentRole" list-name="foundRoles"> + <field-map field-name="contentId" env-name="checkContentId"/> + <field-map field-name="roleTypeId" env-name="checkRoleTypeId"/> + <field-map field-name="partyId" env-name="checkPartyId"/> + </entity-and> + </then> + <else> + <log level="verbose" message="Doing lookup without roleTypeId"/> + <!-- looking up any role --> + <entity-and entity-name="ContentRole" list-name="foundRoles"> + <field-map field-name="contentId" env-name="checkContentId"/> + <field-map field-name="partyId" env-name="checkPartyId"/> + </entity-and> + </else> + </if> + + <log level="verbose" message="Checking for ContentRole: [party] - ${checkPartyId} [role] - ${checkRoleTypeId} [content] - ${checkContentId} :: ${foundRoles}"/> + + <!-- the return should contain some entry if the user is a member --> + <if> + <condition> + <not> + <if-empty field-name="foundRoles"/> + </not> + </condition> + <then> + <set field="hasPermission" type="Boolean" value="true"/> + </then> + </if> + </else> </if> - <field-to-result field-name="hasPermission"/> </simple-method> <!-- method to get user's party associations --> @@ -487,6 +660,7 @@ <call-service service-name="getRelatedParties" include-user-login="true" in-map-name="lookupMap"> <result-to-field result-name="relatedPartyIdList" field-name="partyIdList"/> </call-service> + <log level="verbose" message="Got list of associated parties: ${partyIdList}"/> </simple-method> <!-- method to get content associations --> |
Free forum by Nabble | Edit this page |