Skip to content

Commit 03b67cc

Browse files
assouktimvsct-jburet
authored andcommitted
[Vertx-Pac4j] Temporary use of session to store a Pac4jUser as a TockUser
1 parent 02ddff1 commit 03b67cc

8 files changed

Lines changed: 44 additions & 23 deletions

File tree

bot/admin/server/src/main/kotlin/verticle/DialogVerticle.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,6 @@ class DialogVerticle {
253253
* Get the namespace from the context
254254
* @param context : the vertx routing context
255255
*/
256-
private fun getNamespace(context: RoutingContext) = (context.user() as TockUser).namespace
256+
private fun getNamespace(context: RoutingContext) = ((context.user() ?: context.session().get("tockUser")) as TockUser).namespace
257257

258258
}

bot/admin/server/src/main/kotlin/verticle/GenAIVerticle.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ class GenAIVerticle {
252252
* Get the namespace from the context
253253
* @param context : the vertx routing context
254254
*/
255-
private fun getNamespace(context: RoutingContext) = (context.user() as TockUser).namespace
255+
private fun getNamespace(context: RoutingContext) = ((context.user() ?: context.session().get("tockUser")) as TockUser).namespace
256256

257257
/**
258258
* Merge namespace and botId on requested [MetricFilter]

bot/admin/server/src/main/kotlin/verticle/IndicatorVerticle.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ class IndicatorVerticle {
150150
* Get the namespace from the context
151151
* @param context : the vertx routing context
152152
*/
153-
private fun getNamespace(context: RoutingContext) = (context.user() as TockUser).namespace
153+
private fun getNamespace(context: RoutingContext) = ((context.user() ?: context.session().get("tockUser")) as TockUser).namespace
154154

155155
/**
156156
* Merge namespace and botId on requested [MetricFilter]

nlp/admin/server/src/main/kotlin/AdminVerticle.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,6 +1174,7 @@ open class AdminVerticle : WebVerticle() {
11741174

11751175
fun configureStaticHandling() {
11761176
if (!devEnvironment) {
1177+
logger.info { "Running in production: static content enabled." }
11771178
// serve statics in docker image
11781179
val webRoot = verticleProperty("content_path", "/maven/dist")
11791180
// swagger yaml
@@ -1216,9 +1217,8 @@ open class AdminVerticle : WebVerticle() {
12161217
.replace("<base href=\"/\"", "<base href=\"$baseHref\"")
12171218
logger.debug { "content: $content" }
12181219
val result = Buffer.buffer(content)
1219-
if (!devEnvironment) {
1220-
indexContent = result
1221-
}
1220+
indexContent = result
1221+
12221222
context.response()
12231223
.putHeader(HttpHeaderNames.CONTENT_TYPE, "text/html; charset=utf-8")
12241224
.end(result)
@@ -1242,6 +1242,8 @@ open class AdminVerticle : WebVerticle() {
12421242
router.route(GET, "$baseHref*")
12431243
.handler(StaticHandler.create(FileSystemAccess.ROOT, webRoot))
12441244
.handler(indexContentHandler)
1245+
}else{
1246+
logger.info { "Running in development: static content disabled." }
12451247
}
12461248
}
12471249

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
<aws-sdk>1.12.792</aws-sdk>
7676
<aws-sagemaker>2.35.3</aws-sagemaker>
7777
<pac4j>6.2.2</pac4j>
78-
<vertx-pac4j>7.0.1</vertx-pac4j>
78+
<vertx-pac4j>7.0.2</vertx-pac4j>
7979
<okhttp-eventsource>4.1.1</okhttp-eventsource>
8080
<graphql-kotlin>6.3.0</graphql-kotlin>
8181

shared/src/main/kotlin/security/auth/CASAuthProvider.kt

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,14 @@ import io.vertx.ext.web.RoutingContext
3636
import io.vertx.ext.web.handler.AuthenticationHandler
3737
import io.vertx.ext.web.handler.BodyHandler
3838
import io.vertx.ext.web.handler.SessionHandler
39+
import io.vertx.ext.web.impl.UserContextInternal
3940
import io.vertx.ext.web.sstore.LocalSessionStore
4041
import mu.KotlinLogging
42+
import org.pac4j.cas.profile.CasProfile
4143
import org.pac4j.core.config.Config
42-
import org.pac4j.vertx.auth.Pac4jUser
44+
import org.pac4j.core.profile.ProfileManager
45+
import org.pac4j.vertx.VertxProfileManager
46+
import org.pac4j.vertx.VertxWebContext
4347
import org.pac4j.vertx.context.session.VertxSessionStore
4448
import org.pac4j.vertx.handler.impl.CallbackHandler
4549
import org.pac4j.vertx.handler.impl.CallbackHandlerOptions
@@ -95,10 +99,10 @@ abstract class CASAuthProvider(vertx: Vertx) : SSOTockAuthProvider(vertx) {
9599
abstract fun getConfig(): Config
96100

97101
/** Read Tock Login from CAS user info */
98-
abstract fun readCasLogin(user: Pac4jUser): String
102+
abstract fun readCasLogin(userCASProfile: CasProfile): String
99103

100104
/** Read roles grouped by namespace from CAS user infos */
101-
abstract fun readRolesByNamespace(user: Pac4jUser): Map<String, Set<String>>
105+
abstract fun readRolesByNamespace(userCASProfile: CasProfile): Map<String, Set<String>>
102106

103107
override fun createAuthHandler(verticle: WebVerticle): AuthenticationHandler {
104108
val options: SecurityHandlerOptions = SecurityHandlerOptions().setClients("CasClient")
@@ -121,10 +125,19 @@ abstract class CASAuthProvider(vertx: Vertx) : SSOTockAuthProvider(vertx) {
121125
return user!! // !! is because user is already guaranteed to be not null
122126
}
123127

124-
protected open fun upgradeToTockUser(user: Pac4jUser, resultHandler: Handler<HttpResult<TockUser>>) {
128+
/**
129+
* https://github.com/pac4j/vertx-pac4j/wiki/Get-the-authenticated-user-profiles
130+
*/
131+
fun getUserCasProfile(rc: RoutingContext): CasProfile {
132+
val profileManager: ProfileManager =
133+
VertxProfileManager(VertxWebContext(rc), sessionStore)
134+
return profileManager.getProfile(CasProfile::class.java).get()
135+
}
136+
137+
protected open fun upgradeToTockUser(userCASProfile: CasProfile, resultHandler: Handler<HttpResult<TockUser>>) {
125138
try {
126-
val username = readCasLogin(user)
127-
val rolesByNamespace = readRolesByNamespace(user)
139+
val username = readCasLogin(userCASProfile)
140+
val rolesByNamespace = readRolesByNamespace(userCASProfile)
128141
logger.debug { "authenticate $username/$rolesByNamespace" }
129142

130143
if (rolesByNamespace.keys.isEmpty()) {
@@ -169,15 +182,19 @@ abstract class CASAuthProvider(vertx: Vertx) : SSOTockAuthProvider(vertx) {
169182

170183
verticle.router.route("/*").handler(WithExcludedPathHandler(excluded) { rc ->
171184
val user = rc.user()
172-
if (user != null && user !is TockUser) {
185+
if (user != null && user !is TockUser) { // user is Pac4jUser
173186
executor.executeBlocking {
174-
upgradeToTockUser(user as Pac4jUser) { hr ->
187+
upgradeToTockUser(getUserCasProfile(rc)) { hr ->
175188
if (hr.succeeded()) {
176189
vertx.runOnContext {
177-
sessionHandler
178-
.setUser(rc, hr.result)
179-
.onSuccess { rc.next() }
180-
.onFailure { err -> rc.fail(err) }
190+
// TODO : setUser problem (*): This assignment (adding the user to the context) is not maintained for the next vertx handler (rc.next()).
191+
(rc.userContext() as UserContextInternal).setUser(hr.result)
192+
// TODO : we are therefore temporarily using the session to store tockUser.
193+
rc.session().put(
194+
"tockUser",
195+
hr.result
196+
)
197+
rc.next()
181198
}
182199
} else {
183200
rc.userContext().clear()

shared/src/main/kotlin/security/auth/TockAuthProvider.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,5 +58,7 @@ interface TockAuthProvider : AuthenticationProvider {
5858
/**
5959
* Gets a [TockUser] from current vert.x state.
6060
*/
61-
fun toTockUser(context: RoutingContext): TockUser? = context.user() as? TockUser
61+
fun toTockUser(context: RoutingContext): TockUser? {
62+
return context.user() as? TockUser ?: context.session().get("tockUser") as? TockUser
63+
}
6264
}

shared/src/main/kotlin/vertx/WebVerticle.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ abstract class WebVerticle : AbstractVerticle() {
334334
) {
335335
router.route(method, "$basePath$path")
336336
.handler { context ->
337-
val u = context.user()
337+
val u: TockUser? = context.user() as? TockUser ?: context.session().get("tockUser") as? TockUser
338338
if (u == null || roles.isNullOrEmpty()) {
339339
handler.invoke(context)
340340
} else {
@@ -373,7 +373,7 @@ abstract class WebVerticle : AbstractVerticle() {
373373
role: TockUserRole,
374374
resultHandler: (AsyncResult<Boolean>) -> Unit
375375
) {
376-
val u = user() as? TockUser
376+
val u: TockUser? = user() as? TockUser ?: session().get("tockUser")
377377
if (u == null) {
378378
resultHandler.invoke(Future.failedFuture("No user set"))
379379
} else {
@@ -388,7 +388,7 @@ abstract class WebVerticle : AbstractVerticle() {
388388
roles: Set<TockUserRole?>,
389389
resultHandler: (AsyncResult<Boolean>) -> Unit
390390
) {
391-
val tockUser = user() as? TockUser
391+
val tockUser: TockUser? = user() as? TockUser ?: session().get("tockUser") as? TockUser
392392
if (tockUser == null) {
393393
resultHandler.invoke(Future.failedFuture("No user set"))
394394
return

0 commit comments

Comments
 (0)