mirror of
				https://github.com/gitbucket/gitbucket.git
				synced 2025-10-31 10:36:05 +01:00 
			
		
		
		
	Separate Authenticators to the trait from ControllerBase.
This commit is contained in:
		| @@ -26,101 +26,6 @@ abstract class ControllerBase extends ScalatraFilter with ClientSideValidationFo | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |  | ||||||
|    * Allows only the repository owner and administrators. |  | ||||||
|    */ |  | ||||||
|   protected def ownerOnly(action: => Any) = { |  | ||||||
|     { |  | ||||||
|       context.loginAccount match { |  | ||||||
|         case Some(x) if(x.userType == AccountService.Administrator) => action |  | ||||||
|         case Some(x) if(request.getRequestURI.split("/")(1) == x.userName) => action |  | ||||||
|         case _ => redirect("/signin") |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /** |  | ||||||
|    * Allows only the repository owner and administrators. |  | ||||||
|    */ |  | ||||||
|   protected def ownerOnly[T](action: T => Any) = { |  | ||||||
|     (form: T) => { |  | ||||||
|       context.loginAccount match { |  | ||||||
|         case Some(x) if(x.userType == AccountService.Administrator) => action(form) |  | ||||||
|         case Some(x) if(request.getRequestURI.split("/")(1) == x.userName) => action(form) |  | ||||||
|         case _ => redirect("/signin") |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /** |  | ||||||
|    * Allows only signed in users. |  | ||||||
|    */ |  | ||||||
|   protected def usersOnly(action: => Any) = { |  | ||||||
|     { |  | ||||||
|       context.loginAccount match { |  | ||||||
|         case Some(x) => action |  | ||||||
|         case None    => redirect("/signin") |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /** |  | ||||||
|    * Allows only signed in users. |  | ||||||
|    */ |  | ||||||
|   protected def usersOnly[T](action: T => Any) = { |  | ||||||
|     (form: T) => { |  | ||||||
|       context.loginAccount match { |  | ||||||
|         case Some(x) => action(form) |  | ||||||
|         case None    => redirect("/signin") |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| //  /** |  | ||||||
| //   * Allows only collaborators and administrators. |  | ||||||
| //   */ |  | ||||||
| //  protected def collaboratorsOnly(action: => Any) = { |  | ||||||
| //    { |  | ||||||
| //      context.loginAccount match { |  | ||||||
| //        case Some(x) if(x.userType == AccountService.Administrator) => action |  | ||||||
| //        case Some(x) if(request.getRequestURI.split("/")(1) == x.userName) => action |  | ||||||
| //        case Some(x) => { |  | ||||||
| //          val paths = request.getRequestURI.split("/") |  | ||||||
| //          if(getCollaborators(paths(1), paths(2)).contains(x.userName)){ |  | ||||||
| //            action |  | ||||||
| //          } else { |  | ||||||
| //            redirect("/signin") |  | ||||||
| //          } |  | ||||||
| //        } |  | ||||||
| //        case None => redirect("/signin") |  | ||||||
| //      } |  | ||||||
| //    } |  | ||||||
| //  } |  | ||||||
| // |  | ||||||
| //  /** |  | ||||||
| //   * Allows only collaborators and administrators. |  | ||||||
| //   */ |  | ||||||
| //  protected def collaboratorsOnly[T](action: T => Any) = { |  | ||||||
| //    (form: T) => { |  | ||||||
| //      context.loginAccount match { |  | ||||||
| //        case Some(x) if(x.userType == AccountService.Administrator) => action(form) |  | ||||||
| //        case Some(x) if(request.getRequestURI.split("/")(1) == x.userName) => action(form) |  | ||||||
| //        case Some(x) => { |  | ||||||
| //          val paths = request.getRequestURI.split("/") |  | ||||||
| //          if(getCollaborators(paths(1), paths(2)).contains(x.userName)){ |  | ||||||
| //            action(form) |  | ||||||
| //          } else { |  | ||||||
| //            redirect("/signin") |  | ||||||
| //          } |  | ||||||
| //        } |  | ||||||
| //        case None => redirect("/signin") |  | ||||||
| //      } |  | ||||||
| //    } |  | ||||||
| //  } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| //  protected def adminOnly() |  | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| case class Context(path: String, loginAccount: Option[Account]) | case class Context(path: String, loginAccount: Option[Account]) | ||||||
| @@ -1,6 +1,7 @@ | |||||||
| package app | package app | ||||||
|  |  | ||||||
| import util.Directory._ | import util.Directory._ | ||||||
|  | import util.UsersOnlyAuthenticator | ||||||
| import service._ | import service._ | ||||||
| import java.io.File | import java.io.File | ||||||
| import org.eclipse.jgit.api.Git | import org.eclipse.jgit.api.Git | ||||||
| @@ -9,12 +10,13 @@ import org.apache.commons.io._ | |||||||
| import jp.sf.amateras.scalatra.forms._ | import jp.sf.amateras.scalatra.forms._ | ||||||
|  |  | ||||||
| class CreateRepositoryController extends CreateRepositoryControllerBase | class CreateRepositoryController extends CreateRepositoryControllerBase | ||||||
|   with RepositoryService with AccountService with WikiService |   with RepositoryService with AccountService with WikiService with UsersOnlyAuthenticator | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Creates new repository. |  * Creates new repository. | ||||||
|  */ |  */ | ||||||
| trait CreateRepositoryControllerBase extends ControllerBase { self: RepositoryService with WikiService => | trait CreateRepositoryControllerBase extends ControllerBase { | ||||||
|  |   self: RepositoryService with WikiService with UsersOnlyAuthenticator => | ||||||
|  |  | ||||||
|   case class RepositoryCreationForm(name: String, description: String) // TODO Option? |   case class RepositoryCreationForm(name: String, description: String) // TODO Option? | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,12 +1,15 @@ | |||||||
| package app | package app | ||||||
|  |  | ||||||
| import service._ | import service._ | ||||||
|  | import util.OwnerOnlyAuthenticator | ||||||
| import jp.sf.amateras.scalatra.forms._ | import jp.sf.amateras.scalatra.forms._ | ||||||
|  |  | ||||||
| class SettingsController extends SettingsControllerBase with RepositoryService with AccountService | class SettingsController extends SettingsControllerBase | ||||||
|  |   with RepositoryService with AccountService with OwnerOnlyAuthenticator | ||||||
|  |  | ||||||
|  |  | ||||||
| trait SettingsControllerBase extends ControllerBase { self: RepositoryService with AccountService => | trait SettingsControllerBase extends ControllerBase { | ||||||
|  |   self: RepositoryService with AccountService with OwnerOnlyAuthenticator => | ||||||
|  |  | ||||||
|   case class CollaboratorForm(userName: String) |   case class CollaboratorForm(userName: String) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,14 +1,15 @@ | |||||||
| package app | package app | ||||||
|  |  | ||||||
| import service._ | import service._ | ||||||
| import util.JGitUtil | import util.{CollaboratorsOnlyAuthenticator, JGitUtil} | ||||||
| import util.Directory._ | import util.Directory._ | ||||||
| import jp.sf.amateras.scalatra.forms._ | import jp.sf.amateras.scalatra.forms._ | ||||||
|  |  | ||||||
| class WikiController extends WikiControllerBase  | class WikiController extends WikiControllerBase  | ||||||
|   with WikiService with RepositoryService with AccountService |   with WikiService with RepositoryService with AccountService with CollaboratorsOnlyAuthenticator | ||||||
|  |  | ||||||
| trait WikiControllerBase extends ControllerBase { self: WikiService with RepositoryService => | trait WikiControllerBase extends ControllerBase { | ||||||
|  |   self: WikiService with RepositoryService with CollaboratorsOnlyAuthenticator => | ||||||
|  |  | ||||||
|   case class WikiPageEditForm(pageName: String, content: String, message: Option[String], currentPageName: String) |   case class WikiPageEditForm(pageName: String, content: String, message: Option[String], currentPageName: String) | ||||||
|    |    | ||||||
| @@ -81,7 +82,7 @@ trait WikiControllerBase extends ControllerBase { self: WikiService with Reposit | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|    |    | ||||||
|   get("/:owner/:repository/wiki/:page/_edit")(usersOnly { |   get("/:owner/:repository/wiki/:page/_edit")(collaboratorsOnly { | ||||||
|     val owner      = params("owner") |     val owner      = params("owner") | ||||||
|     val repository = params("repository") |     val repository = params("repository") | ||||||
|     val page       = params("page") |     val page       = params("page") | ||||||
| @@ -90,7 +91,7 @@ trait WikiControllerBase extends ControllerBase { self: WikiService with Reposit | |||||||
|         getWikiPage(owner, repository, page), getRepository(owner, repository, servletContext).get) |         getWikiPage(owner, repository, page), getRepository(owner, repository, servletContext).get) | ||||||
|   }) |   }) | ||||||
|    |    | ||||||
|   post("/:owner/:repository/wiki/_edit", editForm)(usersOnly { form => |   post("/:owner/:repository/wiki/_edit", editForm)(collaboratorsOnly { form => | ||||||
|     val owner      = params("owner") |     val owner      = params("owner") | ||||||
|     val repository = params("repository") |     val repository = params("repository") | ||||||
|      |      | ||||||
| @@ -100,14 +101,14 @@ trait WikiControllerBase extends ControllerBase { self: WikiService with Reposit | |||||||
|     redirect("%s/%s/wiki/%s".format(owner, repository, form.pageName)) |     redirect("%s/%s/wiki/%s".format(owner, repository, form.pageName)) | ||||||
|   }) |   }) | ||||||
|    |    | ||||||
|   get("/:owner/:repository/wiki/_new")(usersOnly { |   get("/:owner/:repository/wiki/_new")(collaboratorsOnly { | ||||||
|     val owner      = params("owner") |     val owner      = params("owner") | ||||||
|     val repository = params("repository") |     val repository = params("repository") | ||||||
|      |      | ||||||
|     wiki.html.wikiedit("", None, getRepository(owner, repository, servletContext).get) |     wiki.html.wikiedit("", None, getRepository(owner, repository, servletContext).get) | ||||||
|   }) |   }) | ||||||
|    |    | ||||||
|   post("/:owner/:repository/wiki/_new", newForm)(usersOnly { form => |   post("/:owner/:repository/wiki/_new", newForm)(collaboratorsOnly { form => | ||||||
|     val owner      = params("owner") |     val owner      = params("owner") | ||||||
|     val repository = params("repository") |     val repository = params("repository") | ||||||
|      |      | ||||||
| @@ -117,7 +118,7 @@ trait WikiControllerBase extends ControllerBase { self: WikiService with Reposit | |||||||
|     redirect("%s/%s/wiki/%s".format(owner, repository, form.pageName)) |     redirect("%s/%s/wiki/%s".format(owner, repository, form.pageName)) | ||||||
|   }) |   }) | ||||||
|    |    | ||||||
|   get("/:owner/:repository/wiki/:page/_delete")(usersOnly { |   get("/:owner/:repository/wiki/:page/_delete")(collaboratorsOnly { | ||||||
|     val owner      = params("owner") |     val owner      = params("owner") | ||||||
|     val repository = params("repository") |     val repository = params("repository") | ||||||
|     val page       = params("page") |     val page       = params("page") | ||||||
|   | |||||||
							
								
								
									
										96
									
								
								src/main/scala/util/Authenticator.scala
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								src/main/scala/util/Authenticator.scala
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | |||||||
|  | package util | ||||||
|  |  | ||||||
|  | import app.ControllerBase | ||||||
|  | import service._ | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Allows only the repository owner and administrators. | ||||||
|  |  */ | ||||||
|  | trait OwnerOnlyAuthenticator { self: ControllerBase => | ||||||
|  |  | ||||||
|  |   protected def ownerOnly(action: => Any) = { | ||||||
|  |     { | ||||||
|  |       context.loginAccount match { | ||||||
|  |         case Some(x) if(x.userType == AccountService.Administrator) => action | ||||||
|  |         case Some(x) if(request.getRequestURI.split("/")(1) == x.userName) => action | ||||||
|  |         case _ => redirect("/signin") | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   protected def ownerOnly[T](action: T => Any) = { | ||||||
|  |     (form: T) => { | ||||||
|  |       context.loginAccount match { | ||||||
|  |         case Some(x) if(x.userType == AccountService.Administrator) => action(form) | ||||||
|  |         case Some(x) if(request.getRequestURI.split("/")(1) == x.userName) => action(form) | ||||||
|  |         case _ => redirect("/signin") | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Allows only signed in users. | ||||||
|  |  */ | ||||||
|  | trait UsersOnlyAuthenticator { self: ControllerBase => | ||||||
|  |  | ||||||
|  |   protected def usersOnly(action: => Any) = { | ||||||
|  |     { | ||||||
|  |       context.loginAccount match { | ||||||
|  |         case Some(x) => action | ||||||
|  |         case None    => redirect("/signin") | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   protected def usersOnly[T](action: T => Any) = { | ||||||
|  |     (form: T) => { | ||||||
|  |       context.loginAccount match { | ||||||
|  |         case Some(x) => action(form) | ||||||
|  |         case None    => redirect("/signin") | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Allows only collaborators and administrators. | ||||||
|  |  */ | ||||||
|  | trait CollaboratorsOnlyAuthenticator { self: ControllerBase with RepositoryService => | ||||||
|  |  | ||||||
|  |   protected def collaboratorsOnly(action: => Any) = { | ||||||
|  |     { | ||||||
|  |       context.loginAccount match { | ||||||
|  |         case Some(x) if(x.userType == AccountService.Administrator) => action | ||||||
|  |         case Some(x) if(request.getRequestURI.split("/")(1) == x.userName) => action | ||||||
|  |         case Some(x) => { | ||||||
|  |           val paths = request.getRequestURI.split("/") | ||||||
|  |           if(getCollaborators(paths(1), paths(2)).contains(x.userName)){ | ||||||
|  |             action | ||||||
|  |           } else { | ||||||
|  |             redirect("/signin") | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |         case None => redirect("/signin") | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   protected def collaboratorsOnly[T](action: T => Any) = { | ||||||
|  |     (form: T) => { | ||||||
|  |       context.loginAccount match { | ||||||
|  |         case Some(x) if(x.userType == AccountService.Administrator) => action(form) | ||||||
|  |         case Some(x) if(request.getRequestURI.split("/")(1) == x.userName) => action(form) | ||||||
|  |         case Some(x) => { | ||||||
|  |           val paths = request.getRequestURI.split("/") | ||||||
|  |           if(getCollaborators(paths(1), paths(2)).contains(x.userName)){ | ||||||
|  |             action(form) | ||||||
|  |           } else { | ||||||
|  |             redirect("/signin") | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |         case None => redirect("/signin") | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user