Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fikser sårbarheter og fjerner gamle syfo bibliotek #617

Merged
merged 8 commits into from
Jan 20, 2025
4 changes: 1 addition & 3 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ dependencies {
implementation("io.ktor:ktor-server-cors:$ktorVersion")
implementation("io.ktor:ktor-server-locations:$ktorVersion")
implementation("io.ktor:ktor-server-netty:$ktorVersion")
implementation("io.ktor:ktor-client-apache5:$ktorVersion")
implementation("io.ktor:ktor-server:$ktorVersion")
implementation("io.micrometer:micrometer-core:$micrometerVersion")
implementation("io.mockk:mockk:$mockkVersion")
Expand All @@ -176,11 +177,8 @@ dependencies {
implementation("no.nav.helsearbeidsgiver:pdl-client:$pdlClientVersion")
implementation("no.nav.helsearbeidsgiver:tokenprovider:$tokenProviderVersion")
implementation("no.nav.helsearbeidsgiver:utils:$hagUtilsVersion")
implementation("no.nav.security:mock-oauth2-server:$mockOAuth2ServerVersion")
implementation("no.nav.security:token-client-core:$tokenSupportVersion")
implementation("no.nav.security:token-validation-ktor-v2:$tokenSupportVersion")
implementation("no.nav.syfo.sm:syfosm-common-networking:$navSyfoCommonVersion")
implementation("no.nav.syfo.sm:syfosm-common-rest-sts:$navSyfoCommonVersion")
implementation("no.nav.sykepenger.kontrakter:inntektsmelding-kontrakt:$imkontraktVersion")
implementation("no.nav.teamdokumenthandtering:teamdokumenthandtering-avro-schemas:$joarkHendelseVersion")
implementation("no.nav.tjenestespesifikasjoner:altinn-correspondence-agency-external-basic:$altinnCorrespondanceVersion")
Expand Down
54 changes: 27 additions & 27 deletions src/main/kotlin/no/nav/syfo/client/dokarkiv/DokArkivClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ package no.nav.syfo.client.dokarkiv
import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.plugins.ClientRequestException
import io.ktor.client.plugins.ResponseException
import io.ktor.client.request.accept
import io.ktor.client.request.bearerAuth
import io.ktor.client.request.header
import io.ktor.client.request.patch
import io.ktor.client.request.put
Expand All @@ -13,7 +15,7 @@ import io.ktor.http.HttpStatusCode
import io.ktor.http.contentType
import no.nav.helsearbeidsgiver.utils.log.logger
import no.nav.helsearbeidsgiver.utils.log.sikkerLogger
import no.nav.syfo.helpers.retry
import no.nav.syfo.util.navCallId
import java.io.IOException

// NAV-enheten som personen som utfører journalføring jobber for. Ved automatisk journalføring uten
Expand Down Expand Up @@ -90,42 +92,40 @@ class DokArkivClient(
*
* https://confluence.adeo.no/display/BOA/oppdaterJournalpost
*/

suspend fun oppdaterJournalpost(
journalpostId: String,
oppdaterJournalpostRequest: OppdaterJournalpostRequest,
msgId: String,
) = retry("oppdater_journalpost") {
try {
httpClient
.put("$url/journalpost/$journalpostId") {
contentType(ContentType.Application.Json)
accept(ContentType.Application.Json)
header("Authorization", "Bearer ${getAccessToken()}")
header("Nav-Callid", msgId)
setBody(oppdaterJournalpostRequest)
}.also { logger.info("Oppdatering av journalpost ok for journalpostid {}, msgId {}", journalpostId, msgId) }
} catch (e: Exception) {
if (e is ClientRequestException) {
when (e.response.status) {
callId: String,
): HttpStatusCode {
val idFragment = "journalpostId=[$journalpostId] callId=[$callId]"

return runCatching {
httpClient.put("$url/journalpost/$journalpostId") {
contentType(ContentType.Application.Json)
bearerAuth(getAccessToken())
navCallId(callId)
setBody(oppdaterJournalpostRequest)
}
}.onFailure {
if (it is ResponseException) {
when (it.response.status) {
HttpStatusCode.NotFound -> {
sikkerlogger.error("Oppdatering: Journalposten finnes ikke for journalpostid {}, msgId {}", journalpostId, msgId)
throw RuntimeException("Oppdatering: Journalposten finnes ikke for journalpostid $journalpostId msgid $msgId")
sikkerlogger.error("Journalposten finnes ikke for journalpostid $journalpostId", it)
throw RuntimeException("Journalposten finnes ikke for journalpostid $journalpostId", it)
}

else -> {
sikkerlogger.error(
"Fikk http status {} ved oppdatering av journalpostid {}, msgId {}",
e.response.status,
journalpostId,
msgId,
)
throw RuntimeException("Fikk feilmelding ved oppdatering av journalpostid $journalpostId msgid $msgId")
sikkerlogger.error("Feil ved oppdatering av journalpost $journalpostId", it)
throw RuntimeException("Feil ved oppdatering av journalpost $journalpostId", it)
}
}
}
sikkerlogger.error("Dokarkiv svarte med feilmelding ved oppdatering av journalpost $journalpostId", e)
throw IOException("Dokarkiv svarte med feilmelding ved oppdatering av journalpost for $journalpostId msgid $msgId")
}
throw it
}.onSuccess {
sikkerlogger.info("Oppdatering av journalpost OK. $idFragment")
}.getOrThrow()
.status
}

suspend fun feilregistrerJournalpost(
Expand Down
18 changes: 2 additions & 16 deletions src/main/kotlin/no/nav/syfo/koin/KoinProfiles.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,11 @@ import com.fasterxml.jackson.datatype.jdk8.Jdk8Module
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
import com.fasterxml.jackson.module.kotlin.KotlinFeature
import com.fasterxml.jackson.module.kotlin.KotlinModule
import io.ktor.client.HttpClient
import io.ktor.client.engine.apache.Apache
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.http.ContentType
import io.ktor.serialization.jackson.JacksonConverter
import io.ktor.serialization.jackson.jackson
import io.ktor.server.config.ApplicationConfig
import no.nav.syfo.util.AppEnv.DEV
import no.nav.syfo.util.AppEnv.PROD
import no.nav.syfo.util.KubernetesProbeManager
import no.nav.syfo.util.customObjectMapper
import no.nav.syfo.util.createHttpClient
import org.koin.core.module.Module
import org.koin.dsl.module

Expand All @@ -41,15 +35,7 @@ val common =
single { KubernetesProbeManager() }

single {
HttpClient(Apache) {
expectSuccess = true
install(ContentNegotiation) {
register(ContentType.Application.Json, JacksonConverter(customObjectMapper()))
jackson {
registerModule(JavaTimeModule())
}
}
}
createHttpClient(3)
}
}

Expand Down
50 changes: 50 additions & 0 deletions src/main/kotlin/no/nav/syfo/util/HttpClientUtil.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package no.nav.syfo.util

import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
import io.ktor.client.HttpClient
import io.ktor.client.HttpClientConfig
import io.ktor.client.engine.apache5.Apache5
import io.ktor.client.network.sockets.ConnectTimeoutException
import io.ktor.client.network.sockets.SocketTimeoutException
import io.ktor.client.plugins.HttpRequestRetry
import io.ktor.client.plugins.HttpRequestTimeoutException
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.client.request.HttpRequestBuilder
import io.ktor.client.request.header
import io.ktor.http.ContentType
import io.ktor.serialization.jackson.JacksonConverter
import io.ktor.serialization.jackson.jackson

internal fun createHttpClient(maxRetries: Int): HttpClient = HttpClient(Apache5) { configure(maxRetries) }

internal fun HttpClientConfig<*>.configure(retries: Int) {
expectSuccess = true

install(ContentNegotiation) {
register(ContentType.Application.Json, JacksonConverter(customObjectMapper()))
jackson {
registerModule(JavaTimeModule())
}
}
install(HttpRequestRetry) {
maxRetries = retries
retryOnServerErrors(maxRetries)
retryOnExceptionIf { _, cause ->
cause.isRetryableException()
}
exponentialDelay()
}
}

internal fun HttpRequestBuilder.navCallId(callId: String) {
header("Nav-Call-Id", callId)
}

private fun Throwable.isRetryableException() =
when (this) {
is SocketTimeoutException -> true
is ConnectTimeoutException -> true
is HttpRequestTimeoutException -> true
is java.net.SocketTimeoutException -> true
else -> false
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class DokArkivClientTest {
runBlocking {
val req = mapOppdaterRequest("123")
val resultat = dokArkivClient.oppdaterJournalpost("111", req, "")
assertEquals(HttpStatusCode.OK, resultat.status)
assertEquals(HttpStatusCode.OK, resultat)
}
}

Expand All @@ -46,7 +46,7 @@ class DokArkivClientTest {
runBlocking {
val req = mapFeilregistrertRequest("123", "dok123")
val resultat = dokArkivClient.oppdaterJournalpost("111", req, "")
assertEquals(HttpStatusCode.OK, resultat.status)
assertEquals(HttpStatusCode.OK, resultat)
}
}

Expand Down
Loading