ENGINE-606: Group encryption key reset with key reset overhaul - own grouped keys fails, the rest of key reset passes, but there will be more to test - just trying to ensure the old stuff works first.

ENGINE-606
Krista Bennett 2 years ago
parent 46666254b0
commit 10bf42da69

@ -527,7 +527,7 @@ static const char *sql_group_add_member =
" values (?1, ?2, ?3, ?4) ;";
static const char *sql_group_delete_member =
"delete from own_groups_members "
" where group_id = ?1 and group_address ?2 and "
" where group_id = ?1 and group_address = ?2 and "
" member_id = ?3 and member_address = ?4 ;";
static const char *sql_set_group_member_status =
"update own_groups_members set active_member = ?1 "

@ -463,13 +463,15 @@ static PEP_STATUS is_invited_group_member(PEP_SESSION session, pEp_identity* gro
******************************************************************************************/
identity_list* member_list_to_identity_list(member_list* memberlist) {
memberlist* curr_mem = memberlist;
member_list* curr_mem = memberlist;
identity_list* head = NULL;
identity_list** id_list_curr_ptr = &head;
for ( ; curr_mem && curr_mem->member && curr_mem->member->ident; curr_mem = curr_mem->next,
id_list_curr_ptr = &((*id_list_curr_ptr)->next)) {
*id_list_curr_ptr = identity_dup(curr_mem->member->ident);
*id_list_curr_ptr = new_identity_list(identity_dup(curr_mem->member->ident));
if (!(*id_list_curr_ptr))
return NULL; // Out of memory - FIXME: can we be cleaner here?
}
return head;
}
@ -1961,8 +1963,15 @@ DYNAMIC_API PEP_STATUS group_remove_member(
if (status != PEP_STATUS_OK)
return status;
status = key_reset_managed_group(session, group_identity, manager, group_member);
// We dup this because I'm not sure about ownership on the group identity.
// FIXME: maybe we shouldn't
char* group_key_to_revoke = strdup(group_identity->fpr);
if (!group_key_to_revoke)
return PEP_OUT_OF_MEMORY;
status = key_reset(session, group_key_to_revoke, group_identity);
free(group_key_to_revoke);
free_identity(manager);
return status;

@ -579,6 +579,16 @@ PEP_STATUS is_own_group_identity(PEP_SESSION session, pEp_identity* group_identi
*/
identity_list* member_list_to_identity_list(member_list* memberlist);
/**
*
* @param session
* @param group_identity
* @param manager
* @return
*/
PEP_STATUS get_group_manager(PEP_SESSION session,
pEp_identity* group_identity,
pEp_identity** manager);
#ifdef __cplusplus
}
#endif

@ -176,7 +176,7 @@ static PEP_STATUS _generate_own_commandlist_msg(PEP_SESSION session,
for (list_curr = reset_idents ; list_curr && list_curr->ident; list_curr = list_curr->next) {
pEp_identity* curr_ident = list_curr->ident;
if (curr_ident->flags & (PEP_idf_devicegroup | PEP_idf_group_ident) {
if (curr_ident->flags & (PEP_idf_devicegroup | PEP_idf_group_ident)) {
PEP_STATUS status = _generate_reset_structs(session,
curr_ident,
@ -844,6 +844,79 @@ pEp_free:
return status;
}
static PEP_STATUS send_key_reset_to_active_group_members(PEP_SESSION session,
pEp_identity* group_ident,
pEp_identity* manager,
const char* old_fpr,
const char* new_key) {
PEP_STATUS status = PEP_STATUS_OK;
messageToSend_t send_cb = session->messageToSend;
if (!send_cb)
return PEP_SYNC_NO_MESSAGE_SEND_CALLBACK;
// FIXME: copy group_ident, I think
identity_list* group_ident_node = new_identity_list(group_ident);
// Get active group member list
member_list* members = NULL;
status = retrieve_active_member_list(session, group_ident, &members);
if (status != PEP_STATUS_OK)
return status;
if (members) {
member_list* curr_member = members;
for ( ; curr_member && curr_member->member && curr_member->member->ident; curr_member = curr_member->next) {
pEp_identity* member_ident = curr_member->member->ident;
if (EMPTYSTR(member_ident->user_id) || EMPTYSTR(member_ident->address))
return PEP_UNKNOWN_ERROR;
message* outmsg = NULL;
identity_list* reset_ident_list = new_identity_list(group_ident);
if (!group_ident)
return PEP_OUT_OF_MEMORY;
// FIXME: this is a little expensive - we should refactor so that
// we cache the command list and prepare the messages in a loop with a copy
status = _generate_own_commandlist_msg(session,
reset_ident_list,
false,
manager,
member_ident,
old_fpr,
&outmsg);
if (status != PEP_STATUS_OK) // FIXME: mem
return status;
if (outmsg) {
message* enc_msg = NULL;
// encrypt this baby and get out
// extra keys???
status = encrypt_message(session, outmsg, NULL, &enc_msg, PEP_enc_auto, PEP_encrypt_flag_key_reset_only);
if (status != PEP_STATUS_OK)
return status;
_add_auto_consume(enc_msg);
// insert into queue
status = send_cb(enc_msg);
if (status != PEP_STATUS_OK)
return status;
}
}
}
return status;
}
PEP_STATUS send_key_reset_to_recents(PEP_SESSION session,
pEp_identity* from_ident,
const char* old_fpr,
@ -1034,6 +1107,114 @@ static PEP_STATUS _dup_grouped_only(identity_list* idents, identity_list** filte
return PEP_STATUS_OK;
}
static PEP_STATUS _do_full_reset_on_single_own_ungrouped_identity(PEP_SESSION session,
pEp_identity* ident,
char* old_fpr) {
bool is_own_identity_group = false;
PEP_STATUS status = PEP_STATUS_OK;
// Before we start, deal with group identities...
// Deal with group identities
if (ident->flags & PEP_idf_group_ident) {
status = is_own_group_identity(session, ident, &is_own_identity_group);
if (status != PEP_STATUS_OK)
return status; // inconsistent crap going on here... hrm.
if (!is_own_identity_group) {
// dun dun dunnnnnn
}
}
// Urgh. Can this cause a memleak? FIXME.
char* cached_passphrase = EMPTYSTR(session->curr_passphrase) ? NULL : strdup(session->curr_passphrase);
// Do the full reset on this identity
// Base case for is_own_private starts here
// Note that we reset this key for ANY own ident that has it. And if
// tmp_ident did NOT have this key, it won't matter. We will reset this
// key for all idents for this user.
status = revoke_key(session, old_fpr, NULL);
// Should never happen, we checked this, but STILL.
if (PASS_ERROR(status))
return status;
const char* new_key = NULL;
// If we have a full identity, we have some cleanup and generation tasks here
// FIXME: I think this should always be true here
if (!EMPTYSTR(ident->address)) {
// Note - this will be ignored right now by keygen for group identities.
// Testing needs to make sure all callers set the flag appropriately before
// we get into the current function.
config_passphrase(session, session->generation_passphrase);
// generate new key
if (status == PEP_STATUS_OK) {
ident->fpr = NULL;
status = myself(session, ident);
}
if (status == PEP_STATUS_OK && ident->fpr && strcmp(old_fpr, ident->fpr) != 0)
new_key = strdup(ident->fpr);
// Error handling?
// mistrust old_fpr from trust
ident->fpr = old_fpr;
ident->comm_type = PEP_ct_mistrusted;
status = set_trust(session, ident);
ident->fpr = NULL;
// Done with old use of ident.
if (status == PEP_STATUS_OK) {
// Generate new key
status = myself(session, ident);
}
}
if (status == PEP_STATUS_OK)
// cascade that mistrust for anyone using this key
status = mark_as_compromised(session, old_fpr);
if (status == PEP_STATUS_OK)
status = remove_fpr_as_default(session, old_fpr);
if (status == PEP_STATUS_OK)
status = add_mistrusted_key(session, old_fpr);
// If there's a new key, do the DB linkage with the revoked one, and
// send the key reset mail opportunistically to recently contacted
// partners
if (new_key) {
// add to revocation list
if (status == PEP_STATUS_OK)
status = set_revoked(session, old_fpr, new_key, time(NULL));
// for all active communication partners:
// active_send revocation
ident->fpr = old_fpr;
if (status == PEP_STATUS_OK) {
if (is_own_identity_group) {
pEp_identity* manager = NULL;
status = get_group_manager(session, ident, &manager);
if (status == PEP_STATUS_OK) {
status = send_key_reset_to_active_group_members(session, ident, manager, old_fpr, new_key);
}
}
if (status == PEP_STATUS_OK)
status = send_key_reset_to_recents(session, ident, old_fpr, new_key);
}
ident->fpr = NULL;
}
config_passphrase(session, cached_passphrase);
// Whether new_key is NULL or not, if this key is equal to the current user default, we
// replace it.
status = replace_main_user_fpr_if_equal(session, ident->user_id, new_key, old_fpr);
return status;
}
/**
* @internal
*
@ -1093,68 +1274,6 @@ static PEP_STATUS _check_own_reset_passphrase_readiness(PEP_SESSION session,
return PEP_STATUS_OK;
}
status PEP_STATUS send_key_reset_to_active_group_members(PEP_SESSION session,
pEp_identity* group_ident,
pEp_identity* manager,
const char* old_fpr,
const char* new_key) {
PEP_STATUS status = PEP_STATUS_OK;
// FIXME: copy group_ident, I think
identity_list* group_ident_node = new_identity_list(group_ident);
// Get active group member list
member_list* members = NULL;
status = retrieve_active_group_membership(session, group_ident, &members);
if (status != PEP_STATUS_OK)
return status;
if (members) {
member_list* curr_member = members;
for ( ; curr_member && curr_member->member && curr_member->member->ident; curr_member = curr_member->next) {
pEp_identity* member_ident = curr_member;
if (EMPTYSTR(curr_member->user_id) || EMPTYSTR(curr_member->address))
return PEP_UNKNOWN_ERROR;
message* outmsg = NULL;
identity_list* reset_ident_list = new_identity_list(group_ident);
if (!group_ident)
return PEP_OUT_OF_MEMORY;
// FIXME: this is a little expensive - we should refactor so that
// we cache the command list and prepare the messages in a loop with a copy
status = _generate_own_commandlist_msg(session,
reset_ident_list,
manager,
curr_member,
old_fpr,
&outmsg);
if (status != PEP_STATUS_OK) // FIXME: mem
return status;
if (outmsg) {
// encrypt this baby and get out
// extra keys???
status = encrypt_message(session, outmsg, NULL, &enc_msg, PEP_enc_auto, PEP_encrypt_flag_key_reset_only);
if (status != PEP_STATUS_OK)
return status;
_add_auto_consume(enc_msg);
// insert into queue
status = send_cb(enc_msg);
if (status != PEP_STATUS_OK)
return status;
}
}
}
}
// This is for ONE specific key, but possibly many identities
@ -1185,7 +1304,7 @@ status PEP_STATUS send_key_reset_to_active_group_members(PEP_SESSION session,
*/
static PEP_STATUS _key_reset_device_group_for_shared_key(PEP_SESSION session,
identity_list* key_idents,
const char* old_key,
char* old_key,
bool grouped_only) {
assert(session);
assert(key_idents);
@ -1213,23 +1332,33 @@ static PEP_STATUS _key_reset_device_group_for_shared_key(PEP_SESSION session,
return status;
char* cached_passphrase = EMPTYSTR(session->curr_passphrase) ? NULL : strdup(session->curr_passphrase);
// if we only want grouped identities, we do this:
if (grouped_only) {
identity_list* new_list = NULL;
status = _dup_grouped_only(key_idents, &new_list);
if (status != PEP_STATUS_OK)
goto pEp_error;
key_idents = new_list; // local var change, won't impact caller
// FIXME: How is this not a mem leak later?
}
if (!key_idents)
return PEP_STATUS_OK;
// We need to create this list in either event because we only sync grouped
// identities, so this is necessary for the command list:
identity_list* grouped_idents = NULL;
status = _dup_grouped_only(key_idents, &grouped_idents);
if (status != PEP_STATUS_OK)
goto pEp_error;
// First, do grouped idents. That has to be done before we can revoke the key.
// // if we only want grouped identities, we do this:
// if (grouped_only) {
// identity_list* new_list = NULL;
// status = _dup_grouped_only(key_idents, &new_list);
// if (status != PEP_STATUS_OK)
// goto pEp_error;
// key_idents = new_list; // local var change, won't impact caller
// // FIXME: How is this not a mem leak later?
// }
//
// if (!key_idents)
// return PEP_STATUS_OK;
// each of these has the same key and needs a new one.
identity_list* curr_ident;
for (curr_ident = key_idents; curr_ident && curr_ident->ident; curr_ident = curr_ident->next) {
for (curr_ident = grouped_idents; curr_ident && curr_ident->ident; curr_ident = curr_ident->next) {
pEp_identity* ident = curr_ident->ident;
free(ident->fpr);
ident->fpr = NULL;
@ -1238,7 +1367,7 @@ static PEP_STATUS _key_reset_device_group_for_shared_key(PEP_SESSION session,
goto pEp_error;
}
// Ok, everyone's got a new keypair. Hoorah!
// Ok, everyone who's grouped has got a new keypair. Hoorah!
// generate, sign, and push messages into queue
//
@ -1247,10 +1376,12 @@ static PEP_STATUS _key_reset_device_group_for_shared_key(PEP_SESSION session,
// as the configured key. We'll switch it back
// afterward (no revocation, decrypt, or signing
// with the old key happens in here)
// (N.B. For now, group encryption keys will ignore this
// FIXME: I think group encryption keys probably have to do something different here anyway...
config_passphrase(session, session->generation_passphrase);
status = _generate_own_commandlist_msg(session,
key_idents,
grouped_idents,
true,
NULL,
NULL,
@ -1262,39 +1393,39 @@ static PEP_STATUS _key_reset_device_group_for_shared_key(PEP_SESSION session,
// Key-based errors here shouldn't happen.
if (status != PEP_STATUS_OK)
goto pEp_error;
// Following will only be true if some idents were grouped,
// and will only include grouped idents!
// and will only include grouped idents!
// Will be signed with old signing key.
// (Again, see the FIXME - we need to figure out what
// happens if it got revoked externally)
if (outmsg) {
// happens if it got revoked externally)
if (outmsg) {
// encrypt this baby and get out
// extra keys???
status = encrypt_message(session, outmsg, NULL, &enc_msg, PEP_enc_auto, PEP_encrypt_flag_key_reset_only);
if (status != PEP_STATUS_OK)
goto pEp_error;
_add_auto_consume(enc_msg);
// insert into queue
status = send_cb(enc_msg);
if (status != PEP_STATUS_OK)
goto pEp_error;
goto pEp_error;
}
// Ok, we've signed everything we need to with the old key,
// Revoke that baby.
// Revoke that baby, in case we haven't already.
status = revoke_key(session, old_key, NULL);
// again, we should not have key-related issues here,
// as we ensured the correct password earlier
if (status != PEP_STATUS_OK)
goto pEp_error;
// Ok, NOW - the current password needs to be swapped out
// because we're going to sign with keys using it.
//
@ -1302,68 +1433,72 @@ static PEP_STATUS _key_reset_device_group_for_shared_key(PEP_SESSION session,
//
config_passphrase(session, session->generation_passphrase);
for (curr_ident = key_idents; curr_ident && curr_ident->ident; curr_ident = curr_ident->next) {
// FIXME: why do we only take care of keys in the device group? I guess this is about communication
// TO the device group, but if we revoke keys for identities NOT in the device group,
// we need to handle that too :(
if (curr_ident->ident->flags & PEP_idf_devicegroup) {
pEp_identity* ident = curr_ident->ident;
// set own key, you fool.
// Grab ownership first.
char* new_key = ident->fpr;
ident->fpr = NULL;
status = set_own_key(session, ident, new_key);
if (status != PEP_STATUS_OK)
// scream loudly and cry, then hang head in shame
goto pEp_error;
for (curr_ident = grouped_idents; curr_ident && curr_ident->ident; curr_ident = curr_ident->next) {
pEp_identity* ident = curr_ident->ident;
free(ident->fpr);
// set own key, you fool.
// Grab ownership first.
char* new_key = ident->fpr;
ident->fpr = NULL;
status = set_own_key(session, ident, new_key);
if (status != PEP_STATUS_OK)
// scream loudly and cry, then hang head in shame
goto pEp_error;
// release ownership to the struct again
ident->fpr = new_key;
// N.B. This sort of sucks because we overwrite this every time.
// But this case is infrequent and we don't rely on the binding.
if (status == PEP_STATUS_OK)
status = set_revoked(session, old_key, new_key, time(NULL));
free(ident->fpr);
if (status != PEP_STATUS_OK)
goto pEp_error;
// release ownership to the struct again
ident->fpr = new_key;
// Whether new_key is NULL or not, if this key is equal to the current user default, we
// replace it.
status = replace_main_user_fpr_if_equal(session,
ident->user_id,
new_key,
old_key);
if (status != PEP_STATUS_OK)
goto pEp_error;
pEp_identity* tmp_ident = identity_dup(ident);
if (!tmp_ident) {
status = PEP_OUT_OF_MEMORY;
goto pEp_error;
}
free(tmp_ident->fpr);
// for all active communication partners:
// active_send revocation
tmp_ident->fpr = strdup(old_key); // freed in free_identity
if (status == PEP_STATUS_OK)
status = send_key_reset_to_recents(session, tmp_ident, old_key, ident->fpr);
// N.B. This sort of sucks because we overwrite this every time.
// But this case is infrequent and we don't rely on the binding.
if (status == PEP_STATUS_OK)
status = set_revoked(session, old_key, new_key, time(NULL));
if (status != PEP_STATUS_OK)
goto pEp_error;
// Whether new_key is NULL or not, if this key is equal to the current user default, we
// replace it.
status = replace_main_user_fpr_if_equal(session,
ident->user_id,
new_key,
old_key);
if (status != PEP_STATUS_OK)
goto pEp_error;
pEp_identity* tmp_ident = identity_dup(ident);
if (!tmp_ident) {
status = PEP_OUT_OF_MEMORY;
goto pEp_error;
}
free(tmp_ident->fpr);
// for all active communication partners:
// active_send revocation
tmp_ident->fpr = strdup(old_key); // freed in free_identity
if (status == PEP_STATUS_OK)
status = send_key_reset_to_recents(session, tmp_ident, old_key, ident->fpr);
if (status != PEP_STATUS_OK)
goto pEp_error;
free_identity(tmp_ident);
}
config_passphrase(session, cached_passphrase);
// Make sure non-grouped idents with this key get reset (this probably happens almost never, but
// it's a legitimate use case.
for (curr_ident = key_idents; curr_ident && curr_ident->ident; curr_ident = curr_ident->next) {
if (!(curr_ident->ident->flags & PEP_idf_devicegroup)) {
status = _do_full_reset_on_single_own_ungrouped_identity(session, curr_ident->ident, old_key);
if (status != PEP_STATUS_OK)
goto pEp_error;
free_identity(tmp_ident);
}
}
config_passphrase(session, cached_passphrase);
if (status == PEP_STATUS_OK)
// cascade that mistrust for anyone using this key
status = mark_as_compromised(session, old_key);
@ -1406,7 +1541,7 @@ DYNAMIC_API PEP_STATUS key_reset_own_grouped_keys(PEP_SESSION session) {
for (curr_key = keys; curr_key && curr_key->value; curr_key = curr_key->next) {
identity_list* key_idents = NULL;
const char* own_key = curr_key->value;
char* own_key = curr_key->value;
// If the sticky bit is set, ignore this beast
bool is_sticky = false;
@ -1446,112 +1581,6 @@ pEp_free:
return status;
}
static PEP_STATUS _do_full_reset_on_single_own_ungrouped_identity(PEP_SESSION session,
pEp_identity* ident,
const char* old_fpr) {
bool is_own_identity_group = false;
// Before we start, deal with group identities...
// Deal with group identities
if (tmp_ident->flags & PEP_idf_group_ident) {
status = is_own_group_identity(session, tmp_ident, &is_own_identity_group);
if (status != PEP_STATUS_OK)
return status; // inconsistent crap going on here... hrm.
if (!is_own_identity_group) {
// dun dun dunnnnnn
}
}
// Urgh. Can this cause a memleak? FIXME.
char* cached_passphrase = EMPTYSTR(session->curr_passphrase) ? NULL : strdup(session->curr_passphrase);
// Do the full reset on this identity
// Base case for is_own_private starts here
// Note that we reset this key for ANY own ident that has it. And if
// tmp_ident did NOT have this key, it won't matter. We will reset this
// key for all idents for this user.
PEP_STATUS status = revoke_key(session, old_fpr, NULL);
// Should never happen, we checked this, but STILL.
if (PASS_ERROR(status))
return status;
const char* new_key = NULL;
// If we have a full identity, we have some cleanup and generation tasks here
// FIXME: I think this should always be true here
if (!EMPTYSTR(ident->address)) {
// Note - this will be ignored right now by keygen for group identities.
// Testing needs to make sure all callers set the flag appropriately before
// we get into the current function.
config_passphrase(session, session->generation_passphrase);
// generate new key
if (status == PEP_STATUS_OK) {
ident->fpr = NULL;
status = myself(session, ident);
}
if (status == PEP_STATUS_OK && ident->fpr && strcmp(old_fpr, ident->fpr) != 0)
new_key = strdup(ident->fpr);
// Error handling?
// mistrust old_fpr from trust
ident->fpr = old_fpr;
ident->comm_type = PEP_ct_mistrusted;
status = set_trust(session, ident);
ident->fpr = NULL;
// Done with old use of ident.
if (status == PEP_STATUS_OK) {
// Generate new key
status = myself(session, ident);
}
}
if (status == PEP_STATUS_OK)
// cascade that mistrust for anyone using this key
status = mark_as_compromised(session, old_fpr);
if (status == PEP_STATUS_OK)
status = remove_old_fpr_as_default(session, old_fpr);
if (status == PEP_STATUS_OK)
status = add_mistrusted_key(session, old_fpr);
// If there's a new key, do the DB linkage with the revoked one, and
// send the key reset mail opportunistically to recently contacted
// partners
if (new_key) {
// add to revocation list
if (status == PEP_STATUS_OK)
status = set_revoked(session, old_fpr, new_key, time(NULL));
// for all active communication partners:
// active_send revocation
tmp_ident->fpr = old_fpr;
if (status == PEP_STATUS_OK) {
if (is_own_identity_group) {
pEp_identity* manager = NULL;
status = get_group_manager(session, ident, &manager);
if (status == PEP_STATUS_OK) {
status = send_key_reset_to_active_group_members(session, ident, manager, old_fpr, new_key);
}
}
if (status == PEP_STATUS_OK)
status = send_key_reset_to_recents(session, ident, old_fpr, new_key);
}
tmp_ident->fpr = NULL;
}
config_passphrase(session, cached_passphrase);
// Whether new_key is NULL or not, if this key is equal to the current user default, we
// replace it.
status = replace_main_user_old_fpr_if_equal(session, ident->user_id, new_key, old_fpr);
return status;
}
PEP_STATUS key_reset(
PEP_SESSION session,
@ -1722,8 +1751,8 @@ PEP_STATUS key_reset(
for (curr_ident = key_idents; curr_ident && curr_ident->ident;
curr_ident = curr_ident->next) {
pEp_identity* this_ident = curr_ident->ident;
pEp_identity *this_ident = curr_ident->ident;
status = _do_full_reset_on_single_own_ungrouped_identity(session,
this_ident,
@ -1732,76 +1761,8 @@ PEP_STATUS key_reset(
// Should never happen, we checked this, but STILL.
if (PASS_ERROR(status))
goto pEp_free;
}
// // Do the full reset on this identity
// // Base case for is_own_private starts here
// // Note that we reset this key for ANY own ident that has it. And if
// // tmp_ident did NOT have this key, it won't matter. We will reset this
// // key for all idents for this user.
// status = revoke_key(session, fpr_copy, NULL);
//
// // Should never happen, we checked this, but STILL.
// if (PASS_ERROR(status))
// goto pEp_free;
//
// // If we have a full identity, we have some cleanup and generation tasks here
// if (!EMPTYSTR(this_ident->address)) {
// // generate new key
// if (status == PEP_STATUS_OK) {
// this_ident->fpr = NULL;
// status = myself(session, this_ident);
// }
// if (status == PEP_STATUS_OK && this_ident->fpr && strcmp(fpr_copy, this_ident->fpr) != 0)
// new_key = strdup(this_ident->fpr);
// // Error handling?
//
// // mistrust fpr from trust
// this_ident->fpr = fpr_copy;
//
// this_ident->comm_type = PEP_ct_mistrusted;
// status = set_trust(session, this_ident);
// this_ident->fpr = NULL;
//
// // Done with old use of ident.
// if (status == PEP_STATUS_OK) {
// // Generate new key
// status = myself(session, this_ident);
// }
// }
//
// if (status == PEP_STATUS_OK)
// // cascade that mistrust for anyone using this key
// status = mark_as_compromised(session, fpr_copy);
//
// if (status == PEP_STATUS_OK)
// status = remove_fpr_as_default(session, fpr_copy);
// if (status == PEP_STATUS_OK)
// status = add_mistrusted_key(session, fpr_copy);
//
// // If there's a new key, do the DB linkage with the revoked one, and
// // send the key reset mail opportunistically to recently contacted
// // partners
// if (new_key) {
// // add to revocation list
// if (status == PEP_STATUS_OK)
// status = set_revoked(session, fpr_copy, new_key, time(NULL));
// // for all active communication partners:
// // active_send revocation
//
// config_passphrase(session, session->generation_passphrase);
// tmp_ident->fpr = fpr_copy;
// if (status == PEP_STATUS_OK)
// status = send_key_reset_to_recents(session, this_ident, fpr_copy, new_key);
// config_passphrase(session, cached_passphrase);
// tmp_ident->fpr = NULL;
// if (PASS_ERROR(status))
// goto pEp_free; // should NOT happen
// }
//
// // Whether new_key is NULL or not, if this key is equal to the current user default, we
// // replace it.
// status = replace_main_user_fpr_if_equal(session, this_ident->user_id, new_key, fpr_copy);
// } // Ident list gets freed below, do not free here!
}
// Ok, we've either now reset for each own identity with this key, or
// we got an error and want to bail anyway.
@ -2075,19 +2036,3 @@ the_end:
ASN_STRUCT_FREE(asn_DEF_Distribution, dist);
return status;
}
PEP_STATUS key_reset_managed_group(PEP_SESSION session,
pEp_identity* group_identity,
pEp_identity* manager) {
if (!group_identity || !manager || !group_member)
return PEP_ILLEGAL_VALUE;
if (EMPTYSTR(group_identity->user_id) || EMPTYSTR(manager->user_id) || EMPTYSTR(group_member))
return PEP_ILLEGAL_VALUE;
if (EMPTYSTR(group_identity->address) || EMPTYSTR(manager->address) || EMPTYSTR(group_member))
return PEP_ILLEGAL_VALUE;
if (!is_me(session, group_identity) || !is_me(session, manager))
return PEP_ILLEGAL_VALUE;
}

@ -269,6 +269,10 @@ PEP_STATUS key_reset_commands_to_PER(const keyreset_command_list *command_list,
*/
PEP_STATUS PER_to_key_reset_commands(const char *cmds, size_t size, keyreset_command_list **command_list);
PEP_STATUS key_reset_managed_group(PEP_SESSION session,
pEp_identity* group_identity,
pEp_identity* manager);
#ifdef __cplusplus
}
#endif

@ -2724,7 +2724,7 @@ PEP_STATUS _pgp_generate_keypair(PEP_SESSION session, pEp_identity *identity, ti
assert(identity->fpr == NULL || identity->fpr[0] == 0);
// assert(identity->username);
bool is_group_identity = identity & PEP_idf_group_ident;
bool is_group_identity = identity->flags & PEP_idf_group_ident;
// NOTE: FOR NOW, NO PASSPHRASE-BASED KEYS WILL BE GENERATED FOR GROUP ENCRYPTION.
// VOLKER HAS A PLAN TO FIX THIS.

@ -1,4 +1,4 @@
Message-ID: <pEp.QPG2XU.0SMNWY8ZVM5I9.F83B4963-4AF1-4AD9-8730-AA7CE4F228A2@ravenwatch.house>
Message-ID: <pEp.QQ022G.18B2JG0SBZA8C.C4B3E145-8378-48DF-B9E0-E498D1EE98FC@ravenwatch.house>
From: Fennarion of House Ravenwatch <fennarion@ravenwatch.house>
To: "Go away, peasants!" <abner@tharn.cool>
Subject: =?utf-8?Q?p=E2=89=A1p?=
@ -20,208 +20,208 @@ Content-Disposition: inline; filename="msg.asc"
-----BEGIN PGP MESSAGE-----
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
=Lhzj
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
=FEbY
-----END PGP MESSAGE-----
--436c6125628c895d333ab105721da317--

@ -1,4 +1,4 @@
Message-ID: <pEp.QPG2XW.1CEQMHR16CDAO.6DCEAA03-0551-4FBC-89EF-439176D42E39@ravenwatch.house>
Message-ID: <pEp.QQ022H.1EWFFYHHETBIG.5BE2BD25-94B9-4F72-BDC0-E208B19ECE3D@ravenwatch.house>
From: Fennarion of House Ravenwatch <fennarion@ravenwatch.house>
To: "Go away, peasants!" <abner@tharn.cool>
Subject: =?utf-8?Q?p=E2=89=A1p?=
@ -20,199 +20,199 @@ Content-Disposition: inline; filename="msg.asc"
-----BEGIN PGP MESSAGE-----
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
=D28X
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