summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Dauvergne <bdauvergne@entrouvert.com>2009-08-26 15:13:55 +0000
committerBenjamin Dauvergne <bdauvergne@entrouvert.com>2009-08-26 15:13:55 +0000
commitfbfbe5553dfb00af22c4d7bb3f4c62c9a129c3a9 (patch)
tree22f7c4769cf64d513d022aeecabf68514d769e44
parenta3c4a339f2f90faeb1d755f292f6787aba5de764 (diff)
downloadlasso-fbfbe5553dfb00af22c4d7bb3f4c62c9a129c3a9.tar.gz
lasso-fbfbe5553dfb00af22c4d7bb3f4c62c9a129c3a9.tar.xz
lasso-fbfbe5553dfb00af22c4d7bb3f4c62c9a129c3a9.zip
ID-FF&Core: Seal public field of LassoSession
* id-ff/session.h: seal public fields. * id-ff/session.c, id-ff/sessionprivate.h: add accessors for reading the is_dirty flag and counting store assertions. * id-ff/logout.c, id-ff/login.c, saml-2.0/login.c, saml-2.0/logout.c, saml-2.0/profile.c: use the new accessors. * id-ff/profile.c: include the private header file, use the new accessors, and remove unnecessary setting of is_dirty to FALSE (it should be false at instanciation). * utils.h: add a macro to access private content, prepare for using G_TYPE_INSTANCE_GET_PRIVATE and the GObject infrastructure for private structures eventually.
-rw-r--r--lasso/id-ff/login.c2
-rw-r--r--lasso/id-ff/logout.c4
-rw-r--r--lasso/id-ff/profile.c5
-rw-r--r--lasso/id-ff/session.c77
-rw-r--r--lasso/id-ff/session.h4
-rw-r--r--lasso/id-ff/sessionprivate.h4
-rw-r--r--lasso/saml-2.0/login.c2
-rw-r--r--lasso/saml-2.0/logout.c4
-rw-r--r--lasso/saml-2.0/profile.c16
-rw-r--r--lasso/utils.h2
10 files changed, 81 insertions, 39 deletions
diff --git a/lasso/id-ff/login.c b/lasso/id-ff/login.c
index 03e434ef..c679cd55 100644
--- a/lasso/id-ff/login.c
+++ b/lasso/id-ff/login.c
@@ -1696,7 +1696,7 @@ lasso_login_must_authenticate(LassoLogin *login)
* particular assertions, one is enough
*/
matched = (profile->session != NULL && \
- g_hash_table_size(profile->session->assertions) > 0);
+ lasso_session_count_assertions(profile->session) > 0);
}
g_list_free(assertions);
diff --git a/lasso/id-ff/logout.c b/lasso/id-ff/logout.c
index b77c3def..4730a949 100644
--- a/lasso/id-ff/logout.c
+++ b/lasso/id-ff/logout.c
@@ -748,7 +748,7 @@ lasso_logout_process_response_msg(LassoLogout *logout, gchar *response_msg)
* provider instead.
*/
if (logout->initial_remote_providerID &&
- g_hash_table_size(profile->session->assertions) == 0) {
+ lasso_session_count_assertions(profile->session) <= 0) {
remote_provider = g_hash_table_lookup(profile->server->providers,
logout->initial_remote_providerID);
if (remote_provider->role == LASSO_PROVIDER_ROLE_SP) {
@@ -972,7 +972,7 @@ lasso_logout_validate_request(LassoLogout *logout)
* request and response
*/
if (remote_provider->role == LASSO_PROVIDER_ROLE_SP &&
- g_hash_table_size(profile->session->assertions) >= 1) {
+ lasso_session_count_assertions(profile->session) >= 1) {
lasso_transfer_string(logout->initial_remote_providerID, profile->remote_providerID);
lasso_transfer_gobject(logout->initial_request, profile->request);
lasso_transfer_gobject(logout->initial_response, profile->response);
diff --git a/lasso/id-ff/profile.c b/lasso/id-ff/profile.c
index 16732fc8..a1eccb26 100644
--- a/lasso/id-ff/profile.c
+++ b/lasso/id-ff/profile.c
@@ -40,6 +40,7 @@
#include <lasso/id-ff/profile.h>
#include <lasso/id-ff/profileprivate.h>
#include <lasso/id-ff/providerprivate.h>
+#include "./sessionprivate.h"
#include <lasso/saml-2.0/profileprivate.h>
#include "../utils.h"
@@ -277,7 +278,7 @@ lasso_profile_is_identity_dirty(LassoProfile *profile)
gboolean
lasso_profile_is_session_dirty(LassoProfile *profile)
{
- return (profile->session && profile->session->is_dirty);
+ return lasso_session_is_dirty(profile->session);
}
@@ -377,8 +378,6 @@ lasso_profile_set_session_from_dump(LassoProfile *profile, const gchar *dump)
lasso_saml20_profile_set_session_from_dump(profile);
}
- profile->session->is_dirty = FALSE;
-
return 0;
}
diff --git a/lasso/id-ff/session.c b/lasso/id-ff/session.c
index 058936be..0455b306 100644
--- a/lasso/id-ff/session.c
+++ b/lasso/id-ff/session.c
@@ -54,13 +54,15 @@
/*****************************************************************************/
static gint
-lasso_session_add_assertion_simple(LassoSession *session, const char *providerID, LassoNode *assertion)
+lasso_session_add_assertion_simple(LassoSession *session, const char *providerID, LassoNode
+ *assertion)
{
g_return_val_if_fail(LASSO_IS_SESSION(session), LASSO_PARAM_ERROR_INVALID_VALUE);
g_return_val_if_fail(providerID != NULL, LASSO_PARAM_ERROR_INVALID_VALUE);
g_return_val_if_fail(assertion != NULL, LASSO_PARAM_ERROR_INVALID_VALUE);
- g_hash_table_insert(session->assertions, g_strdup(providerID), g_object_ref(assertion));
+ g_hash_table_insert(lasso_private_data(session)->assertions, g_strdup(providerID),
+ g_object_ref(assertion));
return 0;
}
@@ -103,7 +105,7 @@ lasso_session_add_assertion(LassoSession *session, const char *providerID, Lasso
}
}
- session->is_dirty = TRUE;
+ lasso_private_data(session)->is_dirty = TRUE;
return ret;
}
@@ -131,7 +133,7 @@ lasso_session_add_assertion_with_id(LassoSession *session, const char *assertion
g_strdup(assertionID),
xmlCopyNode(assertion, 1));
- session->is_dirty = TRUE;
+ lasso_private_data(session)->is_dirty = TRUE;
return 0;
}
@@ -155,7 +157,7 @@ lasso_session_add_status(LassoSession *session, const char *providerID, LassoNod
g_hash_table_insert(session->private_data->status, g_strdup(providerID), status);
- session->is_dirty = TRUE;
+ lasso_private_data(session)->is_dirty = TRUE;
return 0;
}
@@ -177,7 +179,7 @@ lasso_session_get_assertion(LassoSession *session, const gchar *providerID)
{
g_return_val_if_fail(LASSO_IS_SESSION(session), NULL);
- return g_hash_table_lookup(session->assertions, providerID);
+ return g_hash_table_lookup(lasso_private_data(session)->assertions, providerID);
}
/**
@@ -226,9 +228,9 @@ lasso_session_get_assertions(LassoSession *session, const char *provider_id)
}
if (provider_id == NULL) {
- g_hash_table_foreach(session->assertions, (GHFunc)add_assertion_to_list, &r);
+ g_hash_table_foreach(lasso_private_data(session)->assertions, (GHFunc)add_assertion_to_list, &r);
} else {
- assertion = g_hash_table_lookup(session->assertions, provider_id);
+ assertion = g_hash_table_lookup(lasso_private_data(session)->assertions, provider_id);
if (assertion)
r = g_list_append(r, assertion);
}
@@ -282,13 +284,13 @@ lasso_session_get_provider_index(LassoSession *session, gint index)
return NULL;
}
- length = g_hash_table_size(session->assertions);
+ length = g_hash_table_size(lasso_private_data(session)->assertions);
if (length == 0)
return NULL;
if (session->private_data->providerIDs == NULL) {
- g_hash_table_foreach(session->assertions, (GHFunc)add_providerID, session);
+ g_hash_table_foreach(lasso_private_data(session)->assertions, (GHFunc)add_providerID, session);
}
element = g_list_nth(session->private_data->providerIDs, index);
@@ -317,7 +319,7 @@ lasso_session_init_provider_ids(LassoSession *session)
g_list_free(session->private_data->providerIDs);
session->private_data->providerIDs = NULL;
}
- g_hash_table_foreach(session->assertions, (GHFunc)add_providerID, session);
+ g_hash_table_foreach(lasso_private_data(session)->assertions, (GHFunc)add_providerID, session);
}
@@ -336,7 +338,7 @@ lasso_session_is_empty(LassoSession *session)
return TRUE;
}
- if (g_hash_table_size(session->assertions)) {
+ if (g_hash_table_size(lasso_private_data(session)->assertions)) {
return FALSE;
}
if (g_hash_table_size(session->private_data->status)) {
@@ -347,6 +349,34 @@ lasso_session_is_empty(LassoSession *session)
}
/**
+ * lasso_session_count_assertions:
+ * @session: a #LassoSession object
+ *
+ * Return the number of assertion currently recored in the session.
+ *
+ * Return value: a positive value or -1 if session is an invalid #LassoSession object, or -2 if the
+ * number is unknown.
+ */
+gint
+lasso_session_count_assertions(LassoSession *session)
+{
+ GHashTable *hashtable;
+
+ lasso_return_val_if_invalid_param(SESSION, session, -1);
+ hashtable = lasso_private_data(session)->assertions;
+
+ return hashtable ? g_hash_table_size(hashtable) : 0;
+}
+
+gboolean
+lasso_session_is_dirty(LassoSession *session)
+{
+ lasso_return_val_if_invalid_param(SESSION, session, TRUE);
+
+ return lasso_private_data(session)->is_dirty;
+}
+
+/**
* lasso_session_remove_assertion:
* @session: a #LassoSession
* @providerID: the provider ID
@@ -361,8 +391,8 @@ lasso_session_remove_assertion(LassoSession *session, const gchar *providerID)
g_return_val_if_fail(LASSO_IS_SESSION(session), LASSO_PARAM_ERROR_INVALID_VALUE);
g_return_val_if_fail(providerID != NULL, LASSO_PARAM_ERROR_INVALID_VALUE);
- if (g_hash_table_remove(session->assertions, providerID)) {
- session->is_dirty = TRUE;
+ if (g_hash_table_remove(lasso_private_data(session)->assertions, providerID)) {
+ lasso_private_data(session)->is_dirty = TRUE;
return 0;
}
@@ -385,7 +415,7 @@ lasso_session_remove_status(LassoSession *session, const gchar *providerID)
g_return_val_if_fail(providerID != NULL, LASSO_PARAM_ERROR_INVALID_VALUE);
if (g_hash_table_remove(session->private_data->status, providerID)) {
- session->is_dirty = TRUE;
+ lasso_private_data(session)->is_dirty = TRUE;
return 0;
}
@@ -406,7 +436,7 @@ lasso_session_add_endpoint_reference(LassoSession *session, LassoWsAddrEndpointR
g_hash_table_insert(session->private_data->eprs,
g_strdup(LASSO_IDWSF2_DISCO_SERVICE_TYPE(i->data)->content),
g_object_ref(epr));
- session->is_dirty = TRUE;
+ lasso_private_data(session)->is_dirty = TRUE;
break;
}
}
@@ -571,8 +601,8 @@ get_xmlNode(LassoNode *node, G_GNUC_UNUSED gboolean lasso_dump)
xmlSetNs(xmlnode, xmlNewNs(xmlnode, (xmlChar*)LASSO_LASSO_HREF, NULL));
xmlSetProp(xmlnode, (xmlChar*)"Version", (xmlChar*)"2");
- if (g_hash_table_size(session->assertions))
- g_hash_table_foreach(session->assertions,
+ if (g_hash_table_size(lasso_private_data(session)->assertions))
+ g_hash_table_foreach(lasso_private_data(session)->assertions,
(GHFunc)add_assertion_childnode, &context);
if (g_hash_table_size(session->private_data->status))
g_hash_table_foreach(session->private_data->status,
@@ -725,8 +755,8 @@ dispose(GObject *object)
return;
session->private_data->dispose_has_run = TRUE;
- g_hash_table_destroy(session->assertions);
- session->assertions = NULL;
+ g_hash_table_destroy(lasso_private_data(session)->assertions);
+ lasso_private_data(session)->assertions = NULL;
g_hash_table_destroy(session->private_data->status);
session->private_data->status = NULL;
@@ -778,10 +808,9 @@ instance_init(LassoSession *session)
(GDestroyNotify)g_free,
(GDestroyNotify)lasso_node_destroy);
#endif
- session->assertions = g_hash_table_new_full(g_str_hash, g_str_equal,
- (GDestroyNotify)g_free,
- (GDestroyNotify)lasso_node_destroy);
- session->is_dirty = FALSE;
+ lasso_private_data(session)->assertions = g_hash_table_new_full(g_str_hash, g_str_equal,
+ (GDestroyNotify)g_free, (GDestroyNotify)lasso_node_destroy);
+ lasso_private_data(session)->is_dirty = FALSE;
}
static void
diff --git a/lasso/id-ff/session.h b/lasso/id-ff/session.h
index fe4b5e00..b355dd90 100644
--- a/lasso/id-ff/session.h
+++ b/lasso/id-ff/session.h
@@ -54,8 +54,8 @@ struct _LassoSession {
/*< public >*/
/* Can actually contain LassoSamlAssertion or LassoSaml2Assertion */
- GHashTable *assertions; /* of LassoSamlAssertion */
- gboolean is_dirty;
+ GHashTable *_assertions; /* of LassoSamlAssertion */
+ gboolean _is_dirty;
/*< private >*/
LassoSessionPrivate *private_data;
diff --git a/lasso/id-ff/sessionprivate.h b/lasso/id-ff/sessionprivate.h
index a6828774..80a15583 100644
--- a/lasso/id-ff/sessionprivate.h
+++ b/lasso/id-ff/sessionprivate.h
@@ -40,6 +40,8 @@ struct _LassoSessionPrivate
GList *providerIDs;
GHashTable *status; /* hold temporary response status for sso-art */
GHashTable *assertions_by_id;
+ GHashTable *assertions; /* of LassoSamlAssertion */
+ gboolean is_dirty;
#ifdef LASSO_WSF_ENABLED
GHashTable *eprs;
#endif
@@ -61,6 +63,8 @@ LassoNode* lasso_session_get_status(
gint lasso_session_remove_status(LassoSession *session, const gchar *providerID);
gint lasso_session_remove_assertion(LassoSession *session, const gchar *providerID);
+gint lasso_session_count_assertions(LassoSession *session);
+gboolean lasso_session_is_dirty(LassoSession *session);
void lasso_session_init_provider_ids(LassoSession *session);
diff --git a/lasso/saml-2.0/login.c b/lasso/saml-2.0/login.c
index 49d98d4a..b361e6ec 100644
--- a/lasso/saml-2.0/login.c
+++ b/lasso/saml-2.0/login.c
@@ -387,7 +387,7 @@ lasso_saml20_login_must_authenticate(LassoLogin *login)
* particular assertions, one is enough
*/
matched = (profile->session != NULL && \
- g_hash_table_size(profile->session->assertions) > 0);
+ lasso_session_count_assertions(profile->session) > 0);
}
g_list_free(assertions);
diff --git a/lasso/saml-2.0/logout.c b/lasso/saml-2.0/logout.c
index 7a7c7bf5..774d35d4 100644
--- a/lasso/saml-2.0/logout.c
+++ b/lasso/saml-2.0/logout.c
@@ -390,7 +390,7 @@ lasso_saml20_logout_validate_request(LassoLogout *logout)
* request and response
*/
if (remote_provider->role == LASSO_PROVIDER_ROLE_SP &&
- g_hash_table_size(profile->session->assertions) >= 1) {
+ lasso_session_count_assertions(profile->session) >= 1) {
lasso_transfer_string(logout->initial_remote_providerID,
profile->remote_providerID);
lasso_transfer_gobject(logout->initial_request, profile->request);
@@ -575,7 +575,7 @@ lasso_saml20_logout_process_response_msg(LassoLogout *logout, const char *respon
* provider instead.
*/
if (logout->initial_remote_providerID &&
- g_hash_table_size(profile->session->assertions) == 0) {
+ lasso_session_count_assertions(profile->session) == 0) {
remote_provider = g_hash_table_lookup(profile->server->providers,
logout->initial_remote_providerID);
if (remote_provider->role == LASSO_PROVIDER_ROLE_SP) {
diff --git a/lasso/saml-2.0/profile.c b/lasso/saml-2.0/profile.c
index 3bc4d7be..580cd115 100644
--- a/lasso/saml-2.0/profile.c
+++ b/lasso/saml-2.0/profile.c
@@ -34,6 +34,7 @@
#include <lasso/id-ff/profile.h>
#include <lasso/id-ff/profileprivate.h>
#include <lasso/id-ff/serverprivate.h>
+#include <../id-ff/sessionprivate.h>
#include <lasso/xml/private.h>
#include <lasso/xml/saml-2.0/samlp2_request_abstract.h>
@@ -400,7 +401,7 @@ lasso_profile_is_saml_query(const gchar *query)
static void
-lasso_saml20_profile_set_session_from_dump_decrypt(G_GNUC_UNUSED gpointer key,
+lasso_saml20_profile_set_session_from_dump_decrypt(
LassoSaml2Assertion *assertion, G_GNUC_UNUSED gpointer data)
{
if (LASSO_IS_SAML2_ASSERTION(assertion) == FALSE) {
@@ -417,10 +418,17 @@ lasso_saml20_profile_set_session_from_dump_decrypt(G_GNUC_UNUSED gpointer key,
gint
lasso_saml20_profile_set_session_from_dump(LassoProfile *profile)
{
- if (profile->session != NULL && profile->session->assertions != NULL) {
- g_hash_table_foreach(profile->session->assertions,
- (GHFunc)lasso_saml20_profile_set_session_from_dump_decrypt,
+ GList *assertions = NULL;
+
+ lasso_bad_param(PROFILE, profile);
+
+ if (lasso_session_count_assertions(profile->session) > 0) {
+ assertions = lasso_session_get_assertions(profile->session, NULL);
+
+ g_list_foreach(assertions,
+ (GFunc)lasso_saml20_profile_set_session_from_dump_decrypt,
NULL);
+ lasso_release_list(assertions);
}
return 0;
diff --git a/lasso/utils.h b/lasso/utils.h
index 82dd8cc6..1c765ed9 100644
--- a/lasso/utils.h
+++ b/lasso/utils.h
@@ -50,6 +50,8 @@
#define lasso_check_type_equality2(a,b,c)
#endif
+#define lasso_private_data(object) ((object)->private_data)
+
/* Freeing */
#define lasso_release(dest) \
{ \