This is an automated email from the ASF dual-hosted git repository. dklco pushed a commit to branch SLING-11871 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-security.git
commit b3a4fb8450da1ab298977547e96037eda5bdacfc Merge: 7e0c9d7 8641525 Author: Dan Klco <[email protected]> AuthorDate: Thu May 11 21:41:14 2023 -0400 Merging latest from master .asf.yaml | 11 + .vscode/settings.json | 3 + bnd.bnd | 1 + pom.xml | 9 +- .../security/impl/ContentDispositionFilter.java | 76 ++++--- .../apache/sling/security/impl/ReferrerFilter.java | 241 +++++++++++---------- .../impl/ContentDispositionFilterTest.java | 30 +-- .../sling/security/impl/ReferrerFilterTest.java | 127 +++++++---- 8 files changed, 283 insertions(+), 215 deletions(-) diff --cc src/main/java/org/apache/sling/security/impl/ReferrerFilter.java index 24223f2,5125e57..9aa56f2 --- a/src/main/java/org/apache/sling/security/impl/ReferrerFilter.java +++ b/src/main/java/org/apache/sling/security/impl/ReferrerFilter.java @@@ -159,26 -159,22 +165,27 @@@ public class ReferrerFilter implements /** * Do we allow empty referrer? */ - private boolean allowEmpty; + private final boolean allowEmpty; + /** + * Do we allow if Origin is set + */ + private boolean bypassWithOrigin; + /** Allowed uri referrers */ - private URL[] allowedUriReferrers; + private final URL[] allowedUriReferrers; /** Allowed regexp referrers */ - private Pattern[] allowedRegexReferrers; + private final Pattern[] allowedRegexReferrers; /** Methods to be filtered. */ - private String[] filterMethods; + private final String[] filterMethods; - /** Paths to be excluded */ - private Pattern[] excludedRegexUserAgents; + /** User agents to be excluded */ + private final Pattern[] excludedRegexUserAgents; - private ServiceRegistration<Object> configPrinterRegistration; + /** Paths to be excluded */ + private final String[] excludedPaths; /** * Create a default list of referrers @@@ -265,14 -261,14 +272,15 @@@ } @Activate - protected void activate(final BundleContext context, Config config) { + public ReferrerFilter(final Config config) { this.allowEmpty = config.allow_empty(); + this.bypassWithOrigin = config.bypass_with_origin(); this.allowedRegexReferrers = createRegexPatterns(config.allow_hosts_regexp()); this.excludedRegexUserAgents = createRegexPatterns(config.exclude_agents_regexp()); + this.excludedPaths = config.exclude_paths(); final Set<String> allowUriReferrers = getDefaultAllowedReferrers(); - if ( config.allow_hosts() != null ) { + if (config.allow_hosts() != null) { allowUriReferrers.addAll(Arrays.asList(config.allow_hosts())); } this.allowedUriReferrers = createReferrerUrls(allowUriReferrers); @@@ -383,14 -363,15 +375,19 @@@ } boolean isValidRequest(final HttpServletRequest request) { + final String origin = request.getHeader("origin"); + if (origin != null && origin.trim().length() != 0 && this.bypassWithOrigin) { + return true; + } + // ignore referrer check if the request matches any of the configured excluded path. + if (isExcludedPath(request)) { + return true; + } + final String referrer = request.getHeader("referer"); // check for missing/empty referrer - if ( referrer == null || referrer.trim().length() == 0 ) { - if ( !this.allowEmpty ) { + if (referrer == null || referrer.trim().length() == 0) { + if (!this.allowEmpty) { this.logger.info("Rejected empty referrer header for {} request to {}", request.getMethod(), request.getRequestURI()); } return this.allowEmpty; diff --cc src/test/java/org/apache/sling/security/impl/ReferrerFilterTest.java index 282a119,53b1f29..038248a --- a/src/test/java/org/apache/sling/security/impl/ReferrerFilterTest.java +++ b/src/test/java/org/apache/sling/security/impl/ReferrerFilterTest.java @@@ -51,17 -52,12 +52,17 @@@ public class ReferrerFilterTest @Override public boolean allow_empty() { - return false; + return allowEmpty; } + @Override + public boolean bypass_with_origin() { + return true; + } + @Override public String[] allow_hosts() { - return new String[]{"relhost"}; + return allowHosts; } @Override @@@ -124,32 -127,56 +132,63 @@@ @Test public void testValidRequest() { - Assert.assertEquals(false, filter.isValidRequest(getRequest(null))); - Assert.assertEquals(true, filter.isValidRequest(getRequest("relative"))); - Assert.assertEquals(true, filter.isValidRequest(getRequest("/relative/too"))); - Assert.assertEquals(true, filter.isValidRequest(getRequest("/relative/but/[illegal]"))); - Assert.assertEquals(false, filter.isValidRequest(getRequest("http://somehost"))); - Assert.assertEquals(true, filter.isValidRequest(getRequest("http://localhost"))); - Assert.assertEquals(true, filter.isValidRequest(getRequest("http://127.0.0.1"))); - Assert.assertEquals(false, filter.isValidRequest(getRequest("http://somehost/but/[illegal]"))); - Assert.assertEquals(true, filter.isValidRequest(getRequest("http://relhost"))); - Assert.assertEquals(true, filter.isValidRequest(getRequest("http://relhost:9001"))); - Assert.assertEquals(false, filter.isValidRequest(getRequest("http://abshost:9001"))); - Assert.assertEquals(false, filter.isValidRequest(getRequest("https://abshost:80"))); - Assert.assertEquals(true, filter.isValidRequest(getRequest("http://abshost:80"))); - Assert.assertEquals(false, filter.isValidRequest(getRequest("http://abshost:9001"))); - Assert.assertEquals(true, filter.isValidRequest(getRequest("http://another.abshost:80"))); - Assert.assertEquals(false, filter.isValidRequest(getRequest("http://yet.another.abshost:80"))); - Assert.assertEquals(true, filter.isValidRequest(getRequest("app://yet.another.abshost:80"))); + assertFalse(filter.isValidRequest(getRequest(null))); + assertTrue(filter.isValidRequest(getRequest("relative"))); + assertTrue(filter.isValidRequest(getRequest("/relative/too"))); + assertTrue(filter.isValidRequest(getRequest("/relative/but/[illegal]"))); + assertFalse(filter.isValidRequest(getRequest("http://somehost"))); + assertTrue(filter.isValidRequest(getRequest("http://localhost"))); + assertTrue(filter.isValidRequest(getRequest("http://127.0.0.1"))); + assertFalse(filter.isValidRequest(getRequest("http://somehost/but/[illegal]"))); + assertTrue(filter.isValidRequest(getRequest("http://relhost"))); + assertTrue(filter.isValidRequest(getRequest("http://relhost:9001"))); + assertFalse(filter.isValidRequest(getRequest("http://abshost:9001"))); + assertFalse(filter.isValidRequest(getRequest("https://abshost:80"))); + assertTrue(filter.isValidRequest(getRequest("http://abshost:80"))); + assertFalse(filter.isValidRequest(getRequest("http://abshost:9001"))); + assertTrue(filter.isValidRequest(getRequest("http://another.abshost:80"))); + assertFalse(filter.isValidRequest(getRequest("http://yet.another.abshost:80"))); + assertTrue(filter.isValidRequest(getRequest("app://yet.another.abshost:80"))); + assertFalse(filter.isValidRequest(getRequest("?://"))); + } + + @Test + public void testExcludedPath() { + assertTrue(filter.isValidRequest(getRequest(null, null, "/test_path"))); + assertFalse(filter.isValidRequest(getRequest(null, null, "/test_path/subtree"))); + assertFalse(filter.isValidRequest(getRequest(null, null, "/test_path_sibling"))); + + assertTrue(filter.isValidRequest(getRequest("relative", null, "/test_path"))); + assertTrue(filter.isValidRequest(getRequest("http://yet.another.abshost:80", null, "/test_path"))); + } + + @Test + public void testExcludedPathNull() { + ReferrerFilter rf = new ReferrerFilter(createConfiguration(false, null, null, null, null)); + + assertFalse(rf.isValidRequest(getRequest(null, null, "/test_path"))); + assertFalse(rf.isValidRequest(getRequest(null, null, "/test_path/subtree"))); + assertFalse(rf.isValidRequest(getRequest(null, null, "/test_path_sibling"))); + + assertTrue(rf.isValidRequest(getRequest("relative", null, "/test_path"))); + assertFalse(rf.isValidRequest(getRequest("http://yet.another.abshost:80", null, "/test_path"))); + } + + @Test + public void testAllowEmpty() { + ReferrerFilter rf = new ReferrerFilter(createConfiguration(true, null, null, null, null)); + + assertTrue(rf.isValidRequest(getRequest(null, null, "/test_path"))); + assertTrue(rf.isValidRequest(getRequest("", null, null))); } + @Test + public void testAllowsWithOrigin(){ + HttpServletRequest request = getRequest(null); + when(request.getHeader("origin")).thenReturn("http://sling.apache.org"); + Assert.assertEquals(true, filter.isValidRequest(request)); + } + @Test public void testIsBrowserRequest() { String userAgent = "Mozilla/5.0;Some-Agent (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko)";
