diff --git a/src/main/scala/app/ControllerBase.scala b/src/main/scala/app/ControllerBase.scala index 4b89776..1a39b2c 100644 --- a/src/main/scala/app/ControllerBase.scala +++ b/src/main/scala/app/ControllerBase.scala @@ -26,6 +26,9 @@ } } + protected def NotFound() = redirect("/") + protected def Unauthorized() = redirect("/") + } case class Context(path: String, loginAccount: Option[Account]) \ No newline at end of file diff --git a/src/main/scala/app/RepositoryViewerController.scala b/src/main/scala/app/RepositoryViewerController.scala index 120081c..ed150c9 100644 --- a/src/main/scala/app/RepositoryViewerController.scala +++ b/src/main/scala/app/RepositoryViewerController.scala @@ -26,8 +26,10 @@ */ get("/:owner") { val owner = params("owner") - - html.user(getAccountByUserName(owner).get, getRepositoriesOfUser(owner, servletContext)) + getAccountByUserName(owner) match { + case Some(account) => html.user(account, getRepositoriesOfUser(owner, servletContext)) + case None => NotFound() + } } /** @@ -36,7 +38,7 @@ get("/:owner/:repository")(readableRepository { val owner = params("owner") val repository = params("repository") - + fileList(owner, repository) }) @@ -98,8 +100,7 @@ }, page, hasNext) } }) - - + /** * Displays the file content of the specified branch or commit. */ diff --git a/src/main/scala/app/SettingsController.scala b/src/main/scala/app/SettingsController.scala index 32f54d0..dd7f52c 100644 --- a/src/main/scala/app/SettingsController.scala +++ b/src/main/scala/app/SettingsController.scala @@ -30,6 +30,7 @@ get("/:owner/:repository/settings")(ownerOnly { val owner = params("owner") val repository = params("repository") + redirect("/%s/%s/settings/options".format(owner, repository)) }) @@ -39,8 +40,11 @@ get("/:owner/:repository/settings/options")(ownerOnly { val owner = params("owner") val repository = params("repository") - - settings.html.options(getRepository(owner, repository, servletContext).get) + + getRepository(owner, repository, servletContext) match { + case Some(r) => settings.html.options(r) + case None => NotFound() + } }) /** @@ -62,8 +66,11 @@ get("/:owner/:repository/settings/collaborators")(ownerOnly { val owner = params("owner") val repository = params("repository") - - settings.html.collaborators(getCollaborators(owner, repository), getRepository(owner, repository, servletContext).get) + + getRepository(owner, repository, servletContext) match { + case Some(r) => settings.html.collaborators(getCollaborators(owner, repository), r) + case None => NotFound() + } }) /** @@ -72,6 +79,7 @@ post("/:owner/:repository/settings/collaborators/add", collaboratorForm)(ownerOnly { form => val owner = params("owner") val repository = params("repository") + addCollaborator(owner, repository, form.userName) redirect("/%s/%s/settings/collaborators".format(owner, repository)) }) @@ -83,6 +91,7 @@ val owner = params("owner") val repository = params("repository") val userName = params("name") + removeCollaborator(owner, repository, userName) redirect("/%s/%s/settings/collaborators".format(owner, repository)) }) diff --git a/src/main/scala/util/Authenticator.scala b/src/main/scala/util/Authenticator.scala index 2696869..03facf5 100644 --- a/src/main/scala/util/Authenticator.scala +++ b/src/main/scala/util/Authenticator.scala @@ -2,12 +2,12 @@ import app.ControllerBase import service._ +import org.scalatra._ /** * Allows only the repository owner and administrators. */ trait OwnerOnlyAuthenticator { self: ControllerBase => - protected def ownerOnly(action: => Any) = { authenticate(action) } protected def ownerOnly[T](action: T => Any) = (form: T) => authenticate({action(form)}) @@ -16,7 +16,7 @@ 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") + case _ => Unauthorized() } } } @@ -26,7 +26,6 @@ * Allows only signed in users. */ trait UsersOnlyAuthenticator { self: ControllerBase => - protected def usersOnly(action: => Any) = { authenticate(action) } protected def usersOnly[T](action: T => Any) = (form: T) => authenticate({action(form)}) @@ -34,7 +33,7 @@ { context.loginAccount match { case Some(x) => action - case None => redirect("/signin") + case None => Unauthorized() } } } @@ -52,7 +51,7 @@ { context.loginAccount match { case Some(x) if(x.userType == AccountService.Administrator) => action - case _ => redirect("/signin") + case _ => Unauthorized() } } } @@ -62,7 +61,6 @@ * Allows only collaborators and administrators. */ trait WritableRepositoryAuthenticator { self: ControllerBase with RepositoryService => - protected def writableRepository(action: => Any) = { authenticate(action) } protected def writableRepository[T](action: T => Any) = (form: T) => authenticate({action(form)}) @@ -72,7 +70,7 @@ case Some(x) if(x.userType == AccountService.Administrator) => action case Some(x) if(paths(1) == x.userName) => action case Some(x) if(getCollaborators(paths(1), paths(2)).contains(x.userName)) => action - case _ => redirect("/signin") + case _ => Unauthorized() } } } @@ -81,7 +79,6 @@ * Allows only the repository owner and administrators. */ trait ReadableRepositoryAuthenticator { self: ControllerBase with RepositoryService => - protected def readableRepository(action: => Any) = { authenticate(action) } protected def readableRepository[T](action: T => Any) = (form: T) => authenticate({action(form)}) @@ -96,7 +93,7 @@ case Some(x) if(x.userType == AccountService.Administrator) => action case Some(x) if(paths(1) == x.userName) => action case Some(x) if(getCollaborators(paths(1), paths(2)).contains(x.userName)) => action - case _ => redirect("/") + case _ => Unauthorized() } } }