aboutsummaryrefslogtreecommitdiffstats
path: root/src/agl-forgerock.c
diff options
context:
space:
mode:
authorRaquel Medina <raquel.medina@konsulko.com>2019-02-15 17:10:40 +0200
committerRaquel Medina <raquel.medina@konsulko.com>2019-02-18 05:41:52 +0200
commit8f64868f9edd313eaee9a73abc3f79110da5f132 (patch)
treef3ac89b3a3dfa2a201186e93cb7c00357d29fec3 /src/agl-forgerock.c
parentd164f55eb32887db04fd2b263345a93b6f0d87e8 (diff)
binding: identity: fix segfault & update to v3 forgerock binding calls
On user login via nfc, the identity service segfaults on nfc event processing. Fix segfault, update forgerock compilation unit to use binding V3 call methods and review the identity agent baseline to remove unused code / tidy up. Bug-AGL: SPEC-2158 Change-Id: Ic87e630e9d028ba22937468375631b8e908011f8 Signed-off-by: Raquel Medina <raquel.medina@konsulko.com>
Diffstat (limited to 'src/agl-forgerock.c')
-rw-r--r--src/agl-forgerock.c105
1 files changed, 60 insertions, 45 deletions
diff --git a/src/agl-forgerock.c b/src/agl-forgerock.c
index 97cc4b9..90c2e8f 100644
--- a/src/agl-forgerock.c
+++ b/src/agl-forgerock.c
@@ -21,34 +21,36 @@
#include <json-c/json.h>
-#define AFB_BINDING_VERSION 2
+#define AFB_BINDING_VERSION 3
#include <afb/afb-binding.h>
+#include "agl-identity-common.h"
#include "oidc-agent.h"
#include "aia-get.h"
-#ifndef NULL
-#define NULL 0
-#endif
-
static int expiration_delay = 5;
-static const char default_endpoint[] = "https://agl-graphapi.forgerocklabs.org/getuserprofilefromtoken";
+static const char default_endpoint[] =
+ "https://agl-graphapi.forgerocklabs.org/getuserprofilefromtoken";
+
static const char *oidc_name;
static char *endpoint;
static void (*onloaded)(struct json_object *data, const char *error);
+
/***** configuration ********************************************/
-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;
char *p;
- s = conf && json_object_object_get_ex(conf, name, &v) ? json_object_get_string(v) : def;
+ s = conf && json_object_object_get_ex(conf, name, &v) ?
+ json_object_get_string(v) : def;
p = *value;
if (s && p != s) {
*value = strdup(s);
@@ -56,24 +58,27 @@ static void confsetstr(struct json_object *conf, const char *name, char **value,
}
}
-static void confsetint(struct json_object *conf, const char *name, int *value, int def)
+static void confsetint(struct json_object *conf,
+ const char *name, int *value, int def)
{
struct json_object *v;
- *value = conf && json_object_object_get_ex(conf, name, &v) ? json_object_get_int(v) : def;
+ *value = conf && json_object_object_get_ex(conf, name, &v) ?
+ json_object_get_int(v) : def;
}
static void confsetoidc(struct json_object *conf, const char *name)
{
struct json_object *idp, *appli;
- if (conf
- && json_object_object_get_ex(conf, "idp", &idp)
- && json_object_object_get_ex(conf, "appli", &appli)) {
- if (oidc_idp_set(name, idp) && oidc_appli_set(name, name, appli, 1)) {
+ if (!conf ||
+ !json_object_object_get_ex(conf, "idp", &idp) ||
+ !json_object_object_get_ex(conf, "appli", &appli))
+ return;
+
+ if (oidc_idp_set(name, idp) &&
+ oidc_appli_set(name, name, appli, 1))
oidc_name = name;
- }
- }
}
/****************************************************************/
@@ -84,7 +89,8 @@ static void loaded(struct json_object *data, const char *error)
onloaded(data, error);
}
-static void downloaded(void *closure, int status, const void *buffer, size_t size)
+static void downloaded(void *closure, int status,
+ const void *buffer, size_t size)
{
struct json_object *object, *subobj;
struct json_object *objkey = closure;
@@ -97,14 +103,15 @@ static void downloaded(void *closure, int status, const void *buffer, size_t siz
if (status == 0 && !buffer) {
AFB_ERROR("discarded");
loaded(NULL, "discarded");
- goto end; /* discarded */
+ goto ignore;
}
/* scan for the status */
if (status == 0 || !buffer) {
- AFB_ERROR("uploading %s failed %s", url ? : "?", (const char*)buffer ? : "");
+ AFB_ERROR("uploading %s failed %s", url ? : "?",
+ (const char*)buffer ? : "");
loaded(NULL, "failed");
- goto end;
+ goto ignore;
}
/* get the object */
@@ -132,7 +139,7 @@ static void downloaded(void *closure, int status, const void *buffer, size_t siz
AFB_INFO("unrecognized key for %s", url ? : "?");
json_object_put(object);
loaded(NULL, "malformed");
- goto end;
+ goto ignore;
}
// Save the profile to the database
@@ -140,11 +147,14 @@ static void downloaded(void *closure, int status, const void *buffer, size_t siz
struct json_object* record = json_object_new_object();
json_object_object_add(record, "key", objkey);
json_object_object_add(record, "value", json_object_get(subobj));
- afb_service_call_sync("persistence", "update", record, &dbr);
+ afb_api_call_sync(get_local_api(), "persistence", "update",
+ record, &dbr, NULL, NULL);
loaded(subobj, NULL);
json_object_put(object);
-end:
+ json_object_put(dbr);
+
+ ignore:
json_object_put(objkey);
}
@@ -158,7 +168,8 @@ void agl_forgerock_setconfig(struct json_object *conf)
AFB_NOTICE("Forgerock endpoint is: %s", endpoint);
}
-void agl_forgerock_setcb(void (*callback)(struct json_object *data, const char *error))
+void agl_forgerock_setcb(
+ void (*callback)(struct json_object *data, const char *error))
{
onloaded = callback;
}
@@ -174,35 +185,39 @@ void reply_from_db(void* closure, int status, struct json_object* result)
struct json_object* tmp;
json_object_object_get_ex(result, "response", &tmp);
json_object_object_get_ex(tmp, "value", &tmp);
- AFB_NOTICE("User profile retrieved from persistence: %s", json_object_to_json_string(tmp));
+ AFB_NOTICE("User profile retrieved from persistence: %s",
+ json_object_to_json_string(tmp));
loaded(json_object_get(tmp), NULL);
}
-void agl_forgerock_download_request(const char *vin, const char *kind, const char *key)
+void agl_forgerock_download_request(const char *vin,
+ const char *kind,
+ const char *key)
{
int rc;
char *url;
- rc = asprintf(&url, "%s?vin=%s&kind=%s&keytoken=%s", endpoint, vin, kind, key);
- if (rc >= 0)
- {
- struct json_object* obj = json_object_new_object();
- json_object_object_add(obj, "url", json_object_new_string(url));
- json_object_object_add(obj, "vin", json_object_new_string(vin));
- json_object_object_add(obj, "kind", json_object_new_string(kind));
- json_object_object_add(obj, "key", json_object_new_string(key));
-
- // Async get from database and from forgerock
- struct json_object* key = json_object_new_object();
- json_object_object_add(key, "key", json_object_get(obj));
- afb_service_call("persistence", "read", key, reply_from_db, NULL);
-
- // Async get from forgerock
- aia_get(url, expiration_delay, oidc_name, oidc_name, downloaded, obj);
- free(url);
- }
- else
+ rc = asprintf(&url, "%s?vin=%s&kind=%s&keytoken=%s",
+ endpoint, vin, kind, key);
+ if (rc < 0) {
AFB_ERROR("out of memory");
+ return;
+ }
+
+ struct json_object* obj = json_object_new_object();
+ json_object_object_add(obj, "url", json_object_new_string(url));
+ json_object_object_add(obj, "vin", json_object_new_string(vin));
+ json_object_object_add(obj, "kind", json_object_new_string(kind));
+ json_object_object_add(obj, "key", json_object_new_string(key));
+
+ // Async get from database and from forgerock
+ struct json_object* key_obj = json_object_new_object();
+ json_object_object_add(key_obj, "key", json_object_get(obj));
+ afb_api_call(get_local_api(), "persistence", "read", key_obj, reply_from_db, NULL);
+
+ // Async get from forgerock
+ aia_get(url, expiration_delay, oidc_name, oidc_name, downloaded, obj);
+ free(url);
}
/* vim: set colorcolumn=80: */