Skip to content

Commit c49cab9

Browse files
committed
style: formatKotlin
1 parent 5a8ee2c commit c49cab9

File tree

3 files changed

+119
-91
lines changed

3 files changed

+119
-91
lines changed

wonderwalled-common/src/main/kotlin/io/nais/common/Auth.kt

+96-71
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ import io.opentelemetry.api.trace.Tracer
2323
import org.slf4j.Logger
2424
import org.slf4j.LoggerFactory
2525

26-
enum class IdentityProvider(@JsonValue val alias: String) {
26+
enum class IdentityProvider(
27+
@JsonValue val alias: String,
28+
) {
2729
MASKINPORTEN("maskinporten"),
2830
AZURE_AD("azuread"),
2931
IDPORTEN("idporten"),
@@ -84,43 +86,63 @@ class AuthClient(
8486
) {
8587
private val tracer: Tracer = GlobalOpenTelemetry.get().getTracer("io.nais.common.AuthClient")
8688

87-
suspend fun token(target: String): TokenResponse = try {
88-
tracer.withSpan("AuthClient/token (${provider.alias})", traceAttributes(target)) {
89-
httpClient.submitForm(config.tokenEndpoint, parameters {
90-
set("target", target)
91-
set("identity_provider", provider.alias)
92-
}).body<TokenResponse.Success>()
89+
suspend fun token(target: String): TokenResponse =
90+
try {
91+
tracer.withSpan("AuthClient/token (${provider.alias})", traceAttributes(target)) {
92+
httpClient
93+
.submitForm(
94+
config.tokenEndpoint,
95+
parameters {
96+
set("target", target)
97+
set("identity_provider", provider.alias)
98+
},
99+
).body<TokenResponse.Success>()
100+
}
101+
} catch (e: ResponseException) {
102+
TokenResponse.Error(e.response.body<TokenErrorResponse>(), e.response.status)
93103
}
94-
} catch (e: ResponseException) {
95-
TokenResponse.Error(e.response.body<TokenErrorResponse>(), e.response.status)
96-
}
97104

98-
suspend fun exchange(target: String, userToken: String): TokenResponse = try {
99-
tracer.withSpan("AuthClient/exchange (${provider.alias})", traceAttributes(target)) {
100-
httpClient.submitForm(config.tokenExchangeEndpoint, parameters {
101-
set("target", target)
102-
set("user_token", userToken)
103-
set("identity_provider", provider.alias)
104-
}).body<TokenResponse.Success>()
105+
suspend fun exchange(
106+
target: String,
107+
userToken: String,
108+
): TokenResponse =
109+
try {
110+
tracer.withSpan("AuthClient/exchange (${provider.alias})", traceAttributes(target)) {
111+
httpClient
112+
.submitForm(
113+
config.tokenExchangeEndpoint,
114+
parameters {
115+
set("target", target)
116+
set("user_token", userToken)
117+
set("identity_provider", provider.alias)
118+
},
119+
).body<TokenResponse.Success>()
120+
}
121+
} catch (e: ResponseException) {
122+
TokenResponse.Error(e.response.body<TokenErrorResponse>(), e.response.status)
105123
}
106-
} catch (e: ResponseException) {
107-
TokenResponse.Error(e.response.body<TokenErrorResponse>(), e.response.status)
108-
}
109124

110125
suspend fun introspect(accessToken: String): TokenIntrospectionResponse =
111126
tracer.withSpan("AuthClient/introspect (${provider.alias})", traceAttributes()) {
112-
httpClient.submitForm(config.tokenIntrospectionEndpoint, parameters {
113-
set("token", accessToken)
114-
set("identity_provider", provider.alias)
115-
}).body()
127+
httpClient
128+
.submitForm(
129+
config.tokenIntrospectionEndpoint,
130+
parameters {
131+
set("token", accessToken)
132+
set("identity_provider", provider.alias)
133+
},
134+
).body()
116135
}
117136

118-
private fun traceAttributes(target: String? = null) = Attributes.builder().apply {
119-
put(attributeKeyIdentityProvider, provider.alias)
120-
if (target != null) {
121-
put(attributeKeyTarget, target)
122-
}
123-
}.build()
137+
private fun traceAttributes(target: String? = null) =
138+
Attributes
139+
.builder()
140+
.apply {
141+
put(attributeKeyIdentityProvider, provider.alias)
142+
if (target != null) {
143+
put(attributeKeyTarget, target)
144+
}
145+
}.build()
124146

125147
companion object {
126148
private val attributeKeyTarget: AttributeKey<String> = AttributeKey.stringKey("target")
@@ -134,57 +156,60 @@ class AuthPluginConfiguration(
134156
var logger: Logger = LoggerFactory.getLogger("io.nais.common.ktor.NaisAuth"),
135157
)
136158

137-
val NaisAuth = createRouteScopedPlugin(
138-
name = "NaisAuth",
139-
createConfiguration = ::AuthPluginConfiguration,
140-
) {
141-
val logger = pluginConfig.logger
142-
val client = pluginConfig.client ?: throw IllegalArgumentException("NaisAuth plugin: client must be set")
143-
val ingress = pluginConfig.ingress ?: ""
144-
145-
val challenge: suspend (ApplicationCall) -> Unit = { call ->
146-
val target = call.loginUrl(ingress)
147-
logger.info("unauthenticated: redirecting to '$target'")
148-
call.respondRedirect(target)
149-
}
150-
151-
pluginConfig.apply {
152-
onCall { call ->
153-
val token = call.bearerToken()
154-
if (token == null) {
155-
logger.warn("unauthenticated: no Bearer token found in Authorization header")
156-
challenge(call)
157-
return@onCall
158-
}
159+
val NaisAuth =
160+
createRouteScopedPlugin(
161+
name = "NaisAuth",
162+
createConfiguration = ::AuthPluginConfiguration,
163+
) {
164+
val logger = pluginConfig.logger
165+
val client = pluginConfig.client ?: throw IllegalArgumentException("NaisAuth plugin: client must be set")
166+
val ingress = pluginConfig.ingress ?: ""
167+
168+
val challenge: suspend (ApplicationCall) -> Unit = { call ->
169+
val target = call.loginUrl(ingress)
170+
logger.info("unauthenticated: redirecting to '$target'")
171+
call.respondRedirect(target)
172+
}
159173

160-
val introspectResponse = try {
161-
client.introspect(token)
162-
} catch (e: Exception) {
163-
logger.error("unauthenticated: introspect request failed: ${e.message}")
174+
pluginConfig.apply {
175+
onCall { call ->
176+
val token = call.bearerToken()
177+
if (token == null) {
178+
logger.warn("unauthenticated: no Bearer token found in Authorization header")
179+
challenge(call)
180+
return@onCall
181+
}
182+
183+
val introspectResponse =
184+
try {
185+
client.introspect(token)
186+
} catch (e: Exception) {
187+
logger.error("unauthenticated: introspect request failed: ${e.message}")
188+
challenge(call)
189+
return@onCall
190+
}
191+
192+
if (introspectResponse.active) {
193+
logger.info("authenticated - claims='${introspectResponse.other}'")
194+
return@onCall
195+
}
196+
197+
logger.warn("unauthenticated: ${introspectResponse.error}")
164198
challenge(call)
165199
return@onCall
166200
}
167-
168-
if (introspectResponse.active) {
169-
logger.info("authenticated - claims='${introspectResponse.other}'")
170-
return@onCall
171-
}
172-
173-
logger.warn("unauthenticated: ${introspectResponse.error}")
174-
challenge(call)
175-
return@onCall
176201
}
177-
}
178202

179-
logger.info("NaisAuth plugin loaded.")
180-
}
203+
logger.info("NaisAuth plugin loaded.")
204+
}
181205

182206
// loginUrl constructs a URL string that points to the login endpoint (Wonderwall) for redirecting a request.
183207
// It also indicates that the user should be redirected back to the original request path after authentication
184208
private fun ApplicationCall.loginUrl(defaultHost: String): String {
185-
val host = defaultHost.ifEmpty(defaultValue = {
186-
"${this.request.local.scheme}://${this.request.host()}"
187-
})
209+
val host =
210+
defaultHost.ifEmpty(defaultValue = {
211+
"${this.request.local.scheme}://${this.request.host()}"
212+
})
188213

189214
return "$host/oauth2/login?redirect=${this.request.uri}"
190215
}

wonderwalled-common/src/main/kotlin/io/nais/common/Http.kt

+16-14
Original file line numberDiff line numberDiff line change
@@ -21,33 +21,34 @@ import io.ktor.server.routing.get
2121
import io.ktor.server.routing.route
2222
import io.ktor.server.routing.routing
2323
import io.opentelemetry.api.GlobalOpenTelemetry
24-
import org.slf4j.event.Level
25-
import java.util.UUID
2624
import io.opentelemetry.instrumentation.ktor.v3_0.KtorClientTelemetry
2725
import io.opentelemetry.instrumentation.ktor.v3_0.KtorServerTelemetry
26+
import org.slf4j.event.Level
27+
import java.util.UUID
2828
import io.ktor.client.engine.cio.CIO as ClientCIO
2929
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation as ClientContentNegotiation
3030
import io.ktor.server.cio.CIO as ServerCIO
3131
import io.ktor.server.plugins.contentnegotiation.ContentNegotiation as ServerContentNegotiation
3232

33-
fun defaultHttpClient() = HttpClient(ClientCIO) {
34-
expectSuccess = true
35-
install(ClientContentNegotiation) {
36-
jackson {
37-
deserializationConfig.apply {
38-
configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
33+
fun defaultHttpClient() =
34+
HttpClient(ClientCIO) {
35+
expectSuccess = true
36+
install(ClientContentNegotiation) {
37+
jackson {
38+
deserializationConfig.apply {
39+
configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
40+
}
3941
}
4042
}
41-
}
4243

43-
install(KtorClientTelemetry) {
44-
setOpenTelemetry(GlobalOpenTelemetry.get())
44+
install(KtorClientTelemetry) {
45+
setOpenTelemetry(GlobalOpenTelemetry.get())
46+
}
4547
}
46-
}
4748

4849
fun server(
4950
config: Config = Config(),
50-
module: Application.(Config) -> Unit
51+
module: Application.(Config) -> Unit,
5152
) = embeddedServer(ServerCIO, port = config.port) {
5253
install(ServerContentNegotiation) {
5354
jackson {
@@ -100,7 +101,8 @@ fun ApplicationCall.requestHeaders(): Map<String, String> =
100101
.associate { header -> header.key to header.value.joinToString() }
101102

102103
fun ApplicationCall.bearerToken(): String? =
103-
request.authorization()
104+
request
105+
.authorization()
104106
?.takeIf { it.startsWith("Bearer ", ignoreCase = true) }
105107
?.removePrefix("Bearer ")
106108
?.removePrefix("bearer ")

wonderwalled-common/src/main/kotlin/io/nais/common/Tracing.kt

+7-6
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,15 @@ import kotlin.coroutines.coroutineContext
1111
suspend fun <T> Tracer.withSpan(
1212
spanName: String,
1313
attributes: Attributes? = null,
14-
block: suspend (span: Span) -> T
14+
block: suspend (span: Span) -> T,
1515
): T {
16-
val span: Span = this.spanBuilder(spanName).run {
17-
if (attributes != null) {
18-
setAllAttributes(attributes)
16+
val span: Span =
17+
this.spanBuilder(spanName).run {
18+
if (attributes != null) {
19+
setAllAttributes(attributes)
20+
}
21+
startSpan()
1922
}
20-
startSpan()
21-
}
2223

2324
return withContext(coroutineContext + span.asContextElement()) {
2425
try {

0 commit comments

Comments
 (0)