diff --git a/build.gradle.kts b/build.gradle.kts index 6b52cec..772e325 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -87,6 +87,7 @@ dependencies { implementation("com.auth0:java-jwt:3.8.2") implementation("com.github.jasync-sql:jasync-postgresql:1.0.7") implementation("fr.postgresjson:postgresjson:$postgresjson_version") + implementation("fr.ktor-voter:ktor-voter:1.0.0") implementation("com.sendgrid:sendgrid-java:4.4.1") implementation("io.lettuce:lettuce-core:5.2.2.RELEASE") implementation("com.rabbitmq:amqp-client:5.8.0") diff --git a/src/main/kotlin/fr/dcproject/Application.kt b/src/main/kotlin/fr/dcproject/Application.kt index 8496075..f70aa7f 100644 --- a/src/main/kotlin/fr/dcproject/Application.kt +++ b/src/main/kotlin/fr/dcproject/Application.kt @@ -13,6 +13,8 @@ import fr.dcproject.event.EventSubscriber import fr.dcproject.event.configEvent import fr.dcproject.routes.* import fr.dcproject.security.voter.* +import fr.ktorVoter.AuthorizationVoter +import fr.ktorVoter.ForbiddenException import fr.postgresjson.migration.Migrations import io.ktor.application.Application import io.ktor.application.ApplicationCall diff --git a/src/main/kotlin/fr/dcproject/ApplicationContext.kt b/src/main/kotlin/fr/dcproject/ApplicationContext.kt index f90cfe3..f57ca38 100644 --- a/src/main/kotlin/fr/dcproject/ApplicationContext.kt +++ b/src/main/kotlin/fr/dcproject/ApplicationContext.kt @@ -1,7 +1,8 @@ package fr.dcproject +import fr.dcproject.entity.User import fr.dcproject.entity.UserI -import fr.dcproject.security.voter.ForbiddenException +import fr.ktorVoter.ForbiddenException import io.ktor.application.ApplicationCall import io.ktor.auth.authentication import io.ktor.util.AttributeKey @@ -26,3 +27,5 @@ val ApplicationCall.citizenOrNull: CitizenEntity? val PipelineContext.citizen get() = context.citizen val PipelineContext.citizenOrNull get() = context.citizenOrNull + +val ApplicationCall.user get() = authentication.principal() diff --git a/src/main/kotlin/fr/dcproject/routes/Article.kt b/src/main/kotlin/fr/dcproject/routes/Article.kt index 21001ce..e457531 100644 --- a/src/main/kotlin/fr/dcproject/routes/Article.kt +++ b/src/main/kotlin/fr/dcproject/routes/Article.kt @@ -6,7 +6,7 @@ import fr.dcproject.event.ArticleUpdate import fr.dcproject.repository.Article.Filter import fr.dcproject.security.voter.ArticleVoter.Action.CREATE import fr.dcproject.security.voter.ArticleVoter.Action.VIEW -import fr.dcproject.security.voter.assertCan +import fr.ktorVoter.assertCan import fr.dcproject.views.ArticleViewManager import fr.postgresjson.repository.RepositoryI import io.ktor.application.application diff --git a/src/main/kotlin/fr/dcproject/routes/Citizen.kt b/src/main/kotlin/fr/dcproject/routes/Citizen.kt index 4528cd3..684174b 100644 --- a/src/main/kotlin/fr/dcproject/routes/Citizen.kt +++ b/src/main/kotlin/fr/dcproject/routes/Citizen.kt @@ -9,7 +9,7 @@ import fr.dcproject.routes.CitizenPaths.CitizensRequest import fr.dcproject.routes.CitizenPaths.CurrentCitizenRequest import fr.dcproject.security.voter.CitizenVoter.Action.CHANGE_PASSWORD import fr.dcproject.security.voter.CitizenVoter.Action.VIEW -import fr.dcproject.security.voter.assertCan +import fr.ktorVoter.assertCan import fr.postgresjson.repository.RepositoryI.Direction import io.ktor.application.call import io.ktor.auth.UserPasswordCredential diff --git a/src/main/kotlin/fr/dcproject/routes/Comment.kt b/src/main/kotlin/fr/dcproject/routes/Comment.kt index 4231711..36e0f59 100644 --- a/src/main/kotlin/fr/dcproject/routes/Comment.kt +++ b/src/main/kotlin/fr/dcproject/routes/Comment.kt @@ -5,7 +5,7 @@ import fr.dcproject.entity.Comment import fr.dcproject.entity.CommentRef import fr.dcproject.routes.CommentPaths.CreateCommentRequest.Content import fr.dcproject.security.voter.CommentVoter.Action.* -import fr.dcproject.security.voter.assertCan +import fr.ktorVoter.assertCan import io.ktor.application.call import io.ktor.features.NotFoundException import io.ktor.http.HttpStatusCode diff --git a/src/main/kotlin/fr/dcproject/routes/CommentArticle.kt b/src/main/kotlin/fr/dcproject/routes/CommentArticle.kt index a5c33b2..0136837 100644 --- a/src/main/kotlin/fr/dcproject/routes/CommentArticle.kt +++ b/src/main/kotlin/fr/dcproject/routes/CommentArticle.kt @@ -6,7 +6,7 @@ import fr.dcproject.entity.Citizen import fr.dcproject.repository.CommentArticle.Sort import fr.dcproject.security.voter.CommentVoter.Action.CREATE import fr.dcproject.security.voter.CommentVoter.Action.VIEW -import fr.dcproject.security.voter.assertCan +import fr.ktorVoter.assertCan import io.ktor.application.call import io.ktor.http.HttpStatusCode import io.ktor.locations.KtorExperimentalLocationsAPI diff --git a/src/main/kotlin/fr/dcproject/routes/CommentConstitution.kt b/src/main/kotlin/fr/dcproject/routes/CommentConstitution.kt index 2721669..889b9ad 100644 --- a/src/main/kotlin/fr/dcproject/routes/CommentConstitution.kt +++ b/src/main/kotlin/fr/dcproject/routes/CommentConstitution.kt @@ -5,7 +5,7 @@ import fr.dcproject.entity.Citizen import fr.dcproject.entity.ConstitutionRef import fr.dcproject.security.voter.CommentVoter.Action.CREATE import fr.dcproject.security.voter.CommentVoter.Action.VIEW -import fr.dcproject.security.voter.assertCan +import fr.ktorVoter.assertCan import io.ktor.application.call import io.ktor.http.HttpStatusCode import io.ktor.locations.KtorExperimentalLocationsAPI diff --git a/src/main/kotlin/fr/dcproject/routes/Constitution.kt b/src/main/kotlin/fr/dcproject/routes/Constitution.kt index d2ab88d..4e6acec 100644 --- a/src/main/kotlin/fr/dcproject/routes/Constitution.kt +++ b/src/main/kotlin/fr/dcproject/routes/Constitution.kt @@ -4,7 +4,7 @@ import fr.dcproject.citizen import fr.dcproject.entity.request.Constitution import fr.dcproject.security.voter.ConstitutionVoter.Action.CREATE import fr.dcproject.security.voter.ConstitutionVoter.Action.VIEW -import fr.dcproject.security.voter.assertCan +import fr.ktorVoter.assertCan import fr.postgresjson.repository.RepositoryI import io.ktor.application.call import io.ktor.locations.KtorExperimentalLocationsAPI diff --git a/src/main/kotlin/fr/dcproject/routes/FollowArticle.kt b/src/main/kotlin/fr/dcproject/routes/FollowArticle.kt index d829959..8ae7b15 100644 --- a/src/main/kotlin/fr/dcproject/routes/FollowArticle.kt +++ b/src/main/kotlin/fr/dcproject/routes/FollowArticle.kt @@ -4,7 +4,7 @@ import fr.dcproject.citizen import fr.dcproject.entity.ArticleRef import fr.dcproject.entity.Citizen import fr.dcproject.security.voter.FollowVoter.Action.* -import fr.dcproject.security.voter.assertCan +import fr.ktorVoter.assertCan import io.ktor.application.call import io.ktor.http.HttpStatusCode import io.ktor.locations.* diff --git a/src/main/kotlin/fr/dcproject/routes/FollowConstitution.kt b/src/main/kotlin/fr/dcproject/routes/FollowConstitution.kt index c0a9b8c..1b7e8b4 100644 --- a/src/main/kotlin/fr/dcproject/routes/FollowConstitution.kt +++ b/src/main/kotlin/fr/dcproject/routes/FollowConstitution.kt @@ -4,7 +4,7 @@ import fr.dcproject.citizen import fr.dcproject.entity.CitizenRef import fr.dcproject.entity.ConstitutionRef import fr.dcproject.security.voter.FollowVoter.Action.* -import fr.dcproject.security.voter.assertCan +import fr.ktorVoter.assertCan import io.ktor.application.call import io.ktor.http.HttpStatusCode import io.ktor.locations.* diff --git a/src/main/kotlin/fr/dcproject/routes/OpinionArticle.kt b/src/main/kotlin/fr/dcproject/routes/OpinionArticle.kt index 3afdf97..9a388bd 100644 --- a/src/main/kotlin/fr/dcproject/routes/OpinionArticle.kt +++ b/src/main/kotlin/fr/dcproject/routes/OpinionArticle.kt @@ -7,7 +7,7 @@ import fr.dcproject.entity.request.RequestBuilder import fr.dcproject.entity.request.getContent import fr.dcproject.security.voter.OpinionVoter.Action.CREATE import fr.dcproject.security.voter.OpinionVoter.Action.VIEW -import fr.dcproject.security.voter.assertCan +import fr.ktorVoter.assertCan import fr.dcproject.utils.toUUID import io.ktor.application.ApplicationCall import io.ktor.application.call diff --git a/src/main/kotlin/fr/dcproject/routes/OpinionChoice.kt b/src/main/kotlin/fr/dcproject/routes/OpinionChoice.kt index 6e7232e..b23d714 100644 --- a/src/main/kotlin/fr/dcproject/routes/OpinionChoice.kt +++ b/src/main/kotlin/fr/dcproject/routes/OpinionChoice.kt @@ -2,7 +2,7 @@ package fr.dcproject.routes import fr.dcproject.entity.OpinionChoice import fr.dcproject.security.voter.OpinionChoiceVoter.Action.VIEW -import fr.dcproject.security.voter.assertCan +import fr.ktorVoter.assertCan import io.ktor.application.call import io.ktor.locations.KtorExperimentalLocationsAPI import io.ktor.locations.Location diff --git a/src/main/kotlin/fr/dcproject/routes/VoteArticle.kt b/src/main/kotlin/fr/dcproject/routes/VoteArticle.kt index dd67019..8aa21a0 100644 --- a/src/main/kotlin/fr/dcproject/routes/VoteArticle.kt +++ b/src/main/kotlin/fr/dcproject/routes/VoteArticle.kt @@ -8,7 +8,7 @@ import fr.dcproject.routes.VoteArticlePaths.ArticleVoteRequest import fr.dcproject.routes.VoteArticlePaths.CommentVoteRequest import fr.dcproject.security.voter.VoteVoter.Action.CREATE import fr.dcproject.security.voter.VoteVoter.Action.VIEW -import fr.dcproject.security.voter.assertCan +import fr.ktorVoter.assertCan import fr.dcproject.utils.toUUID import io.ktor.application.call import io.ktor.http.HttpStatusCode diff --git a/src/main/kotlin/fr/dcproject/routes/VoteConstitution.kt b/src/main/kotlin/fr/dcproject/routes/VoteConstitution.kt index fde707d..240aa49 100644 --- a/src/main/kotlin/fr/dcproject/routes/VoteConstitution.kt +++ b/src/main/kotlin/fr/dcproject/routes/VoteConstitution.kt @@ -4,7 +4,7 @@ import fr.dcproject.citizen import fr.dcproject.entity.Citizen import fr.dcproject.routes.VoteConstitutionPaths.ConstitutionVoteRequest.Content import fr.dcproject.security.voter.VoteVoter.Action.CREATE -import fr.dcproject.security.voter.assertCan +import fr.ktorVoter.assertCan import io.ktor.application.call import io.ktor.http.HttpStatusCode import io.ktor.locations.KtorExperimentalLocationsAPI diff --git a/src/main/kotlin/fr/dcproject/routes/Workgroup.kt b/src/main/kotlin/fr/dcproject/routes/Workgroup.kt index 61322bd..c1a227b 100644 --- a/src/main/kotlin/fr/dcproject/routes/Workgroup.kt +++ b/src/main/kotlin/fr/dcproject/routes/Workgroup.kt @@ -12,7 +12,7 @@ import fr.dcproject.security.voter.WorkgroupVoter.Action.UPDATE import fr.dcproject.security.voter.WorkgroupVoter.ActionMembers.ADD as ADD_MEMBERS import fr.dcproject.security.voter.WorkgroupVoter.ActionMembers.UPDATE as UPDATE_MEMBERS import fr.dcproject.security.voter.WorkgroupVoter.ActionMembers.REMOVE as REMOVE_MEMBERS -import fr.dcproject.security.voter.assertCan +import fr.ktorVoter.assertCan import fr.dcproject.utils.toUUID import fr.postgresjson.repository.RepositoryI import io.ktor.application.ApplicationCall diff --git a/src/main/kotlin/fr/dcproject/security/voter/ArticleVoter.kt b/src/main/kotlin/fr/dcproject/security/voter/ArticleVoter.kt index c16b631..eae16bd 100644 --- a/src/main/kotlin/fr/dcproject/security/voter/ArticleVoter.kt +++ b/src/main/kotlin/fr/dcproject/security/voter/ArticleVoter.kt @@ -3,6 +3,11 @@ package fr.dcproject.security.voter import fr.dcproject.entity.ArticleAuthI import fr.dcproject.entity.ArticleI import fr.dcproject.entity.UserI +import fr.dcproject.user +import fr.ktorVoter.ActionI +import fr.ktorVoter.Vote +import fr.ktorVoter.Voter +import fr.ktorVoter.checkClass import io.ktor.application.ApplicationCall import fr.dcproject.entity.Comment as CommentEntity import fr.dcproject.entity.Vote as VoteEntity diff --git a/src/main/kotlin/fr/dcproject/security/voter/CheckClass.kt b/src/main/kotlin/fr/dcproject/security/voter/CheckClass.kt deleted file mode 100644 index f05463f..0000000 --- a/src/main/kotlin/fr/dcproject/security/voter/CheckClass.kt +++ /dev/null @@ -1,20 +0,0 @@ -package fr.dcproject.security.voter - -import kotlin.reflect.KClass -import kotlin.reflect.full.isSubclassOf - -class WrongClassException( - expected: KClass<*>, - current: KClass<*>? -) : VoterException("Can not define authorization with class $current. Need $expected") - -fun Voter.checkClass( - expected: KClass<*>, - subject: Any? -) { - if (subject != null && !subject::class.isSubclassOf(expected)) { - throw WrongClassException(expected, subject::class) - } else if (subject == null) { - throw WrongClassException(expected, null) - } -} \ No newline at end of file diff --git a/src/main/kotlin/fr/dcproject/security/voter/CitizenVoter.kt b/src/main/kotlin/fr/dcproject/security/voter/CitizenVoter.kt index b27408f..9e2c8c2 100644 --- a/src/main/kotlin/fr/dcproject/security/voter/CitizenVoter.kt +++ b/src/main/kotlin/fr/dcproject/security/voter/CitizenVoter.kt @@ -2,6 +2,10 @@ package fr.dcproject.security.voter import fr.dcproject.entity.CitizenBasicI import fr.dcproject.entity.UserI +import fr.dcproject.user +import fr.ktorVoter.ActionI +import fr.ktorVoter.Vote +import fr.ktorVoter.Voter import io.ktor.application.ApplicationCall import io.ktor.locations.KtorExperimentalLocationsAPI diff --git a/src/main/kotlin/fr/dcproject/security/voter/CommentVoter.kt b/src/main/kotlin/fr/dcproject/security/voter/CommentVoter.kt index a6aed79..8f8bc41 100644 --- a/src/main/kotlin/fr/dcproject/security/voter/CommentVoter.kt +++ b/src/main/kotlin/fr/dcproject/security/voter/CommentVoter.kt @@ -1,6 +1,10 @@ package fr.dcproject.security.voter import fr.dcproject.entity.Comment +import fr.dcproject.user +import fr.ktorVoter.ActionI +import fr.ktorVoter.Vote +import fr.ktorVoter.Voter import io.ktor.application.ApplicationCall class CommentVoter : Voter { diff --git a/src/main/kotlin/fr/dcproject/security/voter/ConstitutionVoter.kt b/src/main/kotlin/fr/dcproject/security/voter/ConstitutionVoter.kt index f114973..2bbcbe9 100644 --- a/src/main/kotlin/fr/dcproject/security/voter/ConstitutionVoter.kt +++ b/src/main/kotlin/fr/dcproject/security/voter/ConstitutionVoter.kt @@ -3,6 +3,10 @@ package fr.dcproject.security.voter import fr.dcproject.entity.Comment import fr.dcproject.entity.ConstitutionSimple import fr.dcproject.entity.UserI +import fr.dcproject.user +import fr.ktorVoter.ActionI +import fr.ktorVoter.Vote +import fr.ktorVoter.Voter import io.ktor.application.ApplicationCall import fr.dcproject.entity.Vote as VoteEntity diff --git a/src/main/kotlin/fr/dcproject/security/voter/FollowVoter.kt b/src/main/kotlin/fr/dcproject/security/voter/FollowVoter.kt index 6f40df3..312c2cc 100644 --- a/src/main/kotlin/fr/dcproject/security/voter/FollowVoter.kt +++ b/src/main/kotlin/fr/dcproject/security/voter/FollowVoter.kt @@ -1,5 +1,9 @@ package fr.dcproject.security.voter +import fr.dcproject.user +import fr.ktorVoter.ActionI +import fr.ktorVoter.Vote +import fr.ktorVoter.Voter import io.ktor.application.ApplicationCall import fr.dcproject.entity.Follow as FollowEntity import fr.dcproject.entity.User as UserEntity diff --git a/src/main/kotlin/fr/dcproject/security/voter/OpinionChoiceVoter.kt b/src/main/kotlin/fr/dcproject/security/voter/OpinionChoiceVoter.kt index 6dcde00..280e8d6 100644 --- a/src/main/kotlin/fr/dcproject/security/voter/OpinionChoiceVoter.kt +++ b/src/main/kotlin/fr/dcproject/security/voter/OpinionChoiceVoter.kt @@ -1,6 +1,9 @@ package fr.dcproject.security.voter import fr.dcproject.entity.OpinionChoice +import fr.ktorVoter.ActionI +import fr.ktorVoter.Vote +import fr.ktorVoter.Voter import io.ktor.application.ApplicationCall class OpinionChoiceVoter : Voter { diff --git a/src/main/kotlin/fr/dcproject/security/voter/OpinionVoter.kt b/src/main/kotlin/fr/dcproject/security/voter/OpinionVoter.kt index 39365c4..571b165 100644 --- a/src/main/kotlin/fr/dcproject/security/voter/OpinionVoter.kt +++ b/src/main/kotlin/fr/dcproject/security/voter/OpinionVoter.kt @@ -2,6 +2,10 @@ package fr.dcproject.security.voter import fr.dcproject.entity.ArticleAuthI import fr.dcproject.entity.Opinion +import fr.dcproject.user +import fr.ktorVoter.ActionI +import fr.ktorVoter.Vote +import fr.ktorVoter.Voter import io.ktor.application.ApplicationCall class OpinionVoter : Voter { diff --git a/src/main/kotlin/fr/dcproject/security/voter/VoteVoter.kt b/src/main/kotlin/fr/dcproject/security/voter/VoteVoter.kt index fd14584..bd1e7f2 100644 --- a/src/main/kotlin/fr/dcproject/security/voter/VoteVoter.kt +++ b/src/main/kotlin/fr/dcproject/security/voter/VoteVoter.kt @@ -1,5 +1,9 @@ package fr.dcproject.security.voter +import fr.dcproject.user +import fr.ktorVoter.ActionI +import fr.ktorVoter.Vote +import fr.ktorVoter.Voter import io.ktor.application.ApplicationCall import fr.dcproject.entity.Vote as VoteEntity diff --git a/src/main/kotlin/fr/dcproject/security/voter/Voter.kt b/src/main/kotlin/fr/dcproject/security/voter/Voter.kt deleted file mode 100644 index 56333a3..0000000 --- a/src/main/kotlin/fr/dcproject/security/voter/Voter.kt +++ /dev/null @@ -1,110 +0,0 @@ -package fr.dcproject.security.voter - -import fr.dcproject.entity.User -import io.ktor.application.ApplicationCall -import io.ktor.application.ApplicationCallPipeline -import io.ktor.application.ApplicationFeature -import io.ktor.auth.authentication -import io.ktor.http.HttpStatusCode -import io.ktor.response.respond -import io.ktor.util.AttributeKey -import io.ktor.util.KtorExperimentalAPI -import io.ktor.util.pipeline.PipelineContext - -interface ActionI - -interface Voter { - fun supports(action: ActionI, call: ApplicationCall, subject: Any? = null): Boolean - fun vote(action: ActionI, call: ApplicationCall, subject: Any? = null): Vote -} - -fun List.can(action: ActionI, call: ApplicationCall, subject: Any? = null): Boolean { - val listOfSubject: List = if (subject !is List<*>) listOf(subject) else subject - val votes: List = listOfSubject.flatMap { subject -> - this - .filter { it.supports(action, call, subject) } - .ifEmpty { throw NoVoterException(action) } - .map { it.vote(action, call, subject) } - } - - return votes.all { it in listOf(Vote.GRANTED, Vote.ABSTAIN) } and votes.any { it == Vote.GRANTED } -} - -enum class Vote { - GRANTED, - ABSTAIN, - DENIED; - - companion object { - fun isGranted(lambda: () -> Boolean): Vote { - return if (lambda()) GRANTED else DENIED - } - } -} - -private val votersAttributeKey = AttributeKey>("voters") - -fun ApplicationCall.assertCan(action: ActionI, subject: Any? = null, agreeIfNullOrEmpty: Boolean = true) { - val isNullOrEmpty = (subject == null || (subject is Collection<*> && subject.isNullOrEmpty())) - if (!can(action, subject) && !agreeIfNullOrEmpty && isNullOrEmpty) { - throw UnauthorizedException(action) - } -} - -fun PipelineContext.assertCan(action: ActionI, subject: Any? = null, agreeIfNullOrEmpty: Boolean = true) = - context.assertCan(action, subject, agreeIfNullOrEmpty) - -fun PipelineContext.can(action: ActionI, subject: Any? = null) = - context.can(action, subject) - -fun ApplicationCall.can(action: ActionI, subject: Any? = null): Boolean { - val voters = attributes[votersAttributeKey] - - return voters.can(action, this, subject) -} - -abstract class VoterException(message: String) : Throwable(message) -class NoVoterException(action: ActionI) : VoterException("No voter found for action '$action'") -class UnauthorizedException(action: ActionI) : VoterException("Unauthorized for action '$action'") -class ForbiddenException(message: String? = null) : Throwable(message) - -val ApplicationCall.user get() = authentication.principal() - -class AuthorizationVoter { - - /** - * Configuration for [AuthorizationVoter] feature. - */ - class Configuration { - var voters = mutableListOf() - fun voter(voter: Voter) = voters.add(voter) - } - - /** - * Object for installing feature - */ - companion object Feature : ApplicationFeature { - - override val key = AttributeKey("Voter") - - @KtorExperimentalAPI - override fun install( - pipeline: ApplicationCallPipeline, - configure: Configuration.() -> Unit - ): AuthorizationVoter { - val configuration = Configuration().apply(configure) - - pipeline.intercept(ApplicationCallPipeline.Features) { - context.attributes.put(votersAttributeKey, configuration.voters) - - try { - proceed() - } catch (e: VoterException) { - context.respond(HttpStatusCode.Forbidden) - } - } - - return AuthorizationVoter() - } - } -} diff --git a/src/main/kotlin/fr/dcproject/security/voter/WorkgroupVoter.kt b/src/main/kotlin/fr/dcproject/security/voter/WorkgroupVoter.kt index ca5507d..12d8583 100644 --- a/src/main/kotlin/fr/dcproject/security/voter/WorkgroupVoter.kt +++ b/src/main/kotlin/fr/dcproject/security/voter/WorkgroupVoter.kt @@ -2,6 +2,11 @@ package fr.dcproject.security.voter import fr.dcproject.citizenOrNull import fr.dcproject.entity.* +import fr.dcproject.user +import fr.ktorVoter.ActionI +import fr.ktorVoter.Vote +import fr.ktorVoter.Voter +import fr.ktorVoter.VoterException import io.ktor.application.ApplicationCall class WorkgroupVoter : Voter { diff --git a/src/test/kotlin/fr/dcproject/security/voter/ArticleVoterTest.kt b/src/test/kotlin/fr/dcproject/security/voter/ArticleVoterTest.kt index e651fa3..9014168 100644 --- a/src/test/kotlin/fr/dcproject/security/voter/ArticleVoterTest.kt +++ b/src/test/kotlin/fr/dcproject/security/voter/ArticleVoterTest.kt @@ -1,6 +1,9 @@ package fr.dcproject.security.voter import fr.dcproject.entity.* +import fr.dcproject.user +import fr.ktorVoter.Vote +import fr.ktorVoter.can import io.ktor.application.ApplicationCall import io.mockk.every import io.mockk.mockk @@ -34,7 +37,7 @@ internal class ArticleVoterTest { ) init { - mockkStatic("fr.dcproject.security.voter.VoterKt") + mockkStatic("fr.dcproject.ApplicationContextKt") } @Test diff --git a/src/test/kotlin/fr/dcproject/security/voter/CitizenVoterTest.kt b/src/test/kotlin/fr/dcproject/security/voter/CitizenVoterTest.kt index 49a1fed..428b7af 100644 --- a/src/test/kotlin/fr/dcproject/security/voter/CitizenVoterTest.kt +++ b/src/test/kotlin/fr/dcproject/security/voter/CitizenVoterTest.kt @@ -1,6 +1,12 @@ package fr.dcproject.security.voter -import fr.dcproject.entity.* +import fr.dcproject.entity.CitizenBasic +import fr.dcproject.entity.CitizenI +import fr.dcproject.entity.User +import fr.dcproject.entity.UserI +import fr.dcproject.user +import fr.ktorVoter.ActionI +import fr.ktorVoter.can import io.ktor.application.ApplicationCall import io.ktor.locations.KtorExperimentalLocationsAPI import io.mockk.every @@ -46,7 +52,7 @@ internal class CitizenVoterTest { ).apply { deletedAt = DateTime.now() } init { - mockkStatic("fr.dcproject.security.voter.VoterKt") + mockkStatic("fr.dcproject.ApplicationContextKt") } @Test diff --git a/src/test/kotlin/fr/dcproject/security/voter/CommentVoterTest.kt b/src/test/kotlin/fr/dcproject/security/voter/CommentVoterTest.kt index a8e38ed..7258bca 100644 --- a/src/test/kotlin/fr/dcproject/security/voter/CommentVoterTest.kt +++ b/src/test/kotlin/fr/dcproject/security/voter/CommentVoterTest.kt @@ -1,6 +1,9 @@ package fr.dcproject.security.voter import fr.dcproject.entity.* +import fr.dcproject.user +import fr.ktorVoter.ActionI +import fr.ktorVoter.can import io.ktor.application.ApplicationCall import io.ktor.locations.KtorExperimentalLocationsAPI import io.mockk.every @@ -66,7 +69,7 @@ internal class CommentVoterTest { ) init { - mockkStatic("fr.dcproject.security.voter.VoterKt") + mockkStatic("fr.dcproject.ApplicationContextKt") } @Test diff --git a/src/test/kotlin/fr/dcproject/security/voter/FollowVoterTest.kt b/src/test/kotlin/fr/dcproject/security/voter/FollowVoterTest.kt index 41c192f..1042144 100644 --- a/src/test/kotlin/fr/dcproject/security/voter/FollowVoterTest.kt +++ b/src/test/kotlin/fr/dcproject/security/voter/FollowVoterTest.kt @@ -1,6 +1,9 @@ package fr.dcproject.security.voter import fr.dcproject.entity.* +import fr.dcproject.user +import fr.ktorVoter.ActionI +import fr.ktorVoter.can import io.ktor.application.ApplicationCall import io.ktor.locations.KtorExperimentalLocationsAPI import io.mockk.every @@ -56,7 +59,7 @@ internal class FollowVoterTest { ) init { - mockkStatic("fr.dcproject.security.voter.VoterKt") + mockkStatic("fr.dcproject.ApplicationContextKt") } @Test diff --git a/src/test/kotlin/fr/dcproject/security/voter/OpinionChoiceVoterTest.kt b/src/test/kotlin/fr/dcproject/security/voter/OpinionChoiceVoterTest.kt index 573f3e8..a355eb0 100644 --- a/src/test/kotlin/fr/dcproject/security/voter/OpinionChoiceVoterTest.kt +++ b/src/test/kotlin/fr/dcproject/security/voter/OpinionChoiceVoterTest.kt @@ -1,6 +1,9 @@ package fr.dcproject.security.voter import fr.dcproject.entity.* +import fr.dcproject.user +import fr.ktorVoter.ActionI +import fr.ktorVoter.can import io.ktor.application.ApplicationCall import io.ktor.locations.KtorExperimentalLocationsAPI import io.mockk.every @@ -40,7 +43,7 @@ internal class OpinionChoiceVoterTest { ) init { - mockkStatic("fr.dcproject.security.voter.VoterKt") + mockkStatic("fr.dcproject.ApplicationContextKt") } @Test diff --git a/src/test/kotlin/fr/dcproject/security/voter/OpinionVoterTest.kt b/src/test/kotlin/fr/dcproject/security/voter/OpinionVoterTest.kt index a74b7f8..f8e450d 100644 --- a/src/test/kotlin/fr/dcproject/security/voter/OpinionVoterTest.kt +++ b/src/test/kotlin/fr/dcproject/security/voter/OpinionVoterTest.kt @@ -1,6 +1,9 @@ package fr.dcproject.security.voter import fr.dcproject.entity.* +import fr.dcproject.user +import fr.ktorVoter.ActionI +import fr.ktorVoter.can import io.ktor.application.ApplicationCall import io.ktor.locations.KtorExperimentalLocationsAPI import io.mockk.every @@ -55,7 +58,7 @@ internal class OpinionVoterTest { ) init { - mockkStatic("fr.dcproject.security.voter.VoterKt") + mockkStatic("fr.dcproject.ApplicationContextKt") } @Test diff --git a/src/test/kotlin/fr/dcproject/security/voter/VoteVoterTest.kt b/src/test/kotlin/fr/dcproject/security/voter/VoteVoterTest.kt index 4da8b13..383617b 100644 --- a/src/test/kotlin/fr/dcproject/security/voter/VoteVoterTest.kt +++ b/src/test/kotlin/fr/dcproject/security/voter/VoteVoterTest.kt @@ -1,7 +1,9 @@ package fr.dcproject.security.voter import fr.dcproject.entity.* -import fr.dcproject.entity.Vote as VoteEntity +import fr.dcproject.user +import fr.ktorVoter.ActionI +import fr.ktorVoter.can import io.ktor.application.ApplicationCall import io.ktor.locations.KtorExperimentalLocationsAPI import io.mockk.every @@ -12,6 +14,7 @@ import org.joda.time.DateTime import org.junit.jupiter.api.Tag import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestInstance +import fr.dcproject.entity.Vote as VoteEntity @KtorExperimentalLocationsAPI @TestInstance(TestInstance.Lifecycle.PER_CLASS) @@ -70,7 +73,7 @@ internal class VoteVoterTest { ) init { - mockkStatic("fr.dcproject.security.voter.VoterKt") + mockkStatic("fr.dcproject.ApplicationContextKt") } @Test diff --git a/src/test/kotlin/fr/dcproject/security/voter/WorkgroupVoterTest.kt b/src/test/kotlin/fr/dcproject/security/voter/WorkgroupVoterTest.kt index 5179274..bfc8b6c 100644 --- a/src/test/kotlin/fr/dcproject/security/voter/WorkgroupVoterTest.kt +++ b/src/test/kotlin/fr/dcproject/security/voter/WorkgroupVoterTest.kt @@ -1,6 +1,10 @@ package fr.dcproject.security.voter import fr.dcproject.entity.* +import fr.dcproject.user +import fr.ktorVoter.ActionI +import fr.ktorVoter.VoterException +import fr.ktorVoter.can import io.ktor.application.ApplicationCall import io.ktor.locations.KtorExperimentalLocationsAPI import io.mockk.every @@ -66,7 +70,7 @@ internal class WorkgroupVoterTest { private val workgroupref = WorkgroupRef() init { - mockkStatic("fr.dcproject.security.voter.VoterKt") + mockkStatic("fr.dcproject.ApplicationContextKt") } @Test