|
|
|
@ -892,14 +892,15 @@ PEP_STATUS _own_identities_retrieve(
|
|
|
|
|
sqlite3_column_text(session->own_identities_retrieve, 0);
|
|
|
|
|
fpr = (const char *)
|
|
|
|
|
sqlite3_column_text(session->own_identities_retrieve, 1);
|
|
|
|
|
user_id = PEP_OWN_USERID;
|
|
|
|
|
username = (const char *)
|
|
|
|
|
user_id = (const char *)
|
|
|
|
|
sqlite3_column_text(session->own_identities_retrieve, 2);
|
|
|
|
|
username = (const char *)
|
|
|
|
|
sqlite3_column_text(session->own_identities_retrieve, 3);
|
|
|
|
|
comm_type = PEP_ct_pEp;
|
|
|
|
|
lang = (const char *)
|
|
|
|
|
sqlite3_column_text(session->own_identities_retrieve, 3);
|
|
|
|
|
sqlite3_column_text(session->own_identities_retrieve, 4);
|
|
|
|
|
flags = (unsigned int)
|
|
|
|
|
sqlite3_column_int(session->own_identities_retrieve, 4);
|
|
|
|
|
sqlite3_column_int(session->own_identities_retrieve, 5);
|
|
|
|
|
|
|
|
|
|
pEp_identity *ident = new_identity(address, fpr, user_id, username);
|
|
|
|
|
if (!ident)
|
|
|
|
@ -1043,24 +1044,70 @@ DYNAMIC_API PEP_STATUS set_own_key(
|
|
|
|
|
fpr && fpr[0]
|
|
|
|
|
))
|
|
|
|
|
return PEP_ILLEGAL_VALUE;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// First see if we have it in own identities already, AND we retrieve
|
|
|
|
|
// our own user_id
|
|
|
|
|
pEp_identity* my_id = NULL;
|
|
|
|
|
identity_list* my_identities = NULL;
|
|
|
|
|
char* my_user_id = NULL;
|
|
|
|
|
status = own_identities_retrieve(session, &my_identities);
|
|
|
|
|
|
|
|
|
|
sqlite3_reset(session->set_own_key);
|
|
|
|
|
sqlite3_bind_text(session->set_own_key, 1, address, -1, SQLITE_STATIC);
|
|
|
|
|
sqlite3_bind_text(session->set_own_key, 2, fpr, -1, SQLITE_STATIC);
|
|
|
|
|
if (status == PEP_STATUS_OK) {
|
|
|
|
|
if (my_identities) {
|
|
|
|
|
if (!(my_identities->ident && my_identities->ident->user_id))
|
|
|
|
|
return PEP_ILLEGAL_VALUE;
|
|
|
|
|
|
|
|
|
|
int result;
|
|
|
|
|
|
|
|
|
|
result = sqlite3_step(session->set_own_key);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_DONE:
|
|
|
|
|
status = PEP_STATUS_OK;
|
|
|
|
|
break;
|
|
|
|
|
my_user_id = strdup(my_identities->ident->user_id);
|
|
|
|
|
|
|
|
|
|
if (!my_user_id)
|
|
|
|
|
return PEP_OUT_OF_MEMORY;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
status = PEP_UNKNOWN_ERROR;
|
|
|
|
|
}
|
|
|
|
|
// Probably cheaper than all the strcmps if there are many,
|
|
|
|
|
// plus this avoids the capitalisation and . problems:
|
|
|
|
|
|
|
|
|
|
status = get_identity(session, my_user_id, address, &my_id);
|
|
|
|
|
|
|
|
|
|
if (status == PEP_STATUS_OK && my_id) {
|
|
|
|
|
if (my_id->fpr && strcasecmp(my_id->fpr, fpr) == 0)) {
|
|
|
|
|
// We're done. It was already here.
|
|
|
|
|
// FIXME: Do we check trust/revocation/?
|
|
|
|
|
goto pep_free;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Otherwise, we see if there's a binding for this user_id/key
|
|
|
|
|
// in the trust DB
|
|
|
|
|
|
|
|
|
|
// If there's an id w/ user_id + address
|
|
|
|
|
if (my_id) {
|
|
|
|
|
free(my_id->fpr);
|
|
|
|
|
my_id->fpr = my_user_id;
|
|
|
|
|
my_user_id->comm_type = PEP_ct_pEp;
|
|
|
|
|
}
|
|
|
|
|
else { // Else, we need a new identity
|
|
|
|
|
status = new_identity(session, address, fpr, my_user_id, NULL, &my_id);
|
|
|
|
|
if (status != PEP_STATUS_OK)
|
|
|
|
|
goto pep_free;
|
|
|
|
|
my_user_id->me = true;
|
|
|
|
|
my_user_id->comm_type = PEP_ct_pEp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
// I think the prerequisite should be that at least one own identity
|
|
|
|
|
// already in the DB, so REALLY look at this.
|
|
|
|
|
// status = new_identity(session, address, fpr, "PEP_OWN_USERID", NULL);
|
|
|
|
|
// my_user_id->me = true;
|
|
|
|
|
// my_user_id->comm_type = PEP_ct_pEp;
|
|
|
|
|
return PEP_CANNOT_FIND_IDENTITY;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
status = set_identity(session, my_id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sqlite3_reset(session->set_own_key);
|
|
|
|
|
pep_free:
|
|
|
|
|
free(my_id);
|
|
|
|
|
free(my_user_id);
|
|
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|