Skip to content

Commit bbf96ee

Browse files
committed
UY-1523: properly append redirectToIdP for saml retrieval
1 parent 3a7685f commit bbf96ee

File tree

6 files changed

+260
-26
lines changed

6 files changed

+260
-26
lines changed

oauth/src/main/java/pl/edu/icm/unity/oauth/client/web/OAuth2RetrievalUI.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.Optional;
1010
import java.util.Set;
1111

12+
import org.apache.hc.core5.http.message.BasicNameValuePair;
1213
import org.apache.logging.log4j.Logger;
1314

1415
import com.vaadin.flow.component.Component;
@@ -22,6 +23,7 @@
2223
import io.imunity.vaadin.auth.VaadinAuthentication;
2324
import io.imunity.vaadin.auth.idp.IdPAuthNComponent;
2425
import io.imunity.vaadin.auth.idp.IdPAuthNGridComponent;
26+
import io.imunity.vaadin.auth.idp.PathWithQueryProvider;
2527
import io.imunity.vaadin.elements.NotificationPresenter;
2628
import io.imunity.vaadin.endpoint.common.LoginMachineDetailsExtractor;
2729
import io.imunity.vaadin.endpoint.common.SessionStorage;
@@ -57,7 +59,7 @@ public class OAuth2RetrievalUI implements VaadinAuthentication.VaadinAuthenticat
5759
private final NotificationPresenter notificationPresenter;
5860

5961
private VaadinAuthentication.AuthenticationCallback callback;
60-
private String redirectParam;
62+
private BasicNameValuePair redirectParam;
6163

6264
private VerticalLayout main;
6365

@@ -162,7 +164,7 @@ public void clear()
162164
idpComponent.setEnabled(true);
163165
}
164166

165-
private String installRequestHandler()
167+
private BasicNameValuePair installRequestHandler()
166168
{
167169
VaadinSession session = VaadinSession.getCurrent();
168170
Collection<RequestHandler> requestHandlers = session.getRequestHandlers();
@@ -189,6 +191,7 @@ private void startFreshLogin(WrappedSession session)
189191
{
190192
SessionStorage.consumeRedirectUrl((ultimateReturnURL, currentRelativeURI) ->
191193
{
194+
PathWithQueryProvider currentRelativeURLProvider = new PathWithQueryProvider(currentRelativeURI);
192195
try
193196
{
194197
LoginMachineDetails loginMachineDetails = LoginMachineDetailsExtractor.getLoginMachineDetailsFromCurrentRequest();
@@ -197,8 +200,8 @@ private void startFreshLogin(WrappedSession session)
197200
ultimateReturnURL, callback.getTriggeringContext());
198201
idpComponent.setEnabled(false);
199202
callback.onStartedAuthentication();
200-
String path = currentRelativeURI.getPath() + (currentRelativeURI.getQuery() != null ? "?" + currentRelativeURI.getQuery() : "");
201-
context.setReturnUrl(path);
203+
204+
context.setReturnUrl(currentRelativeURLProvider.getPathAndQueryOnly());
202205
session.setAttribute(RedirectRequestHandler.REMOTE_AUTHN_CONTEXT, context);
203206
} catch (Exception e)
204207
{
@@ -207,7 +210,8 @@ private void startFreshLogin(WrappedSession session)
207210
clear();
208211
return;
209212
}
210-
UI.getCurrent().getPage().open(currentRelativeURI.getPath() + "?" + redirectParam, SELF_WINDOW_NAME);
213+
UI.getCurrent().getPage().open(currentRelativeURLProvider.getPathWithQueryParamsIncluding(redirectParam),
214+
SELF_WINDOW_NAME);
211215
});
212216
}
213217

saml/src/main/java/pl/edu/icm/unity/saml/sp/web/SAMLRetrievalUI.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.HashSet;
99
import java.util.Set;
1010

11+
import org.apache.hc.core5.http.message.BasicNameValuePair;
1112
import org.apache.logging.log4j.Logger;
1213

1314
import com.vaadin.flow.component.Component;
@@ -20,6 +21,7 @@
2021
import io.imunity.vaadin.auth.VaadinAuthentication;
2122
import io.imunity.vaadin.auth.idp.IdPAuthNComponent;
2223
import io.imunity.vaadin.auth.idp.IdPAuthNGridComponent;
24+
import io.imunity.vaadin.auth.idp.PathWithQueryProvider;
2325
import io.imunity.vaadin.elements.NotificationPresenter;
2426
import io.imunity.vaadin.endpoint.common.LoginMachineDetailsExtractor;
2527
import io.imunity.vaadin.endpoint.common.SessionStorage;
@@ -61,7 +63,7 @@ public class SAMLRetrievalUI implements VaadinAuthentication.VaadinAuthenticatio
6163
private final VaadinAuthentication.Context context;
6264
private IdPAuthNComponent idpComponent;
6365
private VaadinAuthentication.AuthenticationCallback callback;
64-
private String redirectParam;
66+
private BasicNameValuePair redirectParam;
6567

6668
public SAMLRetrievalUI(MessageSource msg, SAMLExchange credentialExchange,
6769
SamlContextManagement samlContextManagement, TrustedIdPKey configKey,
@@ -129,7 +131,7 @@ private String getRetrievalClassName()
129131
return authenticationStepContext.authnOptionId.getAuthenticatorKey() + "." + idpKey;
130132
}
131133

132-
private String installRequestHandler()
134+
private BasicNameValuePair installRequestHandler()
133135
{
134136
VaadinSession session = VaadinSession.getCurrent();
135137
Collection<RequestHandler> requestHandlers = session.getRequestHandlers();
@@ -154,16 +156,16 @@ void startLogin()
154156

155157
private void startFreshLogin(WrappedSession session)
156158
{
157-
SessionStorage.consumeRedirectUrl((ultimateReturnURL, currentRelativeURI) ->
159+
SessionStorage.consumeRedirectUrl((sessionStoredReturnURL, currentRelativeURI) ->
158160
{
159161
RemoteAuthnContext context;
160-
String path = currentRelativeURI.getPath() + (currentRelativeURI.getQuery() != null ? "?" + currentRelativeURI.getQuery() : "");
162+
PathWithQueryProvider currentRelativeURLProvider = new PathWithQueryProvider(currentRelativeURI);
161163
try
162164
{
163165
LoginMachineDetails loginMachineDetails = LoginMachineDetailsExtractor.getLoginMachineDetailsFromCurrentRequest();
164-
context = credentialExchange.createSAMLRequest(configKey, path,
166+
context = credentialExchange.createSAMLRequest(configKey, currentRelativeURLProvider.getPathAndQueryOnly(),
165167
authenticationStepContext,
166-
loginMachineDetails, ultimateReturnURL, callback.getTriggeringContext());
168+
loginMachineDetails, sessionStoredReturnURL, callback.getTriggeringContext());
167169
} catch (Exception e)
168170
{
169171
notificationPresenter.showError(msg.getMessage("WebSAMLRetrieval.configurationError"), e.getMessage());
@@ -177,7 +179,7 @@ private void startFreshLogin(WrappedSession session)
177179
session.setAttribute(VaadinRedirectRequestHandler.REMOTE_AUTHN_CONTEXT, context);
178180
samlContextManagement.addAuthnContext(context);
179181

180-
UI.getCurrent().getPage().open(path + "?" + redirectParam, SELF_WINDOW_NAME);
182+
UI.getCurrent().getPage().open(currentRelativeURLProvider.getPathWithQueryParamsIncluding(redirectParam), SELF_WINDOW_NAME);
181183
});
182184
}
183185

vaadin-authentication/src/main/java/io/imunity/vaadin/auth/NavigationAccessControlInitializer.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@
55

66
package io.imunity.vaadin.auth;
77

8-
import com.vaadin.flow.server.ServiceInitEvent;
9-
import com.vaadin.flow.server.VaadinServiceInitListener;
10-
import com.vaadin.flow.server.auth.NavigationAccessControl;
11-
12-
import io.imunity.vaadin.endpoint.common.SessionStorage;
13-
148
import static io.imunity.vaadin.endpoint.common.SessionStorage.REDIRECT_URL_SESSION_STORAGE_KEY;
9+
import static io.imunity.vaadin.endpoint.common.consent_utils.LoginInProgressService.URL_PARAM_CONTEXT_KEY;
10+
import static java.util.Objects.nonNull;
1511

1612
import org.jsoup.nodes.Document;
1713

14+
import com.vaadin.flow.server.ServiceInitEvent;
15+
import com.vaadin.flow.server.VaadinServiceInitListener;
16+
import com.vaadin.flow.server.auth.NavigationAccessControl;
17+
1818
public class NavigationAccessControlInitializer implements VaadinServiceInitListener
1919
{
2020
private final NavigationAccessControl navigationAccessControl;
@@ -47,9 +47,15 @@ private void saveOriginalUrlRequestInSessionStorageBeforeAllRedirects(ServiceIni
4747
{
4848
serviceInitEvent.addIndexHtmlRequestListener(response ->
4949
{
50+
String signInCtx = response.getVaadinRequest().getParameter(URL_PARAM_CONTEXT_KEY);
51+
String redirect = afterSuccessLoginRedirect;
52+
if (nonNull(signInCtx))
53+
{
54+
redirect = afterSuccessLoginRedirect + "?" + URL_PARAM_CONTEXT_KEY + "=" + signInCtx;
55+
}
5056
Document document = response.getDocument();
5157
document.body().append("<script>window.sessionStorage.setItem("
52-
+ "\"" + REDIRECT_URL_SESSION_STORAGE_KEY + "\", " + afterSuccessLoginRedirect + ");</script>");
58+
+ "\"" + REDIRECT_URL_SESSION_STORAGE_KEY + "\", " + redirect + ");</script>");
5359
});
5460
}
5561
}

vaadin-authentication/src/main/java/io/imunity/vaadin/auth/idp/AbstractRedirectRequestHandler.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,19 @@
44
*/
55
package io.imunity.vaadin.auth.idp;
66

7-
import com.vaadin.flow.server.*;
8-
9-
import pl.edu.icm.unity.base.utils.Log;
7+
import java.io.IOException;
8+
import java.util.UUID;
109

10+
import org.apache.hc.core5.http.message.BasicNameValuePair;
1111
import org.apache.logging.log4j.Logger;
1212

13-
import java.io.IOException;
14-
import java.util.UUID;
13+
import com.vaadin.flow.server.RequestHandler;
14+
import com.vaadin.flow.server.VaadinRequest;
15+
import com.vaadin.flow.server.VaadinResponse;
16+
import com.vaadin.flow.server.VaadinSession;
17+
import com.vaadin.flow.server.WrappedSession;
18+
19+
import pl.edu.icm.unity.base.utils.Log;
1520

1621

1722
/**
@@ -54,9 +59,9 @@ public boolean handleRequest(VaadinSession vaadinSession, VaadinRequest request,
5459
protected abstract boolean handleRequestInternal(Object context, VaadinSession vaadinSession,
5560
VaadinRequest request, VaadinResponse response) throws IOException;
5661

57-
public String getTriggeringParam()
62+
public BasicNameValuePair getTriggeringParam()
5863
{
59-
return AbstractRedirectRequestHandler.TRIGGERING_PARAMETER + "=" + uniqueId;
64+
return new BasicNameValuePair(AbstractRedirectRequestHandler.TRIGGERING_PARAMETER, uniqueId);
6065
}
6166

6267
protected void setCommonHeaders(VaadinResponse response)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package io.imunity.vaadin.auth.idp;
2+
3+
import java.net.URISyntaxException;
4+
import java.net.URL;
5+
6+
import org.apache.hc.core5.http.message.BasicNameValuePair;
7+
import org.apache.hc.core5.net.URIBuilder;
8+
9+
public class PathWithQueryProvider
10+
{
11+
private final URL url;
12+
13+
public PathWithQueryProvider(URL url)
14+
{
15+
this.url = url;
16+
}
17+
18+
public String getPathAndQueryOnly()
19+
{
20+
return getPathAndQuery(toURIBuilder());
21+
}
22+
23+
public String getPathWithQueryParamsIncluding(BasicNameValuePair pair)
24+
{
25+
URIBuilder uriBuilder = toURIBuilder();
26+
uriBuilder.addParameter(pair);
27+
return getPathAndQuery(uriBuilder);
28+
}
29+
30+
private URIBuilder toURIBuilder()
31+
{
32+
try
33+
{
34+
return new URIBuilder(url.toURI());
35+
} catch (URISyntaxException e)
36+
{
37+
throw new RuntimeException("Can't extract path and query from URL", e);
38+
}
39+
}
40+
41+
private String getPathAndQuery(URIBuilder uriBuilder)
42+
{
43+
try
44+
{
45+
String path = uriBuilder.getPath();
46+
String query = uriBuilder.getQueryParams().isEmpty() ? "" : "?" + uriBuilder.build().getRawQuery();
47+
return path + query;
48+
} catch (URISyntaxException e)
49+
{
50+
throw new RuntimeException("Can't extract path and query from URL", e);
51+
}
52+
}
53+
}

0 commit comments

Comments
 (0)