diff options
author | Raquel Medina <raquel.medina@konsulko.com> | 2018-11-23 04:00:22 +0200 |
---|---|---|
committer | Raquel Medina <raquel.medina@konsulko.com> | 2018-11-23 14:39:17 +0200 |
commit | 650c835ad912d9ac05eb10aab9d32828603a0709 (patch) | |
tree | 659c8b1257150fa80a51e46ce9b163bd05a746d8 /src/agl-identity-binding.c | |
parent | 3dd3409bec591d534bc3f9060770918478d4ce76 (diff) |
binding: identity-agent: update binding to v3
Bug-AGL: SPEC-1959
This change was motivated by a segmentation fault on the nfc
service api, the nfc binding is v3 and updating the identity
binding to this version too is part of the fix. The changes
under this commit simply
- update binding artifacts from v2 to v3
- use json_objects typedef (opaque objects) for clarity
Change-Id: Iab6f53794f915d13d9cb3e198e2c3d24c13f879d
Signed-off-by: Raquel Medina <raquel.medina@konsulko.com>
Diffstat (limited to 'src/agl-identity-binding.c')
-rw-r--r-- | src/agl-identity-binding.c | 159 |
1 files changed, 89 insertions, 70 deletions
diff --git a/src/agl-identity-binding.c b/src/agl-identity-binding.c index 20a9384..70c195c 100644 --- a/src/agl-identity-binding.c +++ b/src/agl-identity-binding.c @@ -24,15 +24,15 @@ #include <json-c/json.h> -#define AFB_BINDING_VERSION 2 +#define AFB_BINDING_VERSION 3 #include <afb/afb-binding.h> #include "agl-forgerock.h" -static struct afb_event event; - -static struct json_object *current_identity; +static afb_event_t event; +static json_object *current_identity; +/* default vin corresponds to Toyota Camry 2016, 429 */ static const char default_vin[] = "4T1BF1FK5GU260429"; static char *vin; @@ -42,7 +42,7 @@ static struct json_object *readjson(int fd) { char *buffer; struct stat s; - struct json_object *result = NULL; + json_object *result = NULL; int rc; rc = fstat(fd, &s); @@ -50,11 +50,11 @@ static struct json_object *readjson(int fd) buffer = alloca((size_t)(s.st_size)+1); if (read(fd, buffer, (size_t)s.st_size) == (ssize_t)s.st_size) { buffer[s.st_size] = 0; - //AFB_NOTICE("Config file: %s", buffer); + //AFB_API_NOTICE(afbBindingV3root, "Config file: %s", buffer); result = json_tokener_parse(buffer); //if (!result) //{ - // AFB_ERROR("Config file is not a valid JSON: %s", json_tokener_error_desc(json_tokener_get_error(NULL))); + // AFB_API_ERROR(afbBindingV3root, "Config file is not a valid JSON: %s", json_tokener_error_desc(json_tokener_get_error(NULL))); //} } } @@ -66,7 +66,7 @@ static struct json_object *readjson(int fd) static struct json_object *get_global_config(const char *name, const char *locale) { int fd = afb_daemon_rootdir_open_locale(name, O_RDONLY, locale); - if (fd < 0) AFB_ERROR("Config file not found: %s", name); + if (fd < 0) AFB_API_ERROR(afbBindingV3root, "Config file not found: %s", name); return fd < 0 ? NULL : readjson(fd); } @@ -76,7 +76,8 @@ static struct json_object *get_local_config(const char *name) return fd < 0 ? NULL : readjson(fd); } -static void confsetstr(struct json_object *conf, const char *name, char **value, const char *def) +static void confsetstr(struct json_object *conf, const char *name, + char **value, const char *def) { struct json_object *v; const char *s; @@ -133,7 +134,7 @@ static void do_login(struct json_object *desc) const char* b = json_object_to_json_string(desc); if (strcmp(a, b) == 0) { - AFB_NOTICE("Reloging of the same user."); + AFB_API_NOTICE(afbBindingV3root, "Reloging of the same user."); return; // Switching from one user to the same user -> do nothing } } @@ -141,7 +142,8 @@ static void do_login(struct json_object *desc) struct json_object *object; /* switching the user */ - AFB_INFO("Switching to user %s", desc ? json_object_to_json_string(desc) : "null"); + AFB_API_INFO(afbBindingV3root, "Switching to user %s", + desc ? json_object_to_json_string(desc) : "null"); object = current_identity; current_identity = json_object_get(desc); json_object_put(object); @@ -155,7 +157,7 @@ static void do_logout() { struct json_object *object; - AFB_INFO("Switching to no user"); + AFB_API_INFO(afbBindingV3root, "Switching to no user"); object = current_identity; current_identity = 0; json_object_put(object); @@ -166,7 +168,7 @@ static void do_logout() static void on_forgerock_data(struct json_object *data, const char *error) { if (error) { - AFB_ERROR("Can't get data: %s", error); + AFB_API_ERROR(afbBindingV3root, "Can't get data: %s", error); } else { do_login(data); } @@ -174,70 +176,76 @@ static void on_forgerock_data(struct json_object *data, const char *error) /****************************************************************/ -static void subscribe (struct afb_req request) +static void subscribe (afb_req_t request) { - int rc; - - rc = afb_req_subscribe(request, event); - if (rc < 0) - afb_req_fail(request, "failed", "subscribtion failed"); + if (afb_req_subscribe(request, event)) { + AFB_REQ_ERROR(request, "subscribe error"); + afb_req_reply(request, NULL, "failed", "subscribtion failed"); + } else - afb_req_success(request, NULL, NULL); + afb_req_reply(request, NULL, NULL, NULL); } -static void unsubscribe (struct afb_req request) +static void unsubscribe (afb_req_t request) { afb_req_unsubscribe(request, event); - afb_req_success(request, NULL, NULL); + afb_req_reply(request, NULL, NULL, NULL); } -static void logout (struct afb_req request) +static void logout (afb_req_t request) { do_logout(); - afb_req_success(request, NULL, NULL); + afb_req_reply(request, NULL, NULL, NULL); } -static void fake_login (struct afb_req request) +static void fake_login (afb_req_t request) { struct json_object *desc = afb_req_json(request); do_logout(); if (desc) do_login(desc); - afb_req_success(request, NULL, NULL); + afb_req_reply(request, NULL, NULL, NULL); } -static void get (struct afb_req request) +static void get (afb_req_t request) { - afb_req_success(request, json_object_get(current_identity), NULL); + afb_req_reply(request, json_object_get(current_identity), NULL, NULL); } -static void on_nfc_subscribed(void *closure, int status, struct json_object *result) +static void on_nfc_subscribed(void *closure, struct json_object *result, + const char *error, const char *info, + afb_api_t api) { - if(status) - AFB_ERROR("Failed to subscribe to nfc events."); + if (error) + AFB_API_ERROR(api, "Failed to subscribe to nfc events."); + else + AFB_API_DEBUG(api, "Subscribed to nfc events."); } -static int service_init() +static int service_init(afb_api_t api) { struct json_object *jrequest = NULL; agl_forgerock_setcb(on_forgerock_data); - event = afb_daemon_make_event("event"); - if (!afb_event_is_valid(event)) - return -1; + event = afb_api_make_event(api, "event"); + if (!afb_event_is_valid(event)) { + AFB_API_ERROR(api, "Failed to create event"); + return -1; + } + readconfig(); - if (afb_daemon_require_api("nfc", 1)) + if (afb_api_require_api(api, "nfc", 1)) return -1; - if (afb_daemon_require_api("persistence", 1)) + if (afb_api_require_api(api, "persistence", 1)) return -1; jrequest = json_object_new_object(); json_object_object_add(jrequest, "value", json_object_new_string("presence")); - afb_service_call("nfc", "subscribe", jrequest, on_nfc_subscribed, NULL); + afb_api_call(api, "nfc", "subscribe", jrequest, on_nfc_subscribed, NULL); return 0; } @@ -250,25 +258,29 @@ static void on_nfc_target_add(struct json_object *object) if (json_object_object_get_ex(object, "uid", &json_uid)) { uid = json_object_get_string(json_uid); - AFB_NOTICE("nfc tag detected, call forgerock with vincode=%s and key=%s", vin ? vin : default_vin, uid); + AFB_API_NOTICE(afbBindingV3root, + "nfc tag detected, call forgerock with vincode=%s and key=%s", + vin ? vin : default_vin, uid); send_event_object("incoming", uid, uid); agl_forgerock_download_request(vin ? vin : default_vin, "nfc", uid); } - else AFB_ERROR("nfc target add event is received but no UID found: %s", json_object_to_json_string(object)); + else AFB_API_ERROR(afbBindingV3root, + "nfc target add event is received but no UID found: %s", + json_object_to_json_string(object)); } -static void onevent(const char *event, struct json_object *object) +static void onevent(afb_api_t api, const char *event, struct json_object *object) { - AFB_NOTICE("Received event: %s", event); + AFB_API_NOTICE(api, "Received event: %s", event); if (!strcmp("nfc/presence", event)) { on_nfc_target_add(object); return; } - AFB_WARNING("Unhandled event: %s", event); + AFB_API_WARNING(api, "Unhandled event: %s", event); } -static void fake_auth(struct afb_req req) +static void fake_auth(afb_req_t req) { struct json_object* req_object; struct json_object* kind_object; @@ -276,41 +288,48 @@ static void fake_auth(struct afb_req req) req_object = afb_req_json(req); - if (!json_object_object_get_ex(req_object, "kind", &kind_object)) + if ((!json_object_object_get_ex(req_object, "kind", &kind_object)) || + (!json_object_object_get_ex(req_object, "key", &key_object))) { - afb_req_fail(req, "Missing arg: kind", NULL); - return; + AFB_REQ_ERROR(req, "bad request: %s", + json_object_get_string(req_object)); + afb_req_reply(req, NULL, "Missing arg", NULL); } + else { + const char* kind = json_object_get_string(kind_object); + const char* key = json_object_get_string(key_object); - if (!json_object_object_get_ex(req_object, "key", &key_object)) - { - afb_req_fail(req, "Missing arg: key", NULL); - return; - } - - const char* kind = json_object_get_string(kind_object); - const char* key = json_object_get_string(key_object); + AFB_REQ_NOTICE(req, "kind: %s, key: %s", kind, key); + + send_event_object("incoming", key, key); + agl_forgerock_download_request(vin ? vin : default_vin, kind, key); - send_event_object("incoming", key, key); - agl_forgerock_download_request(vin ? vin : default_vin, kind, key); - - afb_req_success(req, NULL, "fake auth success!"); + afb_req_reply(req, NULL, NULL, "fake auth success!"); + } } -// NOTE: this sample does not use session to keep test a basic as possible -// in real application most APIs should be protected with AFB_SESSION_CHECK -static const struct afb_verb_v2 verbs[]= +/* + * NOTE: this sample does not use session to keep the test as basic as possible + * in real application most APIs should be protected with AFB_SESSION_CHECK + */ +const afb_verb_t verbs[]= { - {"subscribe" , subscribe , NULL, "subscribe to events" , AFB_SESSION_NONE }, - {"unsubscribe", unsubscribe , NULL, "unsubscribe to events" , AFB_SESSION_NONE }, - {"fake-login" , fake_login , NULL, "fake a login" , AFB_SESSION_NONE }, - {"logout" , logout , NULL, "log the current user out", AFB_SESSION_NONE }, - {"get" , get , NULL, "get data" , AFB_SESSION_NONE }, - {"fake-auth" , fake_auth , NULL, "fake an authentication" , AFB_SESSION_NONE }, - {NULL} + {.verb = "subscribe" , .callback = subscribe , .auth = NULL, + .info = "subscribe to events" , .session = AFB_SESSION_NONE }, + {.verb = "unsubscribe", .callback = unsubscribe , .auth = NULL, + .info = "unsubscribe to events" , .session = AFB_SESSION_NONE }, + {.verb = "fake-login" , .callback = fake_login , .auth = NULL, + .info = "fake a login" , .session = AFB_SESSION_NONE }, + {.verb = "logout" , .callback = logout , .auth = NULL, + .info = "log the current user out", .session = AFB_SESSION_NONE }, + {.verb = "get" , .callback = get , .auth = NULL, + .info = "get data" , .session = AFB_SESSION_NONE }, + {.verb = "fake-auth" , .callback = fake_auth , .auth = NULL, + .info = "fake an authentication" , .session = AFB_SESSION_NONE }, + {NULL} }; -const struct afb_binding_v2 afbBindingV2 = +const afb_binding_t afbBindingExport = { .api = "identity", .specification = NULL, |