Skip to content

Commit

Permalink
Juster HTML sanitazion slik at den kun kjøres på relevante tekster.
Browse files Browse the repository at this point in the history
Navn i brukersituasjonvilkår kan feks inneholde ', og det er greit
fordi disse tekstene bare blir rendret som plaintext.
  • Loading branch information
olesls committed Oct 17, 2024
1 parent 4bb7a90 commit 9abdbb2
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,10 @@ data class Opplysning(
ledetekst = ledetekst,
innhold = Tekst(innhold),
)

init {
sanitize(ledetekst)
}
}

data class EnkelOpplysning(
Expand All @@ -202,21 +206,17 @@ data class Tekst(
(forhåndsdefinertTekst != null && fritekst == null) ||
(forhåndsdefinertTekst == null && fritekst != null),
) { "Én, og bare én, av forhåndsdefinertTekst eller fritekst må ha verdi. Mottok forhåndsdefinertTekst <$forhåndsdefinertTekst> og fritekst <$fritekst>" }

sanitize(begrepsforklaring)
sanitize(forhåndsdefinertTekst)
}
}

private val htmlPolicy = HtmlPolicyBuilder().allowElements("em", "strong").toFactory()

data class LokalisertTekst(
val nb: String,
val nn: String,
) {
constructor(norsk: String) : this(nb = norsk, nn = norsk) // For enkle tekster som er like på begge målformer

init {
require(nb == htmlPolicy.sanitize(nb)) { "Ugyldig HTML i nb" }
require(nn == htmlPolicy.sanitize(nn)) { "Ugyldig HTML i nn" }
}
}

data class Varsel(
Expand All @@ -230,3 +230,11 @@ enum class Varseltype {
}

private fun tilPrioritet(hast: Hast?): Prioritet = if (hast != null) Prioritet.HAST else Prioritet.NORMAL

private val htmlPolicy = HtmlPolicyBuilder().allowElements("em", "strong").toFactory()

private fun sanitize(tekst: LokalisertTekst?) {
if (tekst == null) return
require(tekst.nb == htmlPolicy.sanitize(tekst.nb)) { "Ugyldig HTML i nb" }
require(tekst.nn == htmlPolicy.sanitize(tekst.nn)) { "Ugyldig HTML i nn" }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package no.nav.hjelpemidler.behovsmeldingsmodell.v2

import no.nav.hjelpemidler.behovsmeldingsmodell.test.jsonMapper
import no.nav.hjelpemidler.behovsmeldingsmodell.test.readResource
import no.nav.hjelpemidler.behovsmeldingsmodell.v1.Behovsmelding
import no.nav.hjelpemidler.behovsmeldingsmodell.v1.BehovsmeldingResponse
import no.nav.hjelpemidler.behovsmeldingsmodell.v2.mapping.tilInnsenderbehovsmeldingV2
import org.junit.jupiter.api.assertDoesNotThrow
import org.junit.jupiter.api.assertThrows
import kotlin.test.Test
import kotlin.test.assertTrue

class InnsenderbehovsmeldingMapperTest {

private val søknad =
jsonMapper.readResource<BehovsmeldingResponse>("/behovsmeldinger/behovsmelding_søknad_nyere.json")
.behovsmelding.søknad!!

@Test
fun `Skal feile ved ikke-godkjent HTML i en opplysning sin ledetekst`() {
assertThrows<IllegalArgumentException> {
Opplysning(
ledetekst = LokalisertTekst("<script>alert('XSS');</script>"),
innhold = "ok",
)
}
}

@Test
fun `Skal feile ved ikke-godkjent HTML i en opplysning sitt innhold`() {
assertDoesNotThrow {
Opplysning(
ledetekst = LokalisertTekst("ok"),
innhold = "<a href=\"javascript:alert('XSS')\">Vi bryr oss ikke om HTML i fritekst</a>",
)
}

assertThrows<IllegalArgumentException> {
Opplysning(
ledetekst = LokalisertTekst("ok"),
innhold = LokalisertTekst("<a href=\"javascript:alert('XSS')\">Click me</a>"),
)
}
}

@Test
fun `Skal ikke feile ved ikke-godkjent HTML i brukernavn`() {
val fornavn = "<div title='John's profile'>Bryr oss ikke om HTML her</div>"
val behovsmeldingV1 =
Behovsmelding(søknad = søknad.copy(bruker = søknad.bruker.copy(fornavn = fornavn)))
val behovsmeldingV2 = assertDoesNotThrow { tilInnsenderbehovsmeldingV2(behovsmeldingV1) }
assertTrue(behovsmeldingV2.brukersituasjon.vilkår.any { it.tekst.nb.contains(fornavn) })
}
}

0 comments on commit 9abdbb2

Please sign in to comment.