275 lines
8.9 KiB
C
275 lines
8.9 KiB
C
/*
|
|
* Lasso library C unit tests
|
|
*
|
|
* Copyright (C) 2004-2007 Entr'ouvert
|
|
* http://lasso.entrouvert.org
|
|
*
|
|
* Authors: See AUTHORS file in top-level directory.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <check.h>
|
|
|
|
#include <../lasso/lasso.h>
|
|
#include <glib.h>
|
|
#include "../lasso/utils.h"
|
|
|
|
#include <../lasso/id-ff/login.h>
|
|
#include <../lasso/id-ff/server.h>
|
|
#include <../lasso/id-ff/identity.h>
|
|
#include <../lasso/id-ff/session.h>
|
|
#include <../lasso/id-wsf-2.0/discovery.h>
|
|
#include <../lasso/id-wsf-2.0/data_service.h>
|
|
#include <../lasso/id-wsf-2.0/saml2_login.h>
|
|
|
|
#include <../lasso/xml/saml-2.0/samlp2_authn_request.h>
|
|
|
|
#include "./tests.h"
|
|
|
|
static const char
|
|
wsp_metadata[] = TESTSDATADIR "sp5-saml2/metadata.xml";
|
|
static const char
|
|
wsp_private_key[] = TESTSDATADIR "sp5-saml2/private-key.pem";
|
|
static const char
|
|
wsc_metadata[] = TESTSDATADIR "sp6-saml2/metadata.xml";
|
|
static const char
|
|
wsc_private_key[] = TESTSDATADIR "sp6-saml2/private-key.pem";
|
|
static const char
|
|
idp_metadata[] = TESTSDATADIR "idp5-saml2/metadata.xml";
|
|
static const char
|
|
idp_private_key[] = TESTSDATADIR "idp5-saml2/private-key.pem";
|
|
static const char
|
|
service_type[] = "urn:test-service";
|
|
|
|
|
|
struct
|
|
IdPState {
|
|
LassoLogin *login;
|
|
LassoIdWsf2Discovery *discovery;
|
|
LassoServer *server;
|
|
LassoIdentity *identity;
|
|
LassoSession *session;
|
|
};
|
|
|
|
struct
|
|
SPState {
|
|
LassoLogin *login;
|
|
LassoIdWsf2Discovery *discovery;
|
|
LassoIdWsf2DataService *dataservice;
|
|
LassoServer *server;
|
|
LassoIdentity *identity;
|
|
LassoSession *session;
|
|
};
|
|
|
|
static LassoServer*
|
|
get_wsc_server() {
|
|
LassoServer *server;
|
|
server = lasso_server_new(wsc_metadata, wsc_private_key, NULL, NULL);
|
|
lasso_server_add_provider(server, LASSO_PROVIDER_ROLE_IDP, idp_metadata, NULL, NULL);
|
|
return server;
|
|
}
|
|
|
|
static
|
|
LassoServer*
|
|
get_wsp_server() {
|
|
LassoServer *server = lasso_server_new(wsp_metadata, wsp_private_key, NULL, NULL);
|
|
lasso_server_add_provider(server, LASSO_PROVIDER_ROLE_IDP, idp_metadata, NULL, NULL);
|
|
return server;
|
|
}
|
|
|
|
static
|
|
LassoServer*
|
|
get_idp_server() {
|
|
LassoServer *server = lasso_server_new(idp_metadata, idp_private_key, NULL, NULL);
|
|
check_good_rc(lasso_server_add_provider(server, LASSO_PROVIDER_ROLE_SP, wsp_metadata, NULL, NULL));
|
|
check_good_rc(lasso_server_add_provider(server, LASSO_PROVIDER_ROLE_SP, wsc_metadata, NULL, NULL));
|
|
return server;
|
|
}
|
|
|
|
static void
|
|
prepare_idp(struct IdPState *idpstate) {
|
|
check_not_null(idpstate->server = get_idp_server());
|
|
check_not_null(idpstate->identity = lasso_identity_new());
|
|
check_not_null(idpstate->session = lasso_session_new());
|
|
check_not_null(idpstate->login = lasso_login_new(idpstate->server));
|
|
lasso_assign_gobject(idpstate->login->parent.identity, idpstate->identity);
|
|
lasso_assign_gobject(idpstate->login->parent.session, idpstate->session);
|
|
idpstate->discovery = lasso_idwsf2_discovery_new(idpstate->server);
|
|
lasso_assign_gobject(idpstate->discovery->parent.parent.identity, idpstate->identity);
|
|
lasso_assign_gobject(idpstate->discovery->parent.parent.session, idpstate->session);
|
|
}
|
|
|
|
static void
|
|
prepare_wsp(struct SPState *spstate) {
|
|
spstate->server = get_wsp_server();
|
|
spstate->identity = lasso_identity_new();
|
|
spstate->session = lasso_session_new();
|
|
spstate->login = lasso_login_new(spstate->server);
|
|
lasso_assign_gobject(spstate->login->parent.identity, spstate->identity);
|
|
lasso_assign_gobject(spstate->login->parent.session, spstate->session);
|
|
spstate->discovery = lasso_idwsf2_discovery_new(spstate->server);
|
|
lasso_assign_gobject(spstate->discovery->parent.parent.identity, spstate->identity);
|
|
lasso_assign_gobject(spstate->discovery->parent.parent.session, spstate->session);
|
|
spstate->dataservice = lasso_idwsf2_data_service_new(spstate->server);
|
|
lasso_assign_gobject(spstate->dataservice->parent.parent.identity, spstate->identity);
|
|
lasso_assign_gobject(spstate->dataservice->parent.parent.session, spstate->session);
|
|
|
|
}
|
|
|
|
static void
|
|
prepare_wsc(struct SPState *spstate) {
|
|
spstate->server = get_wsc_server();
|
|
spstate->identity = lasso_identity_new();
|
|
spstate->session = lasso_session_new();
|
|
spstate->login = lasso_login_new(spstate->server);
|
|
lasso_assign_gobject(spstate->login->parent.identity, spstate->identity);
|
|
lasso_assign_gobject(spstate->login->parent.session, spstate->session);
|
|
spstate->discovery = lasso_idwsf2_discovery_new(spstate->server);
|
|
lasso_assign_gobject(spstate->discovery->parent.parent.identity, spstate->identity);
|
|
lasso_assign_gobject(spstate->discovery->parent.parent.session, spstate->session);
|
|
spstate->dataservice = lasso_idwsf2_data_service_new(spstate->server);
|
|
lasso_assign_gobject(spstate->dataservice->parent.parent.identity, spstate->identity);
|
|
lasso_assign_gobject(spstate->dataservice->parent.parent.session, spstate->session);
|
|
|
|
}
|
|
|
|
static void
|
|
prepare_saml2_authn_request(LassoLogin *splogin, LassoLogin *idplogin)
|
|
{
|
|
LassoSamlp2AuthnRequest *request;
|
|
|
|
check_good_rc(lasso_login_init_authn_request(splogin, idplogin->parent.server->parent.ProviderID, LASSO_HTTP_METHOD_REDIRECT));
|
|
check_not_null(request = LASSO_SAMLP2_AUTHN_REQUEST(splogin->parent.request));
|
|
request->IsPassive = 0;
|
|
request->NameIDPolicy->AllowCreate = 1;
|
|
check_good_rc(lasso_login_build_authn_request_msg(splogin));
|
|
|
|
}
|
|
|
|
static void
|
|
process_authn_request(LassoLogin *splogin, LassoLogin *idplogin)
|
|
{
|
|
check_good_rc(lasso_login_process_authn_request_msg(idplogin, strchr(splogin->parent.msg_url,'?')+1));
|
|
lasso_login_must_authenticate(idplogin);
|
|
check_false(lasso_login_must_ask_for_consent(idplogin));
|
|
check_good_rc(lasso_login_validate_request_msg(idplogin, 1, 0));
|
|
check_good_rc(lasso_login_build_assertion(idplogin,
|
|
LASSO_SAML_AUTHENTICATION_METHOD_PASSWORD,
|
|
"FIXME: authenticationInstant",
|
|
"FIXME: reauthenticateOnOrAfter",
|
|
"FIXME: notBefore",
|
|
"FIXME: notOnOrAfter"));
|
|
check_good_rc(lasso_login_idwsf2_add_discovery_bootstrap_epr(idplogin,
|
|
"http://example.com/disco", "Discovery Service Description",
|
|
LASSO_SECURITY_MECH_BEARER));
|
|
check_good_rc(lasso_login_build_artifact_msg(idplogin, LASSO_HTTP_METHOD_ARTIFACT_GET));
|
|
}
|
|
|
|
static void
|
|
login_to_idp(struct IdPState *idpstate, struct SPState *spstate)
|
|
{
|
|
// generate request
|
|
prepare_saml2_authn_request(spstate->login, idpstate->login);
|
|
// send request to idp
|
|
// build assertion
|
|
// add disco token
|
|
// generate response artifact
|
|
process_authn_request(spstate->login, idpstate->login);
|
|
// process artifact
|
|
// get response
|
|
// process response
|
|
}
|
|
|
|
static void
|
|
register_metadata(G_GNUC_UNUSED struct IdPState *idpstate, G_GNUC_UNUSED struct SPState *wspstate)
|
|
{
|
|
}
|
|
|
|
static void
|
|
register_data_service(G_GNUC_UNUSED struct IdPState *idpstate, G_GNUC_UNUSED struct SPState *wspstate, G_GNUC_UNUSED const char *service_type)
|
|
{
|
|
}
|
|
|
|
static void
|
|
query_disco(G_GNUC_UNUSED struct IdPState *idpstate, G_GNUC_UNUSED struct SPState *wscstate, G_GNUC_UNUSED const char *service_type)
|
|
{
|
|
}
|
|
|
|
static void
|
|
query_data_service(G_GNUC_UNUSED struct SPState *wspstate, G_GNUC_UNUSED struct SPState *wscstate, G_GNUC_UNUSED int index, G_GNUC_UNUSED char *query, G_GNUC_UNUSED char *data)
|
|
{
|
|
}
|
|
|
|
void
|
|
free_idpstate(struct IdPState *idpstate)
|
|
{
|
|
lasso_release_gobject(idpstate->login);
|
|
lasso_release_gobject(idpstate->discovery);
|
|
lasso_release_gobject(idpstate->server);
|
|
lasso_release_gobject(idpstate->identity);
|
|
lasso_release_gobject(idpstate->session);
|
|
}
|
|
|
|
void
|
|
free_spstate(struct SPState *spstate)
|
|
{
|
|
lasso_release_gobject(spstate->login);
|
|
lasso_release_gobject(spstate->discovery);
|
|
lasso_release_gobject(spstate->dataservice);
|
|
lasso_release_gobject(spstate->identity);
|
|
lasso_release_gobject(spstate->session);
|
|
lasso_release_gobject(spstate->server);
|
|
}
|
|
|
|
|
|
START_TEST(test01_simple_data_query)
|
|
{
|
|
struct IdPState idpstate;
|
|
struct SPState wspstate, wscstate;
|
|
|
|
prepare_idp(&idpstate);
|
|
// check somes values
|
|
prepare_wsp(&wspstate);
|
|
// check somes values
|
|
prepare_wsc(&wscstate);
|
|
login_to_idp(&idpstate, &wspstate);
|
|
register_metadata(&idpstate, &wspstate);
|
|
register_data_service(&idpstate, &wspstate, service_type);
|
|
login_to_idp(&idpstate, &wscstate);
|
|
query_disco(&idpstate, &wspstate, service_type);
|
|
query_data_service(&wspstate, &wscstate, 0, "/test", "<test/>");
|
|
free_spstate(&wscstate);
|
|
free_spstate(&wspstate);
|
|
free_idpstate(&idpstate);
|
|
}
|
|
END_TEST
|
|
|
|
|
|
Suite*
|
|
idwsf2_suite()
|
|
{
|
|
Suite *s = suite_create("IdWsf2");
|
|
TCase *tc_idwsf2_base = tcase_create("Login, Disco, DST queries");
|
|
|
|
suite_add_tcase(s, tc_idwsf2_base);
|
|
tcase_add_test(tc_idwsf2_base, test01_simple_data_query);
|
|
|
|
return s;
|
|
}
|