Big refactoring #77
@@ -21,7 +21,11 @@ import fr.dcproject.component.comment.generic.routes.editComment
|
|||||||
import fr.dcproject.component.comment.generic.routes.getChildrenComments
|
import fr.dcproject.component.comment.generic.routes.getChildrenComments
|
||||||
import fr.dcproject.component.comment.generic.routes.getOneComment
|
import fr.dcproject.component.comment.generic.routes.getOneComment
|
||||||
import fr.dcproject.elasticsearch.configElasticIndexes
|
import fr.dcproject.elasticsearch.configElasticIndexes
|
||||||
import fr.dcproject.entity.User
|
import fr.dcproject.component.auth.User
|
||||||
|
import fr.dcproject.component.auth.UserRepository
|
||||||
|
import fr.dcproject.component.auth.routes.authLogin
|
||||||
|
import fr.dcproject.component.auth.routes.authRegister
|
||||||
|
import fr.dcproject.component.auth.routes.authSso
|
||||||
import fr.dcproject.event.EventNotification
|
import fr.dcproject.event.EventNotification
|
||||||
import fr.dcproject.event.EventSubscriber
|
import fr.dcproject.event.EventSubscriber
|
||||||
import fr.dcproject.routes.*
|
import fr.dcproject.routes.*
|
||||||
@@ -52,7 +56,6 @@ import org.slf4j.event.Level
|
|||||||
import java.time.Duration
|
import java.time.Duration
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.CompletionException
|
import java.util.concurrent.CompletionException
|
||||||
import fr.dcproject.repository.User as UserRepository
|
|
||||||
|
|
||||||
fun main(args: Array<String>): Unit = io.ktor.server.jetty.EngineMain.main(args)
|
fun main(args: Array<String>): Unit = io.ktor.server.jetty.EngineMain.main(args)
|
||||||
|
|
||||||
@@ -172,8 +175,11 @@ fun Application.module(env: Env = PROD) {
|
|||||||
getOneComment(get(), get())
|
getOneComment(get(), get())
|
||||||
createCommentChildren(get(), get())
|
createCommentChildren(get(), get())
|
||||||
getChildrenComments(get(), get())
|
getChildrenComments(get(), get())
|
||||||
|
/* Auth */
|
||||||
|
authLogin(get())
|
||||||
|
authRegister(get())
|
||||||
|
authSso(get())
|
||||||
/* TODO */
|
/* TODO */
|
||||||
auth(get(), get(), get())
|
|
||||||
constitution(get())
|
constitution(get())
|
||||||
followArticle(get())
|
followArticle(get())
|
||||||
followConstitution(get())
|
followConstitution(get())
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package fr.dcproject
|
package fr.dcproject
|
||||||
|
|
||||||
import fr.dcproject.component.citizen.CitizenRepository
|
import fr.dcproject.component.citizen.CitizenRepository
|
||||||
import fr.dcproject.entity.User
|
import fr.dcproject.component.auth.User
|
||||||
import fr.dcproject.entity.UserI
|
import fr.dcproject.component.auth.UserI
|
||||||
import io.ktor.application.*
|
import io.ktor.application.*
|
||||||
import io.ktor.auth.*
|
import io.ktor.auth.*
|
||||||
import io.ktor.util.*
|
import io.ktor.util.*
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.auth0.jwt.JWT
|
|||||||
import com.auth0.jwt.JWTVerifier
|
import com.auth0.jwt.JWTVerifier
|
||||||
import com.auth0.jwt.algorithms.Algorithm
|
import com.auth0.jwt.algorithms.Algorithm
|
||||||
import com.typesafe.config.ConfigFactory
|
import com.typesafe.config.ConfigFactory
|
||||||
import fr.dcproject.entity.UserI
|
import fr.dcproject.component.auth.UserI
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.net.URI
|
import java.net.URI
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ import fr.dcproject.component.comment.generic.CommentVoter
|
|||||||
import fr.dcproject.event.publisher.Publisher
|
import fr.dcproject.event.publisher.Publisher
|
||||||
import fr.dcproject.messages.Mailer
|
import fr.dcproject.messages.Mailer
|
||||||
import fr.dcproject.messages.NotificationEmailSender
|
import fr.dcproject.messages.NotificationEmailSender
|
||||||
import fr.dcproject.messages.SsoManager
|
import fr.dcproject.component.auth.SsoManager
|
||||||
|
import fr.dcproject.component.auth.UserRepository
|
||||||
import fr.dcproject.repository.CommentConstitutionRepository
|
import fr.dcproject.repository.CommentConstitutionRepository
|
||||||
import fr.postgresjson.connexion.Connection
|
import fr.postgresjson.connexion.Connection
|
||||||
import fr.postgresjson.connexion.Requester
|
import fr.postgresjson.connexion.Requester
|
||||||
@@ -38,7 +39,6 @@ import fr.dcproject.repository.FollowArticle as FollowArticleRepository
|
|||||||
import fr.dcproject.repository.FollowConstitution as FollowConstitutionRepository
|
import fr.dcproject.repository.FollowConstitution as FollowConstitutionRepository
|
||||||
import fr.dcproject.repository.OpinionArticle as OpinionArticleRepository
|
import fr.dcproject.repository.OpinionArticle as OpinionArticleRepository
|
||||||
import fr.dcproject.repository.OpinionChoice as OpinionChoiceRepository
|
import fr.dcproject.repository.OpinionChoice as OpinionChoiceRepository
|
||||||
import fr.dcproject.repository.User as UserRepository
|
|
||||||
import fr.dcproject.repository.VoteArticle as VoteArticleRepository
|
import fr.dcproject.repository.VoteArticle as VoteArticleRepository
|
||||||
import fr.dcproject.repository.VoteComment as VoteCommentRepository
|
import fr.dcproject.repository.VoteComment as VoteCommentRepository
|
||||||
import fr.dcproject.repository.VoteConstitution as VoteConstitutionRepository
|
import fr.dcproject.repository.VoteConstitution as VoteConstitutionRepository
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package fr.dcproject.messages
|
package fr.dcproject.component.auth
|
||||||
|
|
||||||
import com.sendgrid.helpers.mail.Mail
|
import com.sendgrid.helpers.mail.Mail
|
||||||
import com.sendgrid.helpers.mail.objects.Content
|
import com.sendgrid.helpers.mail.objects.Content
|
||||||
@@ -6,8 +6,12 @@ import com.sendgrid.helpers.mail.objects.Email
|
|||||||
import fr.dcproject.JwtConfig
|
import fr.dcproject.JwtConfig
|
||||||
import fr.dcproject.component.citizen.CitizenBasicI
|
import fr.dcproject.component.citizen.CitizenBasicI
|
||||||
import fr.dcproject.component.citizen.CitizenRepository
|
import fr.dcproject.component.citizen.CitizenRepository
|
||||||
|
import fr.dcproject.messages.Mailer
|
||||||
import io.ktor.http.*
|
import io.ktor.http.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send an email to the citizen with a link to automatically connect
|
||||||
|
*/
|
||||||
class SsoManager(
|
class SsoManager(
|
||||||
private val mailer: Mailer,
|
private val mailer: Mailer,
|
||||||
private val domain: String,
|
private val domain: String,
|
||||||
@@ -31,12 +35,18 @@ class SsoManager(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO pass token to the function to avoid double generations
|
||||||
|
*/
|
||||||
private fun generateHtmlContent(citizen: CitizenBasicI, url: String): String? {
|
private fun generateHtmlContent(citizen: CitizenBasicI, url: String): String? {
|
||||||
val urlObject = URLBuilder(url)
|
val urlObject = URLBuilder(url)
|
||||||
urlObject.parameters.append("token", JwtConfig.makeToken(citizen.user))
|
urlObject.parameters.append("token", JwtConfig.makeToken(citizen.user))
|
||||||
return "Click <a href=\"${urlObject.buildString()}\">here</a> for connect to $domain"
|
return "Click <a href=\"${urlObject.buildString()}\">here</a> for connect to $domain"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO pass token to the function to avoid double generations
|
||||||
|
*/
|
||||||
private fun generateContent(citizen: CitizenBasicI, url: String): String {
|
private fun generateContent(citizen: CitizenBasicI, url: String): String {
|
||||||
val urlObject = URLBuilder(url)
|
val urlObject = URLBuilder(url)
|
||||||
urlObject.parameters.append("token", JwtConfig.makeToken(citizen.user))
|
urlObject.parameters.append("token", JwtConfig.makeToken(citizen.user))
|
||||||
@@ -1,12 +1,11 @@
|
|||||||
package fr.dcproject.entity
|
package fr.dcproject.component.auth
|
||||||
|
|
||||||
import fr.dcproject.entity.UserI.Roles
|
import fr.dcproject.component.auth.UserI.Roles
|
||||||
import fr.postgresjson.entity.*
|
import fr.postgresjson.entity.*
|
||||||
import io.ktor.auth.*
|
import io.ktor.auth.*
|
||||||
import org.joda.time.DateTime
|
import org.joda.time.DateTime
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@Deprecated("")
|
|
||||||
class User(
|
class User(
|
||||||
id: UUID = UUID.randomUUID(),
|
id: UUID = UUID.randomUUID(),
|
||||||
username: String,
|
username: String,
|
||||||
@@ -1,13 +1,12 @@
|
|||||||
package fr.dcproject.repository
|
package fr.dcproject.component.auth
|
||||||
|
|
||||||
import fr.dcproject.entity.UserFull
|
|
||||||
import fr.postgresjson.connexion.Requester
|
import fr.postgresjson.connexion.Requester
|
||||||
import fr.postgresjson.repository.RepositoryI
|
import fr.postgresjson.repository.RepositoryI
|
||||||
import io.ktor.auth.UserPasswordCredential
|
import io.ktor.auth.UserPasswordCredential
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import fr.dcproject.entity.User as UserEntity
|
import fr.dcproject.component.auth.User as UserEntity
|
||||||
|
|
||||||
class User(override var requester: Requester) : RepositoryI {
|
class UserRepository(override var requester: Requester) : RepositoryI {
|
||||||
fun findByCredentials(credentials: UserPasswordCredential): UserEntity? {
|
fun findByCredentials(credentials: UserPasswordCredential): UserEntity? {
|
||||||
return requester
|
return requester
|
||||||
.getFunction("check_user")
|
.getFunction("check_user")
|
||||||
32
src/main/kotlin/component/auth/routes/Login.kt
Normal file
32
src/main/kotlin/component/auth/routes/Login.kt
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
package fr.dcproject.component.auth.routes
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.exc.MismatchedInputException
|
||||||
|
import fr.dcproject.JwtConfig
|
||||||
|
import fr.dcproject.component.auth.UserRepository
|
||||||
|
import io.ktor.application.*
|
||||||
|
import io.ktor.auth.*
|
||||||
|
import io.ktor.http.*
|
||||||
|
import io.ktor.locations.*
|
||||||
|
import io.ktor.request.*
|
||||||
|
import io.ktor.response.*
|
||||||
|
import io.ktor.routing.*
|
||||||
|
import io.ktor.util.*
|
||||||
|
|
||||||
|
@KtorExperimentalLocationsAPI
|
||||||
|
@Location("/login")
|
||||||
|
private class LoginRequest
|
||||||
|
|
||||||
|
@KtorExperimentalLocationsAPI
|
||||||
|
@KtorExperimentalAPI
|
||||||
|
fun Route.authLogin(userRepo: UserRepository) {
|
||||||
|
post<LoginRequest> {
|
||||||
|
try {
|
||||||
|
val credentials = call.receive<UserPasswordCredential>()
|
||||||
|
userRepo.findByCredentials(credentials)?.let { user ->
|
||||||
|
call.respondText(JwtConfig.makeToken(user))
|
||||||
|
} ?: call.respond(HttpStatusCode.BadRequest, "Username not exist or password is wrong")
|
||||||
|
} catch (e: MismatchedInputException) {
|
||||||
|
call.respond(HttpStatusCode.BadRequest, "You must be send name and password to the request")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
69
src/main/kotlin/component/auth/routes/Register.kt
Normal file
69
src/main/kotlin/component/auth/routes/Register.kt
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
package fr.dcproject.component.auth.routes
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException
|
||||||
|
import fr.dcproject.JwtConfig
|
||||||
|
import fr.dcproject.component.auth.routes.RegisterRequest.Input
|
||||||
|
import fr.dcproject.component.citizen.Citizen
|
||||||
|
import fr.dcproject.component.citizen.CitizenI
|
||||||
|
import fr.dcproject.component.citizen.CitizenRepository
|
||||||
|
import fr.dcproject.component.auth.User
|
||||||
|
import fr.dcproject.component.auth.UserI
|
||||||
|
import io.ktor.application.*
|
||||||
|
import io.ktor.features.*
|
||||||
|
import io.ktor.http.*
|
||||||
|
import io.ktor.locations.*
|
||||||
|
import io.ktor.request.*
|
||||||
|
import io.ktor.response.*
|
||||||
|
import io.ktor.routing.*
|
||||||
|
import io.ktor.util.*
|
||||||
|
import org.joda.time.DateTime
|
||||||
|
|
||||||
|
@KtorExperimentalLocationsAPI
|
||||||
|
@Location("/register")
|
||||||
|
private class RegisterRequest {
|
||||||
|
data class Input(
|
||||||
|
val name: Name,
|
||||||
|
val email: String,
|
||||||
|
val birthday: DateTime,
|
||||||
|
val voteAnonymous: Boolean = true,
|
||||||
|
val followAnonymous: Boolean = true,
|
||||||
|
val user: User
|
||||||
|
) {
|
||||||
|
data class Name(
|
||||||
|
val firstName: String,
|
||||||
|
val lastName: String,
|
||||||
|
val civility: String? = null
|
||||||
|
)
|
||||||
|
data class User(
|
||||||
|
val username: String,
|
||||||
|
val plainPassword: String? = null
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@KtorExperimentalLocationsAPI
|
||||||
|
@KtorExperimentalAPI
|
||||||
|
fun Route.authRegister(citizenRepo: CitizenRepository) {
|
||||||
|
fun Input.toCitizen(): Citizen = Citizen(
|
||||||
|
name = CitizenI.Name(name.firstName, name.lastName, name.civility),
|
||||||
|
birthday = birthday,
|
||||||
|
email = email,
|
||||||
|
followAnonymous = followAnonymous,
|
||||||
|
voteAnonymous = voteAnonymous,
|
||||||
|
user = User(
|
||||||
|
username = user.username,
|
||||||
|
plainPassword = user.plainPassword,
|
||||||
|
roles = listOf(UserI.Roles.ROLE_USER)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
post<RegisterRequest> {
|
||||||
|
try {
|
||||||
|
val citizen = call.receive<Input>().toCitizen()
|
||||||
|
val createdCitizen = citizenRepo.insertWithUser(citizen)?.user ?: throw BadRequestException("Bad request")
|
||||||
|
call.respondText(JwtConfig.makeToken(createdCitizen))
|
||||||
|
} catch (e: MissingKotlinParameterException) {
|
||||||
|
call.respond(HttpStatusCode.BadRequest)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
35
src/main/kotlin/component/auth/routes/Sso.kt
Normal file
35
src/main/kotlin/component/auth/routes/Sso.kt
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package fr.dcproject.component.auth.routes
|
||||||
|
|
||||||
|
import fr.dcproject.component.auth.routes.SsoRequest.Input
|
||||||
|
import fr.dcproject.component.auth.SsoManager
|
||||||
|
import io.ktor.application.*
|
||||||
|
import io.ktor.http.*
|
||||||
|
import io.ktor.locations.*
|
||||||
|
import io.ktor.request.*
|
||||||
|
import io.ktor.response.*
|
||||||
|
import io.ktor.routing.*
|
||||||
|
import io.ktor.util.*
|
||||||
|
|
||||||
|
@KtorExperimentalLocationsAPI
|
||||||
|
@Location("/sso")
|
||||||
|
private class SsoRequest {
|
||||||
|
data class Input(val email: String, val url: String)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send an email to the citizen with a link to automatically connect
|
||||||
|
*/
|
||||||
|
@KtorExperimentalLocationsAPI
|
||||||
|
@KtorExperimentalAPI
|
||||||
|
fun Route.authSso(ssoManager: SsoManager) {
|
||||||
|
post<SsoRequest> {
|
||||||
|
call.receive<Input>().run {
|
||||||
|
try {
|
||||||
|
ssoManager.sendEmail(email, url)
|
||||||
|
} catch (e: SsoManager.EmailNotFound) {
|
||||||
|
call.respond(HttpStatusCode.NotFound)
|
||||||
|
}
|
||||||
|
call.respond(HttpStatusCode.NoContent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,15 +1,14 @@
|
|||||||
package fr.dcproject.component.citizen
|
package fr.dcproject.component.citizen
|
||||||
|
|
||||||
import fr.dcproject.component.citizen.CitizenI.Name
|
import fr.dcproject.component.citizen.CitizenI.Name
|
||||||
import fr.dcproject.entity.User
|
import fr.dcproject.component.auth.User
|
||||||
import fr.dcproject.entity.UserI
|
import fr.dcproject.component.auth.UserI
|
||||||
import fr.dcproject.entity.UserRef
|
import fr.dcproject.component.auth.UserRef
|
||||||
import fr.dcproject.entity.WorkgroupSimple
|
import fr.dcproject.entity.WorkgroupSimple
|
||||||
import fr.postgresjson.entity.*
|
import fr.postgresjson.entity.*
|
||||||
import org.joda.time.DateTime
|
import org.joda.time.DateTime
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@Deprecated("")
|
|
||||||
class Citizen(
|
class Citizen(
|
||||||
override val id: UUID = UUID.randomUUID(),
|
override val id: UUID = UUID.randomUUID(),
|
||||||
override val name: Name,
|
override val name: Name,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package fr.dcproject.component.citizen
|
package fr.dcproject.component.citizen
|
||||||
|
|
||||||
import fr.dcproject.entity.UserI
|
import fr.dcproject.component.auth.UserI
|
||||||
import fr.postgresjson.connexion.Paginated
|
import fr.postgresjson.connexion.Paginated
|
||||||
import fr.postgresjson.connexion.Requester
|
import fr.postgresjson.connexion.Requester
|
||||||
import fr.postgresjson.repository.RepositoryI
|
import fr.postgresjson.repository.RepositoryI
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import fr.dcproject.citizen
|
|||||||
import fr.dcproject.citizenOrNull
|
import fr.dcproject.citizenOrNull
|
||||||
import fr.dcproject.component.citizen.Citizen
|
import fr.dcproject.component.citizen.Citizen
|
||||||
import fr.dcproject.component.citizen.CitizenVoter
|
import fr.dcproject.component.citizen.CitizenVoter
|
||||||
import fr.dcproject.repository.User
|
import fr.dcproject.component.auth.UserRepository
|
||||||
import fr.dcproject.voter.assert
|
import fr.dcproject.voter.assert
|
||||||
import io.ktor.application.*
|
import io.ktor.application.*
|
||||||
import io.ktor.auth.*
|
import io.ktor.auth.*
|
||||||
@@ -23,7 +23,7 @@ class ChangePasswordCitizenRequest(val citizen: Citizen) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@KtorExperimentalLocationsAPI
|
@KtorExperimentalLocationsAPI
|
||||||
fun Route.changeMyPassword(voter: CitizenVoter, userRepository: User) {
|
fun Route.changeMyPassword(voter: CitizenVoter, userRepository: UserRepository) {
|
||||||
put<ChangePasswordCitizenRequest> {
|
put<ChangePasswordCitizenRequest> {
|
||||||
voter.assert { canChangePassword(it.citizen, citizenOrNull) }
|
voter.assert { canChangePassword(it.citizen, citizenOrNull) }
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package fr.dcproject.entity
|
package fr.dcproject.entity
|
||||||
|
|
||||||
|
import fr.dcproject.component.auth.UserI
|
||||||
import fr.dcproject.component.citizen.CitizenBasicI
|
import fr.dcproject.component.citizen.CitizenBasicI
|
||||||
import fr.dcproject.component.citizen.CitizenI
|
import fr.dcproject.component.citizen.CitizenI
|
||||||
import fr.dcproject.component.citizen.CitizenWithUserI
|
import fr.dcproject.component.citizen.CitizenWithUserI
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
package fr.dcproject.routes
|
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.exc.MismatchedInputException
|
|
||||||
import com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException
|
|
||||||
import fr.dcproject.JwtConfig
|
|
||||||
import fr.dcproject.component.citizen.CitizenRepository
|
|
||||||
import fr.dcproject.entity.UserI.Roles.ROLE_USER
|
|
||||||
import fr.dcproject.messages.SsoManager
|
|
||||||
import fr.dcproject.routes.AuthPaths.LoginRequest
|
|
||||||
import fr.dcproject.routes.AuthPaths.RegisterRequest
|
|
||||||
import fr.dcproject.routes.AuthPaths.SsoRequest
|
|
||||||
import io.ktor.application.*
|
|
||||||
import io.ktor.auth.*
|
|
||||||
import io.ktor.features.*
|
|
||||||
import io.ktor.http.*
|
|
||||||
import io.ktor.locations.*
|
|
||||||
import io.ktor.request.*
|
|
||||||
import io.ktor.response.*
|
|
||||||
import io.ktor.routing.*
|
|
||||||
import io.ktor.util.*
|
|
||||||
import fr.dcproject.component.citizen.Citizen as CitizenEntity
|
|
||||||
import fr.dcproject.repository.User as UserRepository
|
|
||||||
|
|
||||||
@KtorExperimentalLocationsAPI
|
|
||||||
object AuthPaths {
|
|
||||||
@Location("/login")
|
|
||||||
class LoginRequest
|
|
||||||
|
|
||||||
@Location("/register")
|
|
||||||
class RegisterRequest
|
|
||||||
|
|
||||||
@Location("/sso")
|
|
||||||
class SsoRequest {
|
|
||||||
data class Content(val email: String, val url: String)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@KtorExperimentalLocationsAPI
|
|
||||||
@KtorExperimentalAPI
|
|
||||||
fun Route.auth(
|
|
||||||
userRepo: UserRepository,
|
|
||||||
citizenRepo: CitizenRepository,
|
|
||||||
ssoManager: SsoManager
|
|
||||||
) {
|
|
||||||
post<LoginRequest> {
|
|
||||||
try {
|
|
||||||
val credentials = call.receive<UserPasswordCredential>()
|
|
||||||
val user = userRepo.findByCredentials(credentials) ?: throw WrongLoginOrPassword()
|
|
||||||
call.respondText(JwtConfig.makeToken(user))
|
|
||||||
} catch (e: MismatchedInputException) {
|
|
||||||
call.respond(HttpStatusCode.BadRequest, "You must be send name and password to the request")
|
|
||||||
} catch (e: WrongLoginOrPassword) {
|
|
||||||
call.respond(HttpStatusCode.BadRequest, e.message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
post<RegisterRequest> {
|
|
||||||
try {
|
|
||||||
val citizen = call.receive<CitizenEntity>()
|
|
||||||
citizen.user.roles = listOf(ROLE_USER)
|
|
||||||
val created = citizenRepo.insertWithUser(citizen)?.user ?: throw BadRequestException("Bad request")
|
|
||||||
call.respondText(JwtConfig.makeToken(created))
|
|
||||||
} catch (e: MissingKotlinParameterException) {
|
|
||||||
call.respond(HttpStatusCode.BadRequest)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
post<SsoRequest> {
|
|
||||||
val content = call.receive<SsoRequest.Content>()
|
|
||||||
try {
|
|
||||||
ssoManager.sendEmail(content.email, content.url)
|
|
||||||
} catch (e: SsoManager.EmailNotFound) {
|
|
||||||
call.respond(HttpStatusCode.NotFound)
|
|
||||||
}
|
|
||||||
|
|
||||||
call.respond(HttpStatusCode.NoContent)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class WrongLoginOrPassword(override val message: String = "Username not exist or password is wrong") : Exception()
|
|
||||||
@@ -2,7 +2,7 @@ package fr.dcproject.security.voter
|
|||||||
|
|
||||||
import fr.dcproject.component.comment.generic.CommentForView
|
import fr.dcproject.component.comment.generic.CommentForView
|
||||||
import fr.dcproject.entity.ConstitutionSimple
|
import fr.dcproject.entity.ConstitutionSimple
|
||||||
import fr.dcproject.entity.UserI
|
import fr.dcproject.component.auth.UserI
|
||||||
import fr.dcproject.user
|
import fr.dcproject.user
|
||||||
import fr.dcproject.voter.NoRuleDefinedException
|
import fr.dcproject.voter.NoRuleDefinedException
|
||||||
import fr.dcproject.voter.NoSubjectDefinedException
|
import fr.dcproject.voter.NoSubjectDefinedException
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package fr.dcproject.security.voter
|
package fr.dcproject.security.voter
|
||||||
|
|
||||||
import fr.dcproject.entity.UserI
|
import fr.dcproject.component.auth.UserI
|
||||||
import fr.dcproject.entity.WorkgroupI
|
import fr.dcproject.entity.WorkgroupI
|
||||||
import fr.dcproject.entity.WorkgroupWithAuthI
|
import fr.dcproject.entity.WorkgroupWithAuthI
|
||||||
import fr.dcproject.entity.WorkgroupWithMembersI.Member.Role
|
import fr.dcproject.entity.WorkgroupWithMembersI.Member.Role
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import org.joda.time.DateTime
|
|||||||
import org.koin.test.KoinTest
|
import org.koin.test.KoinTest
|
||||||
import org.koin.test.get
|
import org.koin.test.get
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import fr.dcproject.entity.User as UserEntity
|
import fr.dcproject.component.auth.User as UserEntity
|
||||||
|
|
||||||
class ArticleSteps : En, KoinTest {
|
class ArticleSteps : En, KoinTest {
|
||||||
init {
|
init {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package steps
|
|||||||
import fr.dcproject.component.citizen.Citizen
|
import fr.dcproject.component.citizen.Citizen
|
||||||
import fr.dcproject.component.citizen.CitizenI
|
import fr.dcproject.component.citizen.CitizenI
|
||||||
import fr.dcproject.component.citizen.CitizenRepository
|
import fr.dcproject.component.citizen.CitizenRepository
|
||||||
import fr.dcproject.entity.User
|
import fr.dcproject.component.auth.User
|
||||||
import io.cucumber.datatable.DataTable
|
import io.cucumber.datatable.DataTable
|
||||||
import io.cucumber.java8.En
|
import io.cucumber.java8.En
|
||||||
import org.joda.time.DateTime
|
import org.joda.time.DateTime
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import org.joda.time.DateTime
|
|||||||
import org.koin.test.KoinTest
|
import org.koin.test.KoinTest
|
||||||
import org.koin.test.get
|
import org.koin.test.get
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import fr.dcproject.entity.User as UserEntity
|
import fr.dcproject.component.auth.User as UserEntity
|
||||||
import fr.dcproject.repository.Constitution as ConstitutionRepository
|
import fr.dcproject.repository.Constitution as ConstitutionRepository
|
||||||
|
|
||||||
class ConstitutionSteps : En, KoinTest {
|
class ConstitutionSteps : En, KoinTest {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package steps
|
package steps
|
||||||
|
|
||||||
|
import fr.dcproject.component.auth.User
|
||||||
import fr.dcproject.component.citizen.Citizen
|
import fr.dcproject.component.citizen.Citizen
|
||||||
import fr.dcproject.component.citizen.CitizenI
|
import fr.dcproject.component.citizen.CitizenI
|
||||||
import fr.dcproject.component.citizen.CitizenRef
|
import fr.dcproject.component.citizen.CitizenRef
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import fr.dcproject.component.article.ArticleForView
|
|||||||
import fr.dcproject.component.article.ArticleVoter
|
import fr.dcproject.component.article.ArticleVoter
|
||||||
import fr.dcproject.component.citizen.CitizenCart
|
import fr.dcproject.component.citizen.CitizenCart
|
||||||
import fr.dcproject.component.citizen.CitizenI
|
import fr.dcproject.component.citizen.CitizenI
|
||||||
import fr.dcproject.entity.User
|
import fr.dcproject.component.auth.User
|
||||||
import fr.dcproject.entity.UserI
|
import fr.dcproject.component.auth.UserI
|
||||||
import fr.dcproject.voter.Vote.DENIED
|
import fr.dcproject.voter.Vote.DENIED
|
||||||
import fr.dcproject.voter.Vote.GRANTED
|
import fr.dcproject.voter.Vote.GRANTED
|
||||||
import fr.postgresjson.connexion.Paginated
|
import fr.postgresjson.connexion.Paginated
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ package unit.voter
|
|||||||
import fr.dcproject.component.citizen.CitizenBasic
|
import fr.dcproject.component.citizen.CitizenBasic
|
||||||
import fr.dcproject.component.citizen.CitizenI
|
import fr.dcproject.component.citizen.CitizenI
|
||||||
import fr.dcproject.component.citizen.CitizenVoter
|
import fr.dcproject.component.citizen.CitizenVoter
|
||||||
import fr.dcproject.entity.User
|
import fr.dcproject.component.auth.User
|
||||||
import fr.dcproject.entity.UserI
|
import fr.dcproject.component.auth.UserI
|
||||||
import fr.dcproject.voter.Vote.DENIED
|
import fr.dcproject.voter.Vote.DENIED
|
||||||
import fr.dcproject.voter.Vote.GRANTED
|
import fr.dcproject.voter.Vote.GRANTED
|
||||||
import io.mockk.mockkStatic
|
import io.mockk.mockkStatic
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import fr.dcproject.component.citizen.CitizenI
|
|||||||
import fr.dcproject.component.comment.generic.CommentForUpdate
|
import fr.dcproject.component.comment.generic.CommentForUpdate
|
||||||
import fr.dcproject.component.comment.generic.CommentForView
|
import fr.dcproject.component.comment.generic.CommentForView
|
||||||
import fr.dcproject.component.comment.generic.CommentVoter
|
import fr.dcproject.component.comment.generic.CommentVoter
|
||||||
import fr.dcproject.entity.User
|
import fr.dcproject.component.auth.User
|
||||||
import fr.dcproject.entity.UserI
|
import fr.dcproject.component.auth.UserI
|
||||||
import fr.dcproject.voter.Vote.DENIED
|
import fr.dcproject.voter.Vote.DENIED
|
||||||
import fr.dcproject.voter.Vote.GRANTED
|
import fr.dcproject.voter.Vote.GRANTED
|
||||||
import fr.postgresjson.connexion.Paginated
|
import fr.postgresjson.connexion.Paginated
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ import fr.dcproject.component.citizen.CitizenBasic
|
|||||||
import fr.dcproject.component.citizen.CitizenCart
|
import fr.dcproject.component.citizen.CitizenCart
|
||||||
import fr.dcproject.component.citizen.CitizenI
|
import fr.dcproject.component.citizen.CitizenI
|
||||||
import fr.dcproject.entity.Follow
|
import fr.dcproject.entity.Follow
|
||||||
import fr.dcproject.entity.User
|
import fr.dcproject.component.auth.User
|
||||||
import fr.dcproject.entity.UserI
|
import fr.dcproject.component.auth.UserI
|
||||||
import fr.dcproject.security.voter.FollowVoter
|
import fr.dcproject.security.voter.FollowVoter
|
||||||
import fr.dcproject.voter.NoSubjectDefinedException
|
import fr.dcproject.voter.NoSubjectDefinedException
|
||||||
import fr.ktorVoter.ActionI
|
import fr.ktorVoter.ActionI
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import fr.dcproject.component.citizen.CitizenBasic
|
|||||||
import fr.dcproject.component.citizen.CitizenCart
|
import fr.dcproject.component.citizen.CitizenCart
|
||||||
import fr.dcproject.component.citizen.CitizenI
|
import fr.dcproject.component.citizen.CitizenI
|
||||||
import fr.dcproject.entity.OpinionChoice
|
import fr.dcproject.entity.OpinionChoice
|
||||||
import fr.dcproject.entity.User
|
import fr.dcproject.component.auth.User
|
||||||
import fr.dcproject.entity.UserI
|
import fr.dcproject.component.auth.UserI
|
||||||
import fr.dcproject.security.voter.OpinionChoiceVoter
|
import fr.dcproject.security.voter.OpinionChoiceVoter
|
||||||
import fr.dcproject.user
|
import fr.dcproject.user
|
||||||
import fr.ktorVoter.ActionI
|
import fr.ktorVoter.ActionI
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import fr.dcproject.component.citizen.CitizenCart
|
|||||||
import fr.dcproject.component.citizen.CitizenI
|
import fr.dcproject.component.citizen.CitizenI
|
||||||
import fr.dcproject.entity.Opinion
|
import fr.dcproject.entity.Opinion
|
||||||
import fr.dcproject.entity.OpinionChoice
|
import fr.dcproject.entity.OpinionChoice
|
||||||
import fr.dcproject.entity.User
|
import fr.dcproject.component.auth.User
|
||||||
import fr.dcproject.entity.UserI
|
import fr.dcproject.component.auth.UserI
|
||||||
import fr.dcproject.security.voter.OpinionVoter
|
import fr.dcproject.security.voter.OpinionVoter
|
||||||
import fr.dcproject.user
|
import fr.dcproject.user
|
||||||
import fr.dcproject.voter.NoSubjectDefinedException
|
import fr.dcproject.voter.NoSubjectDefinedException
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ import fr.dcproject.component.citizen.Citizen
|
|||||||
import fr.dcproject.component.citizen.CitizenBasic
|
import fr.dcproject.component.citizen.CitizenBasic
|
||||||
import fr.dcproject.component.citizen.CitizenCart
|
import fr.dcproject.component.citizen.CitizenCart
|
||||||
import fr.dcproject.component.citizen.CitizenI
|
import fr.dcproject.component.citizen.CitizenI
|
||||||
import fr.dcproject.entity.User
|
import fr.dcproject.component.auth.User
|
||||||
import fr.dcproject.entity.UserI
|
import fr.dcproject.component.auth.UserI
|
||||||
import fr.dcproject.entity.VoteForUpdate
|
import fr.dcproject.entity.VoteForUpdate
|
||||||
import fr.dcproject.security.voter.VoteVoter
|
import fr.dcproject.security.voter.VoteVoter
|
||||||
import fr.dcproject.voter.NoSubjectDefinedException
|
import fr.dcproject.voter.NoSubjectDefinedException
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import fr.dcproject.component.article.ArticleForView
|
|||||||
import fr.dcproject.component.citizen.CitizenBasic
|
import fr.dcproject.component.citizen.CitizenBasic
|
||||||
import fr.dcproject.component.citizen.CitizenCart
|
import fr.dcproject.component.citizen.CitizenCart
|
||||||
import fr.dcproject.component.citizen.CitizenI
|
import fr.dcproject.component.citizen.CitizenI
|
||||||
import fr.dcproject.entity.User
|
import fr.dcproject.component.auth.User
|
||||||
import fr.dcproject.entity.UserI
|
import fr.dcproject.component.auth.UserI
|
||||||
import fr.dcproject.entity.WorkgroupRef
|
import fr.dcproject.entity.WorkgroupRef
|
||||||
import fr.dcproject.entity.WorkgroupWithMembersI
|
import fr.dcproject.entity.WorkgroupWithMembersI
|
||||||
import fr.dcproject.security.voter.WorkgroupVoter
|
import fr.dcproject.security.voter.WorkgroupVoter
|
||||||
|
|||||||
Reference in New Issue
Block a user