diff options
-rw-r--r-- | bindings/java/wrapper_top.c | 36 | ||||
-rw-r--r-- | bindings/overrides.xml | 1 | ||||
-rw-r--r-- | lasso/id-ff/provider.c | 1 | ||||
-rw-r--r-- | lasso/utils.h | 7 | ||||
-rw-r--r-- | lasso/xml/xml.c | 33 |
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; } |