summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bindings/java/wrapper_top.c36
-rw-r--r--bindings/overrides.xml1
-rw-r--r--lasso/id-ff/provider.c1
-rw-r--r--lasso/utils.h7
-rw-r--r--lasso/xml/xml.c33
5 files changed, 45 insertions, 33 deletions
diff --git a/bindings/java/wrapper_top.c b/bindings/java/wrapper_top.c
index e98f149e..5c7d6907 100644
--- a/bindings/java/wrapper_top.c
+++ b/bindings/java/wrapper_top.c
@@ -20,19 +20,19 @@ typedef int (*Converter)(JNIEnv *env, void *from, jobject *to);
typedef int *(*OutConverter)(JNIEnv *env, jobject from, gpointer *to);
/* Static declarations */
-G_GNUC_UNUSED static int gpointer_equal(gpointer p1, gpointer p2);
-G_GNUC_UNUSED static int new_object_with_gobject(JNIEnv *env, GObject *obj, char *clsName, jobject *jobj);
+G_GNUC_UNUSED static int gpointer_equal(const gpointer p1, const gpointer p2);
+G_GNUC_UNUSED static int new_object_with_gobject(JNIEnv *env, GObject *obj, const char *clsName, jobject *jobj);
G_GNUC_UNUSED static int jstring_to_local_string(JNIEnv *env, jstring jstr, const char **str);
G_GNUC_UNUSED static void release_local_string(JNIEnv *env, jstring str, const char *utf_str);
-G_GNUC_UNUSED static int get_jlong_field(JNIEnv *env, jobject obj, char *field, jlong *dest);
-G_GNUC_UNUSED static jclass get_jclass_by_name(JNIEnv *env, char *name);
+G_GNUC_UNUSED static int get_jlong_field(JNIEnv *env, jobject obj, const char *field, jlong *dest);
+G_GNUC_UNUSED static jclass get_jclass_by_name(JNIEnv *env, const char *name);
G_GNUC_UNUSED static int get_array_element(JNIEnv *env, jobjectArray arr, jsize i, jobject *dest);
G_GNUC_UNUSED static int set_array_element(JNIEnv *env, jobjectArray arr, jsize i, jobject value);
G_GNUC_UNUSED static int get_array_size(JNIEnv *env, jobjectArray arr, jsize *dest);
-G_GNUC_UNUSED static int create_object_array(JNIEnv *env, char *clsName, jsize size, jobjectArray *jarr);
+G_GNUC_UNUSED static int create_object_array(JNIEnv *env, const char *clsName, jsize size, jobjectArray *jarr);
G_GNUC_UNUSED static jobject get_shadow_object(JNIEnv *env, GObject *obj);
G_GNUC_UNUSED static void set_shadow_object(JNIEnv *env, GObject *obj, jobject shadow_object);
-G_GNUC_UNUSED static void exception(JNIEnv *env, char *message);
+G_GNUC_UNUSED static void exception(JNIEnv *env, const char *message);
G_GNUC_UNUSED static int string_to_jstring(JNIEnv *env, const char* str, jstring *jstr);
G_GNUC_UNUSED static int string_to_jstring_and_free(JNIEnv *env, char* str, jstring *jstr);
G_GNUC_UNUSED static int jstring_to_string(JNIEnv *env, jstring jstr, char **str);
@@ -45,7 +45,7 @@ G_GNUC_UNUSED static int gobject_to_jobject_and_ref(JNIEnv *env, GObject *obj, j
G_GNUC_UNUSED static int jobject_to_gobject(JNIEnv *env, jobject obj, GObject **gobj);
G_GNUC_UNUSED static int jobject_to_gobject_for_list(JNIEnv *env, jobject obj, GObject **gobj);
G_GNUC_UNUSED static void free_glist(GList **list, GFunc free_function);
-G_GNUC_UNUSED static int get_list(JNIEnv *env, char *clsName, GList *list, Converter convert, jobjectArray *jarr);
+G_GNUC_UNUSED static int get_list(JNIEnv *env, const char *clsName, const GList *list, Converter convert, jobjectArray *jarr);
G_GNUC_UNUSED static int set_list(JNIEnv *env, GList **list, jobjectArray jarr, GFunc free_function, OutConverter convert);
G_GNUC_UNUSED static int remove_from_list(JNIEnv *env,GList **list,jobject obj,GFunc free_function,GCompareFunc compare,OutConverter convert);
G_GNUC_UNUSED static int add_to_list(JNIEnv* env, GList** list, jobject obj, OutConverter convert);
@@ -81,11 +81,12 @@ G_GNUC_UNUSED static void throw_by_name(JNIEnv *env, const char *name, const cha
static int
-gpointer_equal(gpointer p1, gpointer p2) {
+gpointer_equal(const gpointer p1, const gpointer p2) {
return p1 != p2;
}
+
static int
-new_object_with_gobject(JNIEnv *env, GObject *obj, char *clsName, jobject *jobj) {
+new_object_with_gobject(JNIEnv *env, GObject *obj, const char *clsName, jobject *jobj) {
jclass cls;
jmethodID mid;
@@ -96,6 +97,7 @@ new_object_with_gobject(JNIEnv *env, GObject *obj, char *clsName, jobject *jobj)
g_return_val_if_fail((*jobj = (*env)->NewObject(env, cls, mid, PTR_TO_JLONG(obj))), 0);
return 1;
}
+
/** Convert a java string to a jstring */
static int
jstring_to_local_string(JNIEnv *env, jstring jstr, const char **str)
@@ -110,6 +112,7 @@ jstring_to_local_string(JNIEnv *env, jstring jstr, const char **str)
}
return 1;
}
+
/** Release a local string. IT'S MANDATORY TO CALL THIS !!! */
static void
release_local_string(JNIEnv *env, jstring str, const char *utf_str) {
@@ -119,8 +122,9 @@ release_local_string(JNIEnv *env, jstring str, const char *utf_str) {
(*env)->ReleaseStringUTFChars(env, str, utf_str);
}
}
+
static int
-get_jlong_field(JNIEnv *env, jobject obj, char *field, jlong *dest)
+get_jlong_field(JNIEnv *env, jobject obj, const char *field, jlong *dest)
{
jclass cls;
jfieldID fid;
@@ -136,15 +140,17 @@ get_jlong_field(JNIEnv *env, jobject obj, char *field, jlong *dest)
}
static jclass
-get_jclass_by_name(JNIEnv *env, char *name) {
+get_jclass_by_name(JNIEnv *env, const char *name) {
return (*env)->FindClass(env,name);
}
+
static int
get_array_element(JNIEnv *env, jobjectArray arr, jsize i, jobject *dest) {
*dest = (*env)->GetObjectArrayElement(env, arr, i);
g_return_val_if_fail(! (*env)->ExceptionCheck(env), 0);
return 1;
}
+
static int
set_array_element(JNIEnv *env, jobjectArray arr, jsize i, jobject value) {
(*env)->SetObjectArrayElement(env, arr, i, value);
@@ -158,7 +164,7 @@ get_array_size(JNIEnv *env, jobjectArray jarr, jsize *dest) {
return 1;
}
static int
-create_object_array(JNIEnv *env, char *clsName, jsize size, jobjectArray *jarr) {
+create_object_array(JNIEnv *env, const char *clsName, jsize size, jobjectArray *jarr) {
jclass cls;
g_error_if_fail(env && clsName && jarr);
@@ -219,7 +225,7 @@ set_shadow_object(JNIEnv *env, GObject *obj, jobject shadow_object) {
}
/** Throw a new RuntimeException containing this message. */
static void
-exception(JNIEnv *env, char *message) {
+exception(JNIEnv *env, const char *message) {
jclass cls = (*env)->FindClass(env, "java/lang/RuntimeException");
if (cls != NULL) {
throw_by_name(env, "java/lang/RuntimeException", message);
@@ -462,12 +468,12 @@ free_glist(GList **list, GFunc free_function) {
* Can throw. If list is null or empty, return NULL.
*/
static int
-get_list(JNIEnv *env, char *clsName, GList *list, Converter convert, jobjectArray *jarr) {
+get_list(JNIEnv *env, const char *clsName, const GList *list, Converter convert, jobjectArray *jarr) {
jsize l,i;
jclass cls;
g_error_if_fail (env && clsName && convert);
- l = g_list_length(list);
+ l = g_list_length((GList*)list);
if (!l) {
*jarr = NULL;
goto out;
diff --git a/bindings/overrides.xml b/bindings/overrides.xml
index cc2d0ab2..061541be 100644
--- a/bindings/overrides.xml
+++ b/bindings/overrides.xml
@@ -198,6 +198,7 @@
<!-- IdWsf -->
<arg name="abstract" rename="abstract_" language="java"/>
<func name="lasso_personal_profile_service_new_full" rename="lasso_personal_profile_server_new_personal_profile_service_full"/>
+ <func name="lasso_wsf_profile_new_full" rename="lasso_wsf_profile_wsf_profile_new_full"/>
<func name="lasso_authentication_init_request" skip="true"/>
<!-- LassoIdWsf2Discovery -->
<func name="lasso_idwsf2_discovery_metadata_register_self">>
diff --git a/lasso/id-ff/provider.c b/lasso/id-ff/provider.c
index 49301f0b..c67d9ccd 100644
--- a/lasso/id-ff/provider.c
+++ b/lasso/id-ff/provider.c
@@ -622,6 +622,7 @@ instance_init(LassoProvider *provider)
provider->private_data->encryption_public_key_str = NULL;
provider->private_data->encryption_public_key = NULL;
provider->private_data->encryption_mode = LASSO_ENCRYPTION_MODE_NONE;
+ provider->private_data->encryption_sym_key_type = LASSO_ENCRYPTION_SYM_KEY_TYPE_AES_128;
/* no value_destroy_func since it shouldn't destroy the GList on insert */
provider->private_data->IDPDescriptor = g_hash_table_new_full(
diff --git a/lasso/utils.h b/lasso/utils.h
index 49eea267..213cd5c5 100644
--- a/lasso/utils.h
+++ b/lasso/utils.h
@@ -55,6 +55,13 @@
dest = (void*)(src); \
}
+#define lasso_assign_node(dest,src) \
+ { \
+ if (dest) \
+ xmlFreeNodeList(dest); \
+ dest = xmlCopyNode(src, 1); \
+ }
+
#define lasso_list_add_gobject(dest, src) \
{ \
dest = g_list_append(dest, g_object_ref(src)); \
diff --git a/lasso/xml/xml.c b/lasso/xml/xml.c
index 19339e39..06c8bccd 100644
--- a/lasso/xml/xml.c
+++ b/lasso/xml/xml.c
@@ -570,22 +570,16 @@ lasso_node_encrypt(LassoNode *lasso_node, xmlSecKey *encryption_public_key,
xmlSecKeysMngrPtr key_manager = NULL;
xmlNodePtr key_info_node = NULL;
xmlNodePtr encrypted_key_node = NULL;
+ xmlNodePtr encrypted_data = NULL;
xmlNodePtr key_info_node2 = NULL;
xmlSecEncCtxPtr enc_ctx = NULL;
xmlSecTransformId xmlsec_encryption_sym_key_type;
- LassoSaml2EncryptedElement *ret = NULL;
if (encryption_public_key == NULL || !xmlSecKeyIsValid(encryption_public_key)) {
message(G_LOG_LEVEL_WARNING, "Invalid encryption key");
goto exit;
}
- /* Create a new EncryptedElement */
- encrypted_element = LASSO_SAML2_ENCRYPTED_ELEMENT(lasso_saml2_encrypted_element_new());
-
- /* Save the original data for dumps */
- encrypted_element->original_data = g_object_ref(lasso_node);
-
/* Create a document to contain the node to encrypt */
doc = xmlNewDoc((xmlChar*)"1.0");
orig_node = lasso_node_get_xmlNode(lasso_node, FALSE);
@@ -606,14 +600,15 @@ lasso_node_encrypt(LassoNode *lasso_node, xmlSecKey *encryption_public_key,
}
/* Create encryption template for a specific symetric key type */
- encrypted_element->EncryptedData = xmlSecTmplEncDataCreate(doc,
+ encrypted_data = xmlSecTmplEncDataCreate(doc,
xmlsec_encryption_sym_key_type, NULL, xmlSecTypeEncElement, NULL, NULL);
- if (encrypted_element->EncryptedData == NULL) {
+
+ if (encrypted_data == NULL) {
message(G_LOG_LEVEL_WARNING, "Failed to create encryption template");
goto exit;
}
- if (xmlSecTmplEncDataEnsureCipherValue(encrypted_element->EncryptedData) == NULL) {
+ if (xmlSecTmplEncDataEnsureCipherValue(encrypted_data) == NULL) {
message(G_LOG_LEVEL_WARNING, "Failed to add CipherValue node");
goto exit;
}
@@ -643,7 +638,7 @@ lasso_node_encrypt(LassoNode *lasso_node, xmlSecKey *encryption_public_key,
}
/* add <dsig:KeyInfo/> */
- key_info_node = xmlSecTmplEncDataEnsureKeyInfo(encrypted_element->EncryptedData, NULL);
+ key_info_node = xmlSecTmplEncDataEnsureKeyInfo(encrypted_data, NULL);
if (key_info_node == NULL) {
message(G_LOG_LEVEL_WARNING, "Failed to add key info");
goto exit;
@@ -700,24 +695,26 @@ lasso_node_encrypt(LassoNode *lasso_node, xmlSecKey *encryption_public_key,
}
/* encrypt the data */
- if (xmlSecEncCtxXmlEncrypt(enc_ctx, encrypted_element->EncryptedData, orig_node) < 0) {
+ if (xmlSecEncCtxXmlEncrypt(enc_ctx, encrypted_data, orig_node) < 0) {
message(G_LOG_LEVEL_WARNING, "Encryption failed");
goto exit;
}
- encrypted_element->EncryptedKey = g_list_append(encrypted_element->EncryptedKey,
- xmlCopyNode(encrypted_key_node, 1));
- /* Transfer reference to return value*/
- ret = encrypted_element;
- encrypted_element = NULL;
+ /* Create a new EncryptedElement */
+ encrypted_element = LASSO_SAML2_ENCRYPTED_ELEMENT(lasso_saml2_encrypted_element_new());
+ lasso_assign_gobject(encrypted_element->original_data, lasso_node);
+ lasso_list_add(encrypted_element->EncryptedKey, xmlCopyNode(encrypted_key_node, 1));
+ lasso_assign_node(encrypted_element->EncryptedData, encrypted_element->EncryptedData);
exit:
+ /* If encryption worked, encrypted node should have replaced orig_node inside the xmlDoc,
+ * enc_ctx->resultReplaced signal such replacement */
lasso_release_gobject(encrypted_element);
lasso_release_encrypt_context(enc_ctx);
lasso_release_doc(doc);
- return ret;
+ return encrypted_element;
}