diff --git a/src/identity_list.c b/src/identity_list.c index 5dd27fc2..2d9ee0e2 100644 --- a/src/identity_list.c +++ b/src/identity_list.c @@ -134,3 +134,20 @@ DYNAMIC_API int identity_list_length(const identity_list *id_list) return len; } + +PEP_STATUS set_all_userids_in_list(identity_list* id_list, const char* user_id) { + identity_list* curr_list = id_list; + + while (curr_list) { + if (curr_list->ident) { + free(curr_list->ident->user_id); + curr_list->ident->user_id = NULL; + char* dup_userid = strdup(user_id); + if (dup_userid == NULL) + return PEP_OUT_OF_MEMORY; + curr_list->ident->user_id = dup_userid; + } + curr_list = id_list->next; + } + return PEP_STATUS_OK; +} diff --git a/src/identity_list.h b/src/identity_list.h index 5c89c134..857e2ba1 100644 --- a/src/identity_list.h +++ b/src/identity_list.h @@ -83,7 +83,10 @@ DYNAMIC_API identity_list *identity_list_join(identity_list *first_list, identit // length of identity_list in number of elements DYNAMIC_API int identity_list_length(const identity_list *id_list); - + +// Internal +PEP_STATUS set_all_userids_in_list(identity_list* id_list, const char* user_id); + #ifdef __cplusplus } #endif diff --git a/src/map_asn1.h b/src/map_asn1.h index 159e1679..0f6daedd 100644 --- a/src/map_asn1.h +++ b/src/map_asn1.h @@ -80,4 +80,3 @@ identity_list *IdentityList_to_identity_list(IdentityList_t *list, identity_list #ifdef __cplusplus } #endif - diff --git a/src/pEpEngine.c b/src/pEpEngine.c index 00d354c8..2664fd46 100644 --- a/src/pEpEngine.c +++ b/src/pEpEngine.c @@ -5382,3 +5382,20 @@ DYNAMIC_API void set_debug_color(PEP_SESSION session, int ansi_color) session->debug_color = ansi_color; #endif } + +PEP_STATUS set_all_userids_to_own(PEP_SESSION session, identity_list* id_list) { + static char* ownid = NULL; + PEP_STATUS status = PEP_STATUS_OK; + if (!ownid) { + status = get_default_own_userid(session, &ownid); + } + if (status == PEP_STATUS_OK) { + if (ownid) { + status = set_all_userids_in_list(id_list, ownid); + } + else { + status = PEP_UNKNOWN_ERROR; + } + } + return status; +} diff --git a/src/pEpEngine.h b/src/pEpEngine.h index b11fa891..7c31fe99 100644 --- a/src/pEpEngine.h +++ b/src/pEpEngine.h @@ -1418,6 +1418,9 @@ PEP_STATUS sign_only(PEP_SESSION session, const char *fpr, char **sign, size_t *sign_size); + +PEP_STATUS set_all_userids_to_own(PEP_SESSION session, + identity_list* id_list); #ifdef __cplusplus } diff --git a/sync/cond_act_sync.yml2 b/sync/cond_act_sync.yml2 index 1ae8fa02..7f2b4460 100644 --- a/sync/cond_act_sync.yml2 +++ b/sync/cond_act_sync.yml2 @@ -368,6 +368,11 @@ action saveGroupKeys free(user_id); return PEP_OUT_OF_MEMORY; } + status = set_all_userids_to_own(session, il); + if (status != PEP_STATUS_OK) { + free(user_id); + return status; + } identity_list *oil = session->sync_state.own.identities; @@ -452,6 +457,12 @@ action receivedKeysAreDefaultKeys if (!il) return PEP_OUT_OF_MEMORY; + status = set_all_userids_to_own(session, il); + if (status != PEP_STATUS_OK) { + free(user_id); + return status; + } + for (identity_list *_il = il; _il && _il->ident ; _il = _il->next) { // replace partner's user_id with own user_id free(_il->ident->user_id); diff --git a/sync/gen_message_func.ysl2 b/sync/gen_message_func.ysl2 index 698f6ee9..e1ff6dac 100644 --- a/sync/gen_message_func.ysl2 +++ b/sync/gen_message_func.ysl2 @@ -318,6 +318,11 @@ template "field", mode=update_message { &session->«$state».«@name», NULL); if (!il) return PEP_OUT_OF_MEMORY; + + PEP_STATUS own_idents_status = set_all_userids_to_own(session, il); + if (own_idents_status != PEP_STATUS_OK) + return own_idents_status; + IdentityList_t *_il = IdentityList_from_identity_list(il, &msg->choice.«yml:lcase(../../@name)».choice.«$message_name».«@name»); free_identity_list(il); @@ -398,6 +403,11 @@ template "field", mode=update_state { &msg->choice.«yml:lcase(../../@name)».choice.«$message_name».«@name», NULL); if (!il) return PEP_OUT_OF_MEMORY; + + PEP_STATUS own_idents_status = set_all_userids_to_own(session, il); + if (own_idents_status != PEP_STATUS_OK) + return own_idents_status; + IdentityList_t *_il = IdentityList_from_identity_list(il, &session->«yml:lcase(../../../@name)»_state.«yml:lcase(../../@name)».«@name»); free_identity_list(il); @@ -427,4 +437,3 @@ case «../@name»_PR_«yml:lcase(@name)»: || } -