
Actions: modified javadocs and technical doc
@f993028e5d2f663405825ac7f4e8dd7485d98703
--- app/actions/AbstractProjectCheckAction.java
+++ app/actions/AbstractProjectCheckAction.java
... | ... | @@ -37,10 +37,9 @@ |
37 | 37 |
|
38 | 38 |
/** |
39 | 39 |
* /{user.loginId}/{project.name}/** 패턴의 요청에 해당하는 프로젝트가 존재하는지 확인하는 액션. |
40 |
- * - URL에 해당하는 프로젝트가 없을 때 404 Not Found 로 응답한다. |
|
41 |
- * - 현재 사용자가 URL에 해당하는 프로젝트에 읽기 권한이 없을 경우 404 Not Found 로 응답한다. |
|
40 |
+ * - URL에 해당하는 프로젝트가 없거나 현재 사용자가 읽기 권한이 없을 때 403 Forbidden으로 응답한다. |
|
42 | 41 |
* - URL에 해당하는 프로젝트가 있을 때 {@link AbstractProjectCheckAction#call(Project, Context)} 을 |
43 |
- * 호출하여 이후 검증 과정을 수행한다. |
|
42 |
+ * 호출하여 이후에 추가 검증 과정을 수행한다. |
|
44 | 43 |
* |
45 | 44 |
* @author Keesun Baik, kjkmadness |
46 | 45 |
*/ |
--- app/actions/AnonymousCheckAction.java
+++ app/actions/AnonymousCheckAction.java
... | ... | @@ -30,6 +30,7 @@ |
30 | 30 |
import utils.Constants; |
31 | 31 |
|
32 | 32 |
/** |
33 |
+ * {@link actions.AbstractProjectCheckAction}의 추가작업으로, |
|
33 | 34 |
* 현재 사용자가 anonymouse이면 로그인 페이지로 리다이렉트 한다. |
34 | 35 |
* |
35 | 36 |
* @author Wansoon Park, Keesun Beak |
--- app/actions/DefaultProjectCheckAction.java
+++ app/actions/DefaultProjectCheckAction.java
... | ... | @@ -26,7 +26,7 @@ |
26 | 26 |
import play.mvc.Result; |
27 | 27 |
|
28 | 28 |
/** |
29 |
- * {@code AbstractProjectCheckAction}에서 제공하는 기능만을 실행하는 액션. |
|
29 |
+ * {@link AbstractProjectCheckAction}에서 제공하는 기능만을 실행하는 액션. |
|
30 | 30 |
* |
31 | 31 |
* @see {@link AbstractProjectCheckAction} |
32 | 32 |
* @author Keesun Baik |
--- app/actions/IsAllowedAction.java
+++ app/actions/IsAllowedAction.java
... | ... | @@ -35,6 +35,7 @@ |
35 | 35 |
import utils.ErrorViews; |
36 | 36 |
|
37 | 37 |
/** |
38 |
+ * {@link actions.AbstractProjectCheckAction}의 추가작업으로, |
|
38 | 39 |
* 1. 특정 타입의 리소스가 존재하는지 확인한다. |
39 | 40 |
* 2. 특정 타입의 리소스에 권한이 있는지 확인한다. |
40 | 41 |
* |
--- app/actions/IsCreatableAction.java
+++ app/actions/IsCreatableAction.java
... | ... | @@ -32,6 +32,7 @@ |
32 | 32 |
import controllers.annotation.IsCreatable; |
33 | 33 |
|
34 | 34 |
/** |
35 |
+ * {@link actions.AbstractProjectCheckAction}의 추가작업으로, |
|
35 | 36 |
* 프로젝트에 특정 타입의 리소스를 생성할 수 있는지 확인한다. |
36 | 37 |
* |
37 | 38 |
* @author Wansoon Park, Keesun Baik |
--- app/actions/IsOnlyGitAvailableAction.java
+++ app/actions/IsOnlyGitAvailableAction.java
... | ... | @@ -29,6 +29,7 @@ |
29 | 29 |
import utils.ErrorViews; |
30 | 30 |
|
31 | 31 |
/** |
32 |
+ * {@link actions.AbstractProjectCheckAction}의 추가작업으로, |
|
32 | 33 |
* 프로젝트가 Git 프로젝트인지 확인한다. |
33 | 34 |
* |
34 | 35 |
* @see {@link AbstractProjectCheckAction} |
--- app/actions/NullProjectCheckAction.java
+++ app/actions/NullProjectCheckAction.java
... | ... | @@ -1,7 +1,64 @@ |
1 |
+/** |
|
2 |
+ * Yobi, Project Hosting SW |
|
3 |
+ * |
|
4 |
+ * Copyright 2013 NAVER Corp. |
|
5 |
+ * http://yobi.io |
|
6 |
+ * |
|
7 |
+ * @Author Wansoon Park, Keesun Baek |
|
8 |
+ * |
|
9 |
+ * Licensed under the Apache License, Version 2.0 (the "License"); |
|
10 |
+ * you may not use this file except in compliance with the License. |
|
11 |
+ * You may obtain a copy of the License at |
|
12 |
+ * |
|
13 |
+ * http://www.apache.org/licenses/LICENSE-2.0 |
|
14 |
+ * |
|
15 |
+ * Unless required by applicable law or agreed to in writing, software |
|
16 |
+ * distributed under the License is distributed on an "AS IS" BASIS, |
|
17 |
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
18 |
+ * See the License for the specific language governing permissions and |
|
19 |
+ * limitations under the License. |
|
20 |
+ */ |
|
1 | 21 |
package actions; |
2 | 22 |
|
23 |
+import actions.support.PathParser; |
|
24 |
+import controllers.UserApp; |
|
25 |
+import models.Project; |
|
26 |
+import models.User; |
|
27 |
+import play.i18n.Messages; |
|
28 |
+import play.mvc.Action; |
|
29 |
+import play.mvc.Http; |
|
30 |
+import play.mvc.Result; |
|
31 |
+import utils.AccessLogger; |
|
32 |
+import utils.ErrorViews; |
|
33 |
+ |
|
34 |
+import static play.mvc.Controller.flash; |
|
35 |
+ |
|
3 | 36 |
/** |
37 |
+ * /{user.loginId}/{project.name}/** 패턴의 요청에 해당하는 프로젝트가 존재하는지 확인하는 액션. |
|
38 |
+ * - URL에 해당하는 프로젝트가 없을 때 403 Forbidden으로 응답한다. |
|
39 |
+ * |
|
4 | 40 |
* @author Keeun Baik |
5 | 41 |
*/ |
6 |
-public class NullProjectCheckAction { |
|
42 |
+public class NullProjectCheckAction extends Action<Void> { |
|
43 |
+ |
|
44 |
+ @Override |
|
45 |
+ public Result call(Http.Context context) throws Throwable { |
|
46 |
+ PathParser parser = new PathParser(context); |
|
47 |
+ String ownerLoginId = parser.getOwnerLoginId(); |
|
48 |
+ String projectName = parser.getProjectName(); |
|
49 |
+ |
|
50 |
+ Project project = Project.findByOwnerAndProjectName(ownerLoginId, projectName); |
|
51 |
+ |
|
52 |
+ if (project == null) { |
|
53 |
+ if (UserApp.currentUser() == User.anonymous){ |
|
54 |
+ flash("failed", Messages.get("error.auth.unauthorized.waringMessage")); |
|
55 |
+ return AccessLogger.log(context.request(), |
|
56 |
+ forbidden(ErrorViews.Forbidden.render("error.forbidden.or.notfound", context.request().path())), null); |
|
57 |
+ } |
|
58 |
+ return AccessLogger.log(context.request(), |
|
59 |
+ forbidden(ErrorViews.NotFound.render("error.forbidden.or.notfound")), null); |
|
60 |
+ } |
|
61 |
+ |
|
62 |
+ return this.delegate.call(context); |
|
63 |
+ } |
|
7 | 64 |
} |
--- docs/technical/validation-with-annotation.md
+++ docs/technical/validation-with-annotation.md
... | ... | @@ -11,6 +11,7 @@ |
11 | 11 |
* `@IsAllowed` |
12 | 12 |
* `@With(AnonymousCheckAction.class)` |
13 | 13 |
* `@With(NullProjectCheckAction.class)` |
14 |
+* `@With(DefaultProjectCheckAction.class)` |
|
14 | 15 |
|
15 | 16 |
Yobi에서 사용하는 인증 및 권한 검사 애노테이션은 다음과 같은 URL 패턴에만 적용할 수 있다. |
16 | 17 |
|
... | ... | @@ -18,12 +19,29 @@ |
18 | 19 |
|
19 | 20 |
`conf/application.conf`에 설정한 application.context가 있을 경우 해당 컨텍스트 패스를 제거한 URL 패턴에 적용된다. |
20 | 21 |
|
22 |
+## @With(DefaultProjectCheckAction.class) |
|
23 |
+ |
|
24 |
+이 애노테이션은 URL 패턴에 해당하는 프로젝트가 있는지 그리고 해당 프로젝트를 볼 수 있는 권한이 있는지 확인한다. |
|
25 |
+ |
|
26 |
+URL에 해당하는 프로젝트가 없거나 현재 사용자가 읽기 권한이 없을 때 403 Forbidden으로 응답한다. |
|
27 |
+ |
|
28 |
+### 사용예 |
|
29 |
+ |
|
30 |
+다음 코드는 URL 패턴에 해당하는 프로젝트가 있는지 확인한다. |
|
31 |
+ |
|
32 |
+``` |
|
33 |
+@With(DefaultProjectCheckAction.class) |
|
34 |
+public static Result editIssue(String ownerName, String projectName, Long number) { |
|
35 |
+ // 코드 생략 |
|
36 |
+} |
|
37 |
+``` |
|
38 |
+ |
|
21 | 39 |
## @IsOnlyGitAvailable |
22 | 40 |
|
23 |
-GIT 저장소를 사용하는 프로젝트인지 확인한다. |
|
41 |
+`@With(DefaultProjectCheckAction.class)`가 확인하는 작업에 추가로 GIT 저장소를 사용하는 프로젝트인지 확인한다. |
|
24 | 42 |
|
25 |
-URL 패턴에 해당하는 프로젝트가 없는 경우 응답으로 404 Not Found를 반환한다. |
|
26 |
-요청 핸들러에 이 애노테이션을 사용하면 GIT 저장소를 사용하지 않는 프로젝트는 응답으로 400 Bad Request를 반환한다. |
|
43 |
+URL에 해당하는 프로젝트가 없거나 현재 사용자가 읽기 권한이 없을 때 403 Forbidden으로 응답한다. |
|
44 |
+URL에 해당하는 프로젝트가 GIT 저장소를 사용하지 않는 프로젝트일 경우에는 응답으로 400 Bad Request를 반환한다. |
|
27 | 45 |
|
28 | 46 |
컨트롤러 클래스에 이 애노테이션을 사용하면 해당 컨트롤러의 모든 메서드에 적용된다. |
29 | 47 |
|
... | ... | @@ -40,10 +58,12 @@ |
40 | 58 |
|
41 | 59 |
## @IsCreatable |
42 | 60 |
|
43 |
-프로젝트에 특정 리소스 타입을 생성할 수 있는지 확인한다. |
|
61 |
+`@With(DefaultProjectCheckAction.class)`가 확인하는 작업에 추가로 현재 사용자가 프로젝트에 특정 리소스 타입을 생성할 수 있는지 확인한다. |
|
44 | 62 |
|
45 |
-URL 패턴에 해당하는 프로젝트가 없는 경우 응답으로 404 Not Found를 반환한다. |
|
46 |
-프로젝트에 해당 리소스를 생성할 권한이 없다면 응답으로 403 Forbidden을 반환한다. |
|
63 |
+다음의 경우 403 Forbidden으로 응답한다. |
|
64 |
+* URL에 해당하는 프로젝트가 없다. |
|
65 |
+* URL에 해당하는 프로젝트에 현재 사용자가 읽기 권한이 없다. |
|
66 |
+* URL에 해당하는 프로젝트에 해당 리소스를 생성할 권한이 없다. |
|
47 | 67 |
|
48 | 68 |
### 파라미터 |
49 | 69 |
|
... | ... | @@ -62,10 +82,12 @@ |
62 | 82 |
|
63 | 83 |
## @IsAllowed |
64 | 84 |
|
65 |
-특정 리소스에 특정 권한이 가능한지 확인한다. |
|
85 |
+`@With(DefaultProjectCheckAction.class)`가 확인하는 작업에 추가로 현재 사용자가 특정 리소스에 특정 권한이 가능한지 확인한다. |
|
66 | 86 |
|
67 |
-URL 패턴에 해당하는 프로젝트나 리소스가 없는 경우 응답으로 404 Not Found를 반환한다. |
|
68 |
-특정 리소스(`ResourceType`)에 특정 동작(`Operation`)이 가능하지 않을 경우 응답으로 403 Forbidden을 반환한다. |
|
87 |
+다음의 경우 403 Forbidden으로 응답한다. |
|
88 |
+* URL에 해당하는 프로젝트가 없다. |
|
89 |
+* URL에 해당하는 프로젝트에 현재 사용자가 읽기 권한이 없다. |
|
90 |
+* 현재 사용자에게 특정 리소스(`ResourceType`)에 특정 동작(`Operation`)을 허용하지 않는다. |
|
69 | 91 |
|
70 | 92 |
### 파라미터 |
71 | 93 |
|
... | ... | @@ -89,7 +111,6 @@ |
89 | 111 |
이밖에 필요한 리소스 타입이 있다면 `Resource.getResourceObject` 메서드에 코드를 추가해야 한다. |
90 | 112 |
|
91 | 113 |
### 사용예 |
92 |
- |
|
93 | 114 |
|
94 | 115 |
다음 코드는 resourceType을 명시하지 않았기 때문에 기본값인 PROJECT가 적용되어 현재 사용자가 PROJECT 리소스 타입에 READ 권한이 있는지 확인한다. |
95 | 116 |
|
... | ... | @@ -130,7 +151,7 @@ |
130 | 151 |
|
131 | 152 |
이 애노테이션은 URL 패턴에 해당하는 프로젝트가 있는지 확인한다. |
132 | 153 |
|
133 |
-URL 패턴에 해당하는 프로젝트가 없는 경우 응답으로 404 Not Found를 반환한다. |
|
154 |
+URL에 해당하는 프로젝트가 없을 때 403 Forbidden으로 응답한다. |
|
134 | 155 |
|
135 | 156 |
### 사용예 |
136 | 157 |
|
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?