1

I have an application that requires SAML implementation so I included a filter to do the verification or required redirect. The redirect works and everything is fine, however, the redirect URL changes depending on the environment in which I'm running the app, so I need to be able to load that from a properties file. Same goes for another property needed to decode the token. The process to load the properties file fails and the properties come empty.

Here's the error

[INFO] Mar 23, 2017 1:20:49 AM mypackage.SamlFilter init
[INFO] SEVERE: FAILED TO LOAD PROPERTIES FOR FILTER!!!!!!!!!!
[INFO] Mar 23, 2017 1:20:49 AM com.google.apphosting.utils.jetty.JettyLogger warn
[INFO] WARNING: failed SamlFilter: javax.servlet.ServletException: FAILED TO LOAD PROPERTIES FOR FILTER!!!!!!!!!!

Here's the class

package mypackage;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Properties;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.MediaType;

import org.apache.http.HttpStatus;
import org.codehaus.jettison.json.JSONObject;

import mypackage.utilities.JsonToken;
import mypackage.utilities.JsonTokenProcessor;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class SamlFilter implements Filter {
    private JsonTokenProcessor jsonTokenProcessor;
    private String SSOurl;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        Cookie[] cookies = req.getCookies();
        if(cookies != null) { 
            for (Cookie cookie : cookies) {
                if(cookie.getName().equals("token")) {
                    String token = cookie.getValue();
                    JsonToken jsonToken;
                    try {
                        jsonToken = jsonTokenProcessor.decode(token);
                    } catch (Exception e) {
                        log.error(e.getClass().getName() + " while decoding SAML token. Error: " + e.getLocalizedMessage());
                        res.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR);
                        return;
                    }
                    if(!jsonToken.isExpired()) {
                        request.setAttribute("token", jsonToken);
                        chain.doFilter(request, response);
                        return;
                    }
                    break;
                }
            }
        }
        res.setStatus(HttpStatus.SC_UNAUTHORIZED);
        res.addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        res.addHeader("Content-Type", MediaType.APPLICATION_JSON);
        res.addHeader("Expires", "0");
        res.addHeader("Pragma","no-cache");
        JSONObject returnObject = null;
        try {
            returnObject = new JSONObject();
            returnObject.put("redirectURL", redirectURL);
        } catch (Exception e) {
            log.warn("SamlFilter(): " + e.getClass().getName() + " Can't create redirect body. Error: " + e.getLocalizedMessage());
        }
        res.getWriter().write(returnObject.toString());
        res.getWriter().flush();
        res.getWriter().close();
        return;
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Properties properties =     LoadProperties("properties/myfile.properties");
        String myproperty = properties.getProperty("myproperty");

        SSOurl = properties.getProperty("redirectURL");
        if(myproperty == null || myproperty.isEmpty() || SSOurl ==  null || SSOurl.isEmpty()) {
            throw new ServletException("FAILED TO LOAD PROPERTIES FOR FILTER!!!!!!!!!!");
        }
        try {
            jsonTokenProcessor = new JsonTokenProcessor(myproperty);
        } catch (Exception e) {
            log.error("Error: " + e.getLocalizedMessage());
        }
    }

    @Override
    public void destroy() {
    }

    private static Properties LoadProperties(String filename) {
        Properties newProperties = new Properties();
        try {
            InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(filename);
            if (inputStream != null) {
                newProperties.load(inputStream);
                Enumeration<?> e = newProperties.propertyNames();
                while (e.hasMoreElements()) {
                    String key = (String) e.nextElement();
                    String value = newProperties.getProperty(key);
                    log.info("Key : " + key + ", Value : " + value);
                }
            }
        } catch (Exception ex) {
            log.warn("Error: " + ex.getLocalizedMessage());
        }
        return newProperties;
    }
}

Here's the filter definition on web.xml

<filter>
    <filter-name>SamlFilter</filter-name>
    <filter-class>mypackage.SamlFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SamlFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
avillagomez
  • 443
  • 1
  • 8
  • 18

1 Answers1

0

So I found a solution by making all the code of loading properties a static block. That solved everything

@Override
public void init(FilterConfig filterConfig) throws ServletException {
}

@Override
public void destroy() {
}

static {
    Properties newProperties = new Properties();
    try {
        InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("properties/myfile.properties");
        if (inputStream != null) {
            newProperties.load(inputStream);
            Enumeration<?> e = newProperties.propertyNames();
            while (e.hasMoreElements()) {
                String key = (String) e.nextElement();
                String value = newProperties.getProperty(key);
                log.info("Key : " + key + ", Value : " + value);
            }
        }
    } catch (Exception ex) {
        log.warn("Error: " + ex.getLocalizedMessage());
    }

    String myproperty = properties.getProperty("myproperty");

    SSOurl = properties.getProperty("redirectURL");
    if(myproperty == null || myproperty.isEmpty() || SSOurl ==  null || SSOurl.isEmpty()) {
        throw new ServletException("FAILED TO LOAD PROPERTIES FOR FILTER!!!!!!!!!!");
    }
    try {
        jsonTokenProcessor = new JsonTokenProcessor(myproperty);
    } catch (Exception e) {
        log.error("Error: " + e.getLocalizedMessage());
    }
}
avillagomez
  • 443
  • 1
  • 8
  • 18