blob: 92f0053fd926ffab55a9439bc848984f0b8b1142 [file] [log] [blame]
/****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one *
* or more contributor license agreements. See the NOTICE file *
* distributed with this work for additional information *
* regarding copyright ownership. The ASF licenses this file *
* to you under the Apache License, Version 2.0 (the *
* "License"); you may not use this file except in compliance *
* with the License. You may obtain a copy of the License at *
* *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, *
* software distributed under the License is distributed on an *
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
* KIND, either express or implied. See the License for the *
* specific language governing permissions and limitations *
* under the License. *
****************************************************************/
package org.apache.james.protocols.api;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Optional;
import org.apache.commons.configuration2.HierarchicalConfiguration;
import org.apache.commons.configuration2.tree.ImmutableNode;
import com.github.fge.lambdas.Throwing;
import com.google.common.base.Preconditions;
public class OidcSASLConfiguration {
public static OidcSASLConfiguration parse(HierarchicalConfiguration<ImmutableNode> configuration) throws MalformedURLException, URISyntaxException {
String jwksURL = configuration.getString("jwksURL", null);
String claim = configuration.getString("claim", null);
String oidcConfigurationURL = configuration.getString("oidcConfigurationURL", null);
String scope = configuration.getString("scope", null);
Preconditions.checkNotNull(jwksURL, "`jwksURL` property need to be specified inside the oidc tag");
Preconditions.checkNotNull(claim, "`claim` property need to be specified inside the oidc tag");
Preconditions.checkNotNull(oidcConfigurationURL, "`oidcConfigurationURL` property need to be specified inside the oidc tag");
Preconditions.checkNotNull(scope, "`scope` property need to be specified inside the oidc tag");
String introspectionUrl = configuration.getString("introspection.url", null);
String userInfoUrl = configuration.getString("userinfo.url", null);
return new OidcSASLConfiguration(new URI(jwksURL).toURL(), claim, new URI(oidcConfigurationURL).toURL(), scope, Optional.ofNullable(introspectionUrl)
.map(Throwing.function(value -> new URI(value).toURL())), Optional.ofNullable(configuration.getString("introspection.auth", null)),
Optional.ofNullable(userInfoUrl).map(Throwing.function(value -> new URI(value).toURL())));
}
private final URL jwksURL;
private final String claim;
private final URL oidcConfigurationURL;
private final String scope;
private final Optional<URL> introspectionEndpoint;
private final Optional<String> introspectionEndpointAuthorization;
private final Optional<URL> userInfoEndpoint;
public OidcSASLConfiguration(URL jwksURL,
String claim,
URL oidcConfigurationURL,
String scope,
Optional<URL> introspectionEndpoint,
Optional<String> introspectionEndpointAuthorization,
Optional<URL> userInfoEndpoint) {
this.jwksURL = jwksURL;
this.claim = claim;
this.oidcConfigurationURL = oidcConfigurationURL;
this.scope = scope;
this.introspectionEndpoint = introspectionEndpoint;
this.introspectionEndpointAuthorization = introspectionEndpointAuthorization;
this.userInfoEndpoint = userInfoEndpoint;
}
public URL getJwksURL() {
return jwksURL;
}
public String getClaim() {
return claim;
}
public URL getOidcConfigurationURL() {
return oidcConfigurationURL;
}
public String getScope() {
return scope;
}
public Optional<URL> getIntrospectionEndpoint() {
return introspectionEndpoint;
}
public Optional<String> getIntrospectionEndpointAuthorization() {
return introspectionEndpointAuthorization;
}
public Optional<URL> getUserInfoEndpoint() {
return userInfoEndpoint;
}
public boolean isCheckTokenByIntrospectionEndpoint() {
return getIntrospectionEndpoint().isPresent();
}
public boolean isCheckTokenByUserinfoEndpoint() {
return getUserInfoEndpoint().isPresent();
}
}