Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions app/controllers/Application.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@ package controllers

import play.api._
import play.api.mvc._
import com.github.tototoshi.play2.scalate._

import repositories._
import models._

class Application extends Controller {

def index = Action {
UserRepository.insert(User("test"))
Ok(views.html.index("Your new application is ready."))
Ok(Scalate.render("index.jade", Map("title" -> "Index")))
}

}
57 changes: 57 additions & 0 deletions app/controllers/Users.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package controllers

import play.api.mvc._
import com.github.tototoshi.play2.scalate._
import org.mindrot.jbcrypt.BCrypt
import repositories.UserRepository
import models.User

class Users extends Controller {
def newUser = Action(parse.urlFormEncoded) { implicit request =>
val salt = BCrypt.gensalt()
val email = request.body.get("email").get.head
val password = BCrypt.hashpw(request.body.get("password").get.head, salt)

UserRepository.insert(User(email, password, salt))
Ok(Scalate.render("main.jade", Map("title" -> "Register thanks", "content" -> "user/successfulRegistered.jade")))
}

def register = Action {
Ok(Scalate.render("main.jade", Map("title" -> "Register", "content" -> "user/register.jade")))
}

def login = Action(parse.urlFormEncoded) { implicit request =>
val email = request.body.get("email").get.head
val password = request.body.get("password").get.head

val user = UserRepository.findByEmail(email)

if(user.isDefined) {
val salt = user.get.salt
val passwordCorrect = BCrypt.checkpw(BCrypt.hashpw(password, salt), BCrypt.hashpw(user.get.password, salt))

if(passwordCorrect) {
val sessionId = java.util.UUID.randomUUID.toString
Redirect("/user/secret").withSession("sessionId" -> sessionId)
} else {
Redirect("/")
}
} else {
Ok("User existiert nicht")
}
}

def logout = Action {
Redirect("/").withNewSession
}

def afterLogin = Action { request =>
val sessionId = request.session.get("sessionId")

if(sessionId.isDefined) {
Ok(Scalate.render("main.jade", Map("title" -> "User Area", "content" -> "user/afterLogin.jade")))
} else {
Unauthorized("Not allowed")
}
}
}
6 changes: 3 additions & 3 deletions app/models/User.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package models

case class User(name: String)
case class User(email: String, password: String, salt: String)

object User {
def serialize(user: User) : List[(String, Any)] = {
Expand All @@ -10,7 +10,7 @@ object User {
attributes.zip(values).toList
}

def getValues(user: User) : Seq[Any] = {
User.unapply(user).productIterator.toSeq
def getValues(user: User) : List[Any] = {
user.productIterator.toList
}
}
14 changes: 14 additions & 0 deletions app/repositories/UserRepository.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,18 @@ object UserRepository {

collection.insert(test)
}

def findByEmail(email: String) : Option[User] = {
val query = MongoDBObject("email" -> email)
val doc = collection.findOne(query)

if(doc.isDefined) {
val password = doc.get("password").toString()
val salt = doc.get("salt").toString()

Some(User(email, password, salt))
} else {
None
}
}
}
2 changes: 2 additions & 0 deletions app/views/index.jade
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
-@val title: String
- render("main.jade", Map("title" -> title, "content" -> "user/loginForm.jade"))
7 changes: 0 additions & 7 deletions app/views/index.scala.html

This file was deleted.

15 changes: 15 additions & 0 deletions app/views/main.jade
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
-@val title: String
-@val content: String

html(lang="en")
head
title= title
link(rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css")
body
nav(class='navbar navbar-inverse')
ul(class='nav navbar-nav')
li
a(href='/') Home
// TODO show logout if user logged in

- render(content)
15 changes: 0 additions & 15 deletions app/views/main.scala.html

This file was deleted.

3 changes: 3 additions & 0 deletions app/views/user/afterLogin.jade
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.container(style='padding-top: 10px; width: 400px;')
| geheim und so
a(href='/user/logout') Logout
13 changes: 13 additions & 0 deletions app/views/user/loginForm.jade
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
.container(style='padding-top: 50px; width: 400px;')
form(action='/user/login' method='POST' enctype='application/x-www-form-urlencoded')
.form-group
label Email
input(type='email' name='email' tabindex='1' required='required' class='form-control')

.form-group
label Password
input(type='password' name='password' tabindex='2' required='required' class='form-control')

.form-group
input(type='submit' value='Login' class='btn btn-success btn-sm')
a(href='/user/register' class='btn btn-default btn-sm') Register
13 changes: 13 additions & 0 deletions app/views/user/register.jade
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
.container(style='padding-top: 50px; width: 400px;')
form(action='/user/new' method='POST' enctype='application/x-www-form-urlencoded')
.form-group
label Email
input(type='email' name='email' tabindex='1' required='required' class='form-control')

.form-group
label Password
input(type='password' name='password' tabindex='2' required='required' class='form-control')

.form-group
input(type='submit' value='Register' class='btn btn-default btn-sm')

2 changes: 2 additions & 0 deletions app/views/user/successfulRegistered.jade
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.container(style='padding-top: 10px; width: 400px;')
| Vielen Dank für Ihre Registrierung.
12 changes: 11 additions & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,21 @@ libraryDependencies ++= Seq(
cache,
ws,
specs2 % Test,
"org.mongodb" %% "casbah" % "2.8.1"
"org.mongodb" %% "casbah" % "2.8.1",
"com.github.tototoshi" %% "play-scalate" % "0.1.0-SNAPSHOT",
"org.scalatra.scalate" %% "scalate-core" % "1.7.0",
"org.scala-lang" % "scala-compiler" % scalaVersion.value,
"org.mindrot" % "jbcrypt" % "0.3m"
)

resolvers += "scalaz-bintray" at "http://dl.bintray.com/scalaz/releases"
resolvers += "sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/"
resolvers += "jbcrypt repo" at "http://mvnrepository.com/"



// Play provides two styles of routers, one expects its actions to be injected, the
// other, legacy style, accesses its actions statically.
routesGenerator := InjectedRoutesGenerator

unmanagedResourceDirectories in Compile += baseDirectory.value / "app" / "views"
5 changes: 5 additions & 0 deletions conf/routes
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@

# Home page
GET / controllers.Application.index
GET /user/register controllers.Users.register
POST /user/login controllers.Users.login
POST /user/new controllers.Users.newUser
GET /user/secret controllers.Users.afterLogin
GET /user/logout controllers.Users.logout

# Map static resources from the /public folder to the /assets URL path
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)