diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/InnloggetBrukerService.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/InnloggetBrukerService.kt index b352a341..c211df9a 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/InnloggetBrukerService.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/InnloggetBrukerService.kt @@ -5,27 +5,31 @@ import no.nav.arbeidsgiver.tiltakrefusjon.altinn.AltinnTilgangsstyringService import no.nav.arbeidsgiver.tiltakrefusjon.inntekt.InntektskomponentService import no.nav.arbeidsgiver.tiltakrefusjon.norg.NorgService import no.nav.arbeidsgiver.tiltakrefusjon.okonomi.KontoregisterService -import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.* +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.Fnr +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.KorreksjonRepository +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.RefusjonRepository +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.RefusjonService import no.nav.arbeidsgiver.tiltakrefusjon.utils.Issuer import no.nav.arbeidsgiver.tiltakrefusjon.utils.getClaims import no.nav.security.token.support.core.context.TokenValidationContextHolder import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.stereotype.Component +import java.util.* @Observed @Component class InnloggetBrukerService( val context: TokenValidationContextHolder, val altinnTilgangsstyringService: AltinnTilgangsstyringService, - val abacTilgangsstyringService: AbacTilgangsstyringService, + val tilgangskontrollService: TilgangskontrollService, val refusjonRepository: RefusjonRepository, val korreksjonRepository: KorreksjonRepository, val refusjonService: RefusjonService, val inntektskomponentService: InntektskomponentService, val kontoregisterService: KontoregisterService, val norgService: NorgService, - val beslutterRolleConfig: BeslutterRolleConfig + val beslutterRolleConfig: BeslutterRolleConfig, ) { var logger: Logger = LoggerFactory.getLogger(javaClass) @@ -47,7 +51,13 @@ class InnloggetBrukerService( } fun navIdent(): String { - return context.getClaims(Issuer.AZURE)?.getStringClaim("NAVident") ?: throw IllegalArgumentException("Forsøker å hente navident for bruker som ikke er NAV-ansatt") + return context.getClaims(Issuer.AZURE)?.getStringClaim("NAVident") + ?: throw IllegalArgumentException("Forsøker å hente navident for bruker som ikke er NAV-ansatt") + } + + fun azureOid(): UUID { + return context.getClaims(Issuer.AZURE)?.getStringClaim("oid")?.let { UUID.fromString(it) } + ?: throw IllegalArgumentException("Forsøker å hente azure oid for bruker som ikke er NAV-ansatt") } fun displayName(): String { @@ -61,7 +71,10 @@ class InnloggetBrukerService( fun hentInnloggetArbeidsgiver(): InnloggetArbeidsgiver { return when { erArbeidsgiver() -> { - val fnr = Fnr(context.getClaims(Issuer.TOKEN_X)?.getStringClaim("pid") ?: throw IllegalArgumentException("Forsøker å hente pid for bruker som ikke er arbeidsgiver")) + val fnr = Fnr( + context.getClaims(Issuer.TOKEN_X)?.getStringClaim("pid") + ?: throw IllegalArgumentException("Forsøker å hente pid for bruker som ikke er arbeidsgiver") + ) InnloggetArbeidsgiver(fnr.verdi, altinnTilgangsstyringService, refusjonRepository, korreksjonRepository, refusjonService) } @@ -77,7 +90,8 @@ class InnloggetBrukerService( InnloggetSaksbehandler( identifikator = navIdent(), navn = displayName(), - abacTilgangsstyringService = abacTilgangsstyringService, + azureOid = azureOid(), + tilgangskontrollService = tilgangskontrollService, refusjonRepository = refusjonRepository, korreksjonRepository = korreksjonRepository, refusjonService = refusjonService, diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/InnloggetSaksbehandler.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/InnloggetSaksbehandler.kt index 593879f1..6b459c01 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/InnloggetSaksbehandler.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/InnloggetSaksbehandler.kt @@ -5,17 +5,35 @@ import no.nav.arbeidsgiver.tiltakrefusjon.RessursFinnesIkkeException import no.nav.arbeidsgiver.tiltakrefusjon.inntekt.InntektskomponentService import no.nav.arbeidsgiver.tiltakrefusjon.norg.NorgService import no.nav.arbeidsgiver.tiltakrefusjon.okonomi.KontoregisterService -import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.* +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.Beregning +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.BrukerRolle +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.HentSaksbehandlerRefusjonerQueryParametre +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.Inntektsgrunnlag +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.Korreksjon +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.KorreksjonRepository +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.Korreksjonsgrunn +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.Refusjon +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.RefusjonRepository +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.RefusjonService +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.RefusjonStatus +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.Tiltakstype +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.beregnRefusjonsbeløp import org.slf4j.Logger import org.slf4j.LoggerFactory -import org.springframework.data.domain.* +import org.springframework.data.domain.Page +import org.springframework.data.domain.PageImpl +import org.springframework.data.domain.PageRequest +import org.springframework.data.domain.Pageable +import org.springframework.data.domain.Sort import org.springframework.data.repository.findByIdOrNull import java.time.LocalDate +import java.util.* data class InnloggetSaksbehandler( override val identifikator: String, + val azureOid: UUID, val navn: String, - @JsonIgnore val abacTilgangsstyringService: AbacTilgangsstyringService, + @JsonIgnore val tilgangskontrollService: TilgangskontrollService, @JsonIgnore val norgeService: NorgService, @JsonIgnore val refusjonRepository: RefusjonRepository, @JsonIgnore val korreksjonRepository: KorreksjonRepository, @@ -26,6 +44,7 @@ data class InnloggetSaksbehandler( ) : InnloggetBruker { @JsonIgnore val log: Logger = LoggerFactory.getLogger(javaClass) + val internIdentifikatorer = InternIdentifikatorer(identifikator, azureOid) override val rolle: BrukerRolle = BrukerRolle.BESLUTTER fun finnAlle(queryParametre: HentSaksbehandlerRefusjonerQueryParametre): Map { @@ -35,46 +54,46 @@ data class InnloggetSaksbehandler( val tiltakstyper = if (queryParametre.tiltakstype != null) listOf(queryParametre.tiltakstype) else Tiltakstype.values().toList() val liste: Page = - if (!queryParametre.veilederNavIdent.isNullOrBlank()) { - refusjonRepository.findAllByRefusjonsgrunnlag_Tilskuddsgrunnlag_VeilederNavIdentAndStatusInAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeIn( - queryParametre.veilederNavIdent, - statuser, - tiltakstyper, - pageable - ) - } else if (!queryParametre.deltakerFnr.isNullOrBlank()) { - refusjonRepository.findAllByDeltakerFnrAndStatusInAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeIn( - queryParametre.deltakerFnr, - statuser, - tiltakstyper, - pageable - ) - } else if (!queryParametre.bedriftNr.isNullOrBlank()) { - refusjonRepository.findAllByBedriftNrAndStatusInAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeIn( - queryParametre.bedriftNr, - statuser, - tiltakstyper, - pageable - ) - } else if (!queryParametre.enhet.isNullOrBlank()) { - refusjonRepository.findAllByRefusjonsgrunnlag_Tilskuddsgrunnlag_EnhetAndStatusInAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeIn( - queryParametre.enhet, - statuser, - tiltakstyper, - pageable - ) - } else if (queryParametre.avtaleNr != null) { - refusjonRepository.findAllByRefusjonsgrunnlag_Tilskuddsgrunnlag_AvtaleNrAndStatusInAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeIn( - queryParametre.avtaleNr!!, - statuser, - tiltakstyper, - pageable - ) - } else { - PageImpl(emptyList()) - } + if (!queryParametre.veilederNavIdent.isNullOrBlank()) { + refusjonRepository.findAllByRefusjonsgrunnlag_Tilskuddsgrunnlag_VeilederNavIdentAndStatusInAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeIn( + queryParametre.veilederNavIdent, + statuser, + tiltakstyper, + pageable + ) + } else if (!queryParametre.deltakerFnr.isNullOrBlank()) { + refusjonRepository.findAllByDeltakerFnrAndStatusInAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeIn( + queryParametre.deltakerFnr, + statuser, + tiltakstyper, + pageable + ) + } else if (!queryParametre.bedriftNr.isNullOrBlank()) { + refusjonRepository.findAllByBedriftNrAndStatusInAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeIn( + queryParametre.bedriftNr, + statuser, + tiltakstyper, + pageable + ) + } else if (!queryParametre.enhet.isNullOrBlank()) { + refusjonRepository.findAllByRefusjonsgrunnlag_Tilskuddsgrunnlag_EnhetAndStatusInAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeIn( + queryParametre.enhet, + statuser, + tiltakstyper, + pageable + ) + } else if (queryParametre.avtaleNr != null) { + refusjonRepository.findAllByRefusjonsgrunnlag_Tilskuddsgrunnlag_AvtaleNrAndStatusInAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeIn( + queryParametre.avtaleNr!!, + statuser, + tiltakstyper, + pageable + ) + } else { + PageImpl(emptyList()) + } - val refusjonerMedTilgang = liste.content.filter { abacTilgangsstyringService.harLeseTilgang(identifikator, it.deltakerFnr) } + val refusjonerMedTilgang = liste.content.filter { tilgangskontrollService.harLeseTilgang(internIdentifikatorer, it.deltakerFnr) } val response = mapOf( Pair("refusjoner", refusjonerMedTilgang), Pair("size", liste.size), @@ -102,7 +121,7 @@ data class InnloggetSaksbehandler( if (korreksjon.skalGjøreInntektsoppslag()) { var antallMånederSomSkalSjekkes: Long = 1 if (korreksjon.korreksjonsgrunner.contains(Korreksjonsgrunn.HENT_INNTEKTER_TO_MÅNEDER_FREM)) { - if(korreksjon.unntakOmInntekterFremitid != null) { + if (korreksjon.unntakOmInntekterFremitid != null) { antallMånederSomSkalSjekkes = korreksjon.unntakOmInntekterFremitid.toLong() } else { antallMånederSomSkalSjekkes = 2 @@ -127,16 +146,17 @@ data class InnloggetSaksbehandler( } private fun sjekkLesetilgang(refusjon: Refusjon) { - if (!abacTilgangsstyringService.harLeseTilgang(identifikator, refusjon.deltakerFnr)) { + if (!tilgangskontrollService.harLeseTilgang(internIdentifikatorer, refusjon.deltakerFnr)) { throw TilgangskontrollException() } } private fun sjekkLesetilgang(korreksjon: Korreksjon) { - if (!abacTilgangsstyringService.harLeseTilgang(identifikator, korreksjon.deltakerFnr)) { + if (!tilgangskontrollService.harLeseTilgang(internIdentifikatorer, korreksjon.deltakerFnr)) { throw TilgangskontrollException() } } + private fun sjekkKorreksjonTilgang() { if (!harKorreksjonTilgang) { throw TilgangskontrollException() @@ -171,7 +191,7 @@ data class InnloggetSaksbehandler( val refusjon = finnRefusjon(korreksjon.korrigererRefusjonId) sjekkLesetilgang(refusjon) - korreksjon.utbetalKorreksjon(this, korreksjon.refusjonsgrunnlag.tilskuddsgrunnlag.enhet?: "") + korreksjon.utbetalKorreksjon(this, korreksjon.refusjonsgrunnlag.tilskuddsgrunnlag.enhet ?: "") refusjon.status = RefusjonStatus.KORRIGERT refusjonRepository.save(refusjon) @@ -273,7 +293,7 @@ data class InnloggetSaksbehandler( tilskuddsgrunnlag = refusjon.refusjonsgrunnlag.tilskuddsgrunnlag, tidligereUtbetalt = 0, korrigertBruttoLønn = refusjon.refusjonsgrunnlag.endretBruttoLønn, - fratrekkRefunderbarSum =refusjon.refusjonsgrunnlag.refunderbarBeløp, + fratrekkRefunderbarSum = refusjon.refusjonsgrunnlag.refunderbarBeløp, forrigeRefusjonMinusBeløp = minusBeløp, tilskuddFom = refusjon.refusjonsgrunnlag.tilskuddsgrunnlag.tilskuddFom, harFerietrekkForSammeMåned = harFerietrekkForSammeMåned, diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/InternIdentifikatorer.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/InternIdentifikatorer.kt new file mode 100644 index 00000000..76e934b0 --- /dev/null +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/InternIdentifikatorer.kt @@ -0,0 +1,8 @@ +package no.nav.arbeidsgiver.tiltakrefusjon.autorisering + +import java.util.* + +data class InternIdentifikatorer( + val navIdent: String, + val azureOid: UUID +) diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/TilgangskontrollService.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/TilgangskontrollService.kt new file mode 100644 index 00000000..e3302ebb --- /dev/null +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/TilgangskontrollService.kt @@ -0,0 +1,12 @@ +package no.nav.arbeidsgiver.tiltakrefusjon.autorisering + +import org.springframework.stereotype.Service + +@Service +class TilgangskontrollService( + val abacTilgangsstyringService: AbacTilgangsstyringService +) { + fun harLeseTilgang(internIdentifikatorer: InternIdentifikatorer, deltakerFnr: String): Boolean { + return abacTilgangsstyringService.harLeseTilgang(internIdentifikatorer.navIdent, deltakerFnr) + } +} diff --git a/src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/InnloggetSaksbehandlerTest.kt b/src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/InnloggetSaksbehandlerTest.kt index 48fd18b2..d565db56 100644 --- a/src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/InnloggetSaksbehandlerTest.kt +++ b/src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/autorisering/InnloggetSaksbehandlerTest.kt @@ -14,6 +14,7 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMock import org.springframework.boot.test.context.SpringBootTest import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock import org.springframework.test.context.ActiveProfiles +import java.util.* @SpringBootTest @ActiveProfiles("local") @@ -21,22 +22,32 @@ import org.springframework.test.context.ActiveProfiles @AutoConfigureWireMock(port = 8091) class InnloggetSaksbehandlerTest( @Autowired val refusjonRepository: RefusjonRepository, - @Autowired val abacTilgangsstyringService: AbacTilgangsstyringService, + @Autowired val tilgangskontrollService: TilgangskontrollService, @Autowired val korreksjonRepository: KorreksjonRepository, @Autowired val refusjonService: RefusjonService, @Autowired val inntektskomponentService: FakeInntektskomponentService, @Autowired val kontoregisterService: FakeKontoregisterService, - @Autowired val norgService: NorgService) { - - + @Autowired val norgService: NorgService +) { @BeforeEach fun setUp() { refusjonRepository.deleteAll() refusjonRepository.saveAll(refusjoner()) } - val saksbehandler = InnloggetSaksbehandler("Z123456", "Geir", abacTilgangsstyringService, norgService, refusjonRepository, korreksjonRepository, refusjonService, inntektskomponentService, kontoregisterService, true) - + val saksbehandler = InnloggetSaksbehandler( + "Z123456", + UUID.fromString("550e8400-e29b-41d4-a716-446655440000"), + "Geir", + tilgangskontrollService, + norgService, + refusjonRepository, + korreksjonRepository, + refusjonService, + inntektskomponentService, + kontoregisterService, + true + ) @Test fun `saksbehandler får ikke opp refusjoner som den ikke har tilgang til`() { @@ -54,12 +65,9 @@ class InnloggetSaksbehandlerTest( fun `saksbehandler henter refusjoner for ett BedriftNr`() { val bedriftNrDetSlåesOppPå = "998877665" - val alleRefusjoner = saksbehandler.finnAlle(HentSaksbehandlerRefusjonerQueryParametre(size = 1000, bedriftNr = bedriftNrDetSlåesOppPå )) + val alleRefusjoner = saksbehandler.finnAlle(HentSaksbehandlerRefusjonerQueryParametre(size = 1000, bedriftNr = bedriftNrDetSlåesOppPå)) val refusjonerSaksbehandlerHartilgangtil = alleRefusjoner.get("refusjoner") as List Assertions.assertThat(refusjonerSaksbehandlerHartilgangtil).allMatch { it.bedriftNr == bedriftNrDetSlåesOppPå } assertEquals(4, refusjonerSaksbehandlerHartilgangtil.size) - } - - -} \ No newline at end of file +} diff --git a/src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/RefusjonApiTest.kt b/src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/RefusjonApiTest.kt index 130b7c89..02d29eed 100644 --- a/src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/RefusjonApiTest.kt +++ b/src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/RefusjonApiTest.kt @@ -70,7 +70,7 @@ class RefusjonApiTest( @SpykBean lateinit var consoleLogger: AuditConsoleLogger - val navToken = lagTokenForNavId("Z123456") + val navToken = lagTokenForNavId("Z123456", "550e8400-e29b-41d4-a716-446655440000") val arbGiverToken = lagTokenForFnr("16120102137") @BeforeEach @@ -369,11 +369,11 @@ class RefusjonApiTest( ).body() } - private final fun lagTokenForNavId(navId: String): String { + private final fun lagTokenForNavId(navId: String, azureId: String): String { return HttpClient.newHttpClient().send( HttpRequest.newBuilder() .GET() - .uri(URI.create("https://tiltak-fakelogin.ekstern.dev.nav.no/token?NAVident=${navId}&iss=aad&aud=aud-aad")) + .uri(URI.create("https://tiltak-fakelogin.ekstern.dev.nav.no/token?NAVident=${navId}&iss=aad&aud=aud-aad&oid=${azureId}")) .build(), BodyHandlers.ofString() ).body() }