Skip to content

Commit 8ff1de1

Browse files
committed
Applied rules to URL that are enforced by browsers/queuefront
1 parent 2fde844 commit 8ff1de1

File tree

2 files changed

+112
-2
lines changed

2 files changed

+112
-2
lines changed

QueueIT.Security/src/queueit/security/DefaultKnownUserUrlProvider.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,40 @@ private void parseRequest(HttpServletRequest request) {
8181
if (request != null) {
8282
StringBuffer requestURL = request.getRequestURL();
8383
String queryString = request.getQueryString();
84+
85+
String url = null;
8486

8587
if (queryString == null) {
86-
this.requestUrl = requestURL.toString();
88+
url = requestURL.toString();
8789
} else {
88-
this.requestUrl = requestURL.append('?').append(queryString).toString();
90+
url = requestURL.append('?').append(queryString).toString();
8991
}
9092

93+
this.requestUrl = RemovePort443OnHttps(RemovePort80OnHttp(UrlMustHaveSlashAfterDomain(url)));
94+
9195
this.querystringParms = request.getParameterMap();
9296
}
9397
}
98+
99+
private static String RemovePort443OnHttps(String url)
100+
{
101+
return url.replaceFirst("^(https://[^/\\?]*):443/", "$1/");
102+
}
103+
104+
private static String RemovePort80OnHttp(String url)
105+
{
106+
return url.replaceFirst("^(http://[^/\\?]*):80/", "$1/");
107+
}
108+
109+
private static String UrlMustHaveSlashAfterDomain(String url)
110+
{
111+
// ? comes right after domain but there is no slash between them (http://example.com?a=b => http://example.com/?a=b)
112+
url = url.replaceFirst("^(http(s)?://[^/\\?]*)\\?", "$1/?");
113+
114+
// url with no path / querystring that does not end with / (http://example.com => http://example.com/)
115+
url = url.replaceFirst("^(http(s)?://[^/\\?]*)$", "$1/");
116+
117+
return url;
118+
}
119+
94120
}

QueueIT.Security/test/queueit/security/DefaultKnownUserUrlProviderTest.java

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,90 @@ public void DefaultKnownUserUrlProvider_GetUrl_Test() {
4848
assertEquals(expectedUrl, actualUrl.toString());
4949
}
5050

51+
@Test
52+
public void DefaultKnownUserUrlProvider_GetUrl_MissingSlash_Test() {
53+
54+
String expectedUrl = "http://some.url/";
55+
56+
HttpServletRequest request = new MockHttpServletRequest("http://some.url");
57+
RequestContext.newInstance(request, null);
58+
59+
DefaultKnownUserUrlProvider provider = new DefaultKnownUserUrlProvider();
60+
String actualUrl = provider.getUrl();
61+
62+
assertEquals(expectedUrl, actualUrl.toString());
63+
}
64+
65+
@Test
66+
public void DefaultKnownUserUrlProvider_GetUrl_MissingSlashAndQuerystring_Test() {
67+
68+
String expectedUrl = "http://some.url/?sed=sdd";
69+
70+
HttpServletRequest request = new MockHttpServletRequest("http://some.url?sed=sdd");
71+
RequestContext.newInstance(request, null);
72+
73+
DefaultKnownUserUrlProvider provider = new DefaultKnownUserUrlProvider();
74+
String actualUrl = provider.getUrl();
75+
76+
assertEquals(expectedUrl, actualUrl.toString());
77+
}
78+
79+
@Test
80+
public void DefaultKnownUserUrlProvider_GetUrl_HttpWithPort80_Test() {
81+
82+
String expectedUrl = "http://some.url/somepath/default.aspx?x=sdfs";
83+
84+
HttpServletRequest request = new MockHttpServletRequest("http://some.url:80/somepath/default.aspx?x=sdfs");
85+
RequestContext.newInstance(request, null);
86+
87+
DefaultKnownUserUrlProvider provider = new DefaultKnownUserUrlProvider();
88+
String actualUrl = provider.getUrl();
89+
90+
assertEquals(expectedUrl, actualUrl.toString());
91+
}
92+
93+
@Test
94+
public void DefaultKnownUserUrlProvider_GetUrl_HttpWithPort443_Test() {
95+
96+
String expectedUrl = "http://some.url:443/somepath/default.aspx?x=sdfs";
97+
98+
HttpServletRequest request = new MockHttpServletRequest(expectedUrl);
99+
RequestContext.newInstance(request, null);
100+
101+
DefaultKnownUserUrlProvider provider = new DefaultKnownUserUrlProvider();
102+
String actualUrl = provider.getUrl();
103+
104+
assertEquals(expectedUrl, actualUrl.toString());
105+
}
106+
107+
@Test
108+
public void DefaultKnownUserUrlProvider_GetUrl_HttpsWithPort443_Test() {
109+
110+
String expectedUrl = "https://some.url/somepath/default.aspx?x=sdfs";
111+
112+
HttpServletRequest request = new MockHttpServletRequest("https://some.url:443/somepath/default.aspx?x=sdfs");
113+
RequestContext.newInstance(request, null);
114+
115+
DefaultKnownUserUrlProvider provider = new DefaultKnownUserUrlProvider();
116+
String actualUrl = provider.getUrl();
117+
118+
assertEquals(expectedUrl, actualUrl.toString());
119+
}
120+
121+
@Test
122+
public void DefaultKnownUserUrlProvider_GetUrl_HttpsWithPort80_Test() {
123+
124+
String expectedUrl = "https://some.url:80/somepath/default.aspx?x=sdfs";
125+
126+
HttpServletRequest request = new MockHttpServletRequest(expectedUrl);
127+
RequestContext.newInstance(request, null);
128+
129+
DefaultKnownUserUrlProvider provider = new DefaultKnownUserUrlProvider();
130+
String actualUrl = provider.getUrl();
131+
132+
assertEquals(expectedUrl, actualUrl.toString());
133+
}
134+
51135
@Test
52136
public void DefaultKnownUserUrlProvider_GetUrl_SpecialChars_Test() {
53137

0 commit comments

Comments
 (0)