[Notice] Announcing the End of Demo Server [Read me]
Hwi Ahn 2012-08-30
Access control refactoring
@b9a2449ebda0fa38e6d0f6cd227e740799e5119b
app/controllers/ProjectApp.java
--- app/controllers/ProjectApp.java
+++ app/controllers/ProjectApp.java
@@ -3,6 +3,7 @@
 import java.io.File;
 
 import models.*;
+import models.enumeration.RoleType;
 import play.data.Form;
 import play.db.ebean.Transactional;
 import play.mvc.*;
@@ -54,7 +55,8 @@
         } else {
             Project project = filledNewProjectForm.get();
             project.owner = UserApp.currentUser().loginId;
-            ProjectUser.assignRole(UserApp.currentUser().id, Project.create(project), Role.MANAGER);
+            ProjectUser.assignRole(UserApp.currentUser().id,
+                    Project.create(project), RoleType.MANAGER);
 
             RepositoryService.createRepository(project.owner, project.name, project.vcs);
 
@@ -120,9 +122,9 @@
             return redirect(routes.ProjectApp.members(userName, projectName));
         }
         Project project = getProject(userName, projectName);
-        if (!ProjectUser.isMember(user.id, project.id))
-            ProjectUser.assignRole(user.id, project.id, Role.MEMBER);
-        else
+        if(!ProjectUser.isMember(user.id, project.id))
+            ProjectUser.assignRole(user.id, project.id, RoleType.MEMBER);
+        else    
             flash(Constants.WARNING, "project.member.alreadyMember");
         return redirect(routes.ProjectApp.members(userName, projectName));
     }
@@ -150,7 +152,7 @@
     }
 
     public static boolean isManager(Long userId, Long projectId) {
-        if (Role.findRoleByIds(userId, projectId).id.equals(Role.MANAGER))
+        if (Role.findRoleByIds(userId, projectId).id.equals(RoleType.MANAGER))
             return ProjectUser.checkOneMangerPerOneProject(projectId);
         else
             return true;
app/models/Permission.java
--- app/models/Permission.java
+++ app/models/Permission.java
@@ -34,7 +34,7 @@
      * @param operation
      * @return
      */
-    public static boolean permissionCheck(Long userId, Long projectId,
+    public static boolean hasPermission(Long userId, Long projectId,
             Resource resource, Operation operation) {
         int findRowCount = find.where()
                                     .eq("roles.projectUsers.user.id", userId)
@@ -45,9 +45,9 @@
         return (findRowCount != 0) ? true : false;
     }
     
-    public static boolean permissionCheckByRole(Long roleId, Resource resource, Operation operation) {
+    public static boolean hasPermission(RoleType roleType, Resource resource, Operation operation) {
         int findRowCount = find.where()
-                                .eq("roles.id", roleId)
+                                .eq("roles.id", roleType.roleType())
                                 .eq("resource", resource.resource())
                                 .eq("operation", operation.operation())
                             .findRowCount();
app/models/Project.java
--- app/models/Project.java
+++ app/models/Project.java
@@ -8,6 +8,8 @@
 import javax.persistence.Id;
 import javax.persistence.OneToMany;
 
+import models.enumeration.RoleType;
+
 
 import play.data.validation.Constraints;
 import play.db.ebean.Model;
@@ -54,7 +56,7 @@
     public static Long create(Project newProject) {
         newProject.url = "http://localhost:9000/" + newProject.name;
         newProject.save();
-        ProjectUser.assignRole(User.SITE_MANAGER_ID, newProject.id, Role.SITEMANAGER);
+        ProjectUser.assignRole(User.SITE_MANAGER_ID, newProject.id, RoleType.SITEMANAGER);
         return newProject.id;
     }
 
@@ -113,7 +115,7 @@
                                     .select("name")
                                     .where()
                                         .eq("projectUser.user.id", userId)
-                                        .eq("projectUser.role.id", Role.MANAGER)
+                                        .eq("projectUser.role.id", RoleType.MANAGER.roleType())
                                     .findList();
         
         Iterator<Project> iterator = projects.iterator();
app/models/ProjectUser.java
--- app/models/ProjectUser.java
+++ app/models/ProjectUser.java
@@ -5,29 +5,32 @@
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.ManyToOne;
+
+import models.enumeration.RoleType;
+
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
 /**
  * @author "Hwi Ahn"
- * 
+ *
  */
 @Entity
 public class ProjectUser extends Model {
     private static final long serialVersionUID = 1L;
-    private static Finder<Long, ProjectUser> find = new Finder<Long, ProjectUser>(
-            Long.class, ProjectUser.class);
-    
+    private static Finder<Long, ProjectUser> find = new Finder<Long, ProjectUser>(Long.class,
+            ProjectUser.class);
+
     @Id
     public Long id;
-    
+
     @ManyToOne
     public User user;
-    
+
     @ManyToOne
     public Project project;
-    
+
     @ManyToOne
     public Role role;
 
@@ -36,7 +39,7 @@
         this.project = Project.findById(projectId);
         this.role = Role.findById(roleId);
     }
-    
+
     public static void create(Long userId, Long projectId, Long roleId) {
         ProjectUser projectUser = new ProjectUser(userId, projectId, roleId);
         projectUser.save();
@@ -44,7 +47,7 @@
 
     /**
      * 해당 프로젝트에 가입된 해당 유저를 프로젝트에서 탈퇴시킵니다.
-     * 
+     *
      * @param userId
      * @param projectId
      */
@@ -54,7 +57,7 @@
 
     /**
      * 유저에게 새로운 롤을 부여합니다.
-     * 
+     *
      * @param userId
      * @param projectId
      * @param roleId
@@ -69,74 +72,80 @@
         }
     }
 
+    public static void assignRole(Long userId, Long projectId, RoleType roleType) {
+        assignRole(userId, projectId, roleType.roleType());
+    }
+
     /**
      * 해당 유저, 프로젝트 값을 갖는 ProjectUser 오브젝트를 제공합니다.
      * (Site manager는 hidden role로서 반환되지 않습니다.)
-     * 
+     *
      * @param userId
      * @param projectId
      * @return
      */
     public static ProjectUser findByIds(Long userId, Long projectId) {
-        return find.where().eq("user.id", userId).eq("project.id", projectId).ne("role.id", Role.SITEMANAGER).findUnique();
+        return find.where().eq("user.id", userId).eq("project.id", projectId)
+                .ne("role.id", RoleType.SITEMANAGER.roleType()).findUnique();
     }
 
     /**
-     * 해당 프로젝트에 가입한 맴버들의 Login ID와 그 맴버들의 Role의 이름을 제공합니다. 
+     * 해당 프로젝트에 가입한 맴버들의 Login ID와 그 맴버들의 Role의 이름을 제공합니다.
      * (Site manager는 hidden role로서 반환되지 않습니다.)
-     * 
+     *
      * @param projectId
      * @return
      */
     public static List<ProjectUser> findMemberListByProject(Long projectId) {
         return find.fetch("user", "loginId").fetch("role", "name").where()
-                .eq("project.id", projectId).ne("role.id", Role.SITEMANAGER)
+                .eq("project.id", projectId).ne("role.id", RoleType.SITEMANAGER.roleType())
                 .findList();
     }
 
     /**
      * 해당 프로젝트에 최소 1명 이상의 관리자가 남아있는지 확인합니다.
-     * 
+     *
      * @param projectId
      * @return
      */
     public static boolean checkOneMangerPerOneProject(Long projectId) {
-        int findRowCount = find.where().eq("role.id", Role.MANAGER)
+        int findRowCount = find.where().eq("role.id", RoleType.MANAGER.roleType())
                 .eq("project.id", projectId).findRowCount();
         return (findRowCount > 1) ? true : false;
     }
-    
+
     /**
      * 해당 유저가 해당 프로젝트의 매니저 역할인지 확인합니다.
-     * 
+     *
      * @param userId
      * @param projectId
      * @return
      */
     public static boolean isManager(Long userId, Long projectId) {
-        int findRowCount = find.where().eq("user.id", Role.MANAGER)
-                .eq("project.id", projectId).findRowCount();
+        int findRowCount = find.where().eq("user.id", userId)
+                .eq("role.id", RoleType.MANAGER.roleType()).eq("project.id", projectId)
+                .findRowCount();
         return (findRowCount != 0) ? true : false;
     }
-    
 
     /**
      * 해당 유저가 해당 프로젝트에 가입되어 있는지 확인합니다.
-     * 
+     *
      * @param userId
      * @param projectId
      * @return
      */
     public static boolean isMember(Long userId, Long projectId) {
-        if(userId == null) return false;
-        int findRowCount = find.where().eq("user.id", userId)
-                .eq("project.id", projectId).findRowCount();
+        if (userId == null)
+            return false;
+        int findRowCount = find.where().eq("user.id", userId).eq("project.id", projectId)
+                .findRowCount();
         return (findRowCount != 0) ? true : false;
     }
 
     /**
      * 해당 프로젝트에 참가하고 있는 유저의 목록을 제공합니다.
-     * 
+     *
      * @return
      */
     public static Map<String, String> options(Long projectId) {
app/models/Role.java
--- app/models/Role.java
+++ app/models/Role.java
@@ -7,6 +7,9 @@
 import javax.persistence.Id;
 import javax.persistence.ManyToMany;
 import javax.persistence.OneToMany;
+
+import models.enumeration.RoleType;
+
 import java.util.List;
 
 /**
@@ -17,27 +20,27 @@
     private static final long serialVersionUID = 1L;
     private static Finder<Long, Role> find = new Finder<Long, Role>(Long.class,
             Role.class);
-    
-    public static final Long MANAGER = 1l;
-    public static final Long MEMBER = 2l;
-    public static final Long SITEMANAGER = 3l;
-    public static final Long ANONYMOUS = 4l;
-    
+
+
+
     @Id
     public Long id;
-    
+
     public String name;
     public boolean active;
-    
+
     @ManyToMany
     public List<Permission> permissions;
-    
+
     @OneToMany(mappedBy = "role", cascade = CascadeType.ALL)
     public List<ProjectUser> projectUsers;
 
-    
     public static Role findById(Long id) {
         return find.byId(id);
+    }
+
+    public static Role findByRoleType(RoleType roleType) {
+        return find.byId(roleType.roleType());
     }
 
     public static Role findByName(String name) {
@@ -46,7 +49,7 @@
 
     /**
      * 프로젝트와 관련된 롤들의 목록을 반환합니다.
-     * 
+     *
      * @return
      */
     public static List<Role> getActiveRoles() {
@@ -54,10 +57,10 @@
                 .findList();
         return projectRoles;
     }
-    
+
     /**
      * 해당 유저가 해당 프로젝트에서 가지고 있는 롤을 제공합니다.
-     * 
+     *
      * @param userId
      * @param projectId
      * @return
app/models/User.java
--- app/models/User.java
+++ app/models/User.java
@@ -123,6 +123,6 @@
     public static List<User> findUsersByProject(Long projectId) {
         return find.where()
                 .eq("projectUser.project.id", projectId)
-                .ne("projectUser.role.id", Role.SITEMANAGER).findList();
+                .ne("projectUser.role.id", RoleType.SITEMANAGER.roleType()).findList();
     }
 }
 
app/utils/RoleCheck.java (deleted)
--- app/utils/RoleCheck.java
@@ -1,89 +0,0 @@
-package utils;
-
-import models.Comment;
-import models.Issue;
-import models.IssueComment;
-import models.Permission;
-import models.Post;
-import models.Project;
-import models.ProjectUser;
-import models.Role;
-import models.enumeration.Operation;
-import models.enumeration.Resource;
-import play.db.ebean.Model;
-import play.db.ebean.Model.Finder;
-
-/**
- * @author "Hwi Ahn"
- */
-public class RoleCheck {
-
-
-    /**
-     * 
-     * @param userId
-     * @param projectId
-     * @param resource
-     * @param operation
-     * @param resourceId
-     * @return
-     */
-    public static boolean permissionCheck(Object userSessionId, Long projectId, Resource resource,
-            Operation operation, Long resourceId) {
-        Long userId;
-        if(userSessionId instanceof String) {
-            userId = Long.parseLong((String) userSessionId);
-        } else {
-            userId = (Long) userSessionId;
-        }
-        
-        boolean isAuthorEditible;
-
-        switch (resource)
-            {
-            case ISSUE_POST:
-                isAuthorEditible = authorCheck(userId, resourceId, new Finder<Long, Issue>(
-                        Long.class, Issue.class))
-                        && Project.findById(projectId).isAuthorEditable;
-                break;
-            case ISSUE_COMMENT:
-                isAuthorEditible = authorCheck(userId, resourceId, new Finder<Long, IssueComment>(
-                        Long.class, IssueComment.class));
-                break;
-            case BOARD_POST:
-                isAuthorEditible = authorCheck(userId, resourceId, new Finder<Long, Post>(
-                        Long.class, Post.class));
-                break;
-            case BOARD_COMMENT:
-                isAuthorEditible = authorCheck(userId, resourceId, new Finder<Long, Comment>(
-                        Long.class, Comment.class));
-                break;
-            default:
-                isAuthorEditible = false;
-                break;
-            }
-        if (ProjectUser.isMember(userId, projectId)) {
-            return isAuthorEditible
-                    || Permission.permissionCheck(userId, projectId, resource, operation);
-        } else { // Anonymous
-            if (Project.findById(projectId) != null && !Project.findById(projectId).share_option) {
-                return false;
-            }
-            return isAuthorEditible
-                    || Permission.permissionCheckByRole(Role.ANONYMOUS, resource, operation);
-      }
-    }
-
-    /**
-     * 
-     * @param userId
-     * @param resourceId
-     * @param finder
-     * @return
-     */
-    public static <T, K> boolean authorCheck(Long userId, Long resourceId, Model.Finder<K, T> finder) {
-        int findRowCount = finder.where().eq("authorId", userId).eq("id", resourceId)
-                .findRowCount();
-        return (findRowCount != 0) ? true : false;
-    }
-}
app/views/roleCheck.scala.html
--- app/views/roleCheck.scala.html
+++ app/views/roleCheck.scala.html
@@ -1,5 +1,5 @@
 @(userId: String, projectId: Long, resource: models.enumeration.Resource, operation: models.enumeration.Operation, resourceId: Long = null)(content: => Html)
 
-@if(utils.RoleCheck.permissionCheck(userId, projectId, resource, operation, resourceId)){
+@if(utils.AccessControl.isAllowed(userId, projectId, resource, operation, resourceId)){
   @content
 }
test/models/PermissionTest.java
--- test/models/PermissionTest.java
+++ test/models/PermissionTest.java
@@ -2,24 +2,26 @@
 
 import models.enumeration.Operation;
 import models.enumeration.Resource;
+import models.enumeration.RoleType;
 
 import org.junit.Test;
-
-import com.avaje.ebean.Ebean;
 
 import static org.fest.assertions.Assertions.assertThat;
 
 public class PermissionTest extends ModelTest<Permission> {    
     @Test
-    public void permissionCheck() throws Exception {
+    public void hasPermission() throws Exception {
         // Given
         Long hobi = 2l;
         Long nForge4java = 1l;
         Long jindo = 2l;
+        RoleType anonymous = RoleType.ANONYMOUS;
         // When
         // Then
-        assertThat(Permission.permissionCheck(hobi, nForge4java, Resource.PROJECT_SETTING, Operation.WRITE)).isEqualTo(true);
-        assertThat(Permission.permissionCheck(hobi, jindo, Resource.PROJECT_SETTING, Operation.WRITE)).isEqualTo(false);
+        assertThat(Permission.hasPermission(hobi, nForge4java, Resource.PROJECT_SETTING, Operation.WRITE)).isEqualTo(true);
+        assertThat(Permission.hasPermission(hobi, jindo, Resource.PROJECT_SETTING, Operation.WRITE)).isEqualTo(false);
+        assertThat(Permission.hasPermission(anonymous, Resource.BOARD_POST, Operation.READ)).isEqualTo(true);
+        assertThat(Permission.hasPermission(anonymous, Resource.BOARD_POST, Operation.DELETE)).isEqualTo(false);
     }
     
     @Test
@@ -28,16 +30,5 @@
         // When
         // Then
         assertThat(Permission.findPermissionsByRole(1l).size()).isEqualTo(63);
-    }
-    
-    @Test
-    public void permissionCheckByRole() throws Exception {
-        // Given
-        // When
-        boolean result1 = Permission.permissionCheckByRole(Role.ANONYMOUS, Resource.BOARD_POST, Operation.READ);
-        boolean result2 = Permission.permissionCheckByRole(Role.ANONYMOUS, Resource.BOARD_POST, Operation.DELETE);
-        // Then
-        assertThat(result1).isEqualTo(true);
-        assertThat(result2).isEqualTo(false);
     }
 }
test/models/RoleTest.java
--- test/models/RoleTest.java
+++ test/models/RoleTest.java
@@ -2,6 +2,8 @@
 
 import java.util.List;
 
+import models.enumeration.RoleType;
+
 import org.junit.Test;
 
 import static org.fest.assertions.Assertions.assertThat;
@@ -15,7 +17,7 @@
     public void findById() throws Exception {
         // Given
         // When
-        Role role = Role.findById(1l);
+        Role role = Role.findByRoleType(RoleType.MANAGER);
         // Then
         assertThat(role.name).isEqualTo("manager");
     }
test/utils/AccessControlTest.java (Renamed from test/utils/RoleCheckTest.java)
--- test/utils/RoleCheckTest.java
+++ test/utils/AccessControlTest.java
@@ -11,24 +11,24 @@
 import play.db.ebean.Model;
 import play.db.ebean.Model.Finder;
 
-public class RoleCheckTest extends ModelTest<Role>{
+public class AccessControlTest extends ModelTest<Role>{
     @Test
-    public void permissionCheck() throws Exception {
+    public void isAllowed() throws Exception {
         // Given
         Long userSessionId1 = 1l;
         Long userSessionId2 = 2l;
         Long projectId1 = 1l;
         Long projectId2 = 3l;
         // When
-        boolean result1 = RoleCheck.permissionCheck(userSessionId1, projectId1, Resource.PROJECT_SETTING, Operation.WRITE, null);
-        boolean result2 = RoleCheck.permissionCheck(userSessionId2, projectId2, Resource.BOARD_POST, Operation.READ, null);
+        boolean result1 = AccessControl.isAllowed(userSessionId1, projectId1, Resource.PROJECT_SETTING, Operation.WRITE, null);
+        boolean result2 = AccessControl.isAllowed(userSessionId2, projectId2, Resource.BOARD_POST, Operation.READ, null);
         // Then
         assertThat(result1).isEqualTo(true);
         assertThat(result2).isEqualTo(false);
     }
     
     @Test
-    public void authorCheck() throws Exception {
+    public void isAuthor() throws Exception {
         // Given
         Long userId1 = 2l;
         Long resourceId1 = 1l;
@@ -37,8 +37,8 @@
         Long resourceId2 = 1l;
         Finder<Long, Issue> issueFinder = new Finder<Long, Issue>(Long.class, Issue.class);
         // When
-        boolean result1 = RoleCheck.authorCheck(userId1, resourceId1, postFinder);
-        boolean result2 = RoleCheck.authorCheck(userId2, resourceId2, issueFinder);
+        boolean result1 = AccessControl.isAuthor(userId1, resourceId1, postFinder);
+        boolean result2 = AccessControl.isAuthor(userId2, resourceId2, issueFinder);
         // Then
         assertThat(result1).isEqualTo(true);
         assertThat(result2).isEqualTo(false);
Add a comment
List