|
31 | 31 | import org.cloudfoundry.identity.uaa.zone.beans.IdentityZoneManagerImpl; |
32 | 32 | import org.junit.jupiter.api.AfterEach; |
33 | 33 | import org.junit.jupiter.api.BeforeEach; |
| 34 | +import org.junit.jupiter.api.Nested; |
34 | 35 | import org.junit.jupiter.api.Test; |
35 | 36 | import org.junit.jupiter.api.extension.ExtendWith; |
36 | 37 | import org.springframework.dao.DataAccessException; |
@@ -816,84 +817,88 @@ void allowedIdpsforClientOIDCProvider() throws Exception { |
816 | 817 | @Test |
817 | 818 | void oauth_provider_links_shown() throws Exception { |
818 | 819 | LoginInfoEndpoint endpoint = getEndpoint(IdentityZoneHolder.get()); |
819 | | - |
820 | | - RawExternalOAuthIdentityProviderDefinition definition = new RawExternalOAuthIdentityProviderDefinition(); |
821 | | - |
822 | | - definition.setAuthUrl(URI.create("http://auth.url").toURL()); |
823 | | - definition.setTokenUrl(URI.create("http://token.url").toURL()); |
824 | | - definition.setRelyingPartySecret("client-secret"); |
825 | | - |
826 | | - IdentityProvider<AbstractExternalOAuthIdentityProviderDefinition> identityProvider = MultitenancyFixture.identityProvider("oauth-idp-alias", "uaa"); |
827 | | - identityProvider.setConfig(definition); |
828 | | - |
829 | | - when(mockIdentityProviderProvisioning.retrieveActiveByTypes(anyString(), any(), any())).thenReturn(singletonList(identityProvider)); |
| 820 | + mockOauthProvider(true); |
830 | 821 | endpoint.loginForHtml(extendedModelMap, null, new MockHttpServletRequest(), singletonList(MediaType.TEXT_HTML)); |
831 | | - |
832 | 822 | assertThat((Boolean) extendedModelMap.get("showLoginLinks")).isTrue(); |
833 | 823 | } |
834 | 824 |
|
835 | | - @Test |
836 | | - void no_passcode_prompt_present_whenThereIsAtleastOneActiveOauthProvider() throws Exception { |
837 | | - LoginInfoEndpoint endpoint = getEndpoint(IdentityZoneHolder.get()); |
838 | | - |
839 | | - RawExternalOAuthIdentityProviderDefinition definition = new RawExternalOAuthIdentityProviderDefinition() |
840 | | - .setAuthUrl(URI.create("http://auth.url").toURL()) |
841 | | - .setTokenUrl(URI.create("http://token.url").toURL()); |
| 825 | + @Nested |
| 826 | + class WhenAllowOriginLoopHasDefaultValueOfTrue { |
| 827 | + LoginInfoEndpoint endpoint = null; |
| 828 | + @BeforeEach |
| 829 | + void setup() { |
| 830 | + endpoint = getEndpoint(IdentityZoneHolder.get()); |
| 831 | + } |
842 | 832 |
|
843 | | - IdentityProvider<AbstractExternalOAuthIdentityProviderDefinition> identityProvider = MultitenancyFixture.identityProvider("oauth-idp-alias", "uaa"); |
844 | | - identityProvider.setConfig(definition); |
| 833 | + @Test |
| 834 | + void passcode_prompt_present_whenThereIsAtleastOneActiveOauthProvider_AllowOriginLoop() throws Exception { |
| 835 | + mockOauthProvider(false); |
| 836 | + endpoint.infoForLoginJson(extendedModelMap, null, new MockHttpServletRequest("GET", "http://someurl")); |
| 837 | + Map<String, Object> mapPrompts = (Map<String, Object>) extendedModelMap.get("prompts"); |
| 838 | + assertThat(mapPrompts).containsKey("passcode"); |
| 839 | + } |
845 | 840 |
|
846 | | - when(mockIdentityProviderProvisioning.retrieveActiveByTypes(anyString(), eq(OriginKeys.OIDC10), eq(OriginKeys.OAUTH20))) |
847 | | - .thenReturn(singletonList(identityProvider)); |
848 | | - endpoint.infoForLoginJson(extendedModelMap, null, new MockHttpServletRequest("GET", "http://someurl")); |
| 841 | + @Test |
| 842 | + void passcode_prompt_present_whenThereIsAtleastOneActiveOauthProvider_stillWorksWithAccountChooser_AllowOriginLoop() throws Exception { |
| 843 | + IdentityZoneHolder.get().getConfig().setAccountChooserEnabled(true); |
| 844 | + mockOauthProvider(false); |
| 845 | + endpoint.infoForLoginJson(extendedModelMap, null, new MockHttpServletRequest("GET", "http://someurl")); |
| 846 | + Map<String, Object> mapPrompts = (Map<String, Object>) extendedModelMap.get("prompts"); |
| 847 | + assertThat(mapPrompts).containsKey("passcode"); |
| 848 | + } |
849 | 849 |
|
850 | | - Map<String, Object> mapPrompts = (Map<String, Object>) extendedModelMap.get("prompts"); |
851 | | - assertThat(mapPrompts).doesNotContainKey("passcode"); |
| 850 | + @Test |
| 851 | + void passcode_prompt_present_whenThereIsAtleastOneActiveOauthProvider_stillWorksWithDiscovery_AllowOriginLoop() throws Exception { |
| 852 | + IdentityZoneHolder.get().getConfig().setIdpDiscoveryEnabled(true); |
| 853 | + mockOauthProvider(true); |
| 854 | + endpoint.infoForLoginJson(extendedModelMap, null, new MockHttpServletRequest("GET", "http://someurl")); |
| 855 | + Map<String, Object> mapPrompts = (Map<String, Object>) extendedModelMap.get("prompts"); |
| 856 | + assertThat(mapPrompts).containsKey("passcode"); |
| 857 | + } |
852 | 858 | } |
853 | 859 |
|
854 | | - @Test |
855 | | - void no_passcode_prompt_present_whenThereIsAtleastOneActiveOauthProvider_stillWorksWithAccountChooser() throws Exception { |
856 | | - IdentityZoneHolder.get().getConfig().setAccountChooserEnabled(true); |
857 | | - LoginInfoEndpoint endpoint = getEndpoint(IdentityZoneHolder.get()); |
858 | | - |
859 | | - RawExternalOAuthIdentityProviderDefinition definition = new RawExternalOAuthIdentityProviderDefinition() |
860 | | - .setAuthUrl(URI.create("http://auth.url").toURL()) |
861 | | - .setTokenUrl(URI.create("http://token.url").toURL()); |
| 860 | + @Nested |
| 861 | + class WhenAllowOriginLoopIsSetToFalse { |
862 | 862 |
|
863 | | - IdentityProvider<AbstractExternalOAuthIdentityProviderDefinition> identityProvider = MultitenancyFixture.identityProvider("oauth-idp-alias", "uaa"); |
864 | | - identityProvider.setConfig(definition); |
865 | | - |
866 | | - when(mockIdentityProviderProvisioning.retrieveActiveByTypes(anyString(), eq(OriginKeys.OIDC10), eq(OriginKeys.OAUTH20))) |
867 | | - .thenReturn(singletonList(identityProvider)); |
868 | | - endpoint.infoForLoginJson(extendedModelMap, null, new MockHttpServletRequest("GET", "http://someurl")); |
869 | | - |
870 | | - Map<String, Object> mapPrompts = (Map<String, Object>) extendedModelMap.get("prompts"); |
871 | | - assertThat(mapPrompts).doesNotContainKey("passcode"); |
872 | | - } |
| 863 | + LoginInfoEndpoint endpoint = null; |
| 864 | + @BeforeEach |
| 865 | + void setup() { |
| 866 | + IdentityZoneHolder.get().getConfig().getUserConfig().setAllowOriginLoop(false); |
| 867 | + endpoint = getEndpoint(IdentityZoneHolder.get()); |
| 868 | + } |
873 | 869 |
|
874 | | - @Test |
875 | | - void no_passcode_prompt_present_whenThereIsAtleastOneActiveOauthProvider_stillWorksWithDiscovery() throws Exception { |
876 | | - IdentityZoneHolder.get().getConfig().setIdpDiscoveryEnabled(true); |
877 | | - LoginInfoEndpoint endpoint = getEndpoint(IdentityZoneHolder.get()); |
| 870 | + @Test |
| 871 | + void no_passcode_prompt_present_whenThereIsAtleastOneActiveOauthProvider() throws Exception { |
| 872 | + mockOauthProvider(false); |
| 873 | + endpoint.infoForLoginJson(extendedModelMap, null, new MockHttpServletRequest("GET", "http://someurl")); |
| 874 | + Map<String, Object> mapPrompts = (Map<String, Object>) extendedModelMap.get("prompts"); |
| 875 | + assertThat(mapPrompts).doesNotContainKey("passcode"); |
| 876 | + } |
878 | 877 |
|
879 | | - RawExternalOAuthIdentityProviderDefinition definition = new RawExternalOAuthIdentityProviderDefinition() |
880 | | - .setAuthUrl(URI.create("http://auth.url").toURL()) |
881 | | - .setTokenUrl(URI.create("http://token.url").toURL()); |
882 | 878 |
|
883 | | - IdentityProvider<AbstractExternalOAuthIdentityProviderDefinition> identityProvider = MultitenancyFixture.identityProvider("oauth-idp-alias", "uaa"); |
884 | | - identityProvider.setConfig(definition); |
| 879 | + @Test |
| 880 | + void no_passcode_prompt_present_whenThereIsAtleastOneActiveOauthProvider_stillWorksWithAccountChooser() throws Exception { |
| 881 | + IdentityZoneHolder.get().getConfig().setAccountChooserEnabled(true); |
| 882 | + mockOauthProvider(false); |
| 883 | + endpoint.infoForLoginJson(extendedModelMap, null, new MockHttpServletRequest("GET", "http://someurl")); |
| 884 | + Map<String, Object> mapPrompts = (Map<String, Object>) extendedModelMap.get("prompts"); |
| 885 | + assertThat(mapPrompts).doesNotContainKey("passcode"); |
| 886 | + } |
885 | 887 |
|
886 | | - when(mockIdentityProviderProvisioning.retrieveActiveByTypes(anyString(), any())).thenReturn(singletonList(identityProvider)); |
887 | | - endpoint.infoForLoginJson(extendedModelMap, null, new MockHttpServletRequest("GET", "http://someurl")); |
888 | 888 |
|
889 | | - Map<String, Object> mapPrompts = (Map<String, Object>) extendedModelMap.get("prompts"); |
890 | | - assertThat(mapPrompts).doesNotContainKey("passcode"); |
| 889 | + @Test |
| 890 | + void no_passcode_prompt_present_whenThereIsAtleastOneActiveOauthProvider_stillWorksWithDiscovery() throws Exception { |
| 891 | + IdentityZoneHolder.get().getConfig().setIdpDiscoveryEnabled(true); |
| 892 | + mockOauthProvider(true); |
| 893 | + endpoint.infoForLoginJson(extendedModelMap, null, new MockHttpServletRequest("GET", "http://someurl")); |
| 894 | + Map<String, Object> mapPrompts = (Map<String, Object>) extendedModelMap.get("prompts"); |
| 895 | + assertThat(mapPrompts).doesNotContainKey("passcode"); |
| 896 | + } |
891 | 897 | } |
892 | 898 |
|
893 | 899 | @Test |
894 | 900 | void we_return_both_oauth_and_oidc_providers() throws Exception { |
895 | 901 | LoginInfoEndpoint endpoint = getEndpoint(IdentityZoneHolder.get()); |
896 | | - |
897 | 902 | RawExternalOAuthIdentityProviderDefinition oauthDefinition = new RawExternalOAuthIdentityProviderDefinition() |
898 | 903 | .setAuthUrl(URI.create("http://auth.url").toURL()) |
899 | 904 | .setTokenUrl(URI.create("http://token.url").toURL()); |
@@ -1754,8 +1759,7 @@ private static void mockOidcProvider(IdentityProviderProvisioning mockIdentityPr |
1754 | 1759 | when(mockOidcConfig.getResponseType()).thenReturn("token"); |
1755 | 1760 | when(mockProvider.getConfig()).thenReturn(mockOidcConfig); |
1756 | 1761 | when(mockOidcConfig.isShowLinkText()).thenReturn(true); |
1757 | | - when(mockIdentityProviderProvisioning.retrieveActiveByTypes(anyString(), any())).thenReturn(singletonList(mockProvider)); |
1758 | | - when(mockIdentityProviderProvisioning.retrieveActiveByTypes(anyString(), any(), any())).thenReturn(singletonList(mockProvider)); |
| 1762 | + when(mockIdentityProviderProvisioning.retrieveActiveByTypes(anyString(), any(String[].class))).thenReturn(singletonList(mockProvider)); |
1759 | 1763 | when(mockIdentityProviderProvisioning.retrieveByOrigin(eq("my-OIDC-idp1"), any())).thenReturn(mockProvider); |
1760 | 1764 | } |
1761 | 1765 |
|
@@ -1785,4 +1789,22 @@ private static void assertUsernamePasswordButNoPasscodePromptsAreReturned( |
1785 | 1789 | assertThat(returnedPrompts.get("password")[1]).isEqualTo("Password"); |
1786 | 1790 | assertThat(returnedPrompts.get("passcode")).isNull(); |
1787 | 1791 | } |
| 1792 | + |
| 1793 | + private IdentityProvider<AbstractExternalOAuthIdentityProviderDefinition> mockOauthProvider( |
| 1794 | + boolean anyOrigins |
| 1795 | + ) throws MalformedURLException { |
| 1796 | + RawExternalOAuthIdentityProviderDefinition definition = new RawExternalOAuthIdentityProviderDefinition(); |
| 1797 | + definition.setAuthUrl(URI.create("http://auth.url").toURL()); |
| 1798 | + definition.setTokenUrl(URI.create("http://token.url").toURL()); |
| 1799 | + definition.setRelyingPartySecret("client-secret"); |
| 1800 | + IdentityProvider<AbstractExternalOAuthIdentityProviderDefinition> identityProvider = MultitenancyFixture.identityProvider("oauth-idp-alias", "uaa"); |
| 1801 | + identityProvider.setConfig(definition); |
| 1802 | + if (anyOrigins) { |
| 1803 | + when(mockIdentityProviderProvisioning.retrieveActiveByTypes(anyString(), any(String[].class))).thenReturn(singletonList(identityProvider)); |
| 1804 | + } else { |
| 1805 | + when(mockIdentityProviderProvisioning.retrieveActiveByTypes(anyString(), eq(OriginKeys.OIDC10), eq(OriginKeys.OAUTH20))) |
| 1806 | + .thenReturn(singletonList(identityProvider)); |
| 1807 | + } |
| 1808 | + return identityProvider; |
| 1809 | + } |
1788 | 1810 | } |
0 commit comments