summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lasso/id-wsf/data_service.c2
-rw-r--r--lasso/id-wsf/discovery.c627
-rw-r--r--lasso/id-wsf/discovery.h3
-rw-r--r--lasso/id-wsf/wsf_profile.c83
-rw-r--r--lasso/id-wsf/wsf_profile_private.h6
5 files changed, 415 insertions, 306 deletions
diff --git a/lasso/id-wsf/data_service.c b/lasso/id-wsf/data_service.c
index 4c37e655..a66a5165 100644
--- a/lasso/id-wsf/data_service.c
+++ b/lasso/id-wsf/data_service.c
@@ -765,7 +765,7 @@ lasso_data_service_build_modify_response_msg(LassoDataService *service)
if (node != NULL) {
/* If we must replace the root element, change it in the xmlDoc */
if (node == cur_data) {
- xmlDocSetRootElement(doc, newNode);
+ xmlDocSetRootElement(doc, newNode);
xmlFreeNode(cur_data);
cur_data = NULL;
} else {
diff --git a/lasso/id-wsf/discovery.c b/lasso/id-wsf/discovery.c
index 61f9c2a4..4d6a1818 100644
--- a/lasso/id-wsf/discovery.c
+++ b/lasso/id-wsf/discovery.c
@@ -68,12 +68,9 @@
#include <lasso/xml/soap_binding_correlation.h>
#include <lasso/xml/saml_assertion.h>
+#include <lasso/xml/saml_attribute.h>
#include <lasso/xml/saml_attribute_value.h>
#include <lasso/xml/disco_modify.h>
-#include <lasso/xml/ds_key_info.h>
-#include <lasso/xml/ds_key_value.h>
-#include <lasso/xml/ds_rsa_key_value.h>
-
#include <lasso/id-ff/server.h>
#include <lasso/id-ff/provider.h>
@@ -96,25 +93,27 @@ struct _LassoDiscoveryPrivate
/* static methods/functions */
/*****************************************************************************/
-static gchar* lasso_discovery_build_credential(LassoDiscovery *discovery, const gchar *providerId);
-
static gchar*
lasso_discovery_build_credential(LassoDiscovery *discovery, const gchar *providerId)
{
- LassoSoapHeader *header;
- LassoSoapBindingProvider *provider;
- LassoDiscoQueryResponse *response;
- LassoDiscoCredentials *credentials;
- GList *iter;
-
- LassoSamlAssertion *assertion;
-
- LassoSamlAuthenticationStatement *authentication_statement;
+ /* XXX: providerId parameter is never used */
+
+ LassoWsfProfile *profile = NULL;
+ LassoSoapHeader *header = NULL;
+ LassoSoapBindingProvider *provider = NULL;
+ LassoDiscoQueryResponse *response = NULL;
+ LassoDiscoCredentials *credentials = NULL;
+ LassoSamlAssertion *assertion = NULL;
+ LassoSamlAuthenticationStatement *authentication_statement = NULL;
+ LassoSamlSubject *subject = NULL;
+ LassoSamlNameIdentifier *name_identifier = NULL;
+ LassoSamlSubjectConfirmation *subject_confirmation = NULL;
+ LassoDsKeyInfo *key_info = NULL;
+ GList *iter = NULL;
- LassoSamlSubject *subject;
- LassoSamlNameIdentifier *identifier;
+ g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), NULL);
- LassoSamlSubjectConfirmation *subject_confirmation;
+ profile = LASSO_WSF_PROFILE(discovery);
/* Init assertion informations */
assertion = lasso_saml_assertion_new();
@@ -122,36 +121,32 @@ lasso_discovery_build_credential(LassoDiscovery *discovery, const gchar *provide
assertion->MajorVersion = LASSO_SAML_MAJOR_VERSION_N;
assertion->MinorVersion = LASSO_SAML_MINOR_VERSION_N;
assertion->IssueInstant = lasso_get_current_time();
- assertion->Issuer =
- g_strdup(LASSO_PROVIDER(LASSO_WSF_PROFILE(discovery)->server)->ProviderID);
+ assertion->Issuer = g_strdup(LASSO_PROVIDER(profile->server)->ProviderID);
/* Add AuthenticationStatement */
authentication_statement = LASSO_SAML_AUTHENTICATION_STATEMENT(
lasso_saml_authentication_statement_new());
authentication_statement->AuthenticationInstant = lasso_get_current_time();
+
subject = LASSO_SAML_SUBJECT(lasso_saml_subject_new());
- LASSO_SAML_SUBJECT_STATEMENT_ABSTRACT(authentication_statement)->Subject = subject;
/* NameIdentifier */
- identifier = lasso_saml_name_identifier_new();
- identifier->NameQualifier = g_strdup(
- LASSO_PROVIDER(LASSO_WSF_PROFILE(discovery)->server)->ProviderID);
- header = LASSO_WSF_PROFILE(discovery)->soap_envelope_request->Header;
- iter = header->Other;
- while (iter) {
- if (LASSO_IS_SOAP_BINDING_PROVIDER(iter->data) == TRUE) {
+ name_identifier = lasso_saml_name_identifier_new();
+ name_identifier->NameQualifier = g_strdup(LASSO_PROVIDER(profile->server)->ProviderID);
+ header = profile->soap_envelope_request->Header;
+ for (iter = header->Other; iter != NULL; iter = iter->next) {
+ if (LASSO_IS_SOAP_BINDING_PROVIDER(iter->data)) {
provider = LASSO_SOAP_BINDING_PROVIDER(iter->data);
break;
}
- iter = iter->next;
}
- if (provider) {
- identifier->Format = g_strdup(LASSO_LIB_NAME_IDENTIFIER_FORMAT_ENTITYID);
- identifier->content = g_strdup(provider->providerID);
+ if (provider != NULL) {
+ name_identifier->Format = g_strdup(LASSO_LIB_NAME_IDENTIFIER_FORMAT_ENTITYID);
+ name_identifier->content = g_strdup(provider->providerID);
} else {
- identifier->Format = g_strdup(LASSO_LIB_NAME_IDENTIFIER_FORMAT_FEDERATED);
+ name_identifier->Format = g_strdup(LASSO_LIB_NAME_IDENTIFIER_FORMAT_FEDERATED);
}
- subject->NameIdentifier = identifier;
+ subject->NameIdentifier = name_identifier;
/* SubjectConfirmation */
subject_confirmation = lasso_saml_subject_confirmation_new();
@@ -160,77 +155,22 @@ lasso_discovery_build_credential(LassoDiscovery *discovery, const gchar *provide
g_strdup(LASSO_SAML_CONFIRMATION_METHOD_HOLDER_OF_KEY));
/* Add public key value in credential */
- {
- LassoDsKeyInfo *key_info;
- LassoDsRsaKeyValue *rsa_key_value;
- LassoDsKeyValue *key_value;
-
- LassoProvider *lasso_provider;
-
- xmlSecKeyInfoCtx *ctx;
- xmlSecKey *public_key;
- xmlSecKeyData *public_key_data;
-
- xmlDoc *doc;
- xmlNode *key_info_node, *xmlnode;
-
- xmlXPathContext *xpathCtx = NULL;
- xmlXPathObject *xpathObj;
-
- lasso_provider = lasso_server_get_provider(LASSO_WSF_PROFILE(discovery)->server,
- (char *) provider->providerID);
- public_key = lasso_provider_get_public_key(lasso_provider);
- public_key_data = xmlSecKeyGetValue(public_key);
- ctx = xmlSecKeyInfoCtxCreate(NULL);
- xmlSecKeyInfoCtxInitialize(ctx, NULL);
- ctx->mode = xmlSecKeyInfoModeWrite;
- ctx->keyReq.keyType = xmlSecKeyDataTypePublic;
-
- doc = xmlSecCreateTree((xmlChar*)"KeyInfo",
- (xmlChar*)"http://www.w3.org/2000/09/xmldsig#");
- key_info_node = xmlDocGetRootElement(doc);
- xmlSecAddChild(key_info_node, (xmlChar*)"KeyValue",
- (xmlChar*)"http://www.w3.org/2000/09/xmldsig#");
-
- xmlSecKeyInfoNodeWrite(key_info_node, public_key, ctx);
-
- xpathCtx = xmlXPathNewContext(doc);
- xmlXPathRegisterNs(xpathCtx, (xmlChar*)"ds",
- (xmlChar*)"http://www.w3.org/2000/09/xmldsig#");
-
- rsa_key_value = lasso_ds_rsa_key_value_new();
- xpathObj = xmlXPathEvalExpression((xmlChar*)"//ds:Modulus", xpathCtx);
- if (xpathObj->nodesetval && xpathObj->nodesetval->nodeNr) {
- xmlnode = xpathObj->nodesetval->nodeTab[0];
- rsa_key_value->Modulus = (gchar *) xmlNodeGetContent(xmlnode);
- }
- xmlXPathFreeObject(xpathObj);
-
- xpathObj = xmlXPathEvalExpression((xmlChar*)"//ds:Exponent", xpathCtx);
- if (xpathObj->nodesetval && xpathObj->nodesetval->nodeNr) {
- xmlnode = xpathObj->nodesetval->nodeTab[0];
- rsa_key_value->Exponent = (gchar *) xmlNodeGetContent(xmlnode);
- }
- xmlXPathFreeObject(xpathObj);
-
- key_value = lasso_ds_key_value_new();
- key_value->RSAKeyValue = rsa_key_value;
- key_info = lasso_ds_key_info_new();
- key_info->KeyValue = key_value;
+ key_info = lasso_wsf_profile_get_key_info_node(profile, provider->providerID);
+ if (key_info != NULL) {
subject_confirmation->KeyInfo = key_info;
-
- xmlXPathFreeContext(xpathCtx);
- xmlFreeDoc(doc);
}
subject->SubjectConfirmation = subject_confirmation;
+
+ /* Add the subject in the authentication statement */
+ LASSO_SAML_SUBJECT_STATEMENT_ABSTRACT(authentication_statement)->Subject = subject;
assertion->AuthenticationStatement = authentication_statement;
/* Add credential to disco:QueryResponse */
- response = LASSO_DISCO_QUERY_RESPONSE(LASSO_WSF_PROFILE(discovery)->response);
+ response = LASSO_DISCO_QUERY_RESPONSE(profile->response);
credentials = lasso_disco_credentials_new();
- response->Credentials = credentials;
credentials->any = g_list_append(credentials->any, LASSO_NODE(assertion));
+ response->Credentials = credentials;
return g_strdup(assertion->AssertionID);
}
@@ -249,7 +189,7 @@ lasso_discovery_build_credential(LassoDiscovery *discovery, const gchar *provide
static gint
lasso_discovery_init_request(LassoDiscovery *discovery,
LassoDiscoResourceOffering *resourceOffering,
- LassoDiscoDescription *description)
+ LassoDiscoDescription *description)
{
LassoWsfProfile *profile = LASSO_WSF_PROFILE(discovery);
@@ -257,34 +197,33 @@ lasso_discovery_init_request(LassoDiscovery *discovery,
if (g_list_find(resourceOffering->ServiceInstance->Description, description) == NULL) {
message(G_LOG_LEVEL_CRITICAL, lasso_strerror(LASSO_PARAM_ERROR_INVALID_VALUE));
}
+
/* get ResourceID/EncryptedResourceID in description */
/* ResourceID and EncryptedResourceID are owned by resourceOffering,
so increment reference count */
if (resourceOffering->ResourceID != NULL) {
g_object_ref(resourceOffering->ResourceID);
if (LASSO_IS_DISCO_MODIFY(profile->request)) {
- LASSO_DISCO_MODIFY(profile->request)->ResourceID = \
+ LASSO_DISCO_MODIFY(profile->request)->ResourceID =
resourceOffering->ResourceID;
} else if (LASSO_IS_DISCO_QUERY(profile->request)) {
- LASSO_DISCO_QUERY(profile->request)->ResourceID = \
+ LASSO_DISCO_QUERY(profile->request)->ResourceID =
resourceOffering->ResourceID;
}
} else if (resourceOffering->EncryptedResourceID != NULL) {
g_object_ref(resourceOffering->EncryptedResourceID);
if (LASSO_IS_DISCO_MODIFY(profile->request)) {
- LASSO_DISCO_MODIFY(profile->request)->EncryptedResourceID = \
+ LASSO_DISCO_MODIFY(profile->request)->EncryptedResourceID =
resourceOffering->EncryptedResourceID;
} else if (LASSO_IS_DISCO_QUERY(profile->request)) {
- LASSO_DISCO_QUERY(profile->request)->EncryptedResourceID = \
+ LASSO_DISCO_QUERY(profile->request)->EncryptedResourceID =
resourceOffering->EncryptedResourceID;
}
}
if (description->Endpoint != NULL) {
profile->msg_url = g_strdup(description->Endpoint);
- } else if (description->WsdlURI != NULL) {
- /* TODO: get Endpoint at WsdlURI */
- }
+ } /* TODO: else, description->WsdlURI, get endpoint automatically */
return 0;
}
@@ -294,9 +233,9 @@ lasso_discovery_add_insert_entry(LassoDiscovery *discovery,
LassoDiscoServiceInstance *serviceInstance,
LassoDiscoResourceID *resourceId)
{
- LassoDiscoModify *modify;
- LassoDiscoInsertEntry *insertEntry;
- LassoDiscoResourceOffering *resourceOffering;
+ LassoDiscoModify *modify = NULL;
+ LassoDiscoInsertEntry *insertEntry = NULL;
+ LassoDiscoResourceOffering *resourceOffering = NULL;
g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), NULL);
g_return_val_if_fail(LASSO_IS_DISCO_SERVICE_INSTANCE(serviceInstance), NULL);
@@ -322,7 +261,7 @@ gint
lasso_discovery_add_remove_entry(LassoDiscovery *discovery,
const gchar *entryID)
{
- LassoDiscoModify *modify;
+ LassoDiscoModify *modify = NULL;
g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
g_return_val_if_fail(entryID != NULL, LASSO_PARAM_ERROR_INVALID_VALUE);
@@ -331,7 +270,7 @@ lasso_discovery_add_remove_entry(LassoDiscovery *discovery,
/* add RemoveEntry */
modify->RemoveEntry = g_list_append(modify->RemoveEntry,
- lasso_disco_remove_entry_new(entryID));
+ lasso_disco_remove_entry_new(entryID));
return 0;
}
@@ -351,21 +290,23 @@ lasso_discovery_add_remove_entry(LassoDiscovery *discovery,
LassoDiscoRequestedServiceType*
lasso_discovery_add_requested_service_type(LassoDiscovery *discovery,
const gchar *service_type,
- const gchar *option)
+ const gchar *option)
{
- LassoDiscoQuery *query;
- LassoDiscoRequestedServiceType *rst;
+ LassoWsfProfile *profile = NULL;
+ LassoDiscoQuery *query = NULL;
+ LassoDiscoRequestedServiceType *rst = NULL;
LassoDiscoOptions *opts = NULL;
g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), NULL);
g_return_val_if_fail(service_type != NULL, NULL);
- /* option is optional */
+ /* "option" parameter is optional */
+
+ profile = LASSO_WSF_PROFILE(discovery);
- query = LASSO_DISCO_QUERY(LASSO_WSF_PROFILE(discovery)->request);
- if (query == NULL) {
- /* missing request */
+ if (! LASSO_IS_DISCO_QUERY(profile->request)) {
return NULL;
}
+ query = LASSO_DISCO_QUERY(profile->request);
rst = lasso_disco_requested_service_type_new(service_type);
@@ -382,39 +323,29 @@ lasso_discovery_add_requested_service_type(LassoDiscovery *discovery,
return rst;
}
-/**
- * lasso_discovery_destroy:
- * @discovery: a LassoDiscovery
- *
- * Destroys LassoDiscovery objects created with lasso_discovery_new() or
- * lasso_discovery_new_from_dump().
- **/
-void
-lasso_discovery_destroy(LassoDiscovery *discovery)
-{
- lasso_node_destroy(LASSO_NODE(discovery));
-}
-
gint
lasso_discovery_init_modify(LassoDiscovery *discovery,
LassoDiscoResourceOffering *resourceOffering,
LassoDiscoDescription *description)
{
- LassoSoapEnvelope *envelope;
- LassoDiscoModify *modify;
+ LassoWsfProfile *profile = NULL;
+ LassoSoapEnvelope *envelope = NULL;
+ LassoDiscoModify *modify = NULL;
g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
g_return_val_if_fail(LASSO_IS_DISCO_RESOURCE_OFFERING(resourceOffering),
LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
g_return_val_if_fail(LASSO_IS_DISCO_DESCRIPTION(description),
LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
-
+
+ profile = LASSO_WSF_PROFILE(discovery);
+
modify = lasso_disco_modify_new();
- LASSO_WSF_PROFILE(discovery)->request = LASSO_NODE(modify);
+ profile->request = LASSO_NODE(modify);
envelope = lasso_wsf_profile_build_soap_envelope(NULL, NULL);
- LASSO_WSF_PROFILE(discovery)->soap_envelope_request = envelope;
envelope->Body->any = g_list_append(envelope->Body->any, modify);
+ profile->soap_envelope_request = envelope;
return lasso_discovery_init_request(discovery, resourceOffering, description);
}
@@ -422,50 +353,60 @@ lasso_discovery_init_modify(LassoDiscovery *discovery,
static LassoDiscoResourceOffering*
lasso_discovery_get_resource_offering_auto(LassoDiscovery *discovery, const gchar *service_type)
{
- LassoSession *session;
- GList *assertions, *iter, *iter2, *iter3, *iter4;
+ LassoWsfProfile *profile = LASSO_WSF_PROFILE(discovery);
LassoDiscoResourceOffering *resource_offering = NULL;
+ LassoSession *session = NULL;
+ GList *assertions = NULL;
+ LassoSamlAssertion *assertion = NULL;
+ LassoSamlAttribute *attribute = NULL;
+ LassoSamlAttributeValue *attribute_value = NULL;
+ LassoDiscoResourceOffering *offering = NULL;
+ GList *iter = NULL;
+ GList *iter2 = NULL;
+ GList *iter3 = NULL;
+ GList *iter4 = NULL;
- if (LASSO_WSF_PROFILE(discovery)->session == NULL) {
+ if (profile->session == NULL) {
return NULL;
}
- session = LASSO_WSF_PROFILE(discovery)->session;
+ session = profile->session;
assertions = lasso_session_get_assertions(session, NULL);
- iter = assertions;
- while (iter) {
- LassoSamlAssertion *assertion = iter->data;
- iter = g_list_next(iter);
- if (assertion->AttributeStatement == NULL)
+ for (iter = assertions; iter != NULL; iter = g_list_next(iter)) {
+ if (! LASSO_IS_SAML_ASSERTION(iter->data)) {
continue;
- iter2 = assertion->AttributeStatement->Attribute;
- while (iter2) {
- LassoSamlAttribute *attribute = iter2->data;
- iter2 = g_list_next(iter2);
- if (! LASSO_IS_SAML_ATTRIBUTE(attribute)) {
+ }
+ assertion = LASSO_SAML_ASSERTION(iter->data);
+ if (assertion->AttributeStatement == NULL) {
+ continue;
+ }
+ for (iter2 = assertion->AttributeStatement->Attribute; iter2 != NULL;
+ iter2 = g_list_next(iter2)) {
+ if (! LASSO_IS_SAML_ATTRIBUTE(iter2->data)) {
continue;
}
+ attribute = LASSO_SAML_ATTRIBUTE(iter2->data);
if (strcmp(attribute->attributeName, "DiscoveryResourceOffering") != 0) {
continue;
}
- iter3 = attribute->AttributeValue;
- while (iter3) {
- LassoSamlAttributeValue *attribute_value = iter3->data;
- iter3 = g_list_next(iter3);
- if (! LASSO_IS_SAML_ATTRIBUTE_VALUE(attribute_value)) {
+ for (iter3 = attribute->AttributeValue; iter3 != NULL;
+ iter3 = g_list_next(iter3)) {
+ if (! LASSO_IS_SAML_ATTRIBUTE_VALUE(iter3->data)) {
continue;
}
- iter4 = attribute_value->any;
- while (iter4) {
- LassoDiscoResourceOffering *v = iter4->data;
- iter4 = g_list_next(iter4);
- if (! LASSO_IS_DISCO_RESOURCE_OFFERING(v))
+ attribute_value = LASSO_SAML_ATTRIBUTE_VALUE(iter3->data);
+ for (iter4 = attribute_value->any; iter4 != NULL;
+ iter4 = g_list_next(iter4)) {
+ if (! LASSO_IS_DISCO_RESOURCE_OFFERING(iter4->data)) {
continue;
- if (v->ServiceInstance == NULL)
+ }
+ offering = LASSO_DISCO_RESOURCE_OFFERING(iter4->data);
+ if (offering->ServiceInstance == NULL) {
continue;
- if (strcmp(v->ServiceInstance->ServiceType,
+ }
+ if (strcmp(offering->ServiceInstance->ServiceType,
service_type) == 0) {
- resource_offering = v;
+ resource_offering = offering;
goto end;
}
}
@@ -493,26 +434,17 @@ end:
**/
LassoDiscoDescription*
lasso_discovery_get_description_auto(LassoDiscoResourceOffering *offering,
- const gchar *security_mech)
+ const gchar *security_mech_id)
{
- GList *iter, *iter2;
- LassoDiscoDescription *description;
+ g_return_val_if_fail(LASSO_IS_DISCO_RESOURCE_OFFERING(offering), NULL);
+ g_return_val_if_fail(security_mech_id != NULL, NULL);
- iter = offering->ServiceInstance->Description;
- while (iter) {
- description = iter->data;
- iter = g_list_next(iter);
- iter2 = description->SecurityMechID;
- while (iter2) {
- if (strcmp((char*)iter2->data, security_mech) == 0) {
- return description;
- }
- iter2 = g_list_next(iter2);
- }
+ if (offering->ServiceInstance == NULL) {
+ return NULL;
}
- return NULL;
-}
+ return lasso_wsf_profile_get_description_auto(offering->ServiceInstance, security_mech_id);
+}
/**
* lasso_discovery_init_insert
@@ -525,42 +457,49 @@ lasso_discovery_get_description_auto(LassoDiscoResourceOffering *offering,
* Return value: 0 on success; or a negative value otherwise.
**/
gint
-lasso_discovery_init_insert(LassoDiscovery *discovery,
- LassoDiscoResourceOffering *new_offering, const char *security_mech_id)
+lasso_discovery_init_insert(LassoDiscovery *discovery, LassoDiscoResourceOffering *new_offering,
+ const char *security_mech_id)
{
- LassoDiscoModify *modify;
- LassoDiscoResourceOffering *offering;
+ LassoWsfProfile *profile = NULL;
+ LassoDiscoModify *modify = NULL;
+ LassoDiscoResourceOffering *offering = NULL;
LassoDiscoDescription *description = NULL;
+ g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
+ g_return_val_if_fail(LASSO_IS_DISCO_RESOURCE_OFFERING(new_offering),
+ LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
+
+ profile = LASSO_WSF_PROFILE(discovery);
+
modify = lasso_disco_modify_new();
- lasso_wsf_profile_init_soap_request(LASSO_WSF_PROFILE(discovery), LASSO_NODE(modify));
+ lasso_wsf_profile_init_soap_request(profile, LASSO_NODE(modify));
/* get discovery service resource id from principal assertion */
offering = lasso_discovery_get_resource_offering_auto(discovery, LASSO_DISCO_HREF);
- if (offering == NULL) {
+ if (! LASSO_IS_DISCO_RESOURCE_OFFERING(offering)) {
return LASSO_PROFILE_ERROR_MISSING_RESOURCE_OFFERING;
}
if (security_mech_id) {
description = lasso_discovery_get_description_auto(offering, security_mech_id);
- } else {
+ } else if (offering->ServiceInstance && offering->ServiceInstance->Description) {
description = LASSO_DISCO_DESCRIPTION(offering->ServiceInstance->Description->data);
}
- if (!description) {
+ if (! LASSO_IS_DISCO_DESCRIPTION(description)) {
return LASSO_PROFILE_ERROR_MISSING_SERVICE_DESCRIPTION;
}
- lasso_wsf_profile_set_description(LASSO_WSF_PROFILE(discovery), description);
+ lasso_wsf_profile_set_description(profile, description);
- /* XXX: EncryptedResourceID support */
+ /* TODO: EncryptedResourceID support */
modify->ResourceID = g_object_ref(offering->ResourceID);
lasso_node_destroy(LASSO_NODE(offering));
modify->InsertEntry = g_list_append(modify->InsertEntry,
lasso_disco_insert_entry_new(new_offering));
- LASSO_WSF_PROFILE(discovery)->request = LASSO_NODE(modify);
+ profile->request = LASSO_NODE(modify);
if (description->Endpoint != NULL) {
- LASSO_WSF_PROFILE(discovery)->msg_url = g_strdup(description->Endpoint);
- } /* XXX: else, description->WsdlURLI, get endpoint automatically */
+ profile->msg_url = g_strdup(description->Endpoint);
+ } /* TODO: else, description->WsdlURI, get endpoint automatically */
return 0;
}
@@ -578,32 +517,41 @@ lasso_discovery_init_insert(LassoDiscovery *discovery,
gint
lasso_discovery_init_remove(LassoDiscovery *discovery, const char *entry_id)
{
- LassoDiscoModify *modify;
- LassoDiscoResourceOffering *offering;
- LassoDiscoDescription *description;
+ LassoWsfProfile *profile = NULL;
+ LassoDiscoModify *modify = NULL;
+ LassoDiscoResourceOffering *offering = NULL;
+ LassoDiscoDescription *description = NULL;
+
+ g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
+
+ profile = LASSO_WSF_PROFILE(discovery);
modify = lasso_disco_modify_new();
- lasso_wsf_profile_init_soap_request(LASSO_WSF_PROFILE(discovery), LASSO_NODE(modify));
+ lasso_wsf_profile_init_soap_request(profile, LASSO_NODE(modify));
/* get discovery service resource id from principal assertion */
offering = lasso_discovery_get_resource_offering_auto(discovery, LASSO_DISCO_HREF);
- if (offering == NULL) {
+ if (! LASSO_IS_DISCO_RESOURCE_OFFERING(offering)) {
return LASSO_PROFILE_ERROR_MISSING_RESOURCE_OFFERING;
}
- description = lasso_discovery_get_description_auto(offering,
- LASSO_SECURITY_MECH_NULL);
-
- /* XXX: EncryptedResourceID support */
+
+ description = lasso_discovery_get_description_auto(offering, LASSO_SECURITY_MECH_NULL);
+ if (! LASSO_IS_DISCO_DESCRIPTION(description)) {
+ return LASSO_PROFILE_ERROR_MISSING_SERVICE_DESCRIPTION;
+ }
+
+ /* TODO: EncryptedResourceID support */
modify->ResourceID = g_object_ref(offering->ResourceID);
lasso_node_destroy(LASSO_NODE(offering));
modify->RemoveEntry = g_list_append(modify->RemoveEntry,
lasso_disco_remove_entry_new(entry_id));
- LASSO_WSF_PROFILE(discovery)->request = LASSO_NODE(modify);
+
+ profile->request = LASSO_NODE(modify);
if (description->Endpoint != NULL) {
- LASSO_WSF_PROFILE(discovery)->msg_url = g_strdup(description->Endpoint);
- } /* XXX: else, description->WsdlURLK, get endpoint automatically */
+ profile->msg_url = g_strdup(description->Endpoint);
+ } /* TODO: else, description->WsdlURI, get endpoint automatically */
return 0;
}
@@ -619,37 +567,44 @@ lasso_discovery_init_remove(LassoDiscovery *discovery, const char *entry_id)
gint
lasso_discovery_init_query(LassoDiscovery *discovery, const gchar *security_mech_id)
{
- LassoDiscoQuery *query;
- LassoDiscoResourceOffering *offering;
- LassoDiscoDescription *description;
+ LassoWsfProfile *profile = NULL;
+ LassoDiscoQuery *query = NULL;
+ LassoDiscoResourceOffering *offering = NULL;
+ LassoDiscoDescription *description = NULL;
+
+ g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
+
+ profile = LASSO_WSF_PROFILE(discovery);
query = lasso_disco_query_new();
- lasso_wsf_profile_init_soap_request(LASSO_WSF_PROFILE(discovery), LASSO_NODE(query));
+ lasso_wsf_profile_init_soap_request(profile, LASSO_NODE(query));
/* get discovery service resource id from principal assertion */
offering = lasso_discovery_get_resource_offering_auto(discovery, LASSO_DISCO_HREF);
- if (offering == NULL)
+ if (! LASSO_IS_DISCO_RESOURCE_OFFERING(offering)) {
return LASSO_PROFILE_ERROR_MISSING_RESOURCE_OFFERING;
+ }
if (security_mech_id == NULL) {
description = LASSO_DISCO_DESCRIPTION(offering->ServiceInstance->Description->data);
} else {
description = lasso_discovery_get_description_auto(offering, security_mech_id);
}
- if (description == NULL)
+ if (! LASSO_IS_DISCO_DESCRIPTION(description)) {
return LASSO_PROFILE_ERROR_MISSING_SERVICE_DESCRIPTION;
+ }
- lasso_wsf_profile_set_description(LASSO_WSF_PROFILE(discovery), description);
+ lasso_wsf_profile_set_description(profile, description);
- /* XXX: EncryptedResourceID support */
+ /* TODO: EncryptedResourceID support */
query->ResourceID = g_object_ref(offering->ResourceID);
lasso_node_destroy(LASSO_NODE(offering));
- LASSO_WSF_PROFILE(discovery)->request = LASSO_NODE(query);
+ profile->request = LASSO_NODE(query);
if (description->Endpoint != NULL) {
- LASSO_WSF_PROFILE(discovery)->msg_url = g_strdup(description->Endpoint);
- } /* XXX: else, description->WsdlURLK, get endpoint automatically */
+ profile->msg_url = g_strdup(description->Endpoint);
+ } /* TODO: else, description->WsdlURI, get endpoint automatically */
return 0;
}
@@ -669,23 +624,28 @@ gint
lasso_discovery_process_modify_msg(LassoDiscovery *discovery, const gchar *message,
const gchar *security_mech_id)
{
- LassoDiscoModify *request;
- int res = 0;
+ LassoWsfProfile *profile = NULL;
+ LassoDiscoModify *request = NULL;
+ int res;
g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
g_return_val_if_fail(message != NULL, LASSO_PARAM_ERROR_INVALID_VALUE);
- res = lasso_wsf_profile_process_soap_request_msg(LASSO_WSF_PROFILE(discovery), message,
+ profile = LASSO_WSF_PROFILE(discovery);
+
+ res = lasso_wsf_profile_process_soap_request_msg(profile, message,
LASSO_DISCO_HREF, security_mech_id);
- if (res != 0)
+ if (res != 0) {
return res;
+ }
- request = LASSO_DISCO_MODIFY(LASSO_WSF_PROFILE(discovery)->request);
+ request = LASSO_DISCO_MODIFY(profile->request);
- if (request->ResourceID)
+ if (request->ResourceID) {
discovery->resource_id = g_object_ref(request->ResourceID);
- if (request->EncryptedResourceID)
+ } else if (request->EncryptedResourceID) {
discovery->encrypted_resource_id = g_object_ref(request->EncryptedResourceID);
+ }
return 0;
}
@@ -706,83 +666,108 @@ lasso_discovery_process_modify_msg(LassoDiscovery *discovery, const gchar *messa
gint
lasso_discovery_build_modify_response_msg(LassoDiscovery *discovery)
{
- LassoDiscoModify *request = LASSO_DISCO_MODIFY(LASSO_WSF_PROFILE(discovery)->request);
- LassoDiscoModifyResponse *response;
- LassoSoapEnvelope *envelope;
- LassoUtilityStatus *status;
- GList *iter;
+ /* FIXME: Check all error cases, set the right status code,
+ and don't return without building a response */
+
+ LassoWsfProfile *profile = NULL;
+ LassoDiscoModify *request = NULL;
+ LassoDiscoModifyResponse *response = NULL;
+ LassoSoapEnvelope *envelope = NULL;
+ LassoUtilityStatus *status = NULL;
+ LassoDiscoRemoveEntry *remove_entry = NULL;
+ LassoDiscoInsertEntry *insert_entry = NULL;
gboolean failure = FALSE;
- char *new_entry_ids = NULL, *t_new_entry_ids = NULL;
+ char *new_entry_ids = NULL;
+ char *t_new_entry_ids = NULL;
+ GList *iter = NULL;
+ int res = 0;
+ int res2 = 0;
+
+ g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
+
+ profile = LASSO_WSF_PROFILE(discovery);
+ request = LASSO_DISCO_MODIFY(profile->request);
- if (lasso_wsf_profile_get_fault(LASSO_WSF_PROFILE(discovery))) {
- return lasso_wsf_profile_build_soap_response_msg(LASSO_WSF_PROFILE(discovery));
+ if (lasso_wsf_profile_get_fault(profile)) {
+ return lasso_wsf_profile_build_soap_response_msg(profile);
}
- if (LASSO_WSF_PROFILE(discovery)->identity == NULL) {
+ if (profile->identity == NULL) {
return LASSO_PROFILE_ERROR_IDENTITY_NOT_FOUND;
}
/* build response */
- status = lasso_utility_status_new(LASSO_DISCO_STATUS_CODE_FAILED);
+ status = lasso_utility_status_new(LASSO_DISCO_STATUS_CODE_OK);
response = lasso_disco_modify_response_new(status);
- LASSO_WSF_PROFILE(discovery)->response = LASSO_NODE(response);
- envelope = LASSO_WSF_PROFILE(discovery)->soap_envelope_response;
+ profile->response = LASSO_NODE(response);
+ envelope = profile->soap_envelope_response;
envelope->Body->any = g_list_append(envelope->Body->any, response);
/* First verify remove entries are all ok */
- iter = request->RemoveEntry;
- while (iter) {
- LassoDiscoRemoveEntry *entry = iter->data;
- iter = g_list_next(iter);
+ for (iter = request->RemoveEntry; iter != NULL; iter = g_list_next(iter)) {
+ if (! LASSO_IS_DISCO_REMOVE_ENTRY(iter->data)) {
+ continue;
+ }
+ remove_entry = LASSO_DISCO_REMOVE_ENTRY(iter->data);
- if (lasso_identity_get_resource_offering(
- LASSO_WSF_PROFILE(discovery)->identity,
- entry->entryID) == NULL) {
- return LASSO_PROFILE_ERROR_MISSING_RESOURCE_OFFERING;
+ if (! lasso_identity_get_resource_offering(profile->identity,
+ remove_entry->entryID)) {
+ res = LASSO_PROFILE_ERROR_MISSING_RESOURCE_OFFERING;
+ break;
+ }
+ }
+
+ /* Then remove the entries */
+ if (res == 0) {
+ for (iter = request->RemoveEntry; iter != NULL; iter = g_list_next(iter)) {
+ remove_entry = LASSO_DISCO_REMOVE_ENTRY(iter->data);
+ if (! lasso_identity_remove_resource_offering(profile->identity,
+ remove_entry->entryID)) {
+ /* Set the right error code */
+ res = -1;
+ break;
+ }
}
}
if (request->InsertEntry) {
- new_entry_ids = g_malloc(10*g_list_length(request->InsertEntry));
+ new_entry_ids = g_malloc(10 * g_list_length(request->InsertEntry));
t_new_entry_ids = new_entry_ids;
}
- iter = request->InsertEntry;
- while (iter) {
- LassoDiscoInsertEntry *entry = iter->data;
- iter = g_list_next(iter);
+ for (iter = request->InsertEntry; iter != NULL; iter = g_list_next(iter)) {
+ if (! LASSO_IS_DISCO_INSERT_ENTRY(iter->data)) {
+ continue;
+ }
+ insert_entry = LASSO_DISCO_INSERT_ENTRY(iter->data);
- lasso_identity_add_resource_offering(LASSO_WSF_PROFILE(discovery)->identity,
- entry->ResourceOffering);
+ lasso_identity_add_resource_offering(profile->identity,
+ insert_entry->ResourceOffering);
- t_new_entry_ids = g_stpcpy(t_new_entry_ids, entry->ResourceOffering->entryID);
+ t_new_entry_ids = g_stpcpy(t_new_entry_ids,
+ insert_entry->ResourceOffering->entryID);
t_new_entry_ids = g_stpcpy(t_new_entry_ids, " ");
}
if (t_new_entry_ids) {
t_new_entry_ids[-1] = 0; /* remove trailing white space */
}
- iter = request->RemoveEntry;
- while (iter) {
- LassoDiscoRemoveEntry *entry = iter->data;
- iter = g_list_next(iter);
-
- if (lasso_identity_remove_resource_offering(
- LASSO_WSF_PROFILE(discovery)->identity,
- entry->entryID) == FALSE) {
- failure = TRUE;
- }
- }
-
if (new_entry_ids) {
response->newEntryIDs = g_strdup(new_entry_ids);
g_free(new_entry_ids);
}
- g_free(status->code);
- status->code = g_strdup(LASSO_DISCO_STATUS_CODE_OK);
+ if (res != 0) {
+ g_free(status->code);
+ status->code = g_strdup(LASSO_DISCO_STATUS_CODE_FAILED);
+ }
- return lasso_wsf_profile_build_soap_response_msg(LASSO_WSF_PROFILE(discovery));
+ res2 = lasso_wsf_profile_build_soap_response_msg(profile);
+ if (res != 0) {
+ return res;
+ } else {
+ return res2;
+ }
}
/**
@@ -797,15 +782,22 @@ lasso_discovery_build_modify_response_msg(LassoDiscovery *discovery)
gint
lasso_discovery_process_modify_response_msg(LassoDiscovery *discovery, const gchar *message)
{
+ LassoWsfProfile *profile = NULL;
+ LassoDiscoModifyResponse *response = NULL;
int rc;
- LassoDiscoModifyResponse *response;
-
- rc = lasso_wsf_profile_process_soap_response_msg(LASSO_WSF_PROFILE(discovery), message);
+
+ g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
+ g_return_val_if_fail(message != NULL, LASSO_PARAM_ERROR_INVALID_VALUE);
+
+ profile = LASSO_WSF_PROFILE(discovery);
+
+ rc = lasso_wsf_profile_process_soap_response_msg(profile, message);
if (rc) {
return rc;
}
- response = LASSO_DISCO_MODIFY_RESPONSE(LASSO_WSF_PROFILE(discovery)->response);
+ response = LASSO_DISCO_MODIFY_RESPONSE(profile->response);
+
if (strcmp(response->Status->code, LASSO_DISCO_STATUS_CODE_OK) != 0) {
return LASSO_PROFILE_ERROR_STATUS_NOT_SUCCESS;
}
@@ -827,18 +819,21 @@ gint
lasso_discovery_process_query_msg(LassoDiscovery *discovery, const gchar *message,
const char *security_mech_id)
{
- LassoDiscoQuery *request;
- LassoSoapEnvelope *envelope;
+ LassoWsfProfile *profile = NULL;
+ LassoDiscoQuery *request = NULL;
+ LassoSoapEnvelope *envelope = NULL;
g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
g_return_val_if_fail(message != NULL, LASSO_PARAM_ERROR_INVALID_VALUE);
- lasso_wsf_profile_process_soap_request_msg(LASSO_WSF_PROFILE(discovery),
- message, LASSO_DISCO_HREF, security_mech_id);
+ profile = LASSO_WSF_PROFILE(discovery);
+
+ lasso_wsf_profile_process_soap_request_msg(profile, message, LASSO_DISCO_HREF,
+ security_mech_id);
+
+ envelope = profile->soap_envelope_response;
+ request = LASSO_DISCO_QUERY(profile->request);
- envelope = LASSO_WSF_PROFILE(discovery)->soap_envelope_response;
- request = LASSO_DISCO_QUERY(LASSO_WSF_PROFILE(discovery)->request);
-
if (request->ResourceID) {
discovery->resource_id = g_object_ref(request->ResourceID);
} else if (request->EncryptedResourceID) {
@@ -866,21 +861,27 @@ lasso_discovery_process_query_msg(LassoDiscovery *discovery, const gchar *messag
gint
lasso_discovery_build_response_msg(LassoDiscovery *discovery)
{
- LassoDiscoQuery *request = LASSO_DISCO_QUERY(LASSO_WSF_PROFILE(discovery)->request);
- LassoDiscoQueryResponse *response;
- LassoSoapEnvelope *envelope;
-
+ LassoWsfProfile *profile = NULL;
+ LassoDiscoQuery *request = NULL;
+ LassoDiscoQueryResponse *response = NULL;
+ LassoSoapEnvelope *envelope = NULL;
GList *offerings = NULL;
- GList *iter, *iter2, *iter3;
- int res = 0;
-
gchar *credentialRef;
+ GList *iter = NULL;
+ GList *iter2 = NULL;
+ GList *iter3 = NULL;
+ int res = 0;
+
+ g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
+
+ profile = LASSO_WSF_PROFILE(discovery);
+ request = LASSO_DISCO_QUERY(profile->request);
- if (lasso_wsf_profile_get_fault(LASSO_WSF_PROFILE(discovery))) {
- return lasso_wsf_profile_build_soap_response_msg(LASSO_WSF_PROFILE(discovery));
+ if (lasso_wsf_profile_get_fault(profile)) {
+ return lasso_wsf_profile_build_soap_response_msg(profile);
}
- if (LASSO_WSF_PROFILE(discovery)->identity == NULL) {
+ if (profile->identity == NULL) {
return LASSO_PROFILE_ERROR_IDENTITY_NOT_FOUND;
}
@@ -889,7 +890,7 @@ lasso_discovery_build_response_msg(LassoDiscovery *discovery)
LassoDiscoRequestedServiceType *service_type = iter->data;
iter = g_list_next(iter);
offerings = g_list_concat(offerings, lasso_identity_get_offerings(
- LASSO_WSF_PROFILE(discovery)->identity,
+ profile->identity,
service_type->ServiceType));
}
@@ -897,8 +898,8 @@ lasso_discovery_build_response_msg(LassoDiscovery *discovery)
response = lasso_disco_query_response_new(
lasso_utility_status_new(LASSO_DST_STATUS_CODE_OK));
response->ResourceOffering = offerings;
- LASSO_WSF_PROFILE(discovery)->response = LASSO_NODE(response);
- envelope = LASSO_WSF_PROFILE(discovery)->soap_envelope_response;
+ profile->response = LASSO_NODE(response);
+ envelope = profile->soap_envelope_response;
envelope->Body->any = g_list_append(envelope->Body->any, response);
/* Add needed credentials for offerings */
@@ -924,7 +925,7 @@ lasso_discovery_build_response_msg(LassoDiscovery *discovery)
}
}
- res = lasso_wsf_profile_build_soap_response_msg(LASSO_WSF_PROFILE(discovery));
+ res = lasso_wsf_profile_build_soap_response_msg(profile);
return res;
}
@@ -941,15 +942,22 @@ lasso_discovery_build_response_msg(LassoDiscovery *discovery)
gint
lasso_discovery_process_query_response_msg(LassoDiscovery *discovery, const gchar *message)
{
- int rc;
+ LassoWsfProfile *profile = NULL;
LassoDiscoQueryResponse *response;
+ int rc;
+
+ g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
+ g_return_val_if_fail(message != NULL, LASSO_PARAM_ERROR_INVALID_VALUE);
- rc = lasso_wsf_profile_process_soap_response_msg(LASSO_WSF_PROFILE(discovery), message);
+ profile = LASSO_WSF_PROFILE(discovery);
+
+ rc = lasso_wsf_profile_process_soap_response_msg(profile, message);
if (rc) {
return rc;
}
- response = LASSO_DISCO_QUERY_RESPONSE(LASSO_WSF_PROFILE(discovery)->response);
+ response = LASSO_DISCO_QUERY_RESPONSE(profile->response);
+
if (strcmp(response->Status->code, LASSO_DISCO_STATUS_CODE_OK) != 0) {
return LASSO_PROFILE_ERROR_STATUS_NOT_SUCCESS;
}
@@ -974,12 +982,17 @@ lasso_discovery_process_query_response_msg(LassoDiscovery *discovery, const gcha
LassoDataService*
lasso_discovery_get_service(LassoDiscovery *discovery, const char *service_type)
{
+ LassoWsfProfile *profile = NULL;
LassoDiscoQueryResponse *response;
GList *iter;
LassoDiscoResourceOffering *offering = NULL;
LassoDataService *service;
- response = LASSO_DISCO_QUERY_RESPONSE(LASSO_WSF_PROFILE(discovery)->response);
+ g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), NULL);
+
+ profile = LASSO_WSF_PROFILE(discovery);
+
+ response = LASSO_DISCO_QUERY_RESPONSE(profile->response);
if (response == NULL) {
/* no response; probably called at wrong time */
return NULL;
@@ -1009,13 +1022,13 @@ lasso_discovery_get_service(LassoDiscovery *discovery, const char *service_type)
if (strcmp(offering->ServiceInstance->ServiceType, LASSO_PP_HREF) == 0) {
service = LASSO_DATA_SERVICE(lasso_personal_profile_service_new_full(
- LASSO_WSF_PROFILE(discovery)->server, offering));
+ profile->server, offering));
} else {
- service = lasso_data_service_new_full(LASSO_WSF_PROFILE(discovery)->server,
+ service = lasso_data_service_new_full(profile->server,
offering);
}
- lasso_wsf_profile_move_credentials(LASSO_WSF_PROFILE(discovery),
+ lasso_wsf_profile_move_credentials(profile,
LASSO_WSF_PROFILE(service));
return service;
@@ -1034,13 +1047,18 @@ lasso_discovery_get_service(LassoDiscovery *discovery, const char *service_type)
GList*
lasso_discovery_get_services(LassoDiscovery *discovery)
{
+ LassoWsfProfile *profile = NULL;
LassoDiscoQueryResponse *response;
GList *iter;
LassoDiscoResourceOffering *offering;
LassoDataService *service;
GList *services;
- response = LASSO_DISCO_QUERY_RESPONSE(LASSO_WSF_PROFILE(discovery)->response);
+ g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), NULL);
+
+ profile = LASSO_WSF_PROFILE(discovery);
+ response = LASSO_DISCO_QUERY_RESPONSE(profile->response);
+
iter = response->ResourceOffering;
if (iter == NULL) {
return NULL; /* resource not found */
@@ -1055,10 +1073,10 @@ lasso_discovery_get_services(LassoDiscovery *discovery)
}
if (strcmp(offering->ServiceInstance->ServiceType, LASSO_PP_HREF) == 0) {
service = LASSO_DATA_SERVICE(lasso_personal_profile_service_new_full(
- LASSO_WSF_PROFILE(discovery)->server, offering));
+ profile->server, offering));
} else {
service = lasso_data_service_new_full(
- LASSO_WSF_PROFILE(discovery)->server, offering);
+ profile->server, offering);
}
services = g_list_append(services, service);
}
@@ -1066,6 +1084,19 @@ lasso_discovery_get_services(LassoDiscovery *discovery)
return services;
}
+/**
+ * lasso_discovery_destroy:
+ * @discovery: a LassoDiscovery
+ *
+ * Destroys LassoDiscovery objects created with lasso_discovery_new() or
+ * lasso_discovery_new_from_dump().
+ **/
+void
+lasso_discovery_destroy(LassoDiscovery *discovery)
+{
+ lasso_node_destroy(LASSO_NODE(discovery));
+}
+
/*****************************************************************************/
/* private methods */
/*****************************************************************************/
diff --git a/lasso/id-wsf/discovery.h b/lasso/id-wsf/discovery.h
index 3f88bb0a..50bcd2cf 100644
--- a/lasso/id-wsf/discovery.h
+++ b/lasso/id-wsf/discovery.h
@@ -119,7 +119,8 @@ LASSO_EXPORT LassoDataService* lasso_discovery_get_service(LassoDiscovery *disco
LASSO_EXPORT GList* lasso_discovery_get_services(LassoDiscovery *discovery);
LASSO_EXPORT LassoDiscoDescription* lasso_discovery_get_description_auto(
- LassoDiscoResourceOffering *offering, const gchar *security_mech);
+ LassoDiscoResourceOffering *offering, const gchar *security_mech_id);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/lasso/id-wsf/wsf_profile.c b/lasso/id-wsf/wsf_profile.c
index caad1571..935a477d 100644
--- a/lasso/id-wsf/wsf_profile.c
+++ b/lasso/id-wsf/wsf_profile.c
@@ -31,6 +31,8 @@
#include <xmlsec/crypto.h>
#include <lasso/id-wsf/wsf_profile.h>
+#include <lasso/id-wsf/wsf_profile_private.h>
+
#include <lasso/xml/disco_modify.h>
#include <lasso/xml/soap_fault.h>
#include <lasso/xml/soap_binding_correlation.h>
@@ -41,12 +43,13 @@
#include <lasso/xml/saml_authentication_statement.h>
#include <lasso/xml/saml_subject_statement_abstract.h>
#include <lasso/xml/saml_subject.h>
+#include <lasso/xml/ds_key_info.h>
+#include <lasso/xml/ds_key_value.h>
+#include <lasso/xml/ds_rsa_key_value.h>
#include <lasso/id-ff/server.h>
#include <lasso/id-ff/providerprivate.h>
-#include <lasso/id-wsf/wsf_profile_private.h>
-
struct _LassoWsfProfilePrivate
{
gboolean dispose_has_run;
@@ -71,8 +74,6 @@ static gint lasso_wsf_profile_add_soap_signature(LassoWsfProfile *profile,
xmlDoc *doc, xmlNode *envelope_node, LassoSignatureMethod sign_method);
static int lasso_wsf_profile_ensure_soap_credentials_signature(
LassoWsfProfile *profile, xmlDoc *doc, xmlNode *soap_envelope);
-static LassoDiscoDescription* lasso_wsf_profile_get_description_auto(
- LassoDiscoServiceInstance *si, const gchar *security_mech_id);
/*****************************************************************************/
/* private methods */
@@ -111,7 +112,7 @@ lasso_wsf_profile_set_public_key(LassoWsfProfile *profile, const char *public_ke
profile->private_data->public_key = g_strdup(public_key);
}
-static LassoDiscoDescription*
+LassoDiscoDescription*
lasso_wsf_profile_get_description_auto(LassoDiscoServiceInstance *si, const gchar *security_mech_id)
{
GList *iter, *iter2;
@@ -125,7 +126,7 @@ lasso_wsf_profile_get_description_auto(LassoDiscoServiceInstance *si, const gcha
description = LASSO_DISCO_DESCRIPTION(iter->data);
iter2 = description->SecurityMechID;
while (iter2) {
- if (strcmp(security_mech_id, iter->data) == 0)
+ if (strcmp(security_mech_id, iter2->data) == 0)
return description;
iter2 = iter2->next;
}
@@ -836,6 +837,76 @@ lasso_wsf_profile_build_soap_envelope(const char *refToMessageId, const char *pr
return envelope;
}
+LassoDsKeyInfo*
+lasso_wsf_profile_get_key_info_node(LassoWsfProfile *profile, const gchar *providerID)
+{
+ LassoDsKeyInfo *key_info = NULL;
+ LassoDsRsaKeyValue *rsa_key_value = NULL;
+ LassoDsKeyValue *key_value = NULL;
+ LassoProvider *provider = NULL;
+ xmlSecKeyInfoCtx *ctx = NULL;
+ xmlSecKey *public_key = NULL;
+ xmlDoc *doc = NULL;
+ xmlNode *key_info_node = NULL;
+ xmlNode *xmlnode = NULL;
+ xmlXPathContext *xpathCtx = NULL;
+ xmlXPathObject *xpathObj = NULL;
+
+ g_return_val_if_fail(providerID != NULL, NULL);
+
+ provider = lasso_server_get_provider(profile->server, providerID);
+ if (provider == NULL) {
+ return NULL;
+ }
+
+ public_key = lasso_provider_get_public_key(provider);
+ if (public_key == NULL) {
+ return NULL;
+ }
+
+ ctx = xmlSecKeyInfoCtxCreate(NULL);
+ xmlSecKeyInfoCtxInitialize(ctx, NULL);
+ ctx->mode = xmlSecKeyInfoModeWrite;
+ ctx->keyReq.keyType = xmlSecKeyDataTypePublic;
+
+ doc = xmlSecCreateTree((xmlChar*)"KeyInfo",
+ (xmlChar*)"http://www.w3.org/2000/09/xmldsig#");
+ key_info_node = xmlDocGetRootElement(doc);
+ xmlSecAddChild(key_info_node, (xmlChar*)"KeyValue",
+ (xmlChar*)"http://www.w3.org/2000/09/xmldsig#");
+
+ xmlSecKeyInfoNodeWrite(key_info_node, public_key, ctx);
+
+ xpathCtx = xmlXPathNewContext(doc);
+ xmlXPathRegisterNs(xpathCtx, (xmlChar*)"ds",
+ (xmlChar*)"http://www.w3.org/2000/09/xmldsig#");
+
+ rsa_key_value = lasso_ds_rsa_key_value_new();
+ xpathObj = xmlXPathEvalExpression((xmlChar*)"//ds:Modulus", xpathCtx);
+ if (xpathObj->nodesetval && xpathObj->nodesetval->nodeNr) {
+ xmlnode = xpathObj->nodesetval->nodeTab[0];
+ rsa_key_value->Modulus = (gchar *) xmlNodeGetContent(xmlnode);
+ }
+ xmlXPathFreeObject(xpathObj);
+
+ xpathObj = xmlXPathEvalExpression((xmlChar*)"//ds:Exponent", xpathCtx);
+ if (xpathObj->nodesetval && xpathObj->nodesetval->nodeNr) {
+ xmlnode = xpathObj->nodesetval->nodeTab[0];
+ rsa_key_value->Exponent = (gchar *) xmlNodeGetContent(xmlnode);
+ }
+ xmlXPathFreeObject(xpathObj);
+
+ key_value = lasso_ds_key_value_new();
+ key_value->RSAKeyValue = rsa_key_value;
+ key_info = lasso_ds_key_info_new();
+ key_info->KeyValue = key_value;
+
+ xmlXPathFreeContext(xpathCtx);
+ xmlFreeDoc(doc);
+
+ return key_info;
+}
+
/*****************************************************************************/
/* public methods */
/*****************************************************************************/
diff --git a/lasso/id-wsf/wsf_profile_private.h b/lasso/id-wsf/wsf_profile_private.h
index 05e76574..f55b7dd0 100644
--- a/lasso/id-wsf/wsf_profile_private.h
+++ b/lasso/id-wsf/wsf_profile_private.h
@@ -40,6 +40,12 @@ LassoSoapFault* lasso_wsf_profile_get_fault(LassoWsfProfile *profile);
void lasso_wsf_profile_set_public_key(LassoWsfProfile *profile, const char *public_key);
+LassoDsKeyInfo* lasso_wsf_profile_get_key_info_node(LassoWsfProfile *profile,
+ const gchar *providerID);
+
+LassoDiscoDescription* lasso_wsf_profile_get_description_auto(LassoDiscoServiceInstance *si,
+ const gchar *security_mech_id);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */