diff --git a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/web-context.xml b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/web-context.xml index 19b4c10cb..cec77325e 100644 --- a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/web-context.xml +++ b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/web-context.xml @@ -252,7 +252,7 @@ - + @@ -337,8 +337,6 @@ - - @@ -362,7 +360,7 @@ - + diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/mdc/RemoteAddressMDCFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/mdc/RemoteAddressMDCFilter.java index 9739424f1..63db4f10f 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/mdc/RemoteAddressMDCFilter.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/mdc/RemoteAddressMDCFilter.java @@ -20,10 +20,10 @@ public class RemoteAddressMDCFilter { "REMOTE_ADDR" }; - private static final String REMOTE_ADDR = "remoteAddr"; + private static final String REMOTE_ADDRESS = "remoteAddr"; public void doFilter(ServletRequest servletRequest) { - MDC.put(REMOTE_ADDR, getRemoteAddr((HttpServletRequest) servletRequest)); + MDC.put(REMOTE_ADDRESS, getRemoteAddr((HttpServletRequest) servletRequest)); } private String getRemoteAddr(HttpServletRequest request) { @@ -37,7 +37,7 @@ public class RemoteAddressMDCFilter { return ipList.split(",")[0]; } } - return ""; + return "-"; } } diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/PerunConstants.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/PerunConstants.java new file mode 100644 index 000000000..b0463689c --- /dev/null +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/PerunConstants.java @@ -0,0 +1,11 @@ +package cz.muni.ics.oidc; + +public interface PerunConstants { + + String REGISTRAR_TARGET_NEW = "targetnew"; + String REGISTRAR_TARGET_EXISTING = "targetexisting"; + String REGISTRAR_TARGET_EXTENDED = "targetextended"; + + String REGISTRAR_PARAM_VO = "vo"; + +} diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunHTTPRedirectDeflateEncoder.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunHTTPRedirectDeflateEncoder.java index d325f1f3a..82de4ada5 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunHTTPRedirectDeflateEncoder.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunHTTPRedirectDeflateEncoder.java @@ -7,7 +7,7 @@ import org.opensaml.ws.message.encoder.MessageEncodingException; import org.opensaml.xml.util.Pair; import org.springframework.util.StringUtils; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.AARC_IDP_HINT; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.AARC_IDP_HINT; public class PerunHTTPRedirectDeflateEncoder extends HTTPRedirectDeflateEncoder { diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunOidcLogoutSuccessHandler.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunOidcLogoutSuccessHandler.java index 3c2dcea93..ca1ad9f8e 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunOidcLogoutSuccessHandler.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunOidcLogoutSuccessHandler.java @@ -1,7 +1,7 @@ package cz.muni.ics.oidc.saml; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_POST_LOGOUT_REDIRECT_URI; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_STATE; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_POST_LOGOUT_REDIRECT_URI; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_STATE; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunSamlEntryPoint.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunSamlEntryPoint.java index 4e2b33ce3..f8861ae29 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunSamlEntryPoint.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunSamlEntryPoint.java @@ -1,20 +1,20 @@ package cz.muni.ics.oidc.saml; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.AARC_IDP_HINT; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.CLIENT_ID_PREFIX; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.EFILTER_PREFIX; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.FILTER_PREFIX; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.IDP_ENTITY_ID_PREFIX; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_CLIENT_ID; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_PROMPT; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.REFEDS_MFA; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.AARC_IDP_HINT; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.CLIENT_ID_PREFIX; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.EFILTER_PREFIX; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.FILTER_PREFIX; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.IDP_ENTITY_ID_PREFIX; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_CLIENT_ID; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_PROMPT; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.REFEDS_MFA; import cz.muni.ics.oidc.models.Facility; import cz.muni.ics.oidc.models.PerunAttributeValue; import cz.muni.ics.oidc.server.adapters.PerunAdapter; import cz.muni.ics.oidc.server.configurations.FacilityAttrsConfig; import cz.muni.ics.oidc.server.configurations.PerunOidcConfig; -import cz.muni.ics.oidc.server.filters.PerunFilterConstants; +import cz.muni.ics.oidc.server.filters.AuthProcFilterConstants; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -160,12 +160,12 @@ public class PerunSamlEntryPoint extends SAMLEntryPoint { } private void processAcrValues(HttpServletRequest request, WebSSOProfileOptions options) { - String acrValues = request.getParameter(PerunFilterConstants.PARAM_ACR_VALUES); + String acrValues = request.getParameter(AuthProcFilterConstants.PARAM_ACR_VALUES); log.debug("Processing acr_values parameter: {}", acrValues); List acrs = convertAcrValuesToList(acrValues); if (!hasAcrForcingIdp(acrs)) { - String clientId = request.getParameter(PerunFilterConstants.PARAM_CLIENT_ID); + String clientId = request.getParameter(AuthProcFilterConstants.PARAM_CLIENT_ID); String idpFilter = extractIdpFilterForRp(clientId); if (idpFilter != null) { log.debug("Added IdP filter as SAML AuthnContextClassRef ({})", idpFilter); diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunSamlUtils.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunSamlUtils.java index 8742fe6f4..530c6a5e8 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunSamlUtils.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/PerunSamlUtils.java @@ -1,12 +1,12 @@ package cz.muni.ics.oidc.saml; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_ACR_VALUES; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_FORCE_AUTHN; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_PROMPT; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PROMPT_LOGIN; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PROMPT_SELECT_ACCOUNT; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_ACR_VALUES; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_FORCE_AUTHN; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_PROMPT; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PROMPT_LOGIN; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PROMPT_SELECT_ACCOUNT; -import cz.muni.ics.oidc.server.filters.PerunFilterConstants; +import cz.muni.ics.oidc.server.filters.AuthProcFilterConstants; import javax.servlet.ServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; @@ -32,7 +32,7 @@ public class PerunSamlUtils { public static boolean needsReAuthByMfa(ServletRequest request) { String acrValues = request.getParameter(PARAM_ACR_VALUES); boolean res = StringUtils.hasText(acrValues) - && acrValues.contains(PerunFilterConstants.REFEDS_MFA); + && acrValues.contains(AuthProcFilterConstants.REFEDS_MFA); log.debug("requires reAuth by MFA acr - {}", res); return res; } diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilter.java index d736dc4f8..120e6a5c1 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilter.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilter.java @@ -1,31 +1,37 @@ package cz.muni.ics.oidc.server.filters; +import cz.muni.ics.oidc.exceptions.ConfigurationException; +import cz.muni.ics.oidc.saml.SamlProperties; import java.io.IOException; -import java.security.Principal; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; /** - * Abstract class for Perun filters. All filters called in CallPerunFiltersFilter has to extend this. - * - * Configuration of filter names: - *
    - *
  • filter.names - comma separated list of names of the request filters
  • - *
+ * Abstract class for Perun AuthProc filters. All filters defined and called in the + * {@link cz.muni.ics.oidc.server.filters.AuthProcFiltersContainer} instance have to extend this base class. * * Configuration of filter (replace [name] part with the name defined for the filter): *
    *
  • filter.[name].class - Class the filter instantiates
  • - *
  • filter.[name].subs - comma separated list of sub values for which execution of filter will be skipped - * if user's SUB is in the list
  • - *
  • filter.[name].clientIds - comma separated list of client_id values for which execution of filter - * will be skipped if client_id is in the list
  • + *
  • filter.[name].skip_for_users - comma separated list of users for whom the execution of the filter + * will be skipped if the users' SUB matches any value in the list
  • + *
  • filter.[name].skip_for_clients - comma separated list of clients for which the execution of the filter + * will be skipped if the CLIENT_ID matches any value in the list
  • + *
  • filter.[name].execute_for_users - comma separated list of users for whom the filter will be executed + * if the users' SUB matches any value in the list
  • + *
  • filter.[name].execute_for_clients - comma separated list of clients for whom the filter will be executed + * if the CLIENT_ID matches any value in the list
  • *
+ * NOTE: if none of the SKIP/EXECUTE conditions is specified (or the lists are empty), filter is run for all users + * and all clients * * @see cz.muni.ics.oidc.server.filters.impl package for specific filters and their configuration * @@ -33,33 +39,57 @@ import lombok.extern.slf4j.Slf4j; * @author Dominik Frantisek Bucik */ @Slf4j +@Getter public abstract class AuthProcFilter { + public static final String APPLIED = "APPLIED_"; + private static final String DELIMITER = ","; - private static final String CLIENT_IDS = "clientIds"; + private static final String EXECUTE = "execute"; + private static final String EXECUTE_FOR_CLIENTS = "execute_for_clients"; + private static final String EXECUTE_FOR_USERS = "execute_for_users"; + private static final String SKIP_FOR_CLIENTS = "skip_for_clients"; + private static final String SKIP_FOR_USERS = "skip_for_users"; private static final String SUBS = "subs"; + private static final String CLIENT_IDS = "clientIds"; private final String filterName; - private Set clientIds = new HashSet<>(); - private Set subs = new HashSet<>(); + private final Set executeForClients = new HashSet<>(); + private final Set executeForUsers = new HashSet<>(); + private final Set skipForClients = new HashSet<>(); + private final Set skipForUsers = new HashSet<>(); - public AuthProcFilter(AuthProcFilterParams params) { - filterName = params.getFilterName(); + private final SamlProperties samlProperties; - if (params.hasProperty(CLIENT_IDS)) { - this.clientIds = new HashSet<>(Arrays.asList(params.getProperty(CLIENT_IDS).split(DELIMITER))); + public AuthProcFilter(AuthProcFilterInitContext ctx) throws ConfigurationException { + filterName = ctx.getFilterName(); + this.samlProperties = ctx.getBeanUtil().getBean(SamlProperties.class); + initializeExecutionRulesLists(ctx); + + if (!Collections.disjoint(executeForClients, skipForClients)) { + throw new ConfigurationException("Filter '" + filterName + "' is configured to be run and skipped for the same client"); + } else if (!Collections.disjoint(executeForUsers, skipForUsers)) { + throw new ConfigurationException("Filter '" + filterName + "' is configured to be run and skipped for the same user"); } - if (params.hasProperty(SUBS)) { - this.subs = new HashSet<>(Arrays.asList(params.getProperty(SUBS).split(DELIMITER))); + log.info("{} - filter initialized", filterName); + if (!skipForUsers.isEmpty()) { + log.info("{} - skip execution for users with SUB in: '{}'", filterName, skipForUsers); + } + if (!skipForClients.isEmpty()) { + log.info("{} - skip execution for clients with CLIENT_ID in: '{}'", filterName, skipForClients); + } + if (!executeForUsers.isEmpty()) { + log.info("{} - execute for users with SUB in: '{}'", filterName, executeForUsers); + } + if (!executeForClients.isEmpty()) { + log.info("{} - execute for clients with CLIENT_ID in: '{}'", filterName, executeForClients); } - - log.debug("{} - filter initialized", filterName); - log.debug("{} - skip execution for users with SUB in: {}", filterName, subs); - log.debug("{} - skip execution for clients with CLIENT_ID in: {}", filterName, clientIds); } - protected abstract String getSessionAppliedParamName(); + protected String getSessionAppliedParamName() { + return APPLIED + getClass().getSimpleName() + '_' + getFilterName(); + } /** * In this method is done whole logic of filer @@ -69,10 +99,10 @@ public abstract class AuthProcFilter { * @return boolean if filter was successfully done * @throws IOException this exception could be thrown because of failed or interrupted I/O operation */ - protected abstract boolean process(HttpServletRequest request, HttpServletResponse response, FilterParams params) + protected abstract boolean process(HttpServletRequest request, HttpServletResponse response, AuthProcFilterCommonVars params) throws IOException; - public boolean doFilter(HttpServletRequest req, HttpServletResponse res, FilterParams params) throws IOException { + public boolean doFilter(HttpServletRequest req, HttpServletResponse res, AuthProcFilterCommonVars params) throws IOException { if (!skip(req)) { log.trace("{} - executing filter", filterName); return process(req, res, params); @@ -81,14 +111,18 @@ public abstract class AuthProcFilter { } } - private boolean skip(HttpServletRequest request) { - if (hasBeenApplied(request.getSession(true))) { + private boolean skip(HttpServletRequest req) { + if (hasBeenApplied(req.getSession(true))) { return true; } log.debug("{} - marking filter as applied", filterName); - request.getSession(true).setAttribute(getSessionAppliedParamName(), true); - return skipForSub(request.getUserPrincipal()) - || skipForClientId(request.getParameter(PerunFilterConstants.PARAM_CLIENT_ID)); + req.getSession(true).setAttribute(getSessionAppliedParamName(), true); + String sub = FiltersUtils.getUserIdentifier(req, samlProperties.getUserIdentifierAttribute()); + String clientId = FiltersUtils.getClientId(req); + + boolean explicitExecution = executeForSub(sub) || executeForClientId(clientId); + boolean explicitSkip = skipForClientId(clientId) || skipForSub(sub); + return !explicitExecution && explicitSkip; } private boolean hasBeenApplied(HttpSession sess) { @@ -100,21 +134,45 @@ public abstract class AuthProcFilter { return false; } - private boolean skipForSub(Principal p) { - String sub = (p != null) ? p.getName() : null; - if (sub != null && subs.contains(sub)) { - log.debug("{} - skip filter execution: matched one of the ignored SUBS ({})", filterName, sub); - return true; - } - return false; + private boolean executeForSub(String sub) { + return checkRule(sub, executeForUsers, "{} - execute filter: matched one of the explicit SUBS ({})"); + } + + private boolean executeForClientId(String clientId) { + return checkRule(clientId, executeForClients, "{} - execute filter: matched one of the explicit CLIENT_IDS ({})"); + } + + private boolean skipForSub(String sub) { + return checkRule(sub, skipForUsers, "{} - skip filter execution: matched one of the ignored SUBS ({})"); } private boolean skipForClientId(String clientId) { - if (clientId != null && clientIds.contains(clientId)){ - log.debug("{} - skip filter execution: matched one of the ignored CLIENT_IDS ({})", filterName, clientId); + return checkRule(clientId, skipForClients, "{} - skip filter execution: matched one of the ignored CLIENT_IDS ({})"); + } + + private boolean checkRule(String param, Set ruleSet, String logMsg) { + if (param != null && ruleSet.contains(param)){ + log.debug(logMsg, filterName, param); return true; } return false; } + private void initializeExecutionRulesLists(AuthProcFilterInitContext ctx) { + initializeExecutionRuleList(ctx, EXECUTE_FOR_CLIENTS, executeForClients); + initializeExecutionRuleList(ctx, SKIP_FOR_CLIENTS, skipForClients); + initializeExecutionRuleList(ctx, CLIENT_IDS, skipForClients); + + initializeExecutionRuleList(ctx, EXECUTE_FOR_USERS, executeForUsers); + initializeExecutionRuleList(ctx, SKIP_FOR_USERS, skipForUsers); + initializeExecutionRuleList(ctx, SUBS, skipForUsers); + } + + private void initializeExecutionRuleList(AuthProcFilterInitContext ctx, String property, Set list) { + if (ctx.hasProperty(property)) { + String value = ctx.getProperty(property, ""); + list.addAll(Arrays.asList(value.split(DELIMITER))); + } + } + } diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/FilterParams.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilterCommonVars.java similarity index 51% rename from perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/FilterParams.java rename to perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilterCommonVars.java index f6f1dc661..e4818bd5d 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/FilterParams.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilterCommonVars.java @@ -3,31 +3,18 @@ package cz.muni.ics.oidc.server.filters; import cz.muni.ics.oauth2.model.ClientDetailsEntity; import cz.muni.ics.oidc.models.Facility; import cz.muni.ics.oidc.models.PerunUser; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; -public class FilterParams { +@Getter +@AllArgsConstructor +public class AuthProcFilterCommonVars { private final ClientDetailsEntity client; private final Facility facility; private final PerunUser user; - public FilterParams(ClientDetailsEntity client, Facility facility, PerunUser user) { - this.client = client; - this.facility = facility; - this.user = user; - } - - public ClientDetailsEntity getClient() { - return client; - } - - public Facility getFacility() { - return facility; - } - - public PerunUser getUser() { - return user; - } - public String getClientIdentifier() { if (client != null) { return client.getClientId(); diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilterConstants.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilterConstants.java new file mode 100644 index 000000000..170e86cc8 --- /dev/null +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilterConstants.java @@ -0,0 +1,55 @@ +package cz.muni.ics.oidc.server.filters; + +import java.util.Map; + +/** + * Class containing common constants used by Perun request filters. + * + * @author Dominik Baranek + * @author Dominik Frantisek Bucik + */ +public interface AuthProcFilterConstants { + + String AUTHORIZE_REQ_PATTERN = "/auth/authorize"; + String DEVICE_APPROVE_REQ_PATTERN = "/auth/device/authorize"; + + String PARAM_CLIENT_ID = "client_id"; + String PARAM_SCOPE = "scope"; + String PARAM_MESSAGE = "message"; + String PARAM_HEADER = "header"; + String PARAM_TARGET = "target"; + String PARAM_FORCE_AUTHN = "forceAuthn"; + String PARAM_PROMPT = "prompt"; + String PARAM_REASON = "reason"; + String PARAM_ACCEPTED = "accepted"; + String PARAM_ACR_VALUES = "acr_values"; + String PARAM_POST_LOGOUT_REDIRECT_URI = "post_logout_redirect_uri"; + String PARAM_STATE = "state"; + String CLIENT_ID_PREFIX = "urn:cesnet:proxyidp:client_id:"; + String AARC_IDP_HINT = "aarc_idp_hint"; + + String IDP_ENTITY_ID_PREFIX = "urn:cesnet:proxyidp:idpentityid:"; + String FILTER_PREFIX = "urn:cesnet:proxyidp:filter:"; + String EFILTER_PREFIX = "urn:cesnet:proxyidp:efilter:"; + + String SAML_EPUID = "urn:oid:1.3.6.1.4.1.5923.1.1.1.13"; + String SAML_EPPN = "urn:oid:1.3.6.1.4.1.5923.1.1.1.6"; + String SAML_EPTID = "urn:oid:1.3.6.1.4.1.5923.1.1.1.10"; + String SAML_UID = "urn:oid:0.9.2342.19200300.100.1.1"; + String SAML_UNIQUE_IDENTIFIER = "urn:oid:0.9.2342.19200300.100.1.44"; + String SAML_PERUN_USERID_IDENTIFIER = "urn:cesnet:proxyidp:attribute:perunUserId"; + + String REFEDS_MFA = "https://refeds.org/profile/mfa"; + String PROMPT_LOGIN = "login"; + String PROMPT_SELECT_ACCOUNT = "select_account"; + + Map SAML_IDS = Map.of( + "eppn", SAML_EPPN, + "epuid", SAML_EPUID, + "eptid", SAML_EPTID, + "uid", SAML_UID, + "uniqueIdentifier", SAML_UNIQUE_IDENTIFIER, + "perunUserId", SAML_PERUN_USERID_IDENTIFIER + ); + +} diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilterInitContext.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilterInitContext.java new file mode 100644 index 000000000..86120da2b --- /dev/null +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilterInitContext.java @@ -0,0 +1,53 @@ +package cz.muni.ics.oidc.server.filters; + +import cz.muni.ics.oidc.BeanUtil; +import cz.muni.ics.oidc.server.adapters.PerunAdapter; +import cz.muni.ics.oidc.server.configurations.PerunOidcConfig; +import java.util.Properties; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * Class holding parameters for AuthProcFilter instantiation. + * + * @author Dominik Frantisek Bucik + */ +@Getter +@AllArgsConstructor +public class AuthProcFilterInitContext { + + public static final String PROP_CLASS = "class"; + + private final String filterName; + private final String filterPropertyPrefix; + private final Properties properties; + private final BeanUtil beanUtil; + + public boolean hasProperty(String name) { + return this.properties.containsKey(filterPropertyPrefix + '.' + name); + } + + public String getProperty(String name) { + return this.properties.getProperty(filterPropertyPrefix + '.' + name); + } + + public String getProperty(String name, String defaultValue) { + if (this.properties.containsKey(filterPropertyPrefix + '.' + name)) { + return this.properties.getProperty(filterPropertyPrefix + '.' + name); + } + return defaultValue; + } + + public String getFilterClass() { + return (String) properties.getOrDefault(filterPropertyPrefix + '.' + PROP_CLASS, null); + } + + public PerunAdapter getPerunAdapterBean() { + return beanUtil.getBean(PerunAdapter.class); + } + + public PerunOidcConfig getPerunOidcConfigBean() { + return beanUtil.getBean(PerunOidcConfig.class); + } + +} diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilterParams.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilterParams.java deleted file mode 100644 index 749fce772..000000000 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilterParams.java +++ /dev/null @@ -1,52 +0,0 @@ -package cz.muni.ics.oidc.server.filters; - -import cz.muni.ics.oidc.BeanUtil; -import java.util.Properties; - -/** - * Class holding parameters for filter instantiation - * - * @author Dominik Frantisek Bucik - */ -public class AuthProcFilterParams { - - private final String filterName; - - private final String propertyPrefix; - private final Properties properties; - private final BeanUtil beanUtil; - - public AuthProcFilterParams(String filterName, String propertyPrefix, Properties properties, BeanUtil beanUtil) { - this.filterName = filterName; - this.propertyPrefix = propertyPrefix; - this.properties = properties; - this.beanUtil = beanUtil; - } - - public boolean hasProperty(String name) { - return this.properties.containsKey(propertyPrefix + '.' + name); - } - - public String getProperty(String name) { - return this.properties.getProperty(propertyPrefix + '.' + name); - } - - public String getProperty(String name, String defaultValue) { - if (this.properties.containsKey(propertyPrefix + '.' + name)) { - return this.properties.getProperty(propertyPrefix + '.' + name); - } - return defaultValue; - } - - public BeanUtil getBeanUtil() { - return beanUtil; - } - - public String getFilterName() { - return filterName; - } - - public Properties getProperties() { - return properties; - } -} diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFiltersContainer.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFiltersContainer.java index 19632b5f1..9431a6fd9 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFiltersContainer.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFiltersContainer.java @@ -1,7 +1,7 @@ package cz.muni.ics.oidc.server.filters; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.AUTHORIZE_REQ_PATTERN; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.DEVICE_APPROVE_REQ_PATTERN; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.AUTHORIZE_REQ_PATTERN; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.DEVICE_APPROVE_REQ_PATTERN; import cz.muni.ics.oauth2.model.ClientDetailsEntity; import cz.muni.ics.oauth2.service.ClientDetailsEntityService; @@ -23,6 +23,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.security.oauth2.provider.OAuth2RequestFactory; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import org.springframework.security.web.util.matcher.OrRequestMatcher; @@ -31,7 +32,8 @@ import org.springframework.util.StringUtils; import org.springframework.web.filter.GenericFilterBean; /** - * This filter calls other Perun filters saved in the PerunFiltersContext + * Wrapper filter for the AuthProcFilters in the security chain. Takes care of providing most basic parameters + * and calls the custom AuthProcFilter chain. * * @author Dominik Baranek * @author Dominik Frantisek Bucik @@ -46,29 +48,34 @@ public class AuthProcFiltersContainer extends GenericFilterBean { private static final RequestMatcher MATCHER = new OrRequestMatcher( Arrays.asList(AUTHORIZE_MATCHER, AUTHORIZE_ALL_MATCHER, DEVICE_CODE_MATCHER, DEVICE_CODE_ALL_MATCHER)); - @Autowired - private Properties coreProperties; + private final Properties properties; + private final BeanUtil beanUtil; + private final OAuth2RequestFactory authRequestFactory; + private final ClientDetailsEntityService clientDetailsEntityService; + private final PerunAdapter perunAdapter; + private final SamlProperties samlProperties; + + private List filters; @Autowired - private BeanUtil beanUtil; - - @Autowired - private OAuth2RequestFactory authRequestFactory; - - @Autowired - private ClientDetailsEntityService clientDetailsEntityService; - - @Autowired - private PerunAdapter perunAdapter; - - @Autowired - private SamlProperties samlProperties; - - private AuthProcFiltersContext perunFiltersContext; + public AuthProcFiltersContainer(@Qualifier("coreProperties")Properties properties, + BeanUtil beanUtil, + OAuth2RequestFactory authRequestFactory, + ClientDetailsEntityService clientDetailsEntityService, + PerunAdapter perunAdapter, + SamlProperties samlProperties) + { + this.properties = properties; + this.beanUtil = beanUtil; + this.authRequestFactory = authRequestFactory; + this.clientDetailsEntityService = clientDetailsEntityService; + this.perunAdapter = perunAdapter; + this.samlProperties = samlProperties; + } @PostConstruct public void postConstruct() { - this.perunFiltersContext = new AuthProcFiltersContext(coreProperties, beanUtil); + this.filters = AuthProcFiltersInitializer.initialize(properties, beanUtil); } @Override @@ -80,7 +87,6 @@ public class AuthProcFiltersContainer extends GenericFilterBean { if (!MATCHER.matches(req)) { log.debug("AuthProc filters have been skipped, did not match authorization nor device req URL"); } else { - List filters = perunFiltersContext.getFilters(); if (filters != null && !filters.isEmpty()) { ClientDetailsEntity client = FiltersUtils.extractClientFromRequest(req, authRequestFactory, clientDetailsEntityService); @@ -94,7 +100,7 @@ public class AuthProcFiltersContainer extends GenericFilterBean { } } PerunUser user = FiltersUtils.getPerunUser(req, perunAdapter, samlProperties); - FilterParams params = new FilterParams(client, facility, user); + AuthProcFilterCommonVars params = new AuthProcFilterCommonVars(client, facility, user); for (AuthProcFilter filter : filters) { if (!filter.doFilter(req, res, params)) { return; diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFiltersContext.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFiltersContext.java deleted file mode 100644 index c6f324a2b..000000000 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFiltersContext.java +++ /dev/null @@ -1,91 +0,0 @@ -package cz.muni.ics.oidc.server.filters; - -import cz.muni.ics.oidc.BeanUtil; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.LinkedList; -import java.util.List; -import java.util.Properties; -import lombok.extern.slf4j.Slf4j; -import org.springframework.util.StringUtils; - -/** - * Class that contains all custom Perun request filters. Filters are stored in the LinkedList - * and executed in the order they are added to the list. - * - * Filters are configured from configuration file in following way: - * filter.names=filterName1,filterName2,... - * - * @see AuthProcFilter for configuration of filter - * - * @author Dominik Frantisek Bucik - */ -@Slf4j -public class AuthProcFiltersContext { - - private static final String FILTER_NAMES = "filter.names"; - private static final String FILTER_CLASS = ".class"; - private static final String PREFIX = "filter."; - - private final List filters; - private final Properties properties; - private final BeanUtil beanUtil; - - public AuthProcFiltersContext(Properties properties, BeanUtil beanUtil) { - this.properties = properties; - this.beanUtil = beanUtil; - this.filters = new LinkedList<>(); - - String filterNames = properties.getProperty(FILTER_NAMES); - log.debug("Filters to be initialized '{}'", filterNames); - - log.debug("--------------------------------"); - for (String filterName: filterNames.split(",")) { - AuthProcFilter requestFilter = loadFilter(filterName); - filters.add(requestFilter); - log.debug("--------------------------------"); - } - } - - public List getFilters() { - return filters; - } - - private AuthProcFilter loadFilter(String filterName) { - String propPrefix = AuthProcFiltersContext.PREFIX + filterName; - String filterClass = properties.getProperty(propPrefix + FILTER_CLASS, null); - if (!StringUtils.hasText(filterClass)) { - log.warn("{} - failed to initialized filter: no class has ben configured", filterName); - return null; - } - log.trace("{} - loading class '{}'", filterName, filterClass); - - try { - Class rawClazz = Class.forName(filterClass); - if (!AuthProcFilter.class.isAssignableFrom(rawClazz)) { - log.warn("{} - failed to initialized filter: class '{}' does not extend AuthProcFilter", - filterName, filterClass); - return null; - } - - @SuppressWarnings("unchecked") Class clazz = (Class) rawClazz; - Constructor constructor = clazz.getConstructor(AuthProcFilterParams.class); - AuthProcFilterParams params = new AuthProcFilterParams(filterName, propPrefix, properties, beanUtil); - return constructor.newInstance(params); - } catch (ClassNotFoundException e) { - log.warn("{} - failed to initialize filter: class '{}' was not found", filterName, filterClass); - log.trace("{} - details:", filterName, e); - return null; - } catch (NoSuchMethodException e) { - log.warn("{} - failed to initialize filter: class '{}' does not have proper constructor", - filterName, filterClass); - log.trace("{} - details:", filterName, e); - return null; - } catch (IllegalAccessException | InvocationTargetException | InstantiationException e) { - log.warn("{} - failed to initialize filter: class '{}' cannot be instantiated", filterName, filterClass); - log.trace("{} - details:", filterName, e); - return null; - } - } - -} diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFiltersInitializer.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFiltersInitializer.java new file mode 100644 index 000000000..5e00d5233 --- /dev/null +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFiltersInitializer.java @@ -0,0 +1,77 @@ +package cz.muni.ics.oidc.server.filters; + +import cz.muni.ics.oidc.BeanUtil; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; + +/** + * Initialization class for AuthProcFilters. Takes care of loading the filters and putting them into the custom + * authentication processing chain. + * + * @author Dominik Baranek + * @author Dominik Frantisek Bucik + */ +@Slf4j +public class AuthProcFiltersInitializer { + + private static final String FILTER_NAMES = "filter.names"; + private static final String FILTERS_PROP_BASE_PREFIX = "filter."; + + public static List initialize(Properties coreProperties, BeanUtil beanUtil) { + List filters = new LinkedList<>(); + + String filterNames = coreProperties.getProperty(FILTER_NAMES); + log.debug("Filters to be initialized '{}'", filterNames); + + log.debug("--------------------------------"); + for (String filterName: filterNames.split(",")) { + String filterPropertyPrefix = FILTERS_PROP_BASE_PREFIX + filterName; + AuthProcFilterInitContext ctx = new AuthProcFilterInitContext(filterName, filterPropertyPrefix, coreProperties, beanUtil); + AuthProcFilter requestFilter = loadFilter(ctx); + filters.add(requestFilter); + log.debug("--------------------------------"); + } + return filters; + } + + private static AuthProcFilter loadFilter(AuthProcFilterInitContext ctx) { + String filterClass = ctx.getFilterClass(); + if (!StringUtils.hasText(filterClass)) { + log.warn("{} - failed to initialized filter: no class has ben configured", ctx.getFilterName()); + return null; + } + log.debug("{} - loading class '{}'", ctx.getFilterName(), filterClass); + + try { + Class rawClazz = Class.forName(filterClass); + if (!AuthProcFilter.class.isAssignableFrom(rawClazz)) { + log.warn("{} - failed to initialized filter: class '{}' does not extend AuthProcFilter", + ctx.getFilterName(), filterClass); + return null; + } + + @SuppressWarnings("unchecked") Class clazz = (Class) rawClazz; + Constructor constructor = clazz.getConstructor(AuthProcFilterInitContext.class); + return constructor.newInstance(ctx); + } catch (ClassNotFoundException e) { + log.warn("{} - failed to initialize filter: class '{}' was not found", ctx.getFilterName(), filterClass); + log.debug("{} - details:", ctx.getFilterName(), e); + return null; + } catch (NoSuchMethodException e) { + log.warn("{} - failed to initialize filter: class '{}' does not have proper constructor", + ctx.getFilterName(), filterClass); + log.debug("{} - details:", ctx.getFilterName(), e); + return null; + } catch (IllegalAccessException | InvocationTargetException | InstantiationException e) { + log.warn("{} - failed to initialize filter: class '{}' cannot be instantiated", ctx.getFilterName(), filterClass); + log.debug("{} - details:", ctx.getFilterName(), e); + return null; + } + } + +} diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/FiltersUtils.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/FiltersUtils.java index 729a8399e..cad8be75d 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/FiltersUtils.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/FiltersUtils.java @@ -1,7 +1,7 @@ package cz.muni.ics.oidc.server.filters; import static cz.muni.ics.oauth2.web.endpoint.DeviceEndpoint.DEVICE_CODE_SESSION_ATTRIBUTE; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_FORCE_AUTHN; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_FORCE_AUTHN; import cz.muni.ics.oauth2.model.ClientDetailsEntity; import cz.muni.ics.oauth2.model.DeviceCode; @@ -9,8 +9,11 @@ import cz.muni.ics.oauth2.service.ClientDetailsEntityService; import cz.muni.ics.oidc.models.Facility; import cz.muni.ics.oidc.models.PerunAttributeValue; import cz.muni.ics.oidc.models.PerunUser; +import cz.muni.ics.oidc.saml.SamlPrincipal; import cz.muni.ics.oidc.saml.SamlProperties; import cz.muni.ics.oidc.server.adapters.PerunAdapter; +import cz.muni.ics.oidc.server.claims.ClaimInitContext; +import cz.muni.ics.oidc.server.claims.ClaimSourceInitContext; import cz.muni.ics.oidc.server.configurations.FacilityAttrsConfig; import cz.muni.ics.oidc.web.controllers.ControllerUtils; import cz.muni.ics.oidc.web.controllers.PerunUnapprovedRegistrationController; @@ -35,6 +38,42 @@ import org.springframework.util.StringUtils; @Slf4j public class FiltersUtils { + public static final String NO_VALUE = null; + + public static String fillStringMandatoryProperty(String suffix, AuthProcFilterInitContext ctx) { + String filled = fillStringPropertyOrDefaultVal(ctx.getProperty(suffix, NO_VALUE), NO_VALUE); + + if (filled == null) { + throw new IllegalArgumentException(ctx.getFilterName() + " - missing mandatory configuration option: " + suffix); + } + + return filled; + } + + public static String fillStringPropertyOrDefaultVal(String suffix, AuthProcFilterInitContext ctx, String defaultVal) { + return fillStringPropertyOrDefaultVal(ctx.getProperty(suffix, NO_VALUE), defaultVal); + } + + private static String fillStringPropertyOrDefaultVal(String prop, String defaultVal) { + if (StringUtils.hasText(prop)) { + return prop; + } else { + return defaultVal; + } + } + + public static boolean fillBooleanPropertyOrDefaultVal(String suffix, AuthProcFilterInitContext ctx, boolean defaultVal) { + return fillBooleanPropertyOrDefaultVal(ctx.getProperty(suffix, NO_VALUE), defaultVal); + } + + private static boolean fillBooleanPropertyOrDefaultVal(String prop, boolean defaultVal) { + if (StringUtils.hasText(prop)) { + return Boolean.parseBoolean(prop); + } else { + return defaultVal; + } + } + /** * Create map of request params in format key = name, value = paramValue. * @@ -173,7 +212,7 @@ public class FiltersUtils { } else if (!StringUtils.hasText(idAttribute)) { throw new IllegalArgumentException("No identifier from SAML configured"); } - String identifierAttrOid = PerunFilterConstants.SAML_IDS.getOrDefault(idAttribute, null); + String identifierAttrOid = AuthProcFilterConstants.SAML_IDS.getOrDefault(idAttribute, null); if (identifierAttrOid == null) { throw new IllegalStateException("SAML credentials has no value for attribute: " + idAttribute); } @@ -283,10 +322,11 @@ public class FiltersUtils { PerunUser user, String clientIdentifier, FacilityAttrsConfig facilityAttrsConfig, - Map facilityAttributes, PerunAdapter perunAdapter, String redirectUrl) { + Map facilityAttributes = perunAdapter.getFacilityAttributeValues( + facility, facilityAttrsConfig.getMembershipAttrNames()); if (facilityAttributes.get(facilityAttrsConfig.getAllowRegistrationAttr()).valueAsBoolean()) { boolean canRegister = perunAdapter.getAdapterRpc().groupWhereCanRegisterExists(facility); if (canRegister) { @@ -316,7 +356,7 @@ public class FiltersUtils { public static String fillStringMandatoryProperty(String propertyName, String filterName, - AuthProcFilterParams params) { + AuthProcFilterInitContext params) { String filled = params.getProperty(propertyName); if (!StringUtils.hasText(filled)) { @@ -366,4 +406,11 @@ public class FiltersUtils { return new AbstractMap.SimpleImmutableEntry<>(key, value); } + public static String getUserIdentifier(HttpServletRequest req, String identifierSamlAttribute) { + return getExtLogin(getSamlCredential(req), identifierSamlAttribute); + } + + public static String getClientId(HttpServletRequest req) { + return req.getParameter(AuthProcFilterConstants.PARAM_CLIENT_ID); + } } diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/PerunFilterConstants.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/PerunFilterConstants.java deleted file mode 100644 index 11c053255..000000000 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/PerunFilterConstants.java +++ /dev/null @@ -1,57 +0,0 @@ -package cz.muni.ics.oidc.server.filters; - -import java.util.HashMap; -import java.util.Map; - -/** - * Class containing common constants used by Perun request filters. - * - * @author Dominik Baranek - * @author Dominik Frantisek Bucik - */ -public class PerunFilterConstants { - - public static final String AUTHORIZE_REQ_PATTERN = "/auth/authorize"; - public static final String DEVICE_APPROVE_REQ_PATTERN = "/auth/device/authorize"; - - public static final String PARAM_CLIENT_ID = "client_id"; - public static final String PARAM_SCOPE = "scope"; - public static final String PARAM_MESSAGE = "message"; - public static final String PARAM_HEADER = "header"; - public static final String PARAM_TARGET = "target"; - public static final String PARAM_FORCE_AUTHN = "forceAuthn"; - public static final String PARAM_PROMPT = "prompt"; - public static final String PARAM_REASON = "reason"; - public static final String PARAM_ACCEPTED = "accepted"; - public static final String PARAM_ACR_VALUES = "acr_values"; - public static final String PARAM_POST_LOGOUT_REDIRECT_URI = "post_logout_redirect_uri"; - public static final String PARAM_STATE = "state"; - public static final String CLIENT_ID_PREFIX = "urn:cesnet:proxyidp:client_id:"; - public static final String AARC_IDP_HINT = "aarc_idp_hint"; - - public static final String IDP_ENTITY_ID_PREFIX = "urn:cesnet:proxyidp:idpentityid:"; - public static final String FILTER_PREFIX = "urn:cesnet:proxyidp:filter:"; - public static final String EFILTER_PREFIX = "urn:cesnet:proxyidp:efilter:"; - - public static final String SAML_EPUID = "urn:oid:1.3.6.1.4.1.5923.1.1.1.13"; - public static final String SAML_EPPN = "urn:oid:1.3.6.1.4.1.5923.1.1.1.6"; - public static final String SAML_EPTID = "urn:oid:1.3.6.1.4.1.5923.1.1.1.10"; - public static final String SAML_UID = "urn:oid:0.9.2342.19200300.100.1.1"; - public static final String SAML_UNIQUE_IDENTIFIER = "urn:oid:0.9.2342.19200300.100.1.44"; - public static final String SAML_PERUN_USERID_IDENTIFIER = "urn:cesnet:proxyidp:attribute:perunUserId"; - - public static final String REFEDS_MFA = "https://refeds.org/profile/mfa"; - public static final String PROMPT_LOGIN = "login"; - public static final String PROMPT_SELECT_ACCOUNT = "select_account"; - - public static final Map SAML_IDS = new HashMap<>(); - static { - SAML_IDS.put("eppn", SAML_EPPN); - SAML_IDS.put("epuid", SAML_EPUID); - SAML_IDS.put("eptid", SAML_EPTID); - SAML_IDS.put("uid", SAML_UID); - SAML_IDS.put("uniqueIdentifier", SAML_UNIQUE_IDENTIFIER); - SAML_IDS.put("perunUserId", SAML_PERUN_USERID_IDENTIFIER); - } - -} diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/MultiMDCFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/MultiMDCFilter.java deleted file mode 100644 index e4980c8ee..000000000 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/MultiMDCFilter.java +++ /dev/null @@ -1,33 +0,0 @@ -package cz.muni.ics.oidc.server.filters.impl; - -import cz.muni.ics.oidc.server.filters.impl.mdc.RemoteAddressMDCFilter; -import cz.muni.ics.oidc.server.filters.impl.mdc.SessionIdMDCFilter; -import java.io.IOException; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import org.slf4j.MDC; -import org.springframework.web.filter.GenericFilterBean; - -public class MultiMDCFilter extends GenericFilterBean { - - private final RemoteAddressMDCFilter remoteAddressMDCFilter; - private final SessionIdMDCFilter sessionIdMDCFilter; - - public MultiMDCFilter() { - this.remoteAddressMDCFilter = new RemoteAddressMDCFilter(); - this.sessionIdMDCFilter = new SessionIdMDCFilter(); - } - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) - throws IOException, ServletException - { - remoteAddressMDCFilter.doFilter(servletRequest); - sessionIdMDCFilter.doFilter(servletRequest); - filterChain.doFilter(servletRequest, servletResponse); - MDC.clear(); - } - -} diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunAuthorizationFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunAuthorizationFilter.java index 4ef27d2c0..cb3d3c8b7 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunAuthorizationFilter.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunAuthorizationFilter.java @@ -1,17 +1,18 @@ package cz.muni.ics.oidc.server.filters.impl; -import cz.muni.ics.oidc.BeanUtil; +import static cz.muni.ics.oidc.web.controllers.PerunUnapprovedController.UNAPPROVED_AUTHORIZATION; + +import cz.muni.ics.oidc.exceptions.ConfigurationException; import cz.muni.ics.oidc.models.Facility; import cz.muni.ics.oidc.models.PerunAttributeValue; import cz.muni.ics.oidc.models.PerunUser; import cz.muni.ics.oidc.server.adapters.PerunAdapter; import cz.muni.ics.oidc.server.configurations.FacilityAttrsConfig; import cz.muni.ics.oidc.server.configurations.PerunOidcConfig; -import cz.muni.ics.oidc.server.filters.FilterParams; -import cz.muni.ics.oidc.server.filters.FiltersUtils; import cz.muni.ics.oidc.server.filters.AuthProcFilter; -import cz.muni.ics.oidc.server.filters.AuthProcFilterParams; -import cz.muni.ics.oidc.web.controllers.PerunUnapprovedController; +import cz.muni.ics.oidc.server.filters.AuthProcFilterCommonVars; +import cz.muni.ics.oidc.server.filters.AuthProcFilterInitContext; +import cz.muni.ics.oidc.server.filters.FiltersUtils; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -25,44 +26,35 @@ import lombok.extern.slf4j.Slf4j; * Configuration: * - based on the configuration of bean "facilityAttrsConfig" * @see FacilityAttrsConfig + * @see cz.muni.ics.oidc.server.filters.AuthProcFilter (basic configuration options) * * @author Dominik Frantisek Bucik */ @Slf4j public class PerunAuthorizationFilter extends AuthProcFilter { - public static final String APPLIED = "APPLIED_" + PerunAuthorizationFilter.class.getSimpleName(); - private final PerunAdapter perunAdapter; private final FacilityAttrsConfig facilityAttrsConfig; - private final String filterName; private final PerunOidcConfig config; - public PerunAuthorizationFilter(AuthProcFilterParams params) { - super(params); - BeanUtil beanUtil = params.getBeanUtil(); - this.perunAdapter = beanUtil.getBean(PerunAdapter.class); - this.facilityAttrsConfig = beanUtil.getBean(FacilityAttrsConfig.class); - this.filterName = params.getFilterName(); - this.config = beanUtil.getBean(PerunOidcConfig.class); + public PerunAuthorizationFilter(AuthProcFilterInitContext ctx) throws ConfigurationException { + super(ctx); + this.perunAdapter = ctx.getPerunAdapterBean(); + this.config = ctx.getPerunOidcConfigBean(); + this.facilityAttrsConfig = ctx.getBeanUtil().getBean(FacilityAttrsConfig.class); } @Override - protected String getSessionAppliedParamName() { - return APPLIED; - } - - @Override - protected boolean process(HttpServletRequest req, HttpServletResponse res, FilterParams params) { + protected boolean process(HttpServletRequest req, HttpServletResponse res, AuthProcFilterCommonVars params) { Facility facility = params.getFacility(); if (facility == null || facility.getId() == null) { - log.debug("{} - skip filter execution: no facility provided", filterName); + log.debug("{} - skip filter execution: no facility provided", getFilterName()); return true; } PerunUser user = params.getUser(); if (user == null || user.getId() == null) { - log.debug("{} - skip filter execution: no user provided", filterName); + log.debug("{} - skip filter execution: no user provided", getFilterName()); return true; } @@ -78,17 +70,16 @@ public class PerunAuthorizationFilter extends AuthProcFilter { facility, facilityAttrsConfig.getMembershipAttrNames()); if (!facilityAttributes.get(facilityAttrsConfig.getCheckGroupMembershipAttr()).valueAsBoolean()) { - log.debug("{} - skip filter execution: membership check not requested", filterName); + log.debug("{} - skip filter execution: membership check not requested", getFilterName()); return true; } if (perunAdapter.canUserAccessBasedOnMembership(facility, user.getId())) { - log.info("{} - user allowed to access the service", filterName); + log.info("{} - user allowed to access the service", getFilterName()); return true; } else { - FiltersUtils.redirectUserCannotAccess(config.getConfigBean().getIssuer(), response, facility, user, clientIdentifier, - facilityAttrsConfig, facilityAttributes, perunAdapter, - PerunUnapprovedController.UNAPPROVED_AUTHORIZATION); + FiltersUtils.redirectUserCannotAccess(config.getConfigBean().getIssuer(), response, facility, user, + clientIdentifier, facilityAttrsConfig, perunAdapter, UNAPPROVED_AUTHORIZATION); return false; } } diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunEnsureVoMember.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunEnsureVoMember.java index cb736dabe..844e26f56 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunEnsureVoMember.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunEnsureVoMember.java @@ -1,19 +1,21 @@ package cz.muni.ics.oidc.server.filters.impl; -import cz.muni.ics.oidc.BeanUtil; +import cz.muni.ics.oidc.PerunConstants; +import cz.muni.ics.oidc.exceptions.ConfigurationException; import cz.muni.ics.oidc.models.Facility; import cz.muni.ics.oidc.models.PerunAttributeValue; import cz.muni.ics.oidc.server.adapters.PerunAdapter; import cz.muni.ics.oidc.server.configurations.PerunOidcConfig; -import cz.muni.ics.oidc.server.filters.FilterParams; -import cz.muni.ics.oidc.server.filters.FiltersUtils; import cz.muni.ics.oidc.server.filters.AuthProcFilter; -import cz.muni.ics.oidc.server.filters.AuthProcFilterParams; +import cz.muni.ics.oidc.server.filters.AuthProcFilterInitContext; +import cz.muni.ics.oidc.server.filters.AuthProcFilterCommonVars; +import cz.muni.ics.oidc.server.filters.FiltersUtils; import cz.muni.ics.oidc.web.controllers.ControllerUtils; import cz.muni.ics.oidc.web.controllers.PerunUnapprovedController; import cz.muni.ics.oidc.web.controllers.RegistrationController; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -26,6 +28,7 @@ import org.springframework.util.StringUtils; * Otherwise, user can to access the service. * * Configuration (replace [name] part with the name defined for the filter): + * @see cz.muni.ics.oidc.server.filters.AuthProcFilter (basic configuration options) *
    *
  • filter.[name].triggerAttr - mapping to attribute which contains flag if this is enabled for facility
  • *
  • filter.[name].voDefsAttr - mapping to attribute which contains VO(s) to check
  • @@ -36,8 +39,6 @@ import org.springframework.util.StringUtils; @Slf4j public class PerunEnsureVoMember extends AuthProcFilter { - public static final String APPLIED = "APPLIED_" + PerunEnsureVoMember.class.getSimpleName(); - private static final String TRIGGER_ATTR = "triggerAttr"; private static final String VO_DEFS_ATTR = "voDefsAttr"; private static final String LOGIN_URL_ATTR = "loginURL"; @@ -46,50 +47,45 @@ public class PerunEnsureVoMember extends AuthProcFilter { private final String voDefsAttr; private final String loginUrlAttr; private final PerunAdapter perunAdapter; - private final String filterName; private final PerunOidcConfig perunOidcConfig; - public PerunEnsureVoMember(AuthProcFilterParams params) { - super(params); - BeanUtil beanUtil = params.getBeanUtil(); + public PerunEnsureVoMember(AuthProcFilterInitContext ctx) throws ConfigurationException { + super(ctx); + this.perunOidcConfig = ctx.getPerunOidcConfigBean(); + this.perunAdapter = ctx.getPerunAdapterBean(); - this.perunOidcConfig = beanUtil.getBean(PerunOidcConfig.class); - this.perunAdapter = beanUtil.getBean(PerunAdapter.class); - this.filterName = params.getFilterName(); - - this.triggerAttr = FiltersUtils.fillStringMandatoryProperty(TRIGGER_ATTR, filterName, params); - this.voDefsAttr = FiltersUtils.fillStringMandatoryProperty(VO_DEFS_ATTR, filterName, params); - - this.loginUrlAttr = params.getProperty(LOGIN_URL_ATTR); - log.debug("{} - initialized filter: {}", filterName, this); + this.triggerAttr = FiltersUtils.fillStringMandatoryProperty(TRIGGER_ATTR, ctx); + this.voDefsAttr = FiltersUtils.fillStringMandatoryProperty(VO_DEFS_ATTR, ctx); + this.loginUrlAttr = FiltersUtils.fillStringPropertyOrDefaultVal(LOGIN_URL_ATTR, ctx, null); } @Override - protected String getSessionAppliedParamName() { - return APPLIED; - } - - @Override - protected boolean process(HttpServletRequest req, HttpServletResponse res, FilterParams params) { + protected boolean process(HttpServletRequest req, HttpServletResponse res, AuthProcFilterCommonVars params) { Facility facility = params.getFacility(); if (facility == null || facility.getId() == null) { - log.debug("{} - skip execution: no facility provided", filterName); + log.debug("{} - skip execution: no facility provided", getFilterName()); return true; } - Map attrs = perunAdapter.getFacilityAttributeValues(facility, - Arrays.asList(voDefsAttr, triggerAttr, loginUrlAttr)); + List attrsToFetch = Arrays.asList(voDefsAttr, triggerAttr, loginUrlAttr); + Map attrs = perunAdapter.getFacilityAttributeValues(facility, attrsToFetch); + + if (attrs == null) { + log.debug("{} - skip filter execution: could not fetch attributes '{}' for facility '{}'", + getFilterName(), attrsToFetch, facility); + return true; + } PerunAttributeValue triggerAttrValue = attrs.getOrDefault(triggerAttr, null); if (triggerAttrValue == null || !triggerAttrValue.valueAsBoolean()) { log.debug("{} - skip execution: attribute '{}' is null or false, which disables the filter", - filterName, triggerAttr); + getFilterName(), triggerAttr); return true; } PerunAttributeValue voDefsAttrValue = getVoDefsAttrValue(attrs.getOrDefault(voDefsAttr, null)); if (voDefsAttrValue == null) { - log.debug("{} - skip execution: attribute '{}' has null or no value", filterName, voDefsAttr); + log.debug("{} - skip execution: attribute '{}' has null or no value", getFilterName(), voDefsAttr); return true; } String voShortName = voDefsAttrValue.valueAsString(); @@ -97,7 +93,7 @@ public class PerunEnsureVoMember extends AuthProcFilter { boolean canAccess = perunAdapter.isUserInVo(params.getUser().getId(), voShortName); if (canAccess) { - log.debug("{} - user allowed to continue", filterName); + log.debug("{} - user allowed to continue", getFilterName()); return true; } else { redirect(res, getLoginUrl(facility.getId()), voShortName); @@ -144,10 +140,11 @@ public class PerunEnsureVoMember extends AuthProcFilter { private void redirectDirectly(HttpServletResponse res, String loginUrl, String voShortName) { String registrarUrl = perunOidcConfig.getRegistrarUrl(); Map params = new HashMap<>(); - params.put("vo", voShortName); + params.put(PerunConstants.REGISTRAR_PARAM_VO, voShortName); if (StringUtils.hasText(loginUrl)) { - params.put("targetnew", loginUrl); - params.put("targetexisting", loginUrl); + params.put(PerunConstants.REGISTRAR_TARGET_NEW, loginUrl); + params.put(PerunConstants.REGISTRAR_TARGET_EXISTING, loginUrl); + params.put(PerunConstants.REGISTRAR_TARGET_EXTENDED, loginUrl); } String target = ControllerUtils.createUrl(registrarUrl, params); @@ -156,7 +153,7 @@ public class PerunEnsureVoMember extends AuthProcFilter { params.put(RegistrationController.PARAM_TARGET, target); String redirectUrl = ControllerUtils.createUrl(url, params); - log.debug("{} - redirecting user to '{}'", filterName, redirectUrl); + log.debug("{} - redirecting user to '{}'", getFilterName(), redirectUrl); res.reset(); res.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); res.setHeader(HttpHeaders.LOCATION, redirectUrl); @@ -166,7 +163,7 @@ public class PerunEnsureVoMember extends AuthProcFilter { String redirectUrl = ControllerUtils.constructRequestUrl(perunOidcConfig, PerunUnapprovedController.UNAPPROVED_ENSURE_VO_MAPPING); - log.debug("{} - redirecting user to '{}'", filterName, redirectUrl); + log.debug("{} - redirecting user to '{}'", getFilterName(), redirectUrl); res.reset(); res.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); res.setHeader(HttpHeaders.LOCATION, redirectUrl); diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunForceAupFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunForceAupFilter.java index 8cd73168e..2c2db1f30 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunForceAupFilter.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunForceAupFilter.java @@ -4,6 +4,7 @@ import static cz.muni.ics.oidc.web.controllers.AupController.APPROVED; import com.fasterxml.jackson.databind.ObjectMapper; import cz.muni.ics.oidc.BeanUtil; +import cz.muni.ics.oidc.exceptions.ConfigurationException; import cz.muni.ics.oidc.models.Aup; import cz.muni.ics.oidc.models.Facility; import cz.muni.ics.oidc.models.PerunAttribute; @@ -12,10 +13,10 @@ import cz.muni.ics.oidc.models.PerunUser; import cz.muni.ics.oidc.saml.SamlProperties; import cz.muni.ics.oidc.server.adapters.PerunAdapter; import cz.muni.ics.oidc.server.configurations.PerunOidcConfig; -import cz.muni.ics.oidc.server.filters.FilterParams; -import cz.muni.ics.oidc.server.filters.FiltersUtils; import cz.muni.ics.oidc.server.filters.AuthProcFilter; -import cz.muni.ics.oidc.server.filters.AuthProcFilterParams; +import cz.muni.ics.oidc.server.filters.AuthProcFilterCommonVars; +import cz.muni.ics.oidc.server.filters.AuthProcFilterInitContext; +import cz.muni.ics.oidc.server.filters.FiltersUtils; import cz.muni.ics.oidc.web.controllers.AupController; import java.io.IOException; import java.text.ParseException; @@ -36,6 +37,7 @@ import org.springframework.util.StringUtils; * AUP filter checks if there are new AUPs which user hasn't accepted yet and forces him to do that. * * Configuration (replace [name] part with the name defined for the filter): + * @see cz.muni.ics.oidc.server.filters.AuthProcFilter (basic configuration options) *
      *
    • filter.[name].orgAupsAttrName - Mapping to Perun entityless attribute containing organization AUPs
    • *
    • filter.[name].userAupsAttrName - Mapping to Perun user attribute containing list of AUPS approved by user
    • @@ -52,8 +54,6 @@ import org.springframework.util.StringUtils; @Slf4j public class PerunForceAupFilter extends AuthProcFilter { - public static final String APPLIED = "APPLIED_" + PerunForceAupFilter.class.getSimpleName(); - private static final String DATE_FORMAT = "yyyy-MM-dd"; /* CONFIGURATION PROPERTIES */ @@ -75,46 +75,39 @@ public class PerunForceAupFilter extends AuthProcFilter { private final PerunAdapter perunAdapter; private final PerunOidcConfig perunOidcConfig; private final SamlProperties samlProperties; - private final String filterName; - public PerunForceAupFilter(AuthProcFilterParams params) { - super(params); - BeanUtil beanUtil = params.getBeanUtil(); - this.perunAdapter = beanUtil.getBean(PerunAdapter.class); - this.perunOidcConfig = beanUtil.getBean(PerunOidcConfig.class); + public PerunForceAupFilter(AuthProcFilterInitContext ctx) throws ConfigurationException { + super(ctx); + BeanUtil beanUtil = ctx.getBeanUtil(); + this.perunAdapter = ctx.getPerunAdapterBean(); + this.perunOidcConfig = ctx.getPerunOidcConfigBean(); this.samlProperties = beanUtil.getBean(SamlProperties.class); - this.perunOrgAupsAttrName = params.getProperty(ORG_AUPS_ATTR_NAME); - this.perunUserAupsAttrName = params.getProperty(USER_AUPS_ATTR_NAME); - this.perunVoAupAttrName = params.getProperty(VO_AUP_ATTR_NAME); - this.perunFacilityRequestedAupsAttrName = params.getProperty(FACILITY_REQUESTED_AUPS_ATTR_NAME); - this.perunFacilityVoShortNamesAttrName = params.getProperty(VO_SHORT_NAMES_ATTR_NAME); - this.filterName = params.getFilterName(); + this.perunOrgAupsAttrName = FiltersUtils.fillStringMandatoryProperty(ORG_AUPS_ATTR_NAME, ctx); + this.perunUserAupsAttrName = FiltersUtils.fillStringMandatoryProperty(USER_AUPS_ATTR_NAME, ctx); + this.perunVoAupAttrName = FiltersUtils.fillStringMandatoryProperty(VO_AUP_ATTR_NAME, ctx); + this.perunFacilityRequestedAupsAttrName = FiltersUtils.fillStringMandatoryProperty(FACILITY_REQUESTED_AUPS_ATTR_NAME, ctx); + this.perunFacilityVoShortNamesAttrName = FiltersUtils.fillStringMandatoryProperty(VO_SHORT_NAMES_ATTR_NAME, ctx); } @Override - protected String getSessionAppliedParamName() { - return APPLIED; - } - - @Override - protected boolean process(HttpServletRequest req, HttpServletResponse res, FilterParams params) throws IOException { + protected boolean process(HttpServletRequest req, HttpServletResponse res, AuthProcFilterCommonVars params) throws IOException { if (req.getSession() != null && req.getSession().getAttribute(APPROVED) != null) { req.getSession().removeAttribute(APPROVED); log.debug("{} - skip filter execution: aups are already approved, check at next access to the service due" + - " to a delayed propagation to LDAP", filterName); + " to a delayed propagation to LDAP", getFilterName()); return true; } PerunUser user = FiltersUtils.getPerunUser(req, perunAdapter, samlProperties); if (user == null || user.getId() == null) { - log.debug("{} - skip filter execution: no user provider", filterName); + log.debug("{} - skip filter execution: no user provider", getFilterName()); return true; } Facility facility = params.getFacility(); if (facility == null || facility.getId() == null) { - log.debug("{} - skip filter execution: no facility provider", filterName); + log.debug("{} - skip filter execution: no facility provider", getFilterName()); return true; } @@ -124,13 +117,13 @@ public class PerunForceAupFilter extends AuthProcFilter { if (facilityAttributes == null) { log.debug("{} - skip filter execution: could not fetch attributes '{}' for facility '{}'", - filterName, attrsToFetch, facility); + getFilterName(), attrsToFetch, facility); return true; } else if (!facilityAttributes.containsKey(perunFacilityRequestedAupsAttrName) && !facilityAttributes.containsKey(perunFacilityVoShortNamesAttrName)) { log.debug("{} - skip filter execution: could not fetch required attributes '{}' and '{}' for facility '{}'", - filterName, perunFacilityRequestedAupsAttrName, perunFacilityVoShortNamesAttrName, facility); + getFilterName(), perunFacilityRequestedAupsAttrName, perunFacilityVoShortNamesAttrName, facility); return true; } @@ -139,30 +132,36 @@ public class PerunForceAupFilter extends AuthProcFilter { try { newAups = getAupsToApprove(user, facilityAttributes); } catch (ParseException | IOException e) { - log.warn("{} - caught parse exception when processing AUPs to approve", filterName); - log.trace("{} - details:", filterName, e); + log.warn("{} - caught parse exception when processing AUPs to approve", getFilterName()); + log.debug("{} - details:", getFilterName(), e); return true; } if (!newAups.isEmpty()) { - log.debug("{} - user has to approve some AUPs", filterName); - log.trace("{} - AUPS to be approved: '{}'", filterName, newAups); - String newAupsString = mapper.writeValueAsString(newAups); - - req.getSession().setAttribute(AupController.RETURN_URL, req.getRequestURI() - .replace(req.getContextPath(), "") + '?' + req.getQueryString()); - req.getSession().setAttribute(AupController.NEW_AUPS, newAupsString); - req.getSession().setAttribute(AupController.USER_ATTR, perunUserAupsAttrName); - - log.debug("{} - redirecting user '{}' to AUPs approval page", filterName, user); - res.sendRedirect(req.getContextPath() + '/' + AupController.URL); + log.info("{} - user has to approve some AUPs", getFilterName()); + log.debug("{} - AUPS to be approved: '{}'", getFilterName(), newAups); + redirectToApproval(req, res, newAups, user); return false; } - log.debug("{} - no need to approve any AUPs", filterName); + log.debug("{} - no need to approve any AUPs", getFilterName()); return true; } + private void redirectToApproval(HttpServletRequest req, HttpServletResponse res, Map newAups, + PerunUser user) throws IOException + { + String newAupsString = mapper.writeValueAsString(newAups); + + req.getSession().setAttribute(AupController.RETURN_URL, req.getRequestURI() + .replace(req.getContextPath(), "") + '?' + req.getQueryString()); + req.getSession().setAttribute(AupController.NEW_AUPS, newAupsString); + req.getSession().setAttribute(AupController.USER_ATTR, perunUserAupsAttrName); + + log.debug("{} - redirecting user '{}' to AUPs approval page", getFilterName(), user); + res.sendRedirect(req.getContextPath() + '/' + AupController.URL); + } + private Map getAupsToApprove(PerunUser user, Map facilityAttributes) throws ParseException, IOException { @@ -220,12 +219,12 @@ public class PerunForceAupFilter extends AuthProcFilter { continue; } } - log.debug("{} - need to approve AUP with key '{}' ({})", filterName, keyToVoAup.getKey(), voLatestAup); + log.debug("{} - need to approve AUP with key '{}' ({})", getFilterName(), keyToVoAup.getKey(), voLatestAup); aupsToApprove.put(keyToVoAup.getKey(), voLatestAup); } } - log.trace("{} - VO AUPs to approve: {}", filterName, aupsToApprove); + log.trace("{} - VO AUPs to approve: {}", getFilterName(), aupsToApprove); return aupsToApprove; } @@ -246,7 +245,7 @@ public class PerunForceAupFilter extends AuthProcFilter { } } } - log.debug("{} - Mapped ORG aups: {}", filterName, orgAups); + log.debug("{} - Mapped ORG aups: {}", getFilterName(), orgAups); if (!orgAups.isEmpty()) { for (String requiredOrgAupKey : requestedAups) { @@ -260,12 +259,12 @@ public class PerunForceAupFilter extends AuthProcFilter { continue; } } - log.debug("{} - need to approve AUP with key '{}' ({})", filterName, requiredOrgAupKey, orgLatestAup); + log.debug("{} - need to approve AUP with key '{}' ({})", getFilterName(), requiredOrgAupKey, orgLatestAup); aupsToApprove.put(requiredOrgAupKey, orgLatestAup); } } - log.debug("{} - ORG AUPs to approve: {}", filterName, aupsToApprove); + log.debug("{} - ORG AUPs to approve: {}", getFilterName(), aupsToApprove); return aupsToApprove; } diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunIsCesnetEligibleFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunIsCesnetEligibleFilter.java deleted file mode 100644 index 50a41686e..000000000 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunIsCesnetEligibleFilter.java +++ /dev/null @@ -1,147 +0,0 @@ -package cz.muni.ics.oidc.server.filters.impl; - -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_FORCE_AUTHN; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_REASON; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_SCOPE; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_TARGET; -import static cz.muni.ics.oidc.web.controllers.PerunUnapprovedController.REASON_EXPIRED; -import static cz.muni.ics.oidc.web.controllers.PerunUnapprovedController.REASON_NOT_SET; - -import cz.muni.ics.oidc.BeanUtil; -import cz.muni.ics.oidc.models.PerunAttributeValue; -import cz.muni.ics.oidc.models.PerunUser; -import cz.muni.ics.oidc.server.adapters.PerunAdapter; -import cz.muni.ics.oidc.server.configurations.PerunOidcConfig; -import cz.muni.ics.oidc.server.filters.FilterParams; -import cz.muni.ics.oidc.server.filters.FiltersUtils; -import cz.muni.ics.oidc.server.filters.AuthProcFilter; -import cz.muni.ics.oidc.server.filters.AuthProcFilterParams; -import cz.muni.ics.oidc.web.controllers.ControllerUtils; -import cz.muni.ics.oidc.web.controllers.PerunUnapprovedController; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.apache.http.HttpHeaders; - -/** - * This filter verifies that user attribute isCesnetEligible is not older than given time frame. - * In case the value is older, denies access to the service and forces user to use verified identity. - * Otherwise, user can to access the service. - * - * Configuration (replace [name] part with the name defined for the filter): - *
        - *
      • filter.[name].isCesnetEligibleAttr - mapping to isCesnetEligible attribute
      • - *
      • filter.[name].validityPeriod - specify in months, how long the value can be old, if no value - * or invalid value has been provided, defaults to 12 months
      • - *
      - * @author Dominik Frantisek Bucik - */ -@Slf4j -public class PerunIsCesnetEligibleFilter extends AuthProcFilter { - - public static final String APPLIED = "APPLIED_" + PerunIsCesnetEligibleFilter.class.getSimpleName(); - - /* CONFIGURATION PROPERTIES */ - private static final String IS_CESNET_ELIGIBLE_ATTR_NAME = "isCesnetEligibleAttr"; - private static final String IS_CESNET_ELIGIBLE_SCOPE = "isCesnetEligibleScope"; - private static final String VALIDITY_PERIOD = "validityPeriod"; - private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; - - private final String isCesnetEligibleAttrName; - private final String triggerScope; - private final int validityPeriod; - /* END OF CONFIGURATION PROPERTIES */ - - private final PerunOidcConfig config; - private final PerunAdapter perunAdapter; - private final String filterName; - - public PerunIsCesnetEligibleFilter(AuthProcFilterParams params) { - super(params); - BeanUtil beanUtil = params.getBeanUtil(); - this.config = beanUtil.getBean(PerunOidcConfig.class); - this.perunAdapter = beanUtil.getBean(PerunAdapter.class); - this.isCesnetEligibleAttrName = params.getProperty(IS_CESNET_ELIGIBLE_ATTR_NAME); - this.triggerScope = params.getProperty(IS_CESNET_ELIGIBLE_SCOPE); - int validityPeriodParam = 12; - if (params.hasProperty(VALIDITY_PERIOD)) { - try { - validityPeriodParam = Integer.parseInt(params.getProperty(VALIDITY_PERIOD)); - } catch (NumberFormatException ignored) { - //no problem, we have default value - } - } - - this.validityPeriod = validityPeriodParam; - this.filterName = params.getFilterName(); - } - - @Override - protected String getSessionAppliedParamName() { - return APPLIED; - } - - @Override - protected boolean process(HttpServletRequest req, HttpServletResponse res, FilterParams params) { - if (!FiltersUtils.isScopePresent(req.getParameter(PARAM_SCOPE), triggerScope)) { - log.debug("{} - skip execution: scope '{}' is not present in request", filterName, triggerScope); - return true; - } - - PerunUser user = params.getUser(); - if (user == null || user.getId() == null) { - log.debug("{} - skip execution: no user provider", filterName); - return true; - } - - String reason = REASON_NOT_SET; - PerunAttributeValue attrValue = perunAdapter.getUserAttributeValue(user.getId(), isCesnetEligibleAttrName); - if (attrValue != null) { - LocalDateTime timeStamp; - try { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_TIME_FORMAT); - timeStamp = LocalDateTime.parse(attrValue.valueAsString(), formatter); - } catch (DateTimeParseException e) { - log.warn("{} - could not parse timestamp from attribute '{}' value: '{}'", - filterName, isCesnetEligibleAttrName, attrValue.valueAsString()); - log.debug("{} - skip execution: no timestamp to compare to", filterName); - log.trace("{} - details:", filterName, e); - return true; - } - - LocalDateTime now = LocalDateTime.now(); - if (now.minusMonths(validityPeriod).isBefore(timeStamp)) { - log.debug("{} - attribute '{}' value is valid", filterName, isCesnetEligibleAttrName); - return true; - } else { - reason = REASON_EXPIRED; - } - } - - log.debug("{} - attribute '{}' value is invalid, stop user at this point", filterName, attrValue); - this.redirect(req, res, reason); - return false; - } - - private void redirect(HttpServletRequest req, HttpServletResponse res, String reason) { - Map params = new HashMap<>(); - - String targetURL = FiltersUtils.buildRequestURL(req, Collections.singletonMap(PARAM_FORCE_AUTHN, "true")); - params.put(PARAM_TARGET, targetURL); - params.put(PARAM_REASON, reason); - - String redirectUrl = ControllerUtils.createRedirectUrl(config.getConfigBean().getIssuer(), - PerunUnapprovedController.UNAPPROVED_IS_CESNET_ELIGIBLE_MAPPING, params); - log.debug("{} - redirecting user to unapproved: URL '{}'", filterName, redirectUrl); - res.reset(); - res.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); - res.setHeader(HttpHeaders.LOCATION, redirectUrl); - } - -} diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunIsTestSpFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunIsTestSpFilter.java index 06fc36676..aa34f95aa 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunIsTestSpFilter.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunIsTestSpFilter.java @@ -1,17 +1,17 @@ package cz.muni.ics.oidc.server.filters.impl; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_TARGET; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_TARGET; import static cz.muni.ics.oidc.web.controllers.IsTestSpController.IS_TEST_SP_APPROVED_SESS; -import cz.muni.ics.oidc.BeanUtil; +import cz.muni.ics.oidc.exceptions.ConfigurationException; import cz.muni.ics.oidc.models.Facility; import cz.muni.ics.oidc.models.PerunAttributeValue; import cz.muni.ics.oidc.server.adapters.PerunAdapter; import cz.muni.ics.oidc.server.configurations.PerunOidcConfig; -import cz.muni.ics.oidc.server.filters.FilterParams; -import cz.muni.ics.oidc.server.filters.FiltersUtils; import cz.muni.ics.oidc.server.filters.AuthProcFilter; -import cz.muni.ics.oidc.server.filters.AuthProcFilterParams; +import cz.muni.ics.oidc.server.filters.AuthProcFilterInitContext; +import cz.muni.ics.oidc.server.filters.AuthProcFilterCommonVars; +import cz.muni.ics.oidc.server.filters.FiltersUtils; import cz.muni.ics.oidc.web.controllers.ControllerUtils; import cz.muni.ics.oidc.web.controllers.IsTestSpController; import java.io.IOException; @@ -27,8 +27,9 @@ import org.apache.http.HttpHeaders; * Otherwise, user can to access the service. * * Configuration (replace [name] part with the name defined for the filter): + * @see cz.muni.ics.oidc.server.filters.AuthProcFilter (basic configuration options) *
        - *
      • filter.[name].isTestSpAttr - mapping to isCesnetEligible attribute
      • + *
      • filter.[name].isTestSpAttr - mapping to isTestSp attribute
      • *
      * @author Dominik Frantisek Bucik * @author Pavol Pluta <500348@mail.muni.cz> @@ -36,50 +37,40 @@ import org.apache.http.HttpHeaders; @Slf4j public class PerunIsTestSpFilter extends AuthProcFilter { - public static final String APPLIED = "APPLIED_" + PerunIsTestSpFilter.class.getSimpleName(); - private static final String IS_TEST_SP_ATTR_NAME = "isTestSpAttr"; private final String isTestSpAttrName; private final PerunAdapter perunAdapter; - private final String filterName; private final PerunOidcConfig config; - public PerunIsTestSpFilter(AuthProcFilterParams params) { - super(params); - BeanUtil beanUtil = params.getBeanUtil(); - this.perunAdapter = beanUtil.getBean(PerunAdapter.class); - this.isTestSpAttrName = params.getProperty(IS_TEST_SP_ATTR_NAME); - this.filterName = params.getFilterName(); - this.config = beanUtil.getBean(PerunOidcConfig.class); + public PerunIsTestSpFilter(AuthProcFilterInitContext ctx) throws ConfigurationException { + super(ctx); + this.perunAdapter = ctx.getPerunAdapterBean(); + this.config = ctx.getPerunOidcConfigBean(); + this.isTestSpAttrName = FiltersUtils.fillStringMandatoryProperty(IS_TEST_SP_ATTR_NAME, ctx); } @Override - protected String getSessionAppliedParamName() { - return APPLIED; - } - - @Override - protected boolean process(HttpServletRequest req, HttpServletResponse res, FilterParams params) throws IOException { + protected boolean process(HttpServletRequest req, HttpServletResponse res, AuthProcFilterCommonVars params) throws IOException { Facility facility = params.getFacility(); if (facility == null || facility.getId() == null) { - log.debug("{} - skip execution: no facility provided", filterName); + log.debug("{} - skip execution: no facility provided", getFilterName()); return true; } else if (testSpWarningApproved(req)){ - log.debug("{} - skip execution: warning already approved", filterName); + log.debug("{} - skip execution: warning already approved", getFilterName()); return true; } PerunAttributeValue attrValue = perunAdapter.getFacilityAttributeValue(facility.getId(), isTestSpAttrName); if (attrValue == null) { - log.debug("{} - skip execution: attribute {} has null value", filterName, isTestSpAttrName); + log.debug("{} - skip execution: attribute {} has null value", getFilterName(), isTestSpAttrName); return true; } else if (attrValue.valueAsBoolean()) { - log.debug("{} - redirecting user to test SP warning page", filterName); + log.debug("{} - redirecting user to test SP warning page", getFilterName()); this.redirect(req, res); return false; } - log.debug("{} - service is not testing, let user access it", filterName); + log.debug("{} - service is not testing, let user access it", getFilterName()); return true; } @@ -102,7 +93,7 @@ public class PerunIsTestSpFilter extends AuthProcFilter { params.put(PARAM_TARGET, targetURL); String redirectUrl = ControllerUtils.createRedirectUrl(config.getConfigBean().getIssuer(), IsTestSpController.MAPPING, params); - log.debug("{} - redirecting user to testSP warning page: {}", filterName, redirectUrl); + log.debug("{} - redirecting user to testSP warning page: {}", getFilterName(), redirectUrl); res.reset(); res.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); res.setHeader(HttpHeaders.LOCATION, redirectUrl); diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunLogIdentityFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunLogIdentityFilter.java index e00a30f6c..e54b63d45 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunLogIdentityFilter.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunLogIdentityFilter.java @@ -1,11 +1,12 @@ package cz.muni.ics.oidc.server.filters.impl; import cz.muni.ics.oauth2.model.ClientDetailsEntity; +import cz.muni.ics.oidc.exceptions.ConfigurationException; import cz.muni.ics.oidc.models.PerunUser; import cz.muni.ics.oidc.saml.SamlProperties; import cz.muni.ics.oidc.server.filters.AuthProcFilter; -import cz.muni.ics.oidc.server.filters.AuthProcFilterParams; -import cz.muni.ics.oidc.server.filters.FilterParams; +import cz.muni.ics.oidc.server.filters.AuthProcFilterInitContext; +import cz.muni.ics.oidc.server.filters.AuthProcFilterCommonVars; import cz.muni.ics.oidc.server.filters.FiltersUtils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -13,29 +14,23 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.security.saml.SAMLCredential; /** - * This filter logs information about the user who has logged in INFO level in the format: - * 'User ID: {}, User identifier: {}, User name: {}, service ID: {}, service name: {}'. + * This filter logs information about the user who has logged in INFO level in the format + * {} - user_id '{}', user_identifier '{}', user_name '{}', service_identifier '{}', service_name: '{}'. + * @see cz.muni.ics.oidc.server.filters.AuthProcFilter (basic configuration options) * @author Dominik Frantisek Bucik */ @Slf4j public class PerunLogIdentityFilter extends AuthProcFilter { - public static final String APPLIED = "APPLIED_" + PerunLogIdentityFilter.class.getSimpleName(); - private final String userIdentifierAttr; - public PerunLogIdentityFilter(AuthProcFilterParams params) { + public PerunLogIdentityFilter(AuthProcFilterInitContext params) throws ConfigurationException { super(params); userIdentifierAttr = params.getBeanUtil().getBean(SamlProperties.class).getUserIdentifierAttribute(); } @Override - protected String getSessionAppliedParamName() { - return APPLIED; - } - - @Override - protected boolean process(HttpServletRequest req, HttpServletResponse res, FilterParams params) { + protected boolean process(HttpServletRequest req, HttpServletResponse res, AuthProcFilterCommonVars params) { PerunUser user = params.getUser(); ClientDetailsEntity client = params.getClient(); SAMLCredential samlCredential = FiltersUtils.getSamlCredential(req); @@ -57,8 +52,8 @@ public class PerunLogIdentityFilter extends AuthProcFilter { identifier = FiltersUtils.getExtLogin(samlCredential, userIdentifierAttr); } - log.info("User ID: {}, User identifier: {}, User name: {}, service ID: {}, service name: {}", - id, identifier, name, clientId, clientName); + log.info("{} - user_id '{}', user_identifier '{}', user_name '{}', service_identifier '{}', service_name: '{}'", + getFilterName(), id, identifier, name, clientId, clientName); return true; } diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/ProxyStatisticsFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/ProxyStatisticsFilter.java index b33b8d067..0051cc545 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/ProxyStatisticsFilter.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/ProxyStatisticsFilter.java @@ -5,11 +5,12 @@ import static java.nio.charset.StandardCharsets.UTF_8; import cz.muni.ics.oauth2.model.ClientDetailsEntity; import cz.muni.ics.oidc.BeanUtil; +import cz.muni.ics.oidc.exceptions.ConfigurationException; import cz.muni.ics.oidc.saml.SamlProperties; -import cz.muni.ics.oidc.server.filters.FilterParams; +import cz.muni.ics.oidc.server.filters.AuthProcFilterCommonVars; import cz.muni.ics.oidc.server.filters.FiltersUtils; import cz.muni.ics.oidc.server.filters.AuthProcFilter; -import cz.muni.ics.oidc.server.filters.AuthProcFilterParams; +import cz.muni.ics.oidc.server.filters.AuthProcFilterInitContext; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; @@ -29,6 +30,7 @@ import org.springframework.util.StringUtils; * Filter for collecting data about login. * * Configuration (replace [name] part with the name defined for the filter): + * @see cz.muni.ics.oidc.server.filters.AuthProcFilter (basic configuration options) *
        *
      • filter.[name].idpNameAttributeName - Mapping to Request attribute containing name of used * Identity Provider
      • @@ -51,8 +53,6 @@ import org.springframework.util.StringUtils; @Slf4j public class ProxyStatisticsFilter extends AuthProcFilter { - public static final String APPLIED = "APPLIED_" + ProxyStatisticsFilter.class.getSimpleName(); - /* CONFIGURATION OPTIONS */ private static final String IDP_NAME_ATTRIBUTE_NAME = "idpNameAttributeName"; private static final String IDP_ENTITY_ID_ATTRIBUTE_NAME = "idpEntityIdAttributeName"; @@ -74,62 +74,55 @@ public class ProxyStatisticsFilter extends AuthProcFilter { /* END OF CONFIGURATION OPTIONS */ private final DataSource mitreIdStats; - private final String filterName; private final SamlProperties samlProperties; - public ProxyStatisticsFilter(AuthProcFilterParams params) { - super(params); - BeanUtil beanUtil = params.getBeanUtil(); + public ProxyStatisticsFilter(AuthProcFilterInitContext ctx) throws ConfigurationException { + super(ctx); + BeanUtil beanUtil = ctx.getBeanUtil(); this.mitreIdStats = beanUtil.getBean("mitreIdStats", DataSource.class); this.samlProperties = beanUtil.getBean(SamlProperties.class); - this.idpNameAttributeName = params.getProperty(IDP_NAME_ATTRIBUTE_NAME, + this.idpNameAttributeName = FiltersUtils.fillStringPropertyOrDefaultVal(IDP_NAME_ATTRIBUTE_NAME, ctx, "urn:cesnet:proxyidp:attribute:sourceIdPName"); - this.idpEntityIdAttributeName = params.getProperty(IDP_ENTITY_ID_ATTRIBUTE_NAME, + this.idpEntityIdAttributeName = FiltersUtils.fillStringPropertyOrDefaultVal(IDP_ENTITY_ID_ATTRIBUTE_NAME, ctx, "urn:cesnet:proxyidp:attribute:sourceIdPEntityID"); - this.statisticsTableName = params.getProperty(STATISTICS_TABLE_NAME, "statistics_per_user"); - this.identityProvidersMapTableName = params.getProperty(IDENTITY_PROVIDERS_MAP_TABLE_NAME, "statistics_idp"); - this.serviceProvidersMapTableName = params.getProperty(SERVICE_PROVIDERS_MAP_TABLE_NAME, "statistics_sp"); - this.idpIdColumnName = params.getProperty(IDP_ID_COLUMN_NAME, "idpId"); - this.spIdColumnName = params.getProperty(SP_ID_COLUMN_NAME, "spId"); - this.usernameColumnName = params.getProperty(USERNAME_COLUMN_NAME, "user"); - this.filterName = params.getFilterName(); + this.statisticsTableName = FiltersUtils.fillStringPropertyOrDefaultVal(STATISTICS_TABLE_NAME, ctx, "statistics_per_user"); + this.identityProvidersMapTableName = FiltersUtils.fillStringPropertyOrDefaultVal(IDENTITY_PROVIDERS_MAP_TABLE_NAME, ctx, "statistics_idp"); + this.serviceProvidersMapTableName = FiltersUtils.fillStringPropertyOrDefaultVal(SERVICE_PROVIDERS_MAP_TABLE_NAME, ctx, "statistics_sp"); + this.idpIdColumnName = FiltersUtils.fillStringPropertyOrDefaultVal(IDP_ID_COLUMN_NAME, ctx, "idpId"); + this.spIdColumnName = FiltersUtils.fillStringPropertyOrDefaultVal(SP_ID_COLUMN_NAME, ctx, "spId"); + this.usernameColumnName = FiltersUtils.fillStringPropertyOrDefaultVal(USERNAME_COLUMN_NAME, ctx, "user"); } @Override - protected String getSessionAppliedParamName() { - return APPLIED; - } - - @Override - protected boolean process(HttpServletRequest req, HttpServletResponse res, FilterParams params) { + protected boolean process(HttpServletRequest req, HttpServletResponse res, AuthProcFilterCommonVars params) { ClientDetailsEntity client = params.getClient(); if (client == null) { - log.warn("{} - skip execution: no client provided", filterName); + log.warn("{} - skip execution: no client provided", getFilterName()); return true; } else if (!StringUtils.hasText(client.getClientId())) { - log.warn("{} - skip execution: no client identifier provided", filterName); + log.warn("{} - skip execution: no client identifier provided", getFilterName()); return true; } else if (!StringUtils.hasText(client.getClientName())) { - log.warn("{} - skip execution: no client name provided", filterName); + log.warn("{} - skip execution: no client name provided", getFilterName()); return true; } SAMLCredential samlCredential = FiltersUtils.getSamlCredential(req); if (samlCredential == null) { log.warn("{} - skip execution: no authN object available, cannot extract user identifier and idp identifier", - filterName); + getFilterName()); return true; } String userIdentifier = FiltersUtils.getExtLogin(samlCredential, samlProperties.getUserIdentifierAttribute()); if (!StringUtils.hasText(userIdentifier)) { - log.warn("{} - skip execution: no user identifier provided", filterName); + log.warn("{} - skip execution: no user identifier provided", getFilterName()); return true; } else if (!StringUtils.hasText(samlCredential.getAttributeAsString(idpEntityIdAttributeName))) { - log.warn("{} - skip execution: no authenticating idp identifier provided", filterName); + log.warn("{} - skip execution: no authenticating idp identifier provided", getFilterName()); return true; } else if (!StringUtils.hasText(samlCredential.getAttributeAsString(idpNameAttributeName))) { - log.warn("{} - skip execution: no authenticating idp identifier provided", filterName); + log.warn("{} - skip execution: no authenticating idp identifier provided", getFilterName()); return true; } @@ -141,7 +134,7 @@ public class ProxyStatisticsFilter extends AuthProcFilter { insertOrUpdateLogin(idpEntityId, idpName, clientId, clientName, userIdentifier); log.info("{} - User identity: {}, service: {}, serviceName: {}, via IdP: {}", - filterName, userIdentifier, client.getClientId(), client.getClientName(), idpEntityId); + getFilterName(), userIdentifier, client.getClientId(), client.getClientName(), idpEntityId); return true; } @@ -158,12 +151,12 @@ public class ProxyStatisticsFilter extends AuthProcFilter { if (spId == null) { return; } - log.trace("{} - Extracted IDs for SP and IdP: spId={}({}), idpId={}({})", - filterName, spId, spIdentifier, idpId, idpEntityId); + log.debug("{} - Extracted IDs for SP and IdP: spId={}({}), idpId={}({})", + getFilterName(), spId, spIdentifier, idpId, idpEntityId); insertOrUpdateLogin(c, idpId, spId, userId); } catch (SQLException ex) { - log.warn("{} - caught SQLException", filterName); - log.debug("{} - details:", filterName, ex); + log.warn("{} - caught SQLException", getFilterName()); + log.debug("{} - details:", getFilterName(), ex); } } @@ -174,6 +167,7 @@ public class ProxyStatisticsFilter extends AuthProcFilter { } else { updateLogin(c, idpId, spId, userId); } + log.info("{} - login info stored in statistics", getFilterName()); } private boolean fetchLogin(Connection c, Long idpId, Long spId, String userId) { @@ -193,8 +187,8 @@ public class ProxyStatisticsFilter extends AuthProcFilter { return rs.getInt("res") > 0; } } catch (SQLException e) { - log.warn("{} - caught SQLException when fetching login entry", filterName); - log.debug("{} - details:", filterName, e); + log.warn("{} - caught SQLException when fetching login entry", getFilterName()); + log.debug("{} - details:", getFilterName(), e); } return false; } @@ -210,8 +204,8 @@ public class ProxyStatisticsFilter extends AuthProcFilter { return rs.getLong(spIdColumnName); } } catch (SQLException ex) { - log.warn("{} - caught SQLException when extracting SP ID", filterName); - log.debug("{} - details:", filterName, ex); + log.warn("{} - caught SQLException when extracting SP ID", getFilterName()); + log.debug("{} - details:", getFilterName(), ex); } return null; } @@ -227,8 +221,8 @@ public class ProxyStatisticsFilter extends AuthProcFilter { return rs.getLong(idpIdColumnName); } } catch (SQLException ex) { - log.warn("{} - caught SQLException when extracting IdP ID", filterName); - log.debug("{} - details:", filterName, ex); + log.warn("{} - caught SQLException when extracting IdP ID", getFilterName()); + log.debug("{} - details:", getFilterName(), ex); } return null; } @@ -238,11 +232,11 @@ public class ProxyStatisticsFilter extends AuthProcFilter { if (!Objects.equals(idpName, idpNameInDb)) { if (idpNameInDb == null) { if (insertIdpMap(c, idpEntityId, idpName)) { - log.trace("{} - IdP map entry inserted", filterName); + log.debug("{} - IdP map entry inserted", getFilterName()); } } else { if (updateIdpMap(c, idpEntityId, idpName)) { - log.trace("{} - IdP map entry updated", filterName); + log.debug("{} - IdP map entry updated", getFilterName()); } } } @@ -276,11 +270,11 @@ public class ProxyStatisticsFilter extends AuthProcFilter { if (!Objects.equals(spName, spNameInDb)) { if (spNameInDb == null) { if (insertSpMap(c, spIdentifier, spName)) { - log.trace("{} - SP map entry inserted", filterName); + log.debug("{} - SP map entry inserted", getFilterName()); } } else { if (updateSpMap(c, spIdentifier, spName)) { - log.trace("{} - SP map entry updated", filterName); + log.debug("{} - SP map entry updated", getFilterName()); } } } @@ -307,10 +301,10 @@ public class ProxyStatisticsFilter extends AuthProcFilter { ps.setString(4, userId); ps.execute(); log.debug("{} - Inserted first login for combination: idpId={}, spId={}, userId={}", - filterName, idpId, spId, userId); + getFilterName(), idpId, spId, userId); } catch (SQLException ex) { - log.warn("{} - caught SQLException when inserting login entry", filterName); - log.debug("{} - details:", filterName, ex); + log.warn("{} - caught SQLException when inserting login entry", getFilterName()); + log.debug("{} - details:", getFilterName(), ex); } } @@ -329,10 +323,10 @@ public class ProxyStatisticsFilter extends AuthProcFilter { ps.setString(4, userId); ps.execute(); log.debug("{} - Updated login count by 1 for combination: idpId={}, spId={}, userId={}", - filterName, idpId, spId, userId); + getFilterName(), idpId, spId, userId); } catch (SQLException ex) { - log.warn("{} - caught SQLException when updating login entry", filterName); - log.debug("{} - details:", filterName, ex); + log.warn("{} - caught SQLException when updating login entry", getFilterName()); + log.debug("{} - details:", getFilterName(), ex); } } @@ -352,12 +346,12 @@ public class ProxyStatisticsFilter extends AuthProcFilter { ps.setString(1, identifier); ps.setString(2, name); ps.execute(); - log.debug("{} - {} entry inserted", filterName, table); + log.debug("{} - {} entry inserted", getFilterName(), table); return true; } catch (SQLException ex) { // someone has already inserted it - log.trace("{} - {} entry failed to insert", filterName, table); - log.trace("{} - details", filterName, ex); + log.debug("{} - {} entry failed to insert", getFilterName(), table); + log.debug("{} - details", getFilterName(), ex); } return false; } @@ -377,11 +371,11 @@ public class ProxyStatisticsFilter extends AuthProcFilter { ps.setString(1, name); ps.setString(2, identifier); ps.execute(); - log.debug("{} - {} entry updated", filterName, table); + log.debug("{} - {} entry updated", getFilterName(), table); return true; } catch (SQLException ex) { - log.trace("{} - {} map entry failed to update", filterName, table); - log.trace("{} - details", filterName); + log.debug("{} - {} map entry failed to update", getFilterName(), table); + log.debug("{} - details", getFilterName()); } return false; } diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/ValidUserFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/ValidUserFilter.java index e3d4d2cf9..25f8e6b69 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/ValidUserFilter.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/ValidUserFilter.java @@ -1,19 +1,18 @@ package cz.muni.ics.oidc.server.filters.impl; -import cz.muni.ics.oidc.BeanUtil; +import cz.muni.ics.oidc.exceptions.ConfigurationException; import cz.muni.ics.oidc.models.Facility; import cz.muni.ics.oidc.models.PerunAttributeValue; import cz.muni.ics.oidc.models.PerunUser; import cz.muni.ics.oidc.server.adapters.PerunAdapter; import cz.muni.ics.oidc.server.configurations.FacilityAttrsConfig; import cz.muni.ics.oidc.server.configurations.PerunOidcConfig; -import cz.muni.ics.oidc.server.filters.FilterParams; -import cz.muni.ics.oidc.server.filters.FiltersUtils; import cz.muni.ics.oidc.server.filters.AuthProcFilter; -import cz.muni.ics.oidc.server.filters.AuthProcFilterParams; +import cz.muni.ics.oidc.server.filters.AuthProcFilterCommonVars; +import cz.muni.ics.oidc.server.filters.AuthProcFilterInitContext; +import cz.muni.ics.oidc.server.filters.FiltersUtils; import cz.muni.ics.oidc.web.controllers.PerunUnapprovedController; import java.util.HashSet; -import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -27,6 +26,7 @@ import org.springframework.util.StringUtils; * the environment the service is in. * * Configuration (replace [name] part with the name defined for the filter): + * @see cz.muni.ics.oidc.server.filters.AuthProcFilter (basic configuration options) *
          *
        • filter.[name].allEnvGroups - Comma separated list of GROUP IDs the user must be always member of
        • *
        • filter.[name].allEnvGroups - Comma separated list of VO IDs the user must be always member of
        • @@ -46,8 +46,6 @@ import org.springframework.util.StringUtils; @Slf4j public class ValidUserFilter extends AuthProcFilter { - public static final String APPLIED = "APPLIED_" + ValidUserFilter.class.getSimpleName(); - /* CONFIGURATION OPTIONS */ private static final String ALL_ENV_GROUPS = "allEnvGroups"; private static final String ALL_ENV_VOS = "allEnvVos"; @@ -66,85 +64,92 @@ public class ValidUserFilter extends AuthProcFilter { private final PerunAdapter perunAdapter; private final FacilityAttrsConfig facilityAttrsConfig; - private final String filterName; private final PerunOidcConfig config; - public ValidUserFilter(AuthProcFilterParams params) { - super(params); - BeanUtil beanUtil = params.getBeanUtil(); - this.perunAdapter = beanUtil.getBean(PerunAdapter.class); - this.facilityAttrsConfig = beanUtil.getBean(FacilityAttrsConfig.class); + public ValidUserFilter(AuthProcFilterInitContext ctx) throws ConfigurationException { + super(ctx); + this.perunAdapter = ctx.getPerunAdapterBean(); + this.config = ctx.getPerunOidcConfigBean(); + this.facilityAttrsConfig = ctx.getBeanUtil().getBean(FacilityAttrsConfig.class); - this.allEnvGroups = this.getIdsFromParam(params, ALL_ENV_GROUPS); - this.allEnvVos = this.getIdsFromParam(params, ALL_ENV_VOS); - this.testEnvGroups = this.getIdsFromParam(params, TEST_ENV_GROUPS); - this.testEnvVos = this.getIdsFromParam(params, TEST_ENV_VOS); - this.prodEnvGroups = this.getIdsFromParam(params, PROD_ENV_GROUPS); - this.prodEnvVos = this.getIdsFromParam(params, PROD_ENV_VOS); - this.filterName = params.getFilterName(); - this.config = beanUtil.getBean(PerunOidcConfig.class); + this.allEnvGroups = getIdsFromParam(ctx, ALL_ENV_GROUPS); + this.allEnvVos = getIdsFromParam(ctx, ALL_ENV_VOS); + this.testEnvGroups = getIdsFromParam(ctx, TEST_ENV_GROUPS); + this.testEnvVos = getIdsFromParam(ctx, TEST_ENV_VOS); + this.prodEnvGroups = getIdsFromParam(ctx, PROD_ENV_GROUPS); + this.prodEnvVos = getIdsFromParam(ctx, PROD_ENV_VOS); + + if (allSetsEmpty()) { + throw new ConfigurationException("All sets are configured to be empty"); + } + } + + private boolean allSetsEmpty() { + return allEnvVos.isEmpty() && allEnvGroups.isEmpty() + && prodEnvVos.isEmpty() && prodEnvGroups.isEmpty() + && testEnvVos.isEmpty() && testEnvGroups.isEmpty(); } @Override - protected String getSessionAppliedParamName() { - return APPLIED; - } - - @Override - protected boolean process(HttpServletRequest req, HttpServletResponse res, FilterParams params) { - Set additionalVos = new HashSet<>(); - Set additionalGroups = new HashSet<>(); - + protected boolean process(HttpServletRequest req, HttpServletResponse res, AuthProcFilterCommonVars params) { PerunUser user = params.getUser(); - if (user == null || user.getId() == null) { - log.debug("{} - skip filter execution: no user provided", filterName); + log.debug("{} - skip filter execution: no user provided", getFilterName()); return true; } Facility facility = params.getFacility(); if (facility == null || facility.getId() == null) { - log.debug("{} - skip filter execution: no facility provided", filterName); + log.debug("{} - skip filter execution: no facility provided", getFilterName()); return true; } - if (!checkMemberValidInGroupsAndVos(user, facility, res, params, allEnvVos, allEnvGroups, - PerunUnapprovedController.UNAPPROVED_NOT_IN_MANDATORY_VOS_GROUPS)) { + if (!checkMemberValidInGroupsAndVos(user, allEnvVos, allEnvGroups)) { + redirectCannotAccess(res, facility, user, params.getClientIdentifier(), PerunUnapprovedController.UNAPPROVED_NOT_IN_MANDATORY_VOS_GROUPS); return false; } - PerunAttributeValue isTestSp = perunAdapter.getFacilityAttributeValue(facility.getId(), facilityAttrsConfig.getTestSpAttr()); - boolean isTestSpBool = false; - if (isTestSp != null) { - isTestSpBool = isTestSp.valueAsBoolean(); + PerunAttributeValue isTestSpAttrValue = perunAdapter.getFacilityAttributeValue(facility.getId(), facilityAttrsConfig.getTestSpAttr()); + boolean testService = false; + if (isTestSpAttrValue != null) { + testService = isTestSpAttrValue.valueAsBoolean(); } - log.debug("{} - service {} in test env", filterName, (isTestSpBool ? "is" : "is not")); - if (isTestSpBool) { - additionalVos.addAll(testEnvVos); - additionalGroups.addAll(testEnvGroups); - if (!checkMemberValidInGroupsAndVos(user, facility, res, params, additionalVos, - additionalGroups, PerunUnapprovedController.UNAPPROVED_NOT_IN_TEST_VOS_GROUPS)) { - return false; - } + log.debug("{} - service {} in test env", getFilterName(), (testService ? "is" : "is not")); + + Set vos = new HashSet<>(); + Set groups = new HashSet<>(); + String unapprovedMapping; + if (testService) { + vos.addAll(testEnvVos); + groups.addAll(testEnvGroups); + unapprovedMapping = PerunUnapprovedController.UNAPPROVED_NOT_IN_TEST_VOS_GROUPS; } else { - additionalVos.addAll(prodEnvVos); - additionalGroups.addAll(prodEnvGroups); - - if (!checkMemberValidInGroupsAndVos(user, facility, res, params, additionalVos, - additionalGroups, PerunUnapprovedController.UNAPPROVED_NOT_IN_PROD_VOS_GROUPS)) { - return false; - } + vos.addAll(prodEnvVos); + groups.addAll(prodEnvGroups); + unapprovedMapping = PerunUnapprovedController.UNAPPROVED_NOT_IN_PROD_VOS_GROUPS; + } + if (!checkMemberValidInGroupsAndVos(user, vos, groups)) { + log.info("{} - Redirecting to unapproved page with mapping '{}'", getFilterName(), unapprovedMapping); + redirectCannotAccess(res, facility, user, params.getClientIdentifier(), unapprovedMapping); + return false; } - log.info("{} - user satisfies the membership criteria", filterName); + log.info("{} - user satisfies the membership criteria", getFilterName()); return true; } - private Set getIdsFromParam(AuthProcFilterParams params, String propKey) { + private void redirectCannotAccess(HttpServletResponse res, Facility facility, PerunUser user, + String clientId, String mapping) + { + FiltersUtils.redirectUserCannotAccess(config.getConfigBean().getIssuer(), res, facility, user, + clientId, facilityAttrsConfig, perunAdapter, mapping); + } + + private Set getIdsFromParam(AuthProcFilterInitContext params, String propKey) { Set result = new HashSet<>(); - String prop = params.getProperty(propKey); + String prop = params.getProperty(propKey, ""); if (StringUtils.hasText(prop)) { String[] parts = prop.split(","); for (String idStr: parts) { @@ -155,26 +160,11 @@ public class ValidUserFilter extends AuthProcFilter { return result; } - private boolean checkMemberValidInGroupsAndVos( - PerunUser user, - Facility facility, - HttpServletResponse response, - FilterParams params, - Set vos, - Set groups, - String redirectUrl - ) { + private boolean checkMemberValidInGroupsAndVos(PerunUser user, Set vos, Set groups) { if (!perunAdapter.isValidMemberInGroupsAndVos(user.getId(), vos, groups)) { - log.info("{} - user is not member in required set of vos and groups", filterName); + log.info("{} - user is not member in required set of vos and groups", getFilterName()); log.debug("{} - user: '{}', vos: '{}', groups: '{}'", - filterName, user.getId(), vos, groups); - - Map facilityAttributes = perunAdapter.getFacilityAttributeValues( - facility, facilityAttrsConfig.getMembershipAttrNames()); - - FiltersUtils.redirectUserCannotAccess(config.getConfigBean().getIssuer(), response, facility, user, - params.getClientIdentifier(), facilityAttrsConfig, facilityAttributes, perunAdapter, redirectUrl); - + getFilterName(), user.getId(), vos, groups); return false; } return true; diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/mdc/RemoteAddressMDCFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/mdc/RemoteAddressMDCFilter.java deleted file mode 100644 index 541b39c0d..000000000 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/mdc/RemoteAddressMDCFilter.java +++ /dev/null @@ -1,43 +0,0 @@ -package cz.muni.ics.oidc.server.filters.impl.mdc; - -import javax.servlet.ServletRequest; -import javax.servlet.http.HttpServletRequest; -import org.slf4j.MDC; - -public class RemoteAddressMDCFilter { - - private static final String[] IP_HEADER_CANDIDATES = { - "X-Forwarded-For", - "Proxy-Client-IP", - "WL-Proxy-Client-IP", - "HTTP_X_FORWARDED_FOR", - "HTTP_X_FORWARDED", - "HTTP_X_CLUSTER_CLIENT_IP", - "HTTP_CLIENT_IP", - "HTTP_FORWARDED_FOR", - "HTTP_FORWARDED", - "HTTP_VIA", - "REMOTE_ADDR" - }; - - private static final String REMOTE_ADDR = "remoteAddr"; - - public void doFilter(ServletRequest servletRequest) { - MDC.put(REMOTE_ADDR, getRemoteAddr((HttpServletRequest) servletRequest)); - } - - private String getRemoteAddr(HttpServletRequest request) { - if (request.getRemoteAddr() != null) { - return request.getRemoteAddr(); - } - - for (String header: IP_HEADER_CANDIDATES) { - String ipList = request.getHeader(header); - if (ipList != null && ipList.length() != 0 && !"unknown".equalsIgnoreCase(ipList)) { - return ipList.split(",")[0]; - } - } - return "-"; - } - -} diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/mdc/SessionIdMDCFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/mdc/SessionIdMDCFilter.java deleted file mode 100644 index f4ba622ed..000000000 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/mdc/SessionIdMDCFilter.java +++ /dev/null @@ -1,23 +0,0 @@ -package cz.muni.ics.oidc.server.filters.impl.mdc; - -import javax.servlet.ServletRequest; -import javax.servlet.http.HttpServletRequest; -import org.slf4j.MDC; - -public class SessionIdMDCFilter { - - private static final int SIZE = 12; - private static final String SESSION_ID = "sessionID"; - - public void doFilter(ServletRequest servletRequest) { - HttpServletRequest req = (HttpServletRequest) servletRequest; - if (req.getSession() != null) { - String id = req.getSession().getId(); - if (id != null && id.length() > SIZE) { - id = id.substring(0, SIZE); - } - MDC.put(SESSION_ID, id); - } - } - -} diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/web/controllers/AupController.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/web/controllers/AupController.java index 673801627..9a2055f4a 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/web/controllers/AupController.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/web/controllers/AupController.java @@ -36,7 +36,7 @@ public class AupController { public static final String URL = "aup"; public static final String NEW_AUPS = "newAups"; - public static final String APPROVED = "approved"; + public static final String APPROVED = "aup_approved"; public static final String RETURN_URL = "returnUrl"; public static final String USER_ATTR = "userAttr"; diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/web/controllers/IsTestSpController.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/web/controllers/IsTestSpController.java index 8445758bc..bac4c8ed0 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/web/controllers/IsTestSpController.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/web/controllers/IsTestSpController.java @@ -1,7 +1,7 @@ package cz.muni.ics.oidc.web.controllers; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_ACCEPTED; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_TARGET; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_ACCEPTED; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_TARGET; import cz.muni.ics.oidc.server.configurations.PerunOidcConfig; import cz.muni.ics.oidc.web.WebHtmlClasses; diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/web/controllers/PerunUnapprovedController.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/web/controllers/PerunUnapprovedController.java index f56ba35bb..ae1114a99 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/web/controllers/PerunUnapprovedController.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/web/controllers/PerunUnapprovedController.java @@ -1,10 +1,10 @@ package cz.muni.ics.oidc.web.controllers; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_CLIENT_ID; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_HEADER; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_MESSAGE; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_REASON; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_TARGET; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_CLIENT_ID; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_HEADER; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_MESSAGE; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_REASON; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_TARGET; import cz.muni.ics.oauth2.model.ClientDetailsEntity; import cz.muni.ics.oauth2.service.ClientDetailsEntityService; @@ -12,8 +12,6 @@ import cz.muni.ics.oidc.server.configurations.PerunOidcConfig; import cz.muni.ics.oidc.web.WebHtmlClasses; import cz.muni.ics.openid.connect.view.HttpCodeView; import java.util.Map; -import java.util.Properties; -import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/EndSessionEndpoint.java b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/EndSessionEndpoint.java index 2d36b5e11..3cbb000bc 100644 --- a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/EndSessionEndpoint.java +++ b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/EndSessionEndpoint.java @@ -16,9 +16,9 @@ package cz.muni.ics.openid.connect.web.endpoint; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_POST_LOGOUT_REDIRECT_URI; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_STATE; -import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_TARGET; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_POST_LOGOUT_REDIRECT_URI; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_STATE; +import static cz.muni.ics.oidc.server.filters.AuthProcFilterConstants.PARAM_TARGET; import com.google.common.base.Strings; import com.google.common.collect.Iterables;