=== modified file 'dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/security/authority/DefaultRequiredAuthoritiesProvider.java' --- dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/security/authority/DefaultRequiredAuthoritiesProvider.java 2013-01-17 12:05:04 +0000 +++ dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/security/authority/DefaultRequiredAuthoritiesProvider.java 2013-01-17 13:32:15 +0000 @@ -30,12 +30,14 @@ import com.opensymphony.xwork2.config.entities.ActionConfig; import org.hisp.dhis.security.StrutsAuthorityUtils; import org.hisp.dhis.security.intercept.SingleSecurityMetadataSource; +import org.springframework.beans.factory.annotation.Required; import org.springframework.security.access.ConfigAttribute; import org.springframework.security.access.SecurityMetadataSource; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.Set; /** @@ -51,11 +53,20 @@ private String requiredAuthoritiesKey; + @Required public void setRequiredAuthoritiesKey( String requiredAuthoritiesKey ) { this.requiredAuthoritiesKey = requiredAuthoritiesKey; } + private String anyAuthoritiesKey; + + @Required + public void setAnyAuthoritiesKey( String anyAuthoritiesKey ) + { + this.anyAuthoritiesKey = anyAuthoritiesKey; + } + private Set globalAttributes = Collections.emptySet(); public void setGlobalAttributes( Set globalAttributes ) @@ -81,8 +92,22 @@ return new SingleSecurityMetadataSource( object, attributes ); } + public Collection getAllAuthorities( ActionConfig actionConfig ) + { + Collection authorities = new HashSet(); + authorities.addAll( getRequiredAuthorities( actionConfig ) ); + authorities.addAll( getAnyAuthorities( actionConfig ) ); + + return authorities; + } + public Collection getRequiredAuthorities( ActionConfig actionConfig ) { return StrutsAuthorityUtils.getAuthorities( actionConfig, requiredAuthoritiesKey ); } + + public Collection getAnyAuthorities( ActionConfig actionConfig ) + { + return StrutsAuthorityUtils.getAuthorities( actionConfig, anyAuthoritiesKey ); + } } === modified file 'dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/security/authority/DetectingSystemAuthoritiesProvider.java' --- dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/security/authority/DetectingSystemAuthoritiesProvider.java 2013-01-17 12:05:04 +0000 +++ dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/security/authority/DetectingSystemAuthoritiesProvider.java 2013-01-17 13:32:15 +0000 @@ -27,14 +27,13 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import java.util.Collection; -import java.util.HashSet; - -import org.apache.struts2.dispatcher.Dispatcher; - import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.config.entities.ActionConfig; import com.opensymphony.xwork2.config.entities.PackageConfig; +import org.apache.struts2.dispatcher.Dispatcher; + +import java.util.Collection; +import java.util.HashSet; /** * @author Torgeir Lorange Ostby @@ -68,7 +67,7 @@ { for ( ActionConfig actionConfig : packageConfig.getActionConfigs().values() ) { - authorities.addAll( requiredAuthoritiesProvider.getRequiredAuthorities( actionConfig ) ); + authorities.addAll( requiredAuthoritiesProvider.getAllAuthorities( actionConfig ) ); } } === modified file 'dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/security/authority/RequiredAuthoritiesProvider.java' --- dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/security/authority/RequiredAuthoritiesProvider.java 2013-01-17 12:05:04 +0000 +++ dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/security/authority/RequiredAuthoritiesProvider.java 2013-01-17 13:32:15 +0000 @@ -27,12 +27,11 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import com.opensymphony.xwork2.config.entities.ActionConfig; +import org.springframework.security.access.SecurityMetadataSource; + import java.util.Collection; -import org.springframework.security.access.SecurityMetadataSource; - -import com.opensymphony.xwork2.config.entities.ActionConfig; - /** * @author Torgeir Lorange Ostby * @version $Id: RequiredAuthoritiesProvider.java 3160 2007-03-24 20:15:06Z torgeilo $ @@ -46,7 +45,7 @@ * needed. * * @param actionConfig the secure actionConfig to get required authorities - * from. + * from. */ public SecurityMetadataSource createSecurityMetadataSource( ActionConfig actionConfig ); @@ -56,11 +55,16 @@ * SecurityMetadataSource may include additional attributes if needed. * * @param actionConfig the actionConfig to get required authorities from. - * @param object the secure object. + * @param object the secure object. */ public SecurityMetadataSource createSecurityMetadataSource( ActionConfig actionConfig, Object object ); /** + * Returns all authorities of an action configuration. + */ + public Collection getAllAuthorities( ActionConfig actionConfig ); + + /** * Returns the required authorities of an action configuration. */ public Collection getRequiredAuthorities( ActionConfig actionConfig ); === modified file 'dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/security/vote/ActionAccessVoter.java' --- dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/security/vote/ActionAccessVoter.java 2013-01-17 12:05:04 +0000 +++ dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/security/vote/ActionAccessVoter.java 2013-01-17 13:32:15 +0000 @@ -30,6 +30,8 @@ import com.opensymphony.xwork2.config.entities.ActionConfig; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hisp.dhis.security.StrutsAuthorityUtils; +import org.springframework.beans.factory.annotation.Required; import org.springframework.security.access.ConfigAttribute; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; @@ -46,6 +48,26 @@ private static final Log LOG = LogFactory.getLog( ActionAccessVoter.class ); // ------------------------------------------------------------------------- + // AccessDecisionVoter Input + // ------------------------------------------------------------------------- + + private String requiredAuthoritiesKey; + + @Required + public void setRequiredAuthoritiesKey( String requiredAuthoritiesKey ) + { + this.requiredAuthoritiesKey = requiredAuthoritiesKey; + } + + private String anyAuthoritiesKey; + + @Required + public void setAnyAuthoritiesKey( String anyAuthoritiesKey ) + { + this.anyAuthoritiesKey = anyAuthoritiesKey; + } + + // ------------------------------------------------------------------------- // AccessDecisionVoter implementation // ------------------------------------------------------------------------- @@ -69,6 +91,34 @@ return ACCESS_ABSTAIN; } + ActionConfig actionConfig = (ActionConfig) object; + Collection requiredAuthorities = StrutsAuthorityUtils.getConfigAttributes( actionConfig, requiredAuthoritiesKey ); + Collection anyAuthorities = StrutsAuthorityUtils.getConfigAttributes( actionConfig, anyAuthoritiesKey ); + + int allStatus = allAuthorities( authentication, object, requiredAuthorities ); + + if ( allStatus == ACCESS_DENIED ) + { + return ACCESS_DENIED; + } + + int anyStatus = anyAuthority( authentication, object, anyAuthorities ); + + if ( anyStatus == ACCESS_DENIED ) + { + return ACCESS_DENIED; + } + + if ( allStatus == ACCESS_GRANTED || anyStatus == ACCESS_GRANTED ) + { + return ACCESS_GRANTED; + } + + return ACCESS_ABSTAIN; + } + + private int allAuthorities( Authentication authentication, Object object, Collection attributes ) + { int supported = 0; for ( ConfigAttribute attribute : attributes ) @@ -107,4 +157,46 @@ return ACCESS_ABSTAIN; } + + private int anyAuthority( Authentication authentication, Object object, Collection attributes ) + { + int supported = 0; + boolean found = false; + + for ( ConfigAttribute attribute : attributes ) + { + if ( supports( attribute ) ) + { + ++supported; + + for ( GrantedAuthority authority : authentication.getAuthorities() ) + { + if ( authority.getAuthority().equals( attribute.getAttribute() ) ) + { + found = true; + break; + } + } + + } + } + + if ( !found && supported > 0 ) + { + LOG.debug( "ACCESS_DENIED [" + object.toString() + "]" ); + + return ACCESS_DENIED; + } + + if ( supported > 0 ) + { + LOG.debug( "ACCESS_GRANTED [" + object.toString() + "]" ); + + return ACCESS_GRANTED; + } + + LOG.debug( "ACCESS_ABSTAIN [" + object.toString() + "]: No supported attributes." ); + + return ACCESS_ABSTAIN; + } } === modified file 'dhis-2/dhis-web/dhis-web-commons/src/main/resources/META-INF/dhis/security.xml' --- dhis-2/dhis-web/dhis-web-commons/src/main/resources/META-INF/dhis/security.xml 2013-01-17 12:05:04 +0000 +++ dhis-2/dhis-web/dhis-web-commons/src/main/resources/META-INF/dhis/security.xml 2013-01-17 13:32:15 +0000 @@ -128,6 +128,8 @@ + + @@ -182,6 +184,7 @@ + M_MODULE_ACCESS_VOTER_ENABLED === modified file 'dhis-2/dhis-web/dhis-web-reporting/src/main/resources/struts.xml' --- dhis-2/dhis-web/dhis-web-reporting/src/main/resources/struts.xml 2013-01-17 12:05:04 +0000 +++ dhis-2/dhis-web/dhis-web-reporting/src/main/resources/struts.xml 2013-01-17 13:32:15 +0000 @@ -1,7 +1,7 @@ + "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" + "http://struts.apache.org/dtds/struts-2.0.dtd"> @@ -13,13 +13,14 @@ /dhis-web-reporting/index.vm /dhis-web-reporting/menu.vm - + displayViewDocumentForm.action F_DOCUMENT_ADD + F_DOCUMENT_PUBLIC_ADD,F_DOCUMENT_PRIVATE_ADD @@ -53,7 +54,7 @@ /dhis-web-commons/ajax/jsonResponseSuccess.vm plainTextError - + @@ -63,7 +64,7 @@ - + @@ -93,17 +94,17 @@ /dhis-web-reporting/menu.vm javascript/report.js - + /dhis-web-reporting/jsonReport.vm plainTextError - + /dhis-web-reporting/jsonReports.vm plainTextError - + /dhis-web-commons/ajax/jsonResponseSuccess.vm plainTextError @@ -112,17 +113,17 @@ - - + + /dhis-web-commons/ajax/jsonResponseSuccess.vm /dhis-web-commons/ajax/jsonResponseInput.vm plainTextError - - - - - + + + + + @@ -131,12 +132,12 @@ /dhis-web-reporting/menu.vm javascript/table.js - + /dhis-web-reporting/jsonReportTables.vm plainTextError - + /dhis-web-commons/ajax/jsonResponseSuccess.vm F_REPORTTABLE_DELETE @@ -189,14 +190,14 @@ /dhis-web-reporting/reportTableGrid.vm true javascript/generateReport.js - style/dhis-web-reporting.css + style/dhis-web-reporting.css ../dhis-web-commons/ajax/xmlDataElements.vm plainTextError - + @@ -206,12 +207,12 @@ ../dhis-web-commons/oust/oust.js,javascript/pivot.js - - + + /dhis-web-reporting/responsePivotTable.vm plainTextError - + @@ -227,8 +228,8 @@ /dhis-web-commons/ajax/htmlGrid.vm - - + + @@ -236,17 +237,17 @@ /dhis-web-reporting/dataSetReportForm.vm /dhis-web-reporting/menu.vm ../dhis-web-commons/oust/oust.js,javascript/dataSetReport.js - style/dhis-web-reporting.css + style/dhis-web-reporting.css - /dhis-web-reporting/renderDefaultDataSetReportForm.vm - /dhis-web-reporting/renderSectionDataSetReportForm.vm - /dhis-web-reporting/renderCustomDataSetReportForm.vm + /dhis-web-reporting/renderDefaultDataSetReportForm.vm + /dhis-web-reporting/renderSectionDataSetReportForm.vm + /dhis-web-reporting/renderCustomDataSetReportForm.vm - + @@ -256,7 +257,8 @@ /dhis-web-commons/ajax/htmlGrid.vm - + /main.vm /dhis-web-reporting/viewOrgUnitDistribution.vm /dhis-web-reporting/menu.vm @@ -266,24 +268,24 @@ - - - - - /main.vm + + + + + /main.vm /dhis-web-reporting/viewDataMartForm.vm /dhis-web-reporting/menu.vm javascript/dataMart.js F_DATA_MART_ADMIN - - - - /dhis-web-commons/ajax/jsonResponseSuccess.vm + + + + /dhis-web-commons/ajax/jsonResponseSuccess.vm plainTextError F_DATA_MART_ADMIN - - - + + + @@ -358,6 +360,6 @@ F_MYDATAMART_VIEW - +