diff options
author | 2016-05-23 14:26:54 +0200 | |
---|---|---|
committer | 2016-05-23 14:27:09 +0200 | |
commit | fca2e14e1d57d7b89d1a6de07075cc0e6e157ca7 (patch) | |
tree | 479bd5382cb943356c32f12890991afb1d1ebcf4 /src | |
parent | e6d40a8447eff5e1be00ea35715092876e0520fa (diff) |
Setting and checking LOA
Change-Id: I02c3795c6e212491605861228eb60b731be78537
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
Diffstat (limited to 'src')
-rw-r--r-- | src/afb-api-so.c | 20 | ||||
-rw-r--r-- | src/afb-context.c | 11 | ||||
-rw-r--r-- | src/afb-context.h | 2 |
3 files changed, 26 insertions, 7 deletions
diff --git a/src/afb-api-so.c b/src/afb-api-so.c index 320834f7..9ab3e621 100644 --- a/src/afb-api-so.c +++ b/src/afb-api-so.c @@ -97,9 +97,9 @@ static void call_check(struct afb_req req, struct afb_context *context, const st { struct monitoring data; - int stag = (int)(verb->session & AFB_SESSION_MASK); + int stag = (int)verb->session; - if (stag != AFB_SESSION_NONE) { + if (stag != (AFB_SESSION_CREATE|AFB_SESSION_CLOSE|AFB_SESSION_RENEW|AFB_SESSION_CHECK|AFB_SESSION_LOA_EQ)) { if (!afb_context_check(context)) { afb_context_close(context); afb_req_fail(req, "failed", "invalid token's identity"); @@ -124,6 +124,22 @@ static void call_check(struct afb_req req, struct afb_context *context, const st afb_context_close(context); } + if ((stag & AFB_SESSION_LOA_GE) != 0) { + int loa = (stag >> AFB_SESSION_LOA_SHIFT) & AFB_SESSION_LOA_MASK; + if (!afb_context_check_loa(context, loa)) { + afb_req_fail(req, "failed", "invalid LOA"); + return; + } + } + + if ((stag & AFB_SESSION_LOA_LE) != 0) { + int loa = (stag >> AFB_SESSION_LOA_SHIFT) & AFB_SESSION_LOA_MASK; + if (afb_context_check_loa(context, loa + 1)) { + afb_req_fail(req, "failed", "invalid LOA"); + return; + } + } + data.req = req; data.action = verb->callback; afb_sig_monitor((void*)monitored_call, &data, api_timeout); diff --git a/src/afb-context.c b/src/afb-context.c index a7010dbb..0492ecbf 100644 --- a/src/afb-context.c +++ b/src/afb-context.c @@ -138,16 +138,19 @@ int afb_context_check_loa(struct afb_context *context, unsigned loa) return context->loa_in >= loa; } -void afb_context_change_loa(struct afb_context *context, unsigned loa) +int afb_context_change_loa(struct afb_context *context, unsigned loa) { - assert(context->validated); + if (!context->validated || loa > 7) + return 0; - if (loa == context->loa_in) + if (loa == context->loa_in && !context->loa_changed) context->loa_changing = 0; else { - context->loa_changing = 1; context->loa_out = loa & 7; + context->loa_changing = 1; + context->loa_changed = 0; } + return 1; } diff --git a/src/afb-context.h b/src/afb-context.h index 3f4301ec..27a262ac 100644 --- a/src/afb-context.h +++ b/src/afb-context.h @@ -54,5 +54,5 @@ extern void afb_context_close(struct afb_context *context); extern void afb_context_refresh(struct afb_context *context); extern int afb_context_check(struct afb_context *context); extern int afb_context_check_loa(struct afb_context *context, unsigned loa); -extern void afb_context_change_loa(struct afb_context *context, unsigned loa); +extern int afb_context_change_loa(struct afb_context *context, unsigned loa); |