Skip to content

Commit

Permalink
Gjør saksbehandlers epostadresse tilgjengelig for avdelingsleder (#2086)
Browse files Browse the repository at this point in the history
  • Loading branch information
dijjal authored Jun 11, 2024
1 parent 650628f commit e12d52c
Show file tree
Hide file tree
Showing 9 changed files with 60 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
@ApplicationScoped
public class AnsattTjeneste {

private static final LRUCache<String, String> ANSATT_NAVN = new LRUCache<>(1000, TimeUnit.MILLISECONDS.convert(24 * 7, TimeUnit.HOURS));
private static final LRUCache<String, BrukerProfil> ANSATT_PROFIL = new LRUCache<>(1000, TimeUnit.MILLISECONDS.convert(24 * 7, TimeUnit.HOURS));
private static final LRUCache<String, List<String>> ANSATT_ENHETER = new LRUCache<>(1000, TimeUnit.MILLISECONDS.convert(25, TimeUnit.HOURS));

private EnhetstilgangTjeneste enhetstilgangTjeneste;
Expand All @@ -30,21 +30,21 @@ 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<String> hentAvdelingerNavnForAnsatt(String ident) {
if (aktuelleEnhetIder == null) {
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()))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package no.nav.foreldrepenger.los.organisasjon.ansatt;

public record BrukerProfil(String ident, String navn, String epostAdresse) {
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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());
}
Expand All @@ -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()) {
Expand All @@ -64,30 +81,21 @@ 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));
}
return attribute;
}

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);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -55,7 +56,8 @@ public List<ReservasjonDto> hentAvdelingensReservasjoner(@NotNull @QueryParam("a

private List<ReservasjonDto> tilReservasjonDtoListe(List<Reservasjon> 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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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());
}

Expand All @@ -83,12 +85,12 @@ public Optional<SaksbehandlerDto> tilSaksbehandlerDto(Saksbehandler saksbehandle

private Optional<SaksbehandlerDto> 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<String> hentSaksbehandlerNavn(String ident) {
public Optional<BrukerProfil> 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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ public String getNavn() {
return saksbehandlerDto.navn();
}

@JsonProperty("epostAdresse")
public String getEpostAdresse() {
return saksbehandlerDto.epostAdresse();
}

@JsonProperty("avdelingsnavn")
public List<String> getAvdelingsnavn() {
return avdelingsnavn;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit e12d52c

Please sign in to comment.