package org.pac4j.config.client;
import org.pac4j.config.builder.*;
import org.pac4j.core.client.Client;
import org.pac4j.core.config.Config;
import org.pac4j.core.config.ConfigFactory;
import org.pac4j.core.credentials.authenticator.Authenticator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.pac4j.core.util.CommonHelper.isNotBlank;
/**
* Build a configuration from properties.
*
* @author Jerome Leleu
* @since 1.8.1
*/
public class PropertiesConfigFactory extends AbstractBuilder implements ConfigFactory, PropertiesConstants {
private final String callbackUrl;
public PropertiesConfigFactory(final Map<String, String> properties) {
this(null, properties);
}
public PropertiesConfigFactory(final String callbackUrl, final Map<String, String> properties) {
super(properties);
this.callbackUrl = callbackUrl;
}
public Config build(final Object... parameters) {
final List<Client> clients = new ArrayList<>();
final Map<String, Authenticator> authenticators = new HashMap<>();
// pac4j-ldap dependency required
if (hasLdapAuthenticator()) {
final LdapAuthenticatorBuilder ldapAuthenticatorBuilder = new LdapAuthenticatorBuilder(properties);
ldapAuthenticatorBuilder.tryBuildLdapAuthenticator(authenticators);
}
// pac4j-oauth dependency required
if (hasOAuthClients()) {
final OAuthBuilder oAuthBuilder = new OAuthBuilder(properties);
oAuthBuilder.tryCreateFacebookClient(clients);
oAuthBuilder.tryCreateTwitterClient(clients);
oAuthBuilder.tryCreateDropboxClient(clients);
oAuthBuilder.tryCreateGithubClient(clients);
oAuthBuilder.tryCreateYahooClient(clients);
oAuthBuilder.tryCreateGoogleClient(clients);
oAuthBuilder.tryCreateFoursquareClient(clients);
oAuthBuilder.tryCreateWindowsLiveClient(clients);
oAuthBuilder.tryCreateLinkedInClient(clients);
}
// pac4j-saml dependency required
if (hasSaml2Clients()) {
final Saml2ClientBuilder saml2ClientBuilder = new Saml2ClientBuilder(properties);
saml2ClientBuilder.tryCreateSaml2Client(clients);
}
// pac4j-cas dependency required
if (hasCasClients()) {
final CasClientBuilder casClientBuilder = new CasClientBuilder(properties);
casClientBuilder.tryCreateCasClient(clients);
}
// pac4j-oidc dependency required
if (hasOidcClients()) {
final OidcClientBuilder oidcClientBuilder = new OidcClientBuilder(properties);
oidcClientBuilder.tryCreateOidcClient(clients);
}
// pac4j-http dependency required
if (hasHttpClients()) {
final IndirectHttpClientBuilder indirectHttpClientBuilder = new IndirectHttpClientBuilder(properties, authenticators);
indirectHttpClientBuilder.tryCreateLoginFormClient(clients);
indirectHttpClientBuilder.tryCreateIndirectBasciAuthClient(clients);
final DirectClientBuilder directClientBuilder = new DirectClientBuilder(properties);
directClientBuilder.tryCreateAnonymousClient(clients);
}
return new Config(callbackUrl, clients);
}
protected boolean hasLdapAuthenticator() {
for (int i = 0; i <= MAX_NUM_CLIENTS; i++) {
final String type = getProperty(LDAP_TYPE, i);
if (isNotBlank(type)) {
return true;
}
}
return false;
}
protected boolean hasOAuthClients() {
if (isNotBlank(getProperty(LINKEDIN_ID)) && isNotBlank(getProperty(LINKEDIN_SECRET))) {
return true;
}
if (isNotBlank(getProperty(FACEBOOK_ID)) && isNotBlank(getProperty(FACEBOOK_SECRET))) {
return true;
}
if (isNotBlank(getProperty(WINDOWSLIVE_ID)) && isNotBlank(getProperty(WINDOWSLIVE_SECRET))) {
return true;
}
if (isNotBlank(getProperty(FOURSQUARE_ID)) && isNotBlank(getProperty(FOURSQUARE_SECRET))) {
return true;
}
if (isNotBlank(getProperty(GOOGLE_ID)) && isNotBlank(getProperty(GOOGLE_SECRET))) {
return true;
}
if (isNotBlank(getProperty(YAHOO_ID)) && isNotBlank(getProperty(YAHOO_SECRET))) {
return true;
}
if (isNotBlank(getProperty(DROPBOX_ID)) && isNotBlank(getProperty(DROPBOX_SECRET))) {
return true;
}
if (isNotBlank(getProperty(GITHUB_ID)) && isNotBlank(getProperty(GITHUB_SECRET))) {
return true;
}
if (isNotBlank(getProperty(TWITTER_ID)) && isNotBlank(getProperty(TWITTER_SECRET))) {
return true;
}
return false;
}
protected boolean hasSaml2Clients() {
for (int i = 0; i <= MAX_NUM_CLIENTS; i++) {
if (isNotBlank(getProperty(SAML_KEYSTORE_PASSWORD, i)) &&
isNotBlank(getProperty(SAML_PRIVATE_KEY_PASSWORD, i)) &&
isNotBlank(getProperty(SAML_KEYSTORE_PATH, i)) &&
isNotBlank(getProperty(SAML_IDENTITY_PROVIDER_METADATA_PATH, i))) {
return true;
}
}
return false;
}
protected boolean hasCasClients() {
for (int i = 0; i <= MAX_NUM_CLIENTS; i++) {
if (isNotBlank(getProperty(CAS_LOGIN_URL, i))) {
return true;
}
}
return false;
}
protected boolean hasOidcClients() {
for (int i = 0; i <= MAX_NUM_CLIENTS; i++) {
if (isNotBlank(getProperty(OIDC_ID, i)) && isNotBlank(getProperty(OIDC_SECRET, i))) {
return true;
}
}
return false;
}
protected boolean hasHttpClients() {
if (isNotBlank(getProperty(ANONYMOUS))) {
return true;
}
for (int i = 0; i <= MAX_NUM_CLIENTS; i++) {
if (isNotBlank(getProperty(FORMCLIENT_LOGIN_URL, i)) && isNotBlank(getProperty(FORMCLIENT_AUTHENTICATOR, i))) {
return true;
}
if (isNotBlank(getProperty(INDIRECTBASICAUTH_AUTHENTICATOR, i))) {
return true;
}
}
return false;
}
}