Skip to content

Commit 72bb65f

Browse files
fix(#396): open SSO login links in root webview (#397)
Co-authored-by: Joshua Kuestersteffen <jkuester@kuester7.com>
1 parent 4b38e85 commit 72bb65f

File tree

2 files changed

+112
-1
lines changed

2 files changed

+112
-1
lines changed

src/main/java/org/medicmobile/webapp/mobile/UrlHandler.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,18 @@
2020
public class UrlHandler extends WebViewClient {
2121
EmbeddedBrowserActivity parentActivity;
2222
SettingsStore settings;
23+
private final String oidcRedirectUriQueryParam;
2324

2425
public UrlHandler(EmbeddedBrowserActivity parentActivity, SettingsStore settings) {
2526
this.parentActivity = parentActivity;
2627
this.settings = settings;
28+
this.oidcRedirectUriQueryParam = "redirect_uri=" + Uri.encode(this.settings.getAppUrl() + "/medic/login/oidc");
2729
}
2830

2931
@Override
3032
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
3133
Uri uri = request.getUrl();
32-
if (isUrlRelated(this.settings.getAppUrl(), uri)) {
34+
if (isUrlRelated(this.settings.getAppUrl(), uri) || isOidcProviderUrl(uri)) {
3335
// Load all related URLs in the WebView
3436
return false;
3537
}
@@ -41,6 +43,18 @@ public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request
4143
return true;
4244
}
4345

46+
/**
47+
* Support OIDC login flow by allowing any URL that contains the current app_url as the redirect_uri.
48+
*/
49+
private boolean isOidcProviderUrl(Uri uriToTest) {
50+
if (uriToTest == null) {
51+
return false;
52+
}
53+
return uriToTest
54+
.toString()
55+
.contains(oidcRedirectUriQueryParam);
56+
}
57+
4458
/**
4559
* Support for SDK 21 and 22.
4660
*/
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package org.medicmobile.webapp.mobile;
2+
3+
import static org.junit.Assert.assertFalse;
4+
import static org.junit.Assert.assertTrue;
5+
import static org.mockito.ArgumentMatchers.any;
6+
import static org.mockito.Mockito.doNothing;
7+
import static org.mockito.Mockito.mock;
8+
import static org.mockito.Mockito.times;
9+
import static org.mockito.Mockito.verify;
10+
import static org.mockito.Mockito.when;
11+
12+
import android.content.Context;
13+
import android.net.Uri;
14+
import android.webkit.WebResourceRequest;
15+
import android.webkit.WebView;
16+
17+
import org.junit.Before;
18+
import org.junit.Test;
19+
import org.junit.runner.RunWith;
20+
import org.robolectric.RobolectricTestRunner;
21+
22+
@RunWith(RobolectricTestRunner.class)
23+
public class UrlHandlerTest {
24+
private static final String APP_URL = "https://project-abc.medic.org";
25+
private SettingsStore settingsStore;
26+
private WebView webView;
27+
private WebResourceRequest webResourceRequest;
28+
private Context context;
29+
private UrlHandler handler;
30+
31+
@Before
32+
public void setup() {
33+
settingsStore = mock(SettingsStore.class);
34+
when(settingsStore.getAppUrl()).thenReturn(APP_URL);
35+
webView = mock(WebView.class);
36+
context = mock(Context.class);
37+
when(webView.getContext()).thenReturn(context);
38+
doNothing().when(context).startActivity(any());
39+
webResourceRequest = mock(WebResourceRequest.class);
40+
41+
handler = new UrlHandler(null, settingsStore);
42+
}
43+
44+
@Test
45+
public void shouldOverrideUrlLoading_withAppUrlSubPath() {
46+
when(webResourceRequest.getUrl()).thenReturn(Uri.parse(APP_URL + "/some-sub-path"));
47+
48+
boolean result = handler.shouldOverrideUrlLoading(webView, webResourceRequest);
49+
50+
assertFalse(result);
51+
verify(settingsStore, times(2)).getAppUrl();
52+
verify(webResourceRequest).getUrl();
53+
verify(webView, times(0)).getContext();
54+
verify(context, times(0)).startActivity(any());
55+
}
56+
57+
@Test
58+
public void shouldOverrideUrlLoading_withExternalUrl() {
59+
when(webResourceRequest.getUrl()).thenReturn(Uri.parse("some-external-url.com"));
60+
61+
boolean result = handler.shouldOverrideUrlLoading(webView, webResourceRequest);
62+
63+
assertTrue(result);
64+
verify(settingsStore, times(2)).getAppUrl();
65+
verify(webResourceRequest).getUrl();
66+
verify(webView).getContext();
67+
verify(context).startActivity(any());
68+
}
69+
70+
@Test
71+
public void shouldOverrideUrlLoading_withExternalOidcProviderUrl() {
72+
when(webResourceRequest.getUrl()).thenReturn(
73+
Uri.parse("some-external-url.com?redirect_uri=" + Uri.encode(APP_URL + "/medic/login/oidc"))
74+
);
75+
76+
boolean result = handler.shouldOverrideUrlLoading(webView, webResourceRequest);
77+
78+
assertFalse(result);
79+
verify(settingsStore, times(2)).getAppUrl();
80+
verify(webResourceRequest).getUrl();
81+
verify(webView, times(0)).getContext();
82+
verify(context, times(0)).startActivity(any());
83+
}
84+
85+
@Test
86+
public void shouldOverrideUrlLoading_withNullUrl() {
87+
when(webResourceRequest.getUrl()).thenReturn(null);
88+
89+
boolean result = handler.shouldOverrideUrlLoading(webView, webResourceRequest);
90+
91+
assertTrue(result);
92+
verify(settingsStore, times(2)).getAppUrl();
93+
verify(webResourceRequest).getUrl();
94+
verify(webView).getContext();
95+
verify(context).startActivity(any());
96+
}
97+
}

0 commit comments

Comments
 (0)