doortts doortts 2016-12-22
code: Make project members can only access to code or related menus
@022c77120d1e4d3cf9ae7ccad59ad6263f5eba9a
app/controllers/CodeApp.java
--- app/controllers/CodeApp.java
+++ app/controllers/CodeApp.java
@@ -67,6 +67,11 @@
             return status(Http.Status.NOT_IMPLEMENTED, project.vcs + " is not supported!");
         }
 
+        // Only members can access code?
+        if(project.isCodeAccessibleMemberOnly && !project.hasMember(UserApp.currentUser())) {
+            return forbidden(ErrorViews.Forbidden.render("error.forbidden", project));
+        }
+
         PlayRepository repository = RepositoryService.getRepository(project);
 
         if(repository.isEmpty()) {
app/controllers/GitApp.java
--- app/controllers/GitApp.java
+++ app/controllers/GitApp.java
@@ -20,14 +20,9 @@
  */
 package controllers;
 
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-
+import com.github.zafarkhaja.semver.Version;
 import models.Project;
 import models.enumeration.Operation;
-
-import com.github.zafarkhaja.semver.Version;
 import play.api.i18n.Lang;
 import play.i18n.Messages;
 import play.mvc.Controller;
@@ -38,6 +33,9 @@
 import utils.AccessControl;
 import utils.BasicAuthAction;
 import utils.Config;
+
+import javax.servlet.ServletException;
+import java.io.IOException;
 
 public class GitApp extends Controller {
 
@@ -103,6 +101,13 @@
 
         models.User user = UserApp.currentUser();
 
+        // Only members can access code?
+        // Only members can access code?
+        if(project.isCodeAccessibleMemberOnly && !project.hasMember(UserApp.currentUser())) {
+            return forbidden(Messages.get(Lang.defaultLang(),
+                        "git.error.permission", user.loginId, ownerName, projectName));
+        }
+
         if (!isAllowed(project, service)) {
             if (user.isAnonymous()) {
                 return BasicAuthAction.unauthorized(response());
app/controllers/PullRequestApp.java
--- app/controllers/PullRequestApp.java
+++ app/controllers/PullRequestApp.java
@@ -339,6 +339,12 @@
 
     private static Result pullRequests(String userName, String projectName, Category category) {
         Project project = Project.findByOwnerAndProjectName(userName, projectName);
+
+        // Only members can access code?
+        if(project.isCodeAccessibleMemberOnly && !project.hasMember(UserApp.currentUser())) {
+                return forbidden(ErrorViews.Forbidden.render("error.forbidden", project));
+        }
+
         SearchCondition condition = Form.form(SearchCondition.class).bindFromRequest().get();
         condition.setProject(project).setCategory(category);
         Page<PullRequest> page = PullRequest.findPagingList(condition);
app/models/Project.java
--- app/models/Project.java
+++ app/models/Project.java
@@ -40,8 +40,8 @@
 import play.db.ebean.Model;
 import play.db.ebean.Transactional;
 import playRepository.*;
-import utils.FileUtil;
 import utils.CacheStore;
+import utils.FileUtil;
 import utils.JodaDateUtil;
 import validation.ExConstraints;
 
@@ -49,7 +49,10 @@
 import javax.persistence.*;
 import javax.servlet.ServletException;
 import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
 
 @Entity
 public class Project extends Model implements LabelOwner {
@@ -92,6 +95,8 @@
     private long lastIssueNumber;
 
     private long lastPostingNumber;
+
+    public boolean isCodeAccessibleMemberOnly;
 
     @ManyToMany
     public Set<Label> labels;
@@ -176,6 +181,16 @@
         }
     }
 
+    public boolean hasMember(User user) {
+        if (user.isMemberOf(this) ||
+                user.isManagerOf(this) ||
+                user.isSiteManager()) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
     public static boolean exists(String loginId, String projectName) {
         int findRowCount = find.where().ieq("owner", loginId)
                 .ieq("name", projectName).findRowCount();
app/views/project/setting.scala.html
--- app/views/project/setting.scala.html
+++ app/views/project/setting.scala.html
@@ -87,6 +87,14 @@
                         <span class="note">@Messages("project.private.notice")</span>
                     </div>
                 </div>
+                <div class="box-wrap middle">
+                    <div class="cu-label">@Messages("project.codeAccessible")</div>
+                    <div class="cu-desc">
+                        <input name="isCodeAccessibleMemberOnly" type="radio" id="codeAccessibleMemberOnly" class="radio-btn" value="true" @if(project.isCodeAccessibleMemberOnly){checked="checked"}><label for="codeAccessibleMemberOnly" class="bg-radiobtn label-public">@Messages("button.yes")</label>
+                        <input name="isCodeAccessibleMemberOnly" type="radio" id="codeAccessibleAnyone" class="radio-btn" value="false" @if(!project.isCodeAccessibleMemberOnly){checked="checked"}><label for="codeAccessibleAnyone" class="bg-radiobtn label-private">@Messages("button.no")</label>
+                        <span class="note"></span>
+                    </div>
+                </div>
 
                 @if(project.vcs.equals("GIT")){
                 <div class="box-wrap middle reviewer-count-wrap" id="reviewerCountSettingPanel" style="@if(!project.menuSetting.code){display:none;}">
app/views/projectMenu.scala.html
--- app/views/projectMenu.scala.html
+++ app/views/projectMenu.scala.html
@@ -56,11 +56,13 @@
                 </a>
             </li>
             @if(project.menuSetting.code) {
-                <li class="@isActiveMenu(MenuType.CODE)">
-                    <a href="@routes.CodeApp.codeBrowser(project.owner, project.name)">
-                        <span class="menu-name">@Messages("menu.code")</span><span class="short-menu">C</span>
-                    </a>
-                </li>
+                @if(!project.isCodeAccessibleMemberOnly || project.hasMember(UserApp.currentUser())) {
+                    <li class="@isActiveMenu(MenuType.CODE)">
+                        <a href="@routes.CodeApp.codeBrowser(project.owner, project.name)">
+                            <span class="menu-name">@Messages("menu.code")</span><span class="short-menu">C</span>
+                        </a>
+                    </li>
+                }
             }
             @if(project.menuSetting.issue) {
                 <li class="@isActiveMenu(MenuType.ISSUE)">
@@ -69,8 +71,8 @@
                     </a>
                 </li>
             }
-            @if(project.menuSetting.pullRequest) {
-                @if(project.vcs.equals("GIT")){
+            @if(project.menuSetting.pullRequest && project.vcs.equals("GIT")) {
+                @if(!project.isCodeAccessibleMemberOnly || project.hasMember(UserApp.currentUser())) {
                     <li class="@isActiveMenu(MenuType.PULL_REQUEST)">
                     <a href="@getPullRequestURL(project)">
                         <span class="menu-name">@Messages("menu.pullRequest")</span><span class="short-menu">P</span> @countingBadge(PullRequest.countOpenedPullRequests(project))
@@ -79,11 +81,14 @@
                 }
             }
             @if(project.menuSetting.review) {
-                <li class="@isActiveMenu(MenuType.PROJECT_REVIEW)">
-                    <a href="@routes.ReviewThreadApp.reviewThreads(project.owner, project.name)">
-                        <span class="menu-name">@Messages("menu.review")</span><span class="short-menu">R</span> @countingBadge(reviewCount)
-                    </a>
-                </li>
+                @if(!project.isCodeAccessibleMemberOnly || project.hasMember(UserApp.currentUser())) {
+                    <li class="@isActiveMenu(MenuType.PROJECT_REVIEW)">
+                        <a href="@routes.ReviewThreadApp.reviewThreads(project.owner, project.name)">
+                            <span class="menu-name">@Messages("menu.review")</span><span class="short-menu">
+                            R</span> @countingBadge(reviewCount)
+                        </a>
+                    </li>
+                }
             }
             @if(project.menuSetting.milestone) {
                 <li class="@isActiveMenu(MenuType.MILESTONE)">
 
conf/evolutions/default/8.sql (added)
+++ conf/evolutions/default/8.sql
@@ -0,0 +1,5 @@
+# --- !Ups
+ALTER TABLE project ADD COLUMN is_code_accessible_member_only tinyint(1) default 0;
+
+# --- !Downs
+ALTER TABLE project DROP COLUMN is_code_accessible_member_only;
conf/messages
--- conf/messages
+++ conf/messages
@@ -501,6 +501,7 @@
 project.changeVCS.requestion = Do you want to change the repository to {0}?
 project.changeVCS.reaccept = Are you sure?
 project.changeVCS.this = Change Repository Type.
+project.codeAccessible = Only project members can access to code or related menus
 project.codeUpdate = Latest code update
 project.create = Create a project
 project.created = Created date
conf/messages.ko-KR
--- conf/messages.ko-KR
+++ conf/messages.ko-KR
@@ -501,6 +501,7 @@
 project.changeVCS.requestion = 코드 저장소 타입을 {0}으로 변경하시겠습니까?
 project.changeVCS.reaccept = 정말로 변경하시겠습니까?
 project.changeVCS.this = 코드 저장소 타입을 변경합니다.
+project.codeAccessible = 프로젝트 멤버만 코드 및 관련 메뉴에 접근 가능
 project.codeUpdate = 마지막 코드 업데이트
 project.create = 프로젝트 생성
 project.created = 생성일
Add a comment
List