diff --git a/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/AnsattTjeneste.java b/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/AnsattTjeneste.java index 8684e082f..4da692251 100644 --- a/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/AnsattTjeneste.java +++ b/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/AnsattTjeneste.java @@ -13,7 +13,7 @@ @ApplicationScoped public class AnsattTjeneste { - private static final LRUCache ANSATT_NAVN = new LRUCache<>(1000, TimeUnit.MILLISECONDS.convert(25, TimeUnit.HOURS)); + private static final LRUCache ANSATT_PROFIL = new LRUCache<>(1000, TimeUnit.MILLISECONDS.convert(25, TimeUnit.HOURS)); private static final LRUCache> ANSATT_ENHETER = new LRUCache<>(1000, TimeUnit.MILLISECONDS.convert(25, TimeUnit.HOURS)); private EnhetstilgangTjeneste enhetstilgangTjeneste; @@ -30,13 +30,13 @@ public AnsattTjeneste(EnhetstilgangTjeneste enhetstilgangTjeneste, OrganisasjonR this.organisasjonRepository = organisasjonRepository; } - public String hentAnsattNavn(String ident) { - if (ANSATT_NAVN.get(ident) == null) { + public BrukerProfil hentBrukerProfil(String ident) { + if (ANSATT_PROFIL.get(ident) == null) { // TODO: Erstatt med MS Graph API - var navn = new LdapBrukeroppslag().hentBrukersNavn(ident); - ANSATT_NAVN.put(ident, navn); + var brukerProfil = new LdapBrukeroppslag().hentBrukerProfil(ident); + ANSATT_PROFIL.put(ident, brukerProfil); } - return ANSATT_NAVN.get(ident); + return ANSATT_PROFIL.get(ident); } public List hentAvdelingerNavnForAnsatt(String ident) { @@ -44,7 +44,7 @@ public List hentAvdelingerNavnForAnsatt(String ident) { aktuelleEnhetIder = organisasjonRepository.hentAktiveAvdelinger().stream().map(Avdeling::getAvdelingEnhet).toList(); } if (ANSATT_ENHETER.get(ident) == null) { - // TODO: Fjerne axsys og bruk orgrepo.hentSaksbehandler og returner enheter + // TODO: Fjerne axsys. Alternativt vise kun epost var enheter = enhetstilgangTjeneste.hentEnhetstilganger(ident) .stream() .filter(oe -> aktuelleEnhetIder.contains(oe.enhetId())) diff --git a/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/BrukerProfil.java b/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/BrukerProfil.java new file mode 100644 index 000000000..3b4bb080d --- /dev/null +++ b/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/BrukerProfil.java @@ -0,0 +1,4 @@ +package no.nav.foreldrepenger.los.organisasjon.ansatt; + +public record BrukerProfil(String ident, String navn, String epostAdresse) { +} diff --git a/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/LdapBrukeroppslag.java b/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/LdapBrukeroppslag.java index d8edc1688..b37adb549 100644 --- a/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/LdapBrukeroppslag.java +++ b/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/LdapBrukeroppslag.java @@ -1,6 +1,5 @@ package no.nav.foreldrepenger.los.organisasjon.ansatt; -import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.naming.InvalidNameException; @@ -15,14 +14,20 @@ import no.nav.vedtak.exception.IntegrasjonException; import no.nav.vedtak.exception.TekniskException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class LdapBrukeroppslag { + private static final Logger LOG = LoggerFactory.getLogger(LdapBrukeroppslag.class); + private static final Pattern IDENT_PATTERN = Pattern.compile("^\\p{LD}+$"); + private static final String DISPLAY_NAME_ATTR = "displayName"; + private static final String USER_PRINCIPAL_NAME_ATTR = "userPrincipalName"; + private final LdapContext context; private final LdapName searchBase; - private static final Pattern IDENT_PATTERN = Pattern.compile("^\\p{LD}+$"); - public LdapBrukeroppslag() { this(LdapInnlogging.lagLdapContext(), lagLdapSearchBase()); } @@ -32,24 +37,36 @@ public LdapBrukeroppslag() { this.searchBase = searcBase; } - public String hentBrukersNavn(String ident) { + public BrukerProfil hentBrukerProfil(String ident) { var result = ldapSearch(ident.trim()); - return getDisplayName(result); + var displayName = find(result, DISPLAY_NAME_ATTR); + var upn = find(result, USER_PRINCIPAL_NAME_ATTR); + try { + var navn = displayName.get().toString(); + var epostAdresse = upn.get().toString(); + if (!epostAdresse.contains("@nav.no")) { + LOG.info("LDAP: fant ikke gyldig epostadresse for bruker {}", ident); + } + return new BrukerProfil(ident, navn, epostAdresse); + } catch (NamingException e) { + throw new TekniskException("F-314006", String.format("Kunne ikke hente ut attributtverdi for ident %s", ident), e); + } } private SearchResult ldapSearch(String ident) { if (ident == null || ident.isEmpty()) { throw new TekniskException("F-344885", "Kan ikke slå opp brukernavn uten å ha ident"); } - Matcher matcher = IDENT_PATTERN.matcher(ident); + var matcher = IDENT_PATTERN.matcher(ident); if (!matcher.matches()) { throw new TekniskException("F-271934", String.format("Mulig LDAP-injection forsøk. Søkte med ugyldig ident '%s'", ident)); } - SearchControls controls = new SearchControls(); + var controls = new SearchControls(); controls.setSearchScope(SearchControls.SUBTREE_SCOPE); controls.setCountLimit(1); - String søkestreng = String.format("(cn=%s)", ident); + controls.setReturningAttributes(new String[]{DISPLAY_NAME_ATTR, USER_PRINCIPAL_NAME_ATTR}); + var søkestreng = String.format("(cn=%s)", ident); try { var result = context.search(searchBase, søkestreng, controls); // NOSONAR if (result.hasMoreElements()) { @@ -64,18 +81,8 @@ private SearchResult ldapSearch(String ident) { } } - protected String getDisplayName(SearchResult result) { - String attributeName = "displayName"; - Attribute displayName = find(result, attributeName); - try { - return displayName.get().toString(); - } catch (NamingException e) { - throw new TekniskException("F-314006", String.format("Kunne ikke hente ut attributtverdi %s fra %s", attributeName, attributeName), e); - } - } - private static Attribute find(SearchResult element, String attributeName) { - Attribute attribute = element.getAttributes().get(attributeName); + var attribute = element.getAttributes().get(attributeName); if (attribute == null) { throw new IntegrasjonException("F-828846", String.format("Resultat fra LDAP manglet påkrevet attributtnavn %s", attributeName)); } @@ -83,11 +90,12 @@ private static Attribute find(SearchResult element, String attributeName) { } private static LdapName lagLdapSearchBase() { - String userBaseDn = LdapInnlogging.getRequiredProperty("ldap.user.basedn"); + var userBaseDn = LdapInnlogging.getRequiredProperty("ldap.user.basedn"); try { return new LdapName(userBaseDn); // NOSONAR } catch (InvalidNameException e) { throw new IntegrasjonException("F-703197", String.format("Kunne ikke definere base-søk mot LDAP %s", userBaseDn), e); } } + } diff --git a/src/main/java/no/nav/foreldrepenger/los/tjenester/avdelingsleder/reservasjon/AvdelingReservasjonerRestTjeneste.java b/src/main/java/no/nav/foreldrepenger/los/tjenester/avdelingsleder/reservasjon/AvdelingReservasjonerRestTjeneste.java index 5a04513cd..e061ae8cb 100644 --- a/src/main/java/no/nav/foreldrepenger/los/tjenester/avdelingsleder/reservasjon/AvdelingReservasjonerRestTjeneste.java +++ b/src/main/java/no/nav/foreldrepenger/los/tjenester/avdelingsleder/reservasjon/AvdelingReservasjonerRestTjeneste.java @@ -2,6 +2,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import no.nav.foreldrepenger.los.organisasjon.ansatt.BrukerProfil; import no.nav.foreldrepenger.los.reservasjon.Reservasjon; import no.nav.foreldrepenger.los.reservasjon.ReservasjonTjeneste; import no.nav.foreldrepenger.los.tjenester.avdelingsleder.dto.AvdelingEnhetDto; @@ -55,7 +56,8 @@ public List hentAvdelingensReservasjoner(@NotNull @QueryParam("a private List tilReservasjonDtoListe(List reservasjoner) { return reservasjoner.stream().map(reservasjon -> { - var reservertAvNavn = saksbehandlerDtoTjeneste.hentSaksbehandlerNavn(reservasjon.getReservertAv()) + var reservertAvNavn = saksbehandlerDtoTjeneste.hentBrukerProfil(reservasjon.getReservertAv()) + .map(BrukerProfil::navn) .orElseGet(() -> "Ukjent saksbehandler " + reservasjon.getReservertAv()); return new ReservasjonDto(reservasjon, reservertAvNavn, null); }).toList(); diff --git a/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/ReservasjonStatusDtoTjeneste.java b/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/ReservasjonStatusDtoTjeneste.java index 876ec3a8a..a797134bd 100644 --- a/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/ReservasjonStatusDtoTjeneste.java +++ b/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/ReservasjonStatusDtoTjeneste.java @@ -7,6 +7,7 @@ import no.nav.foreldrepenger.los.oppgave.Oppgave; import no.nav.foreldrepenger.los.organisasjon.ansatt.AnsattTjeneste; +import no.nav.foreldrepenger.los.organisasjon.ansatt.BrukerProfil; import no.nav.foreldrepenger.los.reservasjon.Reservasjon; @ApplicationScoped @@ -43,7 +44,9 @@ private String hentNavn(String ident) { if (ident == null) { return null; } - return tryOrEmpty(() -> ansattTjeneste.hentAnsattNavn(ident), "ldap").orElse("Ukjent"); + return tryOrEmpty(() -> ansattTjeneste.hentBrukerProfil(ident), "ldap") + .map(BrukerProfil::navn) + .orElse("Ukjent"); } private ReservasjonStatusDto systembrukerSpesialTilfelle(Reservasjon reservasjon) { diff --git a/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerDto.java b/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerDto.java index 9fc741213..840576a63 100644 --- a/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerDto.java +++ b/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerDto.java @@ -1,6 +1,6 @@ package no.nav.foreldrepenger.los.tjenester.felles.dto; -public record SaksbehandlerDto(SaksbehandlerBrukerIdentDto brukerIdent, String navn) { +public record SaksbehandlerDto(SaksbehandlerBrukerIdentDto brukerIdent, String navn, String epostAdresse) { @Override public String toString() { diff --git a/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerDtoTjeneste.java b/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerDtoTjeneste.java index 343dc8823..81e972ac2 100644 --- a/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerDtoTjeneste.java +++ b/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerDtoTjeneste.java @@ -7,6 +7,8 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; +import no.nav.foreldrepenger.los.organisasjon.ansatt.BrukerProfil; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -72,7 +74,7 @@ public SaksbehandlerMedAvdelingerDto lagKjentOgUkjentSaksbehandlerMedAvdelingerD var avdelinger = ansattTjeneste.hentAvdelingerNavnForAnsatt(ident); return new SaksbehandlerMedAvdelingerDto(saksbehandlerDto.get(), avdelinger); } - var ukjent = new SaksbehandlerDto(new SaksbehandlerBrukerIdentDto(ident), "Ukjent saksbehandler " + ident); + var ukjent = new SaksbehandlerDto(new SaksbehandlerBrukerIdentDto(ident), "Ukjent saksbehandler " + ident, null); return new SaksbehandlerMedAvdelingerDto(ukjent, Collections.emptyList()); } @@ -83,12 +85,12 @@ public Optional tilSaksbehandlerDto(Saksbehandler saksbehandle private Optional tilSaksbehandlerDto(String ident) { var identDto = new SaksbehandlerBrukerIdentDto(ident); - return hentSaksbehandlerNavn(ident).map(navn -> new SaksbehandlerDto(identDto, navn)); + return hentBrukerProfil(ident).map(bp -> new SaksbehandlerDto(identDto, bp.navn(), bp.epostAdresse())); } - public Optional hentSaksbehandlerNavn(String ident) { + public Optional hentBrukerProfil(String ident) { try { - return Optional.of(ansattTjeneste.hentAnsattNavn(ident)); + return Optional.of(ansattTjeneste.hentBrukerProfil(ident)); } catch (IntegrasjonException e) { LOG.info("Henting av ansattnavn feilet, fortsetter med empty.", e); return Optional.empty(); diff --git a/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerMedAvdelingerDto.java b/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerMedAvdelingerDto.java index a88d5aba7..5f5226e0c 100644 --- a/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerMedAvdelingerDto.java +++ b/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerMedAvdelingerDto.java @@ -24,6 +24,12 @@ public String getNavn() { return saksbehandlerDto.navn(); } + @JsonProperty("epostAdresse") + public String getEpostAdresse() { + return saksbehandlerDto.epostAdresse(); + } + + @JsonProperty("avdelingsnavn") public List getAvdelingsnavn() { return avdelingsnavn; } diff --git a/src/test/java/no/nav/foreldrepenger/los/tjenester/avdelingsleder/saksbehandler/AvdelingslederSaksbehandlerRestTjenesteTest.java b/src/test/java/no/nav/foreldrepenger/los/tjenester/avdelingsleder/saksbehandler/AvdelingslederSaksbehandlerRestTjenesteTest.java index 0dda3276b..78078add9 100644 --- a/src/test/java/no/nav/foreldrepenger/los/tjenester/avdelingsleder/saksbehandler/AvdelingslederSaksbehandlerRestTjenesteTest.java +++ b/src/test/java/no/nav/foreldrepenger/los/tjenester/avdelingsleder/saksbehandler/AvdelingslederSaksbehandlerRestTjenesteTest.java @@ -42,7 +42,7 @@ class AvdelingslederSaksbehandlerRestTjenesteTest { private static final AvdelingEnhetDto avdelingDto = new AvdelingEnhetDto("4817"); private static final SaksbehandlerBrukerIdentDto brukerIdentDto = new SaksbehandlerBrukerIdentDto("Z999999"); - private static final SaksbehandlerDto saksbehandlerDto = new SaksbehandlerDto(brukerIdentDto, "Navn Navnesen"); + private static final SaksbehandlerDto saksbehandlerDto = new SaksbehandlerDto(brukerIdentDto, "Navn Navnesen", "navn@navnesen.no"); private AvdelingslederSaksbehandlerTjeneste avdelingslederSaksbehandlerTjeneste; @Mock private SaksbehandlerDtoTjeneste saksbehandlerDtoTjeneste;