doortts doortts 2016-12-28
code: Fix members only access code bug
@9f0f83d67bdc552e6fcdd47e102d35cb30470196
 
app/actions/CodeAccessCheckAction.java (added)
+++ app/actions/CodeAccessCheckAction.java
@@ -0,0 +1,28 @@
+/**
+ *  Yona, 21st Century Project Hosting SW
+ *  <p>
+ *  Copyright Yona & Yobi Authors & NAVER Corp.
+ *  https://yona.io
+ **/
+package actions;
+
+import actions.support.PathParser;
+import controllers.UserApp;
+import models.Project;
+import play.libs.F.Promise;
+import play.mvc.Http.Context;
+import play.mvc.Result;
+import utils.ErrorViews;
+
+public class CodeAccessCheckAction extends AbstractProjectCheckAction<Void> {
+    @Override
+    protected Promise<Result> call(Project project, Context context, PathParser parser) throws Throwable {
+        // Only members can access code?
+        Promise<Result> promise;
+        if(project.isCodeAccessibleMemberOnly && !project.hasMember(UserApp.currentUser())) {
+            promise = Promise.pure((Result) forbidden(ErrorViews.Forbidden.render("error.forbidden.or.notfound", context.request().path())));
+            return promise;
+        }
+        return this.delegate.call(context);
+    }
+}
app/controllers/BranchApp.java
--- app/controllers/BranchApp.java
+++ app/controllers/BranchApp.java
@@ -20,6 +20,7 @@
  */
 package controllers;
 
+import actions.CodeAccessCheckAction;
 import controllers.annotation.AnonymousCheck;
 import controllers.annotation.IsAllowed;
 import controllers.annotation.IsOnlyGitAvailable;
@@ -31,6 +32,7 @@
 import org.eclipse.jgit.lib.Repository;
 import play.mvc.Controller;
 import play.mvc.Result;
+import play.mvc.With;
 import playRepository.GitBranch;
 import playRepository.GitRepository;
 import utils.HttpUtil;
@@ -47,7 +49,7 @@
 @AnonymousCheck
 public class BranchApp extends Controller {
 
-    @IsAllowed(Operation.READ)
+    @With(CodeAccessCheckAction.class)
     public static Result branches(String loginId, String projectName) throws IOException, GitAPIException {
         Project project = Project.findByOwnerAndProjectName(loginId, projectName);
         GitRepository gitRepository = new GitRepository(project);
app/controllers/CodeApp.java
--- app/controllers/CodeApp.java
+++ app/controllers/CodeApp.java
@@ -20,6 +20,7 @@
  */
 package controllers;
 
+import actions.CodeAccessCheckAction;
 import actions.DefaultProjectCheckAction;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import controllers.annotation.AnonymousCheck;
@@ -29,16 +30,12 @@
 import org.apache.commons.io.FilenameUtils;
 import org.apache.tika.Tika;
 import org.apache.tika.mime.MediaType;
-import org.eclipse.jgit.api.ArchiveCommand;
-import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.archive.ZipFormat;
 import org.tmatesoft.svn.core.SVNException;
 import play.mvc.Controller;
 import play.mvc.Http;
 import play.mvc.Result;
 import play.mvc.With;
-import playRepository.GitRepository;
 import playRepository.PlayRepository;
 import playRepository.RepositoryService;
 import utils.ErrorViews;
@@ -95,7 +92,7 @@
         return redirect(routes.CodeApp.codeBrowserWithBranch(userName, projectName, defaultBranch, ""));
     }
 
-    @With(DefaultProjectCheckAction.class)
+    @With(CodeAccessCheckAction.class)
     public static Result codeBrowserWithBranch(String userName, String projectName, String branch, String path)
         throws UnsupportedOperationException, IOException, SVNException, GitAPIException, ServletException {
         Project project = Project.findByOwnerAndProjectName(userName, projectName);
@@ -119,7 +116,7 @@
         return ok(view.render(project, branches, recursiveData, branch, path));
     }
 
-    @With(DefaultProjectCheckAction.class)
+    @With(CodeAccessCheckAction.class)
     public static Result ajaxRequest(String userName, String projectName, String path) throws Exception{
         PlayRepository repository = RepositoryService.getRepository(userName, projectName);
         path = HttpUtil.decodePathSegment(path);
@@ -132,7 +129,7 @@
         }
     }
 
-    @With(DefaultProjectCheckAction.class)
+    @With(CodeAccessCheckAction.class)
     public static Result download(String userName, String projectName, String branch, String path)
             throws UnsupportedOperationException, IOException, SVNException, GitAPIException, ServletException {
         Project project = Project.findByOwnerAndProjectName(userName, projectName);
@@ -164,7 +161,7 @@
         return ok(chunks);
     }
 
-    @With(DefaultProjectCheckAction.class)
+    @With(CodeAccessCheckAction.class)
     public static Result ajaxRequestWithBranch(String userName, String projectName, String branch, String path)
             throws UnsupportedOperationException, IOException, SVNException, GitAPIException, ServletException{
         CodeApp.hostName = request().host();
@@ -180,7 +177,7 @@
         }
     }
 
-    @With(DefaultProjectCheckAction.class)
+    @With(CodeAccessCheckAction.class)
     public static Result showRawFile(String userName, String projectName, String revision, String path) throws Exception{
         path = HttpUtil.decodePathSegment(path);
         revision = HttpUtil.decodePathSegment(revision);
@@ -200,7 +197,7 @@
         return ok(fileAsRaw).as(mediaTypeString);
     }
 
-    @With(DefaultProjectCheckAction.class)
+    @With(CodeAccessCheckAction.class)
     public static Result showImageFile(String userName, String projectName, String revision, String path) throws Exception{
         revision = HttpUtil.decodePathSegment(revision);
         path = HttpUtil.decodePathSegment(path);
app/controllers/CodeHistoryApp.java
--- app/controllers/CodeHistoryApp.java
+++ app/controllers/CodeHistoryApp.java
@@ -20,6 +20,7 @@
  */
 package controllers;
 
+import actions.CodeAccessCheckAction;
 import actions.DefaultProjectCheckAction;
 import actions.NullProjectCheckAction;
 import controllers.annotation.AnonymousCheck;
@@ -33,12 +34,18 @@
 import org.eclipse.jgit.api.errors.NoHeadException;
 import org.tmatesoft.svn.core.SVNException;
 import play.data.Form;
-import play.mvc.*;
+import play.mvc.Call;
+import play.mvc.Controller;
+import play.mvc.Result;
+import play.mvc.With;
 import playRepository.Commit;
 import playRepository.FileDiff;
 import playRepository.PlayRepository;
 import playRepository.RepositoryService;
-import utils.*;
+import utils.AccessControl;
+import utils.ErrorViews;
+import utils.HttpUtil;
+import utils.RouteUtil;
 import views.html.code.diff;
 import views.html.code.history;
 import views.html.code.nohead;
@@ -56,14 +63,14 @@
     private static final int HISTORY_ITEM_LIMIT = 25;
 
 
-    @With(DefaultProjectCheckAction.class)
+    @With(CodeAccessCheckAction.class)
     public static Result historyUntilHead(String ownerName, String projectName) throws IOException,
             UnsupportedOperationException, ServletException, GitAPIException,
             SVNException {
         return history(ownerName, projectName, null, null);
     }
 
-    @IsAllowed(Operation.READ)
+    @With(CodeAccessCheckAction.class)
     public static Result history(String ownerName, String projectName, String branch, String path) throws IOException,
             UnsupportedOperationException, ServletException, GitAPIException,
             SVNException {
@@ -91,7 +98,7 @@
         }
     }
 
-    @IsAllowed(Operation.READ)
+    @With(CodeAccessCheckAction.class)
     public static Result show(String ownerName, String projectName, String commitId)
             throws IOException, UnsupportedOperationException, ServletException, GitAPIException,
             SVNException, NoSuchMethodException {
app/controllers/GitApp.java
--- app/controllers/GitApp.java
+++ app/controllers/GitApp.java
@@ -49,8 +49,14 @@
     private static boolean isAllowed(Project project, String service) throws
             UnsupportedOperationException, IOException, ServletException {
         Operation operation = Operation.UPDATE;
+
         if (service.equals("git-upload-pack")) {
             operation = Operation.READ;
+        }
+
+        // Only members can access code?
+        if(project.isCodeAccessibleMemberOnly && !project.hasMember(UserApp.currentUser())) {
+            operation = Operation.UPDATE;
         }
 
         PlayRepository repository = RepositoryService.getRepository(project);
@@ -102,13 +108,6 @@
         }
 
         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()) {
Add a comment
List