package org.pac4j.config.client;
import com.nimbusds.oauth2.sdk.auth.ClientAuthenticationMethod;
import org.junit.Test;
import org.opensaml.saml.common.xml.SAMLConstants;
import org.pac4j.cas.client.CasClient;
import org.pac4j.cas.config.CasProtocol;
import org.pac4j.core.client.Clients;
import org.pac4j.core.config.Config;
import org.pac4j.core.context.MockWebContext;
import org.pac4j.core.util.TestsConstants;
import org.pac4j.http.client.indirect.FormClient;
import org.pac4j.http.client.indirect.IndirectBasicAuthClient;
import org.pac4j.http.credentials.authenticator.test.SimpleTestUsernamePasswordAuthenticator;
import org.pac4j.oauth.client.FacebookClient;
import org.pac4j.oauth.client.TwitterClient;
import org.pac4j.oidc.client.GoogleOidcClient;
import org.pac4j.oidc.client.OidcClient;
import org.pac4j.saml.client.SAML2Client;
import java.util.HashMap;
import java.util.Map;
import static org.pac4j.config.builder.OAuthBuilder.*;
import static org.junit.Assert.*;
/**
* Tests {@link PropertiesConfigFactory}.
*
* @author Jerome Leleu
* @since 1.8.1
*/
public final class PropertiesConfigFactoryTests implements TestsConstants {
@Test
public void test() {
final Map<String, String> properties = new HashMap<>();
properties.put(FACEBOOK_ID, ID);
properties.put(FACEBOOK_SECRET, SECRET);
properties.put(TWITTER_ID, ID);
properties.put(TWITTER_SECRET, SECRET);
properties.put(CAS_LOGIN_URL, CALLBACK_URL);
properties.put(CAS_PROTOCOL, CasProtocol.CAS20.toString());
properties.put(SAML_KEYSTORE_PASSWORD, PASSWORD);
properties.put(SAML_PRIVATE_KEY_PASSWORD, PASSWORD);
properties.put(SAML_KEYSTORE_PATH, PATH);
properties.put(SAML_IDENTITY_PROVIDER_METADATA_PATH, PATH);
properties.put(SAML_DESTINATION_BINDING_TYPE, SAMLConstants.SAML2_REDIRECT_BINDING_URI);
properties.put(OIDC_ID, ID);
properties.put(OIDC_SECRET, SECRET);
properties.put(OIDC_DISCOVERY_URI, CALLBACK_URL);
properties.put(OIDC_USE_NONCE, "true");
properties.put(OIDC_PREFERRED_JWS_ALGORITHM, "RS384");
properties.put(OIDC_MAX_CLOCK_SKEW, "60");
properties.put(OIDC_CLIENT_AUTHENTICATION_METHOD, "CLIENT_SECRET_POST");
properties.put(OIDC_CUSTOM_PARAM_KEY1, KEY);
properties.put(OIDC_CUSTOM_PARAM_VALUE1, VALUE);
properties.put(CAS_LOGIN_URL.concat(".1"), CALLBACK_URL);
properties.put(CAS_PROTOCOL.concat(".1"), CasProtocol.CAS30.toString());
properties.put(OIDC_TYPE.concat(".1"), "google");
properties.put(OIDC_ID.concat(".1"), ID);
properties.put(OIDC_SECRET.concat(".1"), SECRET);
properties.put(ANONYMOUS, "whatever the value");
properties.put(FORMCLIENT_LOGIN_URL, CALLBACK_URL);
properties.put(FORMCLIENT_AUTHENTICATOR, "testUsernamePassword");
properties.put(INDIRECTBASICAUTH_AUTHENTICATOR.concat(".2"), "testUsernamePassword");
final PropertiesConfigFactory factory = new PropertiesConfigFactory(CALLBACK_URL, properties);
final Config config = factory.build();
final Clients clients = config.getClients();
assertEquals(10, clients.getClients().size());
final FacebookClient fbClient = (FacebookClient) clients.findClient("FacebookClient");
assertEquals(ID, fbClient.getKey());
assertEquals(SECRET, fbClient.getSecret());
assertNotNull(clients.findClient("AnonymousClient"));
final TwitterClient twClient = (TwitterClient) clients.findClient("TwitterClient");
assertEquals(ID, twClient.getKey());
assertEquals(SECRET, twClient.getSecret());
final CasClient casClient = (CasClient) clients.findClient("CasClient");
assertEquals(CALLBACK_URL, casClient.getConfiguration().getLoginUrl());
assertEquals(CasProtocol.CAS20, casClient.getConfiguration().getProtocol());
final SAML2Client saml2client = (SAML2Client) clients.findClient("SAML2Client");
assertNotNull(saml2client);
assertEquals(SAMLConstants.SAML2_REDIRECT_BINDING_URI, saml2client.getConfiguration().getDestinationBindingType());
final OidcClient oidcClient = (OidcClient) clients.findClient("OidcClient");
assertNotNull(oidcClient);
assertEquals(ClientAuthenticationMethod.CLIENT_SECRET_POST.toString(), oidcClient.getConfiguration().getClientAuthenticationMethod().toString().toLowerCase());
final CasClient casClient1 = (CasClient) clients.findClient("CasClient.1");
assertEquals(CasProtocol.CAS30, casClient1.getConfiguration().getProtocol());
final GoogleOidcClient googleOidcClient = (GoogleOidcClient) clients.findClient("GoogleOidcClient.1");
googleOidcClient.init(MockWebContext.create());
assertEquals(ID, googleOidcClient.getConfiguration().getClientId());
assertEquals(SECRET, googleOidcClient.getConfiguration().getSecret());
assertEquals("https://accounts.google.com/.well-known/openid-configuration", googleOidcClient.getConfiguration().getDiscoveryURI());
assertEquals(CALLBACK_URL + "?client_name=GoogleOidcClient.1", googleOidcClient.getCallbackUrl());
final FormClient formClient = (FormClient) clients.findClient("FormClient");
assertEquals(CALLBACK_URL, formClient.getLoginUrl());
assertTrue(formClient.getAuthenticator() instanceof SimpleTestUsernamePasswordAuthenticator);
final IndirectBasicAuthClient indirectBasicAuthClient = (IndirectBasicAuthClient) clients.findClient("IndirectBasicAuthClient.2");
assertEquals("authentication required", indirectBasicAuthClient.getRealmName());
assertTrue(indirectBasicAuthClient.getAuthenticator() instanceof SimpleTestUsernamePasswordAuthenticator);
}
}