=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/Chart.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/Chart.java 2012-12-11 21:17:31 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/Chart.java 2012-12-27 14:07:54 +0000 @@ -145,8 +145,6 @@ private boolean showData; private boolean rewindRelativePeriods; - - private User user; private OrganisationUnitGroupSet organisationUnitGroupSet; @@ -683,20 +681,6 @@ } @JsonProperty - @JsonSerialize( as = BaseIdentifiableObject.class ) - @JsonView( {DetailedView.class, ExportView.class} ) - @JacksonXmlProperty( namespace = Dxf2Namespace.NAMESPACE ) - public User getUser() - { - return user; - } - - public void setUser( User user ) - { - this.user = user; - } - - @JsonProperty @JsonView( {DetailedView.class, ExportView.class} ) @JacksonXmlProperty( namespace = Dxf2Namespace.NAMESPACE ) public OrganisationUnitGroupSet getOrganisationUnitGroupSet() === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseIdentifiableObject.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseIdentifiableObject.java 2012-12-13 11:53:32 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseIdentifiableObject.java 2012-12-27 14:07:54 +0000 @@ -30,17 +30,22 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonView; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import org.apache.commons.lang.Validate; import org.hisp.dhis.common.view.BasicView; import org.hisp.dhis.common.view.DetailedView; import org.hisp.dhis.common.view.ExportView; +import org.hisp.dhis.user.User; +import org.hisp.dhis.user.UserGroupAccess; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Map; +import java.util.Set; /** * @author Bob Jolliffe @@ -86,6 +91,21 @@ protected Date lastUpdated; /** + * Access string for public access. + */ + protected String publicAccess; + + /** + * Owner of this object. + */ + protected User user; + + /** + * Access for userGroups + */ + protected Set userGroupAccesses; + + /** * The i18n variant of the name. Should not be persisted. */ protected transient String displayName; @@ -178,8 +198,8 @@ } @JsonProperty - @JsonView( { DetailedView.class, BasicView.class, ExportView.class } ) - @JacksonXmlProperty( isAttribute = true ) + @JsonView({ DetailedView.class, BasicView.class, ExportView.class }) + @JacksonXmlProperty(isAttribute = true) public Date getCreated() { return created; @@ -203,6 +223,49 @@ this.lastUpdated = lastUpdated; } + @Override + @JsonProperty + @JsonView( { DetailedView.class, BasicView.class, ExportView.class } ) + @JacksonXmlProperty( namespace = Dxf2Namespace.NAMESPACE ) + public String getPublicAccess() + { + return publicAccess; + } + + public void setPublicAccess( String publicAccess ) + { + this.publicAccess = publicAccess; + } + + @Override + @JsonProperty + @JsonSerialize( as = BaseIdentifiableObject.class ) + @JsonView( { BasicView.class, DetailedView.class, ExportView.class } ) + @JacksonXmlProperty( namespace = Dxf2Namespace.NAMESPACE ) + public User getUser() + { + return user; + } + + public void setUser( User user ) + { + this.user = user; + } + + @JsonProperty + @JsonView( { BasicView.class, DetailedView.class, ExportView.class } ) + @JacksonXmlElementWrapper( localName = "userGroupAccesses", namespace = Dxf2Namespace.NAMESPACE ) + @JacksonXmlProperty( localName = "userGroupAccess", namespace = Dxf2Namespace.NAMESPACE ) + public Set getUserGroupAccesses() + { + return userGroupAccesses; + } + + public void setUserGroupAccesses( Set userGroupAccesses ) + { + this.userGroupAccesses = userGroupAccesses; + } + public String getDisplayName() { return displayName != null && !displayName.trim().isEmpty() ? displayName : getName(); === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObject.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObject.java 2012-12-13 11:53:32 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObject.java 2012-12-27 14:07:54 +0000 @@ -27,7 +27,11 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import org.hisp.dhis.user.User; +import org.hisp.dhis.user.UserGroupAccess; + import java.util.Date; +import java.util.Set; public interface IdentifiableObject extends ImportableObject, LinkableObject, Comparable, Mergeable @@ -51,5 +55,11 @@ Date getLastUpdated(); + String getPublicAccess(); + + User getUser(); + + Set getUserGroupAccesses(); + String getDisplayName(); } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/interpretation/Interpretation.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/interpretation/Interpretation.java 2012-12-07 18:16:00 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/interpretation/Interpretation.java 2012-12-27 14:07:54 +0000 @@ -73,10 +73,6 @@ private String text; - private User user; - - private Date created; - @Scanned private List comments = new ArrayList(); @@ -263,33 +259,6 @@ } @JsonProperty - @JsonSerialize( as = BaseIdentifiableObject.class ) - @JsonView( { DetailedView.class, ExportView.class } ) - @JacksonXmlProperty( namespace = Dxf2Namespace.NAMESPACE ) - public User getUser() - { - return user; - } - - public void setUser( User user ) - { - this.user = user; - } - - @JsonProperty - @JsonView( { DetailedView.class, ExportView.class } ) - @JacksonXmlProperty( namespace = Dxf2Namespace.NAMESPACE ) - public Date getCreated() - { - return created; - } - - public void setCreated( Date created ) - { - this.created = created; - } - - @JsonProperty @JsonView( { DetailedView.class, ExportView.class } ) @JacksonXmlElementWrapper( localName = "comments", namespace = Dxf2Namespace.NAMESPACE ) @JacksonXmlProperty( localName = "comment", namespace = Dxf2Namespace.NAMESPACE ) === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/interpretation/InterpretationComment.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/interpretation/InterpretationComment.java 2012-10-14 18:31:58 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/interpretation/InterpretationComment.java 2012-12-27 14:07:54 +0000 @@ -29,7 +29,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonView; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import org.hisp.dhis.common.BaseIdentifiableObject; @@ -43,16 +42,12 @@ /** * @author Lars Helge Overland */ -@JacksonXmlRootElement( localName = "interpretationComment", namespace = Dxf2Namespace.NAMESPACE ) +@JacksonXmlRootElement(localName = "interpretationComment", namespace = Dxf2Namespace.NAMESPACE) public class InterpretationComment extends BaseIdentifiableObject { private String text; - private User user; - - private Date created; - public InterpretationComment() { this.created = new Date(); @@ -72,8 +67,8 @@ } @JsonProperty - @JsonView( { DetailedView.class, ExportView.class } ) - @JacksonXmlProperty( namespace = Dxf2Namespace.NAMESPACE ) + @JsonView({ DetailedView.class, ExportView.class }) + @JacksonXmlProperty(namespace = Dxf2Namespace.NAMESPACE) public String getText() { return text; @@ -83,31 +78,4 @@ { this.text = text; } - - @JsonProperty - @JsonSerialize( as = BaseIdentifiableObject.class ) - @JsonView( { DetailedView.class, ExportView.class } ) - @JacksonXmlProperty( namespace = Dxf2Namespace.NAMESPACE ) - public User getUser() - { - return user; - } - - public void setUser( User user ) - { - this.user = user; - } - - @JsonProperty - @JsonView( { DetailedView.class, ExportView.class } ) - @JacksonXmlProperty( namespace = Dxf2Namespace.NAMESPACE ) - public Date getCreated() - { - return created; - } - - public void setCreated( Date created ) - { - this.created = created; - } } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/mapping/Map.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/mapping/Map.java 2012-11-01 14:02:36 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/mapping/Map.java 2012-12-27 14:07:54 +0000 @@ -52,8 +52,6 @@ public class Map extends BaseIdentifiableObject { - private User user; - private Double longitude; private Double latitude; @@ -85,20 +83,6 @@ // ------------------------------------------------------------------------- @JsonProperty - @JsonSerialize( as = BaseIdentifiableObject.class ) - @JsonView( {DetailedView.class, ExportView.class} ) - @JacksonXmlProperty( namespace = Dxf2Namespace.NAMESPACE ) - public User getUser() - { - return user; - } - - public void setUser( User user ) - { - this.user = user; - } - - @JsonProperty @JsonView( {DetailedView.class, ExportView.class} ) @JacksonXmlProperty( namespace = Dxf2Namespace.NAMESPACE ) public Double getLongitude() === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/patientreport/PatientTabularReport.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/patientreport/PatientTabularReport.java 2012-10-16 04:05:28 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/patientreport/PatientTabularReport.java 2012-12-27 14:07:54 +0000 @@ -27,21 +27,19 @@ package org.hisp.dhis.patientreport; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Set; - import org.hisp.dhis.common.BaseIdentifiableObject; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.patient.PatientAttribute; import org.hisp.dhis.patient.PatientIdentifierType; import org.hisp.dhis.program.ProgramStageDataElement; -import org.hisp.dhis.user.User; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Set; /** * @author Chau Thu Tran - * * @version $PatientTabularReport.java May 7, 2012 12:41:41 PM$ */ public class PatientTabularReport @@ -50,24 +48,23 @@ private static final long serialVersionUID = -2880334669266185058L; public static String PREFIX_EXECUTION_DATE = "executiondate"; - - public static String PREFIX_ORGUNIT = "orgunit"; - + + public static String PREFIX_ORGUNIT = "orgunit"; + public static String PREFIX_META_DATA = "meta"; - + public static String PREFIX_IDENTIFIER_TYPE = "iden"; public static String PREFIX_FIXED_ATTRIBUTE = "fixedAttr"; - + public static String PREFIX_PATIENT_ATTRIBUTE = "attr"; public static String PREFIX_DATA_ELEMENT = "de"; public static String PREFIX_NUMBER_DATA_ELEMENT = "numberDe"; - + public static String VALUE_TYPE_OPTION_SET = "optionSet"; - private Date startDate; private Date endDate; @@ -88,8 +85,6 @@ private String facilityLB; - private User user; - // ------------------------------------------------------------------------- // Constructors // ------------------------------------------------------------------------- @@ -206,15 +201,4 @@ { this.facilityLB = facilityLB; } - - public User getUser() - { - return user; - } - - public void setUser( User user ) - { - this.user = user; - } - } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserGroup.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserGroup.java 2012-07-01 11:33:07 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserGroup.java 2012-12-27 14:07:54 +0000 @@ -1,7 +1,7 @@ package org.hisp.dhis.user; /* - * Copyright (c) 2004-2011, University of Oslo + * Copyright (c) 2004-2012, University of Oslo * All rights reserved. * * Redistribution and use in source and binary forms, with or without === added file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserGroupAccess.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserGroupAccess.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserGroupAccess.java 2012-12-27 14:07:54 +0000 @@ -0,0 +1,74 @@ +package org.hisp.dhis.user; + +/* + * Copyright (c) 2004-2012, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @author Morten Olav Hansen + */ +public class UserGroupAccess +{ + private int id; + + private String access; + + private UserGroup userGroup; + + public UserGroupAccess() + { + } + + public int getId() + { + return id; + } + + public void setId( int id ) + { + this.id = id; + } + + public String getAccess() + { + return access; + } + + public void setAccess( String access ) + { + this.access = access; + } + + public UserGroup getUserGroup() + { + return userGroup; + } + + public void setUserGroup( UserGroup userGroup ) + { + this.userGroup = userGroup; + } +} === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/security/DefaultSecurityService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/security/DefaultSecurityService.java 2012-11-14 13:11:10 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/security/DefaultSecurityService.java 2012-12-27 14:07:54 +0000 @@ -27,17 +27,10 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import java.util.Arrays; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hisp.dhis.common.CodeGenerator; +import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.message.MessageSender; import org.hisp.dhis.period.Cal; import org.hisp.dhis.setting.SystemSettingManager; @@ -48,6 +41,14 @@ import org.hisp.dhis.user.UserCredentials; import org.hisp.dhis.user.UserService; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + /** * @author Lars Helge Overland */ @@ -55,12 +56,12 @@ implements SecurityService { private static final Log log = LogFactory.getLog( DefaultSecurityService.class ); - + private static final String RESTORE_PATH = "/dhis-web-commons/security/restore.action"; private static final int TOKEN_LENGTH = 50; private static final int CODE_LENGTH = 15; - + // ------------------------------------------------------------------------- // Dependencies // ------------------------------------------------------------------------- @@ -85,7 +86,7 @@ { this.userService = userService; } - + private SystemSettingManager systemSettingManager; public void setSystemSettingManager( SystemSettingManager systemSettingManager ) @@ -103,51 +104,51 @@ { return false; } - + UserCredentials credentials = userService.getUserCredentialsByUsername( username ); - + if ( credentials == null || credentials.getUser() == null || credentials.getUser().getEmail() == null ) { log.info( "Could not send message as user does not exist or has no email: " + username ); return false; } - + if ( !ValidationUtils.emailIsValid( credentials.getUser().getEmail() ) ) { log.info( "Could not send message as email is invalid" ); return false; } - + if ( !systemSettingManager.emailEnabled() ) { log.info( "Could not send message as email is not configured" ); return false; } - + if ( credentials.hasAnyAuthority( Arrays.asList( UserAuthorityGroup.CRITICAL_AUTHS ) ) ) { log.info( "Not allowed to recover credentials with critical authorities" ); return false; } - + String[] result = initRestore( credentials ); - + Set users = new HashSet(); users.add( credentials.getUser() ); - + Map vars = new HashMap(); vars.put( "rootPath", rootPath ); vars.put( "restorePath", rootPath + RESTORE_PATH ); vars.put( "token", result[0] ); vars.put( "code", result[1] ); vars.put( "username", username ); - + String text1 = new VelocityManager().render( vars, "restore_message1" ); String text2 = new VelocityManager().render( vars, "restore_message2" ); - + emailMessageSender.sendMessage( "User account restore confirmation (message 1 of 2)", text1, null, users, true ); emailMessageSender.sendMessage( "User account restore confirmation (message 2 of 2)", text2, null, users, true ); - + return true; } @@ -155,22 +156,22 @@ { String token = CodeGenerator.generateCode( TOKEN_LENGTH ); String code = CodeGenerator.generateCode( CODE_LENGTH ); - + String hashedToken = passwordManager.encodePassword( credentials.getUsername(), token ); String hashedCode = passwordManager.encodePassword( credentials.getUsername(), code ); - + Date expiry = new Cal().now().add( Calendar.HOUR_OF_DAY, 1 ).time(); - + credentials.setRestoreToken( hashedToken ); credentials.setRestoreCode( hashedCode ); credentials.setRestoreExpiry( expiry ); userService.updateUserCredentials( credentials ); - + String[] result = { token, code }; return result; } - + public boolean restore( String username, String token, String code, String newPassword ) { if ( username == null || token == null || code == null || newPassword == null ) @@ -179,36 +180,36 @@ } UserCredentials credentials = userService.getUserCredentialsByUsername( username ); - + if ( credentials == null ) { log.info( "Could not restore as user does not exist: " + username ); return false; } - + token = passwordManager.encodePassword( username, token ); code = passwordManager.encodePassword( username, code ); - + Date date = new Cal().now().time(); if ( !credentials.canRestore( token, code, date ) ) { return false; } - + newPassword = passwordManager.encodePassword( username, newPassword ); - + credentials.setPassword( newPassword ); - + credentials.setRestoreCode( null ); credentials.setRestoreToken( null ); credentials.setRestoreExpiry( null ); - + userService.updateUserCredentials( credentials ); - + return true; } - + public boolean verifyToken( String username, String token ) { if ( username == null || token == null ) @@ -217,15 +218,27 @@ } UserCredentials credentials = userService.getUserCredentialsByUsername( username ); - + if ( credentials == null || credentials.getRestoreToken() == null ) { log.info( "Could not verify token as user does not exist or has no token: " + username ); return false; } - + token = passwordManager.encodePassword( username, token ); - + return credentials.getRestoreToken().equals( token ); } + + @Override + public boolean isWritable( IdentifiableObject identifiableObject ) + { + return false; + } + + @Override + public boolean isReadable( IdentifiableObject identifiableObject ) + { + return false; + } } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/security/SecurityService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/security/SecurityService.java 2012-10-29 14:34:57 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/security/SecurityService.java 2012-12-27 14:07:54 +0000 @@ -27,6 +27,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.user.UserCredentials; /** @@ -37,51 +38,67 @@ /** * Will invoke the initiateRestore method and dispatch email messages with * restore information to the user. - * + * * @param username the user name of the user to send restore messages. * @param rootPath the root path of the request. * @return false if any of the arguments are null or if the user credentials * identified by the user name does not exist, true otherwise. */ boolean sendRestoreMessage( String username, String rootPath ); - + /** * Will populate the restoreToken and restoreCode property of the given * credentials with a hashed version of auto-generated values. Will set the * restoreExpiry property with a date time one hour from now. Changes will be * persisted. - * + * * @param credentials the user credentials. - * @return an array where index 0 is the clear-text token and index 1 the + * @return an array where index 0 is the clear-text token and index 1 the * clear-text code. */ String[] initRestore( UserCredentials credentials ); - + /** * Tests whether the given token and code are valid for the given user name. * If true, it will update the user credentials identified by the given user * name with the new password. In order to succeed, the given token and code * must match the ones on the credentials, and the current date must be before * the expiry date time of the credentials. - * - * @param username the user name. - * @param token the token. - * @param code the code. + * + * @param username the user name. + * @param token the token. + * @param code the code. * @param newPassword the proposed new password. * @return true or false. */ boolean restore( String username, String token, String code, String newPassword ); - + /** * Tests whether the given token in combination with the given user name is * valid, i.e. whether the hashed version of the token matches the one on the * user credentials identified by the given user name. - * + * * @param username the user name. - * @param token the token. + * @param token the token. * @return false if any of the arguments are null or if the user credentials * identified by the user name does not exist, true if the arguments * are valid. */ boolean verifyToken( String username, String token ); + + /** + * Checks whether current user has write access to object. + * + * @param identifiableObject Object to check for write access. + * @return true of false depending on outcome of writable check + */ + boolean isWritable( IdentifiableObject identifiableObject ); + + /** + * Checks whether current user has read access to object. + * + * @param identifiableObject Object to check for read access. + * @return true of false depending on outcome of readable check + */ + boolean isReadable( IdentifiableObject identifiableObject ); } === added file 'dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/user/hibernate/userGroupAccess.hbm.xml' --- dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/user/hibernate/userGroupAccess.hbm.xml 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/user/hibernate/userGroupAccess.hbm.xml 2012-12-27 14:07:54 +0000 @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + +