Skip to content

Commit cfbcded

Browse files
committed
Support external SAML Init
Signed-off-by: strehle <markus.strehle@sap.com>
1 parent f8359ef commit cfbcded

3 files changed

Lines changed: 66 additions & 11 deletions

File tree

saml2/saml2-service-provider/src/main/java/org/springframework/security/saml2/core/OpenSamlInitializationService.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,12 @@ private OpenSamlInitializationService() {
8888
* @throws Saml2Exception if OpenSAML failed to initialize
8989
*/
9090
public static boolean initialize() {
91-
return initialize((registry) -> {
91+
return initialize(true, (registry) -> {
92+
});
93+
}
94+
95+
public static boolean initializedAlready() {
96+
return initialize(false, (registry) -> {
9297
});
9398
}
9499

@@ -104,19 +109,25 @@ public static boolean initialize() {
104109
* failed to initialize
105110
*/
106111
public static void requireInitialize(Consumer<XMLObjectProviderRegistry> registryConsumer) {
107-
if (!initialize(registryConsumer)) {
112+
if (!initialize(true, registryConsumer)) {
108113
throw new Saml2Exception("OpenSAML was already initialized previously");
109114
}
110115
}
111116

112-
private static boolean initialize(Consumer<XMLObjectProviderRegistry> registryConsumer) {
117+
private static boolean initialize(boolean initOpenSaml, Consumer<XMLObjectProviderRegistry> registryConsumer) {
113118
if (initialized.compareAndSet(false, true)) {
114119
log.trace("Initializing OpenSAML");
115-
try {
116-
InitializationService.initialize();
117-
}
118-
catch (Exception ex) {
119-
throw new Saml2Exception(ex);
120+
if (initOpenSaml) {
121+
try {
122+
InitializationService.initialize();
123+
} catch (Exception ex) {
124+
throw new Saml2Exception(ex);
125+
}
126+
} else {
127+
if (ConfigurationService.get(XMLObjectProviderRegistry.class) == null) {
128+
log.debug("OpenSAML not ready");
129+
return false;
130+
}
120131
}
121132
registryConsumer.accept(ConfigurationService.get(XMLObjectProviderRegistry.class));
122133
log.debug("Initialized OpenSAML");

saml2/saml2-service-provider/src/test/java/org/springframework/security/saml2/core/OpenSamlInitializationServiceTests.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,34 @@
3131
*
3232
* @author Josh Cummings
3333
*/
34-
public class OpenSamlInitializationServiceTests {
34+
class OpenSamlInitializationServiceTests {
3535

3636
@Test
37-
public void initializeWhenInvokedMultipleTimesThenInitializesOnce() {
37+
void initializeWhenInvokedMultipleTimesThenInitializesOnce() {
3838
OpenSamlInitializationService.initialize();
3939
XMLObjectProviderRegistry registry = ConfigurationService.get(XMLObjectProviderRegistry.class);
4040
assertThat(registry.getBuilderFactory().getBuilder(AuthnRequest.DEFAULT_ELEMENT_NAME)).isNotNull();
4141
assertThatExceptionOfType(Saml2Exception.class)
42-
.isThrownBy(() -> OpenSamlInitializationService.requireInitialize((r) -> {
42+
.isThrownBy(() -> OpenSamlInitializationService.requireInitialize(r -> {
4343
}))
4444
.withMessageContaining("OpenSAML was already initialized previously");
4545
}
4646

47+
@Test
48+
void initializedAlreadyWhenInitializedThenReturnsTrue() {
49+
Saml2Utils.fipsCompliantOpenSamlInit();
50+
assertThat(OpenSamlInitializationService.initializedAlready()).isIn(true, false);
51+
XMLObjectProviderRegistry registry = ConfigurationService.get(XMLObjectProviderRegistry.class);
52+
assertThat(registry.getBuilderFactory().getBuilder(AuthnRequest.DEFAULT_ELEMENT_NAME)).isNotNull();
53+
}
54+
55+
@Test
56+
void initializedAlreadyWhenInitializedThenReturnsBuildIsNull() {
57+
if (OpenSamlInitializationService.initializedAlready()) {
58+
XMLObjectProviderRegistry registry = ConfigurationService.get(XMLObjectProviderRegistry.class);
59+
assertThat(registry.getBuilderFactory().getBuilder(AuthnRequest.DEFAULT_ELEMENT_NAME)).isNotNull();
60+
} else {
61+
assertThat(ConfigurationService.get(XMLObjectProviderRegistry.class)).isNull();
62+
}
63+
}
4764
}

saml2/saml2-service-provider/src/test/java/org/springframework/security/saml2/core/Saml2Utils.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,23 @@
2020
import java.io.IOException;
2121
import java.nio.charset.StandardCharsets;
2222
import java.util.Base64;
23+
import java.util.Properties;
24+
import java.util.ServiceLoader;
2325
import java.util.zip.Deflater;
2426
import java.util.zip.DeflaterOutputStream;
2527
import java.util.zip.Inflater;
2628
import java.util.zip.InflaterOutputStream;
2729

30+
import org.opensaml.core.config.ConfigurationService;
31+
import org.opensaml.core.config.InitializationException;
32+
import org.opensaml.core.config.Initializer;
33+
import org.opensaml.core.config.provider.PropertiesAdapter;
34+
import org.opensaml.security.config.GlobalNamedCurveRegistryInitializer;
35+
import org.opensaml.xmlsec.config.impl.DefaultSecurityConfigurationBootstrap;
2836
import org.springframework.security.saml2.Saml2Exception;
2937

38+
import static org.opensaml.xmlsec.config.impl.DefaultSecurityConfigurationBootstrap.CONFIG_PROPERTY_ECDH_DEFAULT_KDF;
39+
3040
public final class Saml2Utils {
3141

3242
private Saml2Utils() {
@@ -67,4 +77,21 @@ public static String samlInflate(byte[] b) {
6777
}
6878
}
6979

80+
public static void fipsCompliantOpenSamlInit() {
81+
Properties props = new Properties();
82+
props.setProperty(CONFIG_PROPERTY_ECDH_DEFAULT_KDF, DefaultSecurityConfigurationBootstrap.PBKDF2);
83+
ConfigurationService.setDefaultConfigurationPropertiesSource(() -> new PropertiesAdapter(props));
84+
Class<?> toSkip = GlobalNamedCurveRegistryInitializer.class;
85+
ServiceLoader.load(Initializer.class).stream()
86+
.filter(provider -> provider.type() != toSkip)
87+
.forEach(Saml2Utils::init);
88+
}
89+
90+
private static void init(ServiceLoader.Provider<Initializer> provider) {
91+
try {
92+
provider.get().init();
93+
} catch (InitializationException ex) {
94+
throw new Saml2Exception(ex);
95+
}
96+
}
7097
}

0 commit comments

Comments
 (0)