diff options
| author | Benjamin Dauvergne <bdauvergne@entrouvert.com> | 2009-08-26 15:13:55 +0000 |
|---|---|---|
| committer | Benjamin Dauvergne <bdauvergne@entrouvert.com> | 2009-08-26 15:13:55 +0000 |
| commit | fbfbe5553dfb00af22c4d7bb3f4c62c9a129c3a9 (patch) | |
| tree | 22f7c4769cf64d513d022aeecabf68514d769e44 | |
| parent | a3c4a339f2f90faeb1d755f292f6787aba5de764 (diff) | |
| download | lasso-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.c | 2 | ||||
| -rw-r--r-- | lasso/id-ff/logout.c | 4 | ||||
| -rw-r--r-- | lasso/id-ff/profile.c | 5 | ||||
| -rw-r--r-- | lasso/id-ff/session.c | 77 | ||||
| -rw-r--r-- | lasso/id-ff/session.h | 4 | ||||
| -rw-r--r-- | lasso/id-ff/sessionprivate.h | 4 | ||||
| -rw-r--r-- | lasso/saml-2.0/login.c | 2 | ||||
| -rw-r--r-- | lasso/saml-2.0/logout.c | 4 | ||||
| -rw-r--r-- | lasso/saml-2.0/profile.c | 16 | ||||
| -rw-r--r-- | lasso/utils.h | 2 |
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) \ { \ |
