fixed issue with bootstrap and write of security and server object

This commit is contained in:
Joakim Eriksson 2017-12-07 22:56:53 +01:00 committed by Niclas Finne
parent 04acccf9a0
commit 18cd711050
2 changed files with 50 additions and 27 deletions

View File

@ -88,6 +88,7 @@
#define RSC_ID(x) ((uint16_t)(x & 0xffff)) #define RSC_ID(x) ((uint16_t)(x & 0xffff))
#define RSC_READABLE(x) ((x & LWM2M_RESOURCE_READ) > 0) #define RSC_READABLE(x) ((x & LWM2M_RESOURCE_READ) > 0)
#define RSC_WRITABLE(x) ((x & LWM2M_RESOURCE_WRITE) > 0) #define RSC_WRITABLE(x) ((x & LWM2M_RESOURCE_WRITE) > 0)
#define RSC_UNSPECIFIED(x) ((x & LWM2M_RESOURCE_OP_MASK) == 0)
/* invalid instance ID - ffff object ID */ /* invalid instance ID - ffff object ID */
#define NO_INSTANCE 0xffffffff #define NO_INSTANCE 0xffffffff
@ -121,6 +122,15 @@ static lwm2m_object_instance_t *
next_object_instance(const lwm2m_context_t *context, lwm2m_object_t *object, lwm2m_object_instance_t *last); next_object_instance(const lwm2m_context_t *context, lwm2m_object_t *object, lwm2m_object_instance_t *last);
struct {
uint16_t object_id;
uint16_t instance_id;
uint16_t token_len;
uint8_t token[8]; /* max 8 bytes in COAP? */
/* in the future also a timeout */
} created;
COAP_HANDLER(lwm2m_handler, lwm2m_handler_callback); COAP_HANDLER(lwm2m_handler, lwm2m_handler_callback);
LIST(object_list); LIST(object_list);
LIST(generic_object_list); LIST(generic_object_list);
@ -923,7 +933,7 @@ create_instance(lwm2m_context_t *context, lwm2m_object_t *object)
static lwm2m_object_instance_t * static lwm2m_object_instance_t *
get_or_create_instance(lwm2m_context_t *ctx, lwm2m_object_t *object, get_or_create_instance(lwm2m_context_t *ctx, lwm2m_object_t *object,
uint8_t *created) uint16_t *c)
{ {
lwm2m_object_instance_t *instance; lwm2m_object_instance_t *instance;
@ -931,35 +941,57 @@ get_or_create_instance(lwm2m_context_t *ctx, lwm2m_object_t *object,
LOG_DBG("Instance: %u/%u/%u = %p\n", ctx->object_id, LOG_DBG("Instance: %u/%u/%u = %p\n", ctx->object_id,
ctx->object_instance_id, ctx->resource_id, instance); ctx->object_instance_id, ctx->resource_id, instance);
/* by default we assume that the instance is not created... so we set flag to zero */ /* by default we assume that the instance is not created... so we set flag to zero */
if(created != NULL) { if(c != NULL) {
*created = 0; *c = LWM2M_OBJECT_INSTANCE_NONE;
} }
if(instance == NULL) { if(instance == NULL) {
instance = create_instance(ctx, object); instance = create_instance(ctx, object);
if(instance != NULL) { if(instance != NULL) {
/* set created flag to one */ if(c != NULL) {
if(created != NULL) { *c = instance->instance_id;
*created = 1;
} }
created.instance_id = instance->instance_id;
created.object_id = instance->object_id;
created.token_len = created.token_len;
memcpy(&created.token, ctx->request->token, created.token_len);
} }
} }
return instance; return instance;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static int static int
check_write(lwm2m_object_instance_t *instance, int rid) check_write(lwm2m_context_t *ctx, lwm2m_object_instance_t *instance, int rid)
{ {
int i; int i;
if(instance->resource_ids != NULL && instance->resource_count > 0) { if(instance->resource_ids != NULL && instance->resource_count > 0) {
int count = instance->resource_count; int count = instance->resource_count;
for(i = 0; i < count; i++) { for(i = 0; i < count; i++) {
if(RSC_ID(instance->resource_ids[i]) == rid && if(RSC_ID(instance->resource_ids[i]) == rid) {
RSC_WRITABLE(instance->resource_ids[i])) { if(RSC_WRITABLE(instance->resource_ids[i])) {
/* yes - writable */ /* yes - writable */
return 1; return 1;
}
if(RSC_UNSPECIFIED(instance->resource_ids[i]) &&
created.instance_id == instance->instance_id &&
created.object_id == instance->object_id &&
memcmp(&created.token, ctx->request->token,
created.token_len) == 0) {
/* yes - writeable at create - never otherwise - sec / srv */
return 1;
}
break;
} }
} }
} }
/* Resource did not exist... - Ignore to avoid problems. */
if(created.instance_id == instance->instance_id &&
created.object_id == instance->object_id &&
memcmp(&created.token, ctx->request->token,
created.token_len) == 0) {
LOG_DBG("Ignoring resource %u/%u/%d in newly created instance\n",
created.object_id, created.instance_id, rid);
return 1;
}
return 0; return 0;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
@ -968,7 +1000,7 @@ process_tlv_write(lwm2m_context_t *ctx, lwm2m_object_t *object,
int rid, uint8_t *data, int len) int rid, uint8_t *data, int len)
{ {
lwm2m_object_instance_t *instance; lwm2m_object_instance_t *instance;
uint8_t created = 0; uint16_t created = LWM2M_OBJECT_INSTANCE_NONE;
ctx->inbuf->buffer = data; ctx->inbuf->buffer = data;
ctx->inbuf->pos = 0; ctx->inbuf->pos = 0;
ctx->inbuf->size = len; ctx->inbuf->size = len;
@ -978,7 +1010,7 @@ process_tlv_write(lwm2m_context_t *ctx, lwm2m_object_t *object,
ctx->object_instance_id, ctx->resource_id); ctx->object_instance_id, ctx->resource_id);
instance = get_or_create_instance(ctx, object, &created); instance = get_or_create_instance(ctx, object, &created);
if(instance != NULL && instance->callback != NULL) { if(instance != NULL && instance->callback != NULL) {
if(created || check_write(instance, rid)) { if(check_write(ctx, instance, rid)) {
return instance->callback(instance, ctx); return instance->callback(instance, ctx);
} else { } else {
return LWM2M_STATUS_OPERATION_NOT_ALLOWED; return LWM2M_STATUS_OPERATION_NOT_ALLOWED;
@ -1001,6 +1033,8 @@ perform_multi_resource_write_op(lwm2m_object_t *object,
uint8_t *inbuf; uint8_t *inbuf;
int inpos; int inpos;
size_t insize; size_t insize;
int i;
uint16_t created = LWM2M_OBJECT_INSTANCE_NONE;
olv = ctx->level; olv = ctx->level;
inbuf = ctx->inbuf->buffer; inbuf = ctx->inbuf->buffer;
@ -1011,8 +1045,6 @@ perform_multi_resource_write_op(lwm2m_object_t *object,
struct json_data json; struct json_data json;
while(lwm2m_json_next_token(ctx, &json)) { while(lwm2m_json_next_token(ctx, &json)) {
int i;
uint8_t created = 0;
LOG_DBG("JSON: '"); LOG_DBG("JSON: '");
for(i = 0; i < json.name_len; i++) { for(i = 0; i < json.name_len; i++) {
LOG_DBG_("%c", json.name[i]); LOG_DBG_("%c", json.name[i]);
@ -1022,6 +1054,7 @@ perform_multi_resource_write_op(lwm2m_object_t *object,
LOG_DBG_("%c", json.value[i]); LOG_DBG_("%c", json.value[i]);
} }
LOG_DBG_("'\n"); LOG_DBG_("'\n");
if(json.name[0] == 'n') { if(json.name[0] == 'n') {
i = parse_path((const char *) json.value, json.value_len, &oid, &iid, &rid); i = parse_path((const char *) json.value, json.value_len, &oid, &iid, &rid);
if(i > 0) { if(i > 0) {
@ -1053,7 +1086,7 @@ perform_multi_resource_write_op(lwm2m_object_t *object,
if(mode == MODE_READY) { if(mode == MODE_READY) {
/* allow write if just created - otherwise not */ /* allow write if just created - otherwise not */
if(!created && !check_write(instance, ctx->resource_id)) { if(!check_write(ctx, instance, ctx->resource_id)) {
return LWM2M_STATUS_OPERATION_NOT_ALLOWED; return LWM2M_STATUS_OPERATION_NOT_ALLOWED;
} }
if(instance->callback(instance, ctx) != LWM2M_STATUS_OK) { if(instance->callback(instance, ctx) != LWM2M_STATUS_OK) {
@ -1425,17 +1458,6 @@ lwm2m_handler_callback(coap_message_t *request, coap_message_t *response,
} }
instance = get_instance_by_context(&context, &object); instance = get_instance_by_context(&context, &object);
if(instance == NULL
&& object != NULL
&& coap_get_method_type(request) == METHOD_PUT
&& context.level == 2) {
/* ALLOW generic instance if CREATE / WRITE*/
instance = create_instance(&context, object);
if(instance == NULL) {
LOG_WARN("failed to create instance %u/%u\n",
context.object_id, context.object_instance_id);
}
}
/* /*
* Check if we found either instance or object. Instance means we found an * Check if we found either instance or object. Instance means we found an

View File

@ -58,6 +58,7 @@
#define LWM2M_RESOURCE_READ 0x10000 #define LWM2M_RESOURCE_READ 0x10000
#define LWM2M_RESOURCE_WRITE 0x20000 #define LWM2M_RESOURCE_WRITE 0x20000
#define LWM2M_RESOURCE_EXECUTE 0x40000 #define LWM2M_RESOURCE_EXECUTE 0x40000
#define LWM2M_RESOURCE_OP_MASK 0x70000
/* The resource id type of lwm2m objects - 16 bits for the ID - the rest /* The resource id type of lwm2m objects - 16 bits for the ID - the rest
is flags */ is flags */