doc_update_sequoia
Volker Birk 7 years ago
parent 74bcc9754b
commit e3f505b57c

@ -6,6 +6,7 @@
#include "sync_fsm.h"
static int init_count = -1;
char sync_uuid[37];
static int user_version(void *_version, int count, char **text, char **name)
{
@ -132,6 +133,8 @@ DYNAMIC_API PEP_STATUS init(PEP_SESSION *session)
#define _DDL_USER_VERSION "3"
if (in_first) {
memset(sync_uuid, 0, 37);
int_result = sqlite3_exec(
_session->db,
"create table if not exists version_info (\n"
@ -385,7 +388,7 @@ DYNAMIC_API PEP_STATUS init(PEP_SESSION *session)
"(select coalesce((select value + 1 from sequences "
"where name = ?1), 1 )), ?2) ; ";
sql_sequence_value2 = "select value, own from sequences where name = ?1 ;";
sql_sequence_value3 = "update sequences set value = ?2 where name = ?1 ;";
sql_sequence_value3 = "update sequences set value = ?2, own = ?3 where name = ?1 ;";
sql_set_revoked = "insert or replace into revoked_keys ("
" revoked_fpr, replacement_fpr, revocation_date) "
@ -1727,6 +1730,9 @@ static PEP_STATUS _get_sequence_value(PEP_SESSION session, const char *name,
status = PEP_OWN_SEQUENCE;
break;
}
case SQLITE_DONE:
status = PEP_RECORD_NOT_FOUND;
break;
default:
status = PEP_UNKNOWN_ERROR;
}
@ -1755,7 +1761,7 @@ static PEP_STATUS _increment_sequence_value(PEP_SESSION session,
}
static PEP_STATUS _set_sequence_value(PEP_SESSION session,
const char *name, int32_t value)
const char *name, int32_t value, int own)
{
assert(session && name && value > 0);
if (!(session && name && value > 0))
@ -1764,6 +1770,7 @@ static PEP_STATUS _set_sequence_value(PEP_SESSION session,
sqlite3_reset(session->sequence_value3);
sqlite3_bind_text(session->sequence_value3, 1, name, -1, SQLITE_STATIC);
sqlite3_bind_int(session->sequence_value3, 2, value);
sqlite3_bind_int(session->sequence_value3, 3, own);
int result = sqlite3_step(session->sequence_value3);
assert(result == SQLITE_DONE);
sqlite3_reset(session->sequence_value3);
@ -1794,18 +1801,22 @@ DYNAMIC_API PEP_STATUS sequence_value(
uuid_unparse_upper(uuid, name);
own = 1;
}
else {
if (name == sync_uuid || strcmp(name, sync_uuid) == 0)
own = 1;
}
if (*value) {
int32_t old_value = 0;
status = _get_sequence_value(session, name, &old_value);
if (status != PEP_STATUS_OK)
if (status != PEP_STATUS_OK && status != PEP_RECORD_NOT_FOUND)
return status;
if (old_value >= *value) {
return PEP_SEQUENCE_VIOLATED;
}
else {
status = _set_sequence_value(session, name, *value);
status = _set_sequence_value(session, name, *value, own);
return status;
}
}

@ -89,6 +89,7 @@ typedef enum {
PEP_COMMIT_FAILED = 0xff01,
PEP_MESSAGE_CONSUMED = 0xff02,
PEP_RECORD_NOT_FOUND = -6,
PEP_CANNOT_CREATE_TEMP_FILE = -5,
PEP_ILLEGAL_VALUE = -4,
PEP_BUFFER_TOO_SMALL = -3,

@ -77,6 +77,8 @@
#define NOT_IMPLEMENTED assert(0); return PEP_UNKNOWN_ERROR;
extern char sync_uuid[37];
typedef struct _pEpSession {
const char *version;
#ifdef USE_GPG
@ -137,7 +139,6 @@ typedef struct _pEpSession {
// state machines
DeviceState_state sync_state;
char sync_uuid[37];
// runtime config

@ -21,6 +21,10 @@ DYNAMIC_API PEP_STATUS register_sync_callbacks(
retrieve_next_sync_msg_t retrieve_next_sync_msg
)
{
unsigned char uuid[16];
uuid_generate_random(uuid);
uuid_unparse_upper(uuid, sync_uuid);
session->sync_obj = obj;
session->messageToSend = messageToSend;
session->showHandshake = showHandshake;

@ -70,14 +70,22 @@ PEP_STATUS receive_DeviceState_msg(PEP_SESSION session, message *src)
if (bl->mime_type && strcasecmp(bl->mime_type, "application/pEp") == 0
&& bl->size) {
DeviceGroup_Protocol_t *msg = NULL;
uper_decode_complete(NULL, &asn_DEF_DeviceGroup_Protocol,
(void **) &msg, bl->value, bl->size);
uper_decode_complete(NULL, &asn_DEF_DeviceGroup_Protocol, (void **)
&msg, bl->value, bl->size);
if (msg) {
found = true;
int32_t value = (int32_t) msg->header.sequence;
PEP_STATUS status = sequence_value(session, (char *)
msg->header.me.user_id, &value);
char *user_id = strndup((char *) msg->header.me.user_id->buf,
msg->header.me.user_id->size);
assert(user_id);
if (!user_id) {
ASN_STRUCT_FREE(asn_DEF_DeviceGroup_Protocol, msg);
return PEP_OUT_OF_MEMORY;
}
PEP_STATUS status = sequence_value(session, (char *) user_id,
&value);
if (status == PEP_STATUS_OK) {
status = session->inject_sync_msg(msg, session->sync_obj);
@ -122,7 +130,7 @@ void free_DeviceGroup_Protocol_msg(DeviceGroup_Protocol_t *msg)
PEP_STATUS unicast_msg(
PEP_SESSION session,
Identity partner,
const Identity partner,
DeviceState_state state,
DeviceGroup_Protocol_t *msg
)
@ -152,7 +160,7 @@ PEP_STATUS unicast_msg(
int32_t seq = 0;
status = sequence_value(session, session->sync_uuid, &seq);
status = sequence_value(session, sync_uuid, &seq);
if (status != PEP_OWN_SEQUENCE && status != PEP_STATUS_OK)
goto error;
@ -163,7 +171,7 @@ PEP_STATUS unicast_msg(
goto enomem;
free(_me->user_id);
_me->user_id = strndup(session->sync_uuid, 37);
_me->user_id = strndup(sync_uuid, 36);
assert(_me->user_id);
if (!_me->user_id)
goto enomem;
@ -200,8 +208,6 @@ PEP_STATUS unicast_msg(
payload = NULL;
free_identity(me);
me = NULL;
free_identity(partner);
partner = NULL;
message *_encrypted = NULL;
status = encrypt_message(session, _message, NULL, &_encrypted, PEP_enc_PEP, 0);
@ -220,7 +226,6 @@ error:
free(payload);
free_message(_message);
free_identity(me);
free_identity(partner);
return status;
}
@ -242,9 +247,7 @@ PEP_STATUS multicast_self_msg(
return status;
for (identity_list *_i = own_identities; _i && _i->ident; _i = _i->next) {
pEp_identity *me = identity_dup(_i->ident);
if (!me)
goto enomem;
pEp_identity *me = _i->ident;
// FIXME: no deep copy for multicast supported yet
DeviceGroup_Protocol_t *_msg = malloc(sizeof(DeviceGroup_Protocol_t));

@ -19,7 +19,7 @@ void free_DeviceGroup_Protocol_msg(DeviceGroup_Protocol_t *msg);
PEP_STATUS unicast_msg(
PEP_SESSION session,
Identity partner,
const Identity partner,
DeviceState_state state,
DeviceGroup_Protocol_t *msg
);

@ -46,12 +46,13 @@ PEP_STATUS sendBeacon(
goto error;
free_DeviceGroup_Protocol_msg(msg);
free_identity(partner);
return PEP_STATUS_OK;
enomem:
status = PEP_OUT_OF_MEMORY;
error:
free(partner);
free_identity(partner);
free_DeviceGroup_Protocol_msg(msg);
return status;
}
@ -89,12 +90,13 @@ PEP_STATUS sendHandshakeRequest(
goto error;
free_DeviceGroup_Protocol_msg(msg);
free_identity(partner);
return PEP_STATUS_OK;
enomem:
status = PEP_OUT_OF_MEMORY;
error:
free(partner);
free_identity(partner);
free_DeviceGroup_Protocol_msg(msg);
return status;
}
@ -140,12 +142,13 @@ PEP_STATUS sendGroupKeys(
free_identity_list(kl);
free_DeviceGroup_Protocol_msg(msg);
free_identity(partner);
return PEP_STATUS_OK;
enomem:
status = PEP_OUT_OF_MEMORY;
error:
free(partner);
free_identity(partner);
free_DeviceGroup_Protocol_msg(msg);
free_identity_list(kl);
return status;

@ -193,12 +193,13 @@ tstylesheet {
`` if "$name='GroupKeys'" |> free_identity_list(kl);
free_DeviceGroup_Protocol_msg(msg);
free_identity(partner);
return PEP_STATUS_OK;
enomem:
status = PEP_OUT_OF_MEMORY;
error:
free(partner);
free_identity(partner);
free_DeviceGroup_Protocol_msg(msg);
`` if "$name='GroupKeys'" |> free_identity_list(kl);
return status;

Loading…
Cancel
Save