// Path: pie-core/src/main/java/com/coverity/security/pie/core/PolicyConfig.java
// public class PolicyConfig {
//     private final String name;
//     private final PieConfig pieConfig;
//     
//     public PolicyConfig(String name, PieConfig pieConfig) {
//         this.name = name;
//         this.pieConfig = pieConfig;
//     }
//     
//     public boolean isEnabled() {
//         return getBoolean("isEnabled", true);
//     }
//     
//     public boolean isReportOnlyMode() {
//         return getBoolean("isReportOnlyMode", true);
//     }
// 
//     public boolean isCollapseEnabled() {
//         return getBoolean("isCollapseEnabled", true);
//     }
//     
//     public URL getPolicyFile() {
//         String policyFile = getProperty("policyFile");
//         if (policyFile != null) {
//             try {
//                 return new URL(policyFile);
//             } catch (MalformedURLException e) {
//                 throw new IllegalStateException("Invalid policy URL: " + policyFile);
//             }
//         }
//         URL resource = this.getClass().getClassLoader().getResource(name + ".policy");
//         if (resource != null) {
//             return resource;
//         }
//         String catalinaHome = System.getProperty("catalina.home");
//         if (catalinaHome != null) {
//             try {
//                 return new File(catalinaHome + File.separatorChar + "conf" + File.separatorChar + name + ".policy").toURI().toURL();
//             } catch (MalformedURLException e) {
//                 throw new IllegalStateException("Could not build default policy file path.");
//             }
//         }
//         
//         // Default to file in the CWD
//         try {
//             return new File(name + ".policy").toURI().toURL();
//         } catch (MalformedURLException e) {
//             throw new RuntimeException(e);
//         }
//     }
//     
//     public boolean getBoolean(String prop, boolean defaultValue) {
//         String v = getProperty(prop);
//         if (v == null) {
//             return defaultValue;
//         }
//         return Boolean.parseBoolean(v);
//     }
//     public int getInteger(String prop, int defaultValue) {
//         String v = getProperty(prop);
//         if (v == null) {
//             return defaultValue;
//         }
//         return Integer.parseInt(v);
//     }
//     
//     
//     public String getProperty(String name) {
//         return pieConfig.getProperties().getProperty(this.name + "." + name);
//     }
// }
// 
// Path: pie-core/src/main/java/com/coverity/security/pie/util/IOUtil.java
// public class IOUtil {
//     public static void closeSilently(Closeable closeable) {
//         if (closeable != null) {
//             try {
//                 closeable.close();
//             } catch (IOException e) {
//                 // Do nothing
//             }
//         }
//     }
//     
//     public static String readFile(File file) throws IOException {
//         return toString(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));
//     }
//     public static String readFile(String file) throws IOException {
//         return toString(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));
//     }
//     public static String readFile(URL file) throws IOException {
//         return toString(file.openStream());
//     }
//     
//     public static String toString(InputStream is) throws IOException {
//         try {
//             return toString(new InputStreamReader(is, StandardCharsets.UTF_8));
//         } finally {
//             closeSilently(is);
//         }
//     }
//     public static String toString(Reader reader) throws IOException {
//         StringBuilder sb = new StringBuilder();
//         try {
//             char buffer[] = new char[4096];
//             int n;
//             while ((n = reader.read(buffer)) > 0) {
//                 sb.append(buffer, 0, n);
//             }
//             reader.close();
//         } catch (IOException e) {
//             closeSilently(reader);
//             throw e;
//         }
//         return sb.toString();
//     }
//     
//     
//     public static void writeFile(File file, String content) throws IOException {
//         writeFile(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8), content);
//     }
//     private static void writeFile(Writer fw, String content) throws IOException {
//         try {
//             fw.write(content);
//             fw.close();
//         } catch (IOException e) {
//             closeSilently(fw);
//             throw e;
//         }
//     }
//     
// }


import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONException;
import org.json.JSONObject;
import com.coverity.security.pie.core.PolicyConfig;
import com.coverity.security.pie.util.IOUtil;
package com.coverity.security.pie.policy.csp;





/**
 * A servlet filter which adds the CSP directive to the response and which handles violation reports send by the agent.
 */
public class CspEnforcementFilter implements Filter {

    public static final String REPORT_URI = "/a379568856ef23aPIE19bc95ce4e2f7fd2b";
    
    private final CspPolicy policy;
    private final PolicyConfig policyConfig;
    
// Path: pie-core/src/main/java/com/coverity/security/pie/core/PolicyConfig.java
// public class PolicyConfig {
//     private final String name;
//     private final PieConfig pieConfig;
//     
//     public PolicyConfig(String name, PieConfig pieConfig) {
//         this.name = name;
//         this.pieConfig = pieConfig;
//     }
//     
//     public boolean isEnabled() {
//         return getBoolean("isEnabled", true);
//     }
//     
//     public boolean isReportOnlyMode() {
//         return getBoolean("isReportOnlyMode", true);
//     }
// 
//     public boolean isCollapseEnabled() {
//         return getBoolean("isCollapseEnabled", true);
//     }
//     
//     public URL getPolicyFile() {
//         String policyFile = getProperty("policyFile");
//         if (policyFile != null) {
//             try {
//                 return new URL(policyFile);
//             } catch (MalformedURLException e) {
//                 throw new IllegalStateException("Invalid policy URL: " + policyFile);
//             }
//         }
//         URL resource = this.getClass().getClassLoader().getResource(name + ".policy");
//         if (resource != null) {
//             return resource;
//         }
//         String catalinaHome = System.getProperty("catalina.home");
//         if (catalinaHome != null) {
//             try {
//                 return new File(catalinaHome + File.separatorChar + "conf" + File.separatorChar + name + ".policy").toURI().toURL();
//             } catch (MalformedURLException e) {
//                 throw new IllegalStateException("Could not build default policy file path.");
//             }
//         }
//         
//         // Default to file in the CWD
//         try {
//             return new File(name + ".policy").toURI().toURL();
//         } catch (MalformedURLException e) {
//             throw new RuntimeException(e);
//         }
//     }
//     
//     public boolean getBoolean(String prop, boolean defaultValue) {
//         String v = getProperty(prop);
//         if (v == null) {
//             return defaultValue;
//         }
//         return Boolean.parseBoolean(v);
//     }
//     public int getInteger(String prop, int defaultValue) {
//         String v = getProperty(prop);
//         if (v == null) {
//             return defaultValue;
//         }
//         return Integer.parseInt(v);
//     }
//     
//     
//     public String getProperty(String name) {
//         return pieConfig.getProperties().getProperty(this.name + "." + name);
//     }
// }
// 
// Path: pie-core/src/main/java/com/coverity/security/pie/util/IOUtil.java
// public class IOUtil {
//     public static void closeSilently(Closeable closeable) {
//         if (closeable != null) {
//             try {
//                 closeable.close();
//             } catch (IOException e) {
//                 // Do nothing
//             }
//         }
//     }
//     
//     public static String readFile(File file) throws IOException {
//         return toString(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));
//     }
//     public static String readFile(String file) throws IOException {
//         return toString(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));
//     }
//     public static String readFile(URL file) throws IOException {
//         return toString(file.openStream());
//     }
//     
//     public static String toString(InputStream is) throws IOException {
//         try {
//             return toString(new InputStreamReader(is, StandardCharsets.UTF_8));
//         } finally {
//             closeSilently(is);
//         }
//     }
//     public static String toString(Reader reader) throws IOException {
//         StringBuilder sb = new StringBuilder();
//         try {
//             char buffer[] = new char[4096];
//             int n;
//             while ((n = reader.read(buffer)) > 0) {
//                 sb.append(buffer, 0, n);
//             }
//             reader.close();
//         } catch (IOException e) {
//             closeSilently(reader);
//             throw e;
//         }
//         return sb.toString();
//     }
//     
//     
//     public static void writeFile(File file, String content) throws IOException {
//         writeFile(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8), content);
//     }
//     private static void writeFile(Writer fw, String content) throws IOException {
//         try {
//             fw.write(content);
//             fw.close();
//         } catch (IOException e) {
//             closeSilently(fw);
//             throw e;
//         }
//     }
//     
// }


// Path: pie-csp/src/main/java/com/coverity/security/pie/policy/csp/CspEnforcementFilter.java
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONException;
import org.json.JSONObject;
import com.coverity.security.pie.core.PolicyConfig;
import com.coverity.security.pie.util.IOUtil;

package com.coverity.security.pie.policy.csp;





/**
 * A servlet filter which adds the CSP directive to the response and which handles violation reports send by the agent.
 */
public class CspEnforcementFilter implements Filter {

    public static final String REPORT_URI = "/a379568856ef23aPIE19bc95ce4e2f7fd2b";
    
    private final CspPolicy policy;
    private final PolicyConfig policyConfig;
    
    public CspEnforcementFilter(CspPolicy policy, PolicyConfig policyConfig) {