summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/agl-forgerock.c105
-rw-r--r--src/agl-identity-binding.c245
-rw-r--r--src/agl-identity-common.h28
-rw-r--r--src/aia-get.c20
-rw-r--r--src/curl-wrap.c6
-rw-r--r--src/curl-wrap.h3
-rw-r--r--src/test-aia-uds-bluez.c65
7 files changed, 239 insertions, 233 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: */
diff --git a/src/agl-identity-binding.c b/src/agl-identity-binding.c
index 70c195c..f246ea9 100644
--- a/src/agl-identity-binding.c
+++ b/src/agl-identity-binding.c
@@ -16,6 +16,7 @@
*/
#define _GNU_SOURCE
+#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
@@ -29,15 +30,21 @@
#include "agl-forgerock.h"
+static afb_api_t this_api;
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;
-/***** configuration ********************************************/
+afb_api_t get_local_api(void)
+{
+ return this_api;
+}
+/***** configuration from file **********************************/
static struct json_object *readjson(int fd)
{
char *buffer;
@@ -50,12 +57,7 @@ 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_API_NOTICE(afbBindingV3root, "Config file: %s", buffer);
result = json_tokener_parse(buffer);
- //if (!result)
- //{
- // AFB_API_ERROR(afbBindingV3root, "Config file is not a valid JSON: %s", json_tokener_error_desc(json_tokener_get_error(NULL)));
- //}
}
}
close(fd);
@@ -66,7 +68,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_API_ERROR(afbBindingV3root, "Config file not found: %s", name);
+ if (fd < 0) AFB_API_ERROR(this_api, "Config file not found: %s", name);
return fd < 0 ? NULL : readjson(fd);
}
@@ -83,7 +85,8 @@ static void confsetstr(struct json_object *conf, const char *name,
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);
@@ -108,11 +111,16 @@ static void readconfig()
/****************************************************************/
-static struct json_object *make_event_object(const char *name, const char *id, const char *nick)
+static struct json_object *make_event_object(const char *name,
+ const char *id,
+ const char *nick)
{
- struct json_object *object = json_object_new_object();
+ struct json_object *object;
- /* TODO: errors */
+ if (!name || !id )
+ return NULL;
+
+ object = json_object_new_object();
json_object_object_add(object, "eventName", json_object_new_string(name));
json_object_object_add(object, "accountid", json_object_new_string(id));
if (nick)
@@ -127,39 +135,44 @@ static int send_event_object(const char *name, const char *id, const char *nick)
static void do_login(struct json_object *desc)
{
- if (current_identity == NULL && desc == NULL) return; // Switching from NULL to NULL -> do nothing
+ /* if switching from NULL to NULL -> do nothing */
+ if (current_identity == NULL && desc == NULL) return;
+
+ /* if switching from one user to the same user -> do nothing */
if (current_identity && desc)
{
const char* a = json_object_to_json_string(current_identity);
const char* b = json_object_to_json_string(desc);
if (strcmp(a, b) == 0)
{
- AFB_API_NOTICE(afbBindingV3root, "Reloging of the same user.");
- return; // Switching from one user to the same user -> do nothing
+ AFB_API_NOTICE(this_api, "re-logging the same user!");
+ return;
}
}
struct json_object *object;
- /* switching the user */
- AFB_API_INFO(afbBindingV3root, "Switching to user %s",
+ /* switching to a different user */
+ AFB_API_INFO(this_api, "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);
if (!json_object_object_get_ex(desc, "name", &object))
- object = 0;
- send_event_object("login", !object ? "null" : json_object_get_string(object)? : "?", 0);
+ object = NULL;
+ send_event_object("login",
+ !object ? "null" : json_object_get_string(object)? : "?",
+ 0);
}
static void do_logout()
{
struct json_object *object;
- AFB_API_INFO(afbBindingV3root, "Switching to no user");
+ AFB_API_INFO(this_api, "Switching to no user");
object = current_identity;
- current_identity = 0;
+ current_identity = NULL;
json_object_put(object);
send_event_object("logout", "null", 0);
@@ -168,50 +181,12 @@ static void do_logout()
static void on_forgerock_data(struct json_object *data, const char *error)
{
if (error) {
- AFB_API_ERROR(afbBindingV3root, "Can't get data: %s", error);
+ AFB_API_ERROR(this_api, "Can't get data: %s", error);
} else {
do_login(data);
}
}
-/****************************************************************/
-
-static void subscribe (afb_req_t request)
-{
- if (afb_req_subscribe(request, event)) {
- AFB_REQ_ERROR(request, "subscribe error");
- afb_req_reply(request, NULL, "failed", "subscribtion failed");
- }
- else
- afb_req_reply(request, NULL, NULL, NULL);
-}
-
-static void unsubscribe (afb_req_t request)
-{
- afb_req_unsubscribe(request, event);
- afb_req_reply(request, NULL, NULL, NULL);
-}
-
-static void logout (afb_req_t request)
-{
- do_logout();
- afb_req_reply(request, NULL, NULL, NULL);
-}
-
-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_reply(request, NULL, NULL, NULL);
-}
-
-static void get (afb_req_t request)
-{
- afb_req_reply(request, json_object_get(current_identity), NULL, NULL);
-}
-
static void on_nfc_subscribed(void *closure, struct json_object *result,
const char *error, const char *info,
afb_api_t api)
@@ -225,48 +200,77 @@ static void on_nfc_subscribed(void *closure, struct json_object *result,
static int service_init(afb_api_t api)
{
struct json_object *jrequest = NULL;
+ int ret;
- agl_forgerock_setcb(on_forgerock_data);
+ this_api = api;
- event = afb_api_make_event(api, "event");
- if (!afb_event_is_valid(event)) {
- AFB_API_ERROR(api, "Failed to create event");
- return -1;
+ ret = afb_api_require_api(this_api, "nfc", 1);
+ if (ret < 0) {
+ AFB_API_ERROR(this_api, "nfc api not available");
+ goto out;
}
-
- readconfig();
- if (afb_api_require_api(api, "nfc", 1))
- return -1;
+ ret = afb_api_require_api(this_api, "persistence", 1);
+ if (ret < 0) {
+ AFB_API_ERROR(this_api, "persistence api not available");
+ goto out;
+ }
- if (afb_api_require_api(api, "persistence", 1))
- return -1;
+ event = afb_api_make_event(this_api, "event");
+ if (!afb_event_is_valid(event)) {
+ AFB_API_ERROR(this_api, "Failed to create event");
+ ret = -EINVAL;
+ goto out;
+ }
+
+ readconfig();
+ agl_forgerock_setcb(on_forgerock_data);
jrequest = json_object_new_object();
json_object_object_add(jrequest, "value", json_object_new_string("presence"));
-
afb_api_call(api, "nfc", "subscribe", jrequest, on_nfc_subscribed, NULL);
- return 0;
+out:
+ return ret;
}
static void on_nfc_target_add(struct json_object *object)
{
- struct json_object * json_uid;
+ struct json_object *json_status;
+ struct json_object *json_uid;
const char *uid;
+
+ if (!object) {
+ AFB_API_ERROR(this_api, "nfc/presence empty args");
+ goto out;
+ }
+
+ if (!json_object_object_get_ex(object, "status", &json_status)) {
+ AFB_API_ERROR(this_api, "nfc/presence missing status");
+ goto out;
+ }
+
+ if (strncmp(json_object_get_string(json_status), "detected", 8)) {
+ AFB_API_WARNING(this_api, "Not a tag detected event!");
+ goto out;
+ }
+
if (json_object_object_get_ex(object, "uid", &json_uid))
{
uid = json_object_get_string(json_uid);
- AFB_API_NOTICE(afbBindingV3root,
+ AFB_API_NOTICE(this_api,
"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_API_ERROR(afbBindingV3root,
- "nfc target add event is received but no UID found: %s",
- json_object_to_json_string(object));
+ else
+ AFB_API_ERROR(this_api,
+ "nfc tag detected event but no UID found: %s",
+ json_object_to_json_string(object));
+out:
+ return;
}
static void onevent(afb_api_t api, const char *event, struct json_object *object)
@@ -277,9 +281,61 @@ static void onevent(afb_api_t api, const char *event, struct json_object *object
on_nfc_target_add(object);
return;
}
+
AFB_API_WARNING(api, "Unhandled event: %s", event);
}
+/****************************************************************/
+
+static void subscribe (afb_req_t request)
+{
+ if (afb_req_subscribe(request, event)) {
+ AFB_REQ_ERROR(request, "subscribe to identity event failed");
+ afb_req_reply(request, NULL, "failed", "subscribe error");
+ return;
+ }
+
+ afb_req_reply(request, NULL, NULL, NULL);
+}
+
+static void unsubscribe (afb_req_t request)
+{
+ if (afb_req_unsubscribe(request, event)) {
+ AFB_REQ_ERROR(request, "unsubscribe to identity event failed");
+ afb_req_reply(request, NULL, "failed", "unsubscribe error");
+ return;
+ }
+
+ afb_req_reply(request, NULL, NULL, NULL);
+}
+
+static void logout (afb_req_t request)
+{
+ do_logout();
+ afb_req_reply(request, NULL, NULL, NULL);
+}
+
+/*
+ * verb "fake_login" intended for testing: force sending a login event
+ */
+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_reply(request, NULL, NULL, NULL);
+}
+
+static void get (afb_req_t request)
+{
+ afb_req_reply(request, json_object_get(current_identity), NULL, NULL);
+}
+
+/*
+ * verb "fake_auth" intended for testing: trigger authentication on the
+ * provided data (e.g same args as per the "nfc/presence" event)
+ */
static void fake_auth(afb_req_t req)
{
struct json_object* req_object;
@@ -294,18 +350,15 @@ static void fake_auth(afb_req_t req)
AFB_REQ_ERROR(req, "bad request: %s",
json_object_get_string(req_object));
afb_req_reply(req, NULL, "Missing arg", NULL);
+ return;
}
- else {
- 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);
+ const char* kind = json_object_get_string(kind_object);
+ const char* key = json_object_get_string(key_object);
- afb_req_reply(req, NULL, NULL, "fake auth success!");
- }
+ AFB_REQ_NOTICE(req, "kind: %s, key: %s", kind, key);
+ agl_forgerock_download_request(vin ? vin : default_vin, kind, key);
+ afb_req_reply(req, NULL, NULL, "fake auth success!");
}
/*
@@ -314,31 +367,29 @@ static void fake_auth(afb_req_t req)
*/
const afb_verb_t verbs[]=
{
- {.verb = "subscribe" , .callback = subscribe , .auth = NULL,
+ {.verb = "subscribe" , .callback = subscribe ,
.info = "subscribe to events" , .session = AFB_SESSION_NONE },
- {.verb = "unsubscribe", .callback = unsubscribe , .auth = NULL,
+ {.verb = "unsubscribe", .callback = unsubscribe ,
.info = "unsubscribe to events" , .session = AFB_SESSION_NONE },
- {.verb = "fake-login" , .callback = fake_login , .auth = NULL,
+ {.verb = "fake-login" , .callback = fake_login ,
.info = "fake a login" , .session = AFB_SESSION_NONE },
- {.verb = "logout" , .callback = logout , .auth = NULL,
+ {.verb = "logout" , .callback = logout ,
.info = "log the current user out", .session = AFB_SESSION_NONE },
- {.verb = "get" , .callback = get , .auth = NULL,
+ {.verb = "get" , .callback = get ,
.info = "get data" , .session = AFB_SESSION_NONE },
- {.verb = "fake-auth" , .callback = fake_auth , .auth = NULL,
+ {.verb = "fake-auth" , .callback = fake_auth ,
.info = "fake an authentication" , .session = AFB_SESSION_NONE },
- {NULL}
+ { }
};
const afb_binding_t afbBindingExport =
{
.api = "identity",
- .specification = NULL,
+ .specification = "Identity-agent API",
.info = "AGL identity service",
.verbs = verbs,
- .preinit = NULL,
.init = service_init,
.onevent = onevent,
- .noconcurrency = 0
};
/* vim: set colorcolumn=80: */
diff --git a/src/agl-identity-common.h b/src/agl-identity-common.h
new file mode 100644
index 0000000..1f0b16c
--- /dev/null
+++ b/src/agl-identity-common.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2019 Konsulko Group
+ * Author: Raquel Medina <raquel.medina@konsulko.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef AGL_IDENTITY_COMMON_H
+#define AGL_IDENTITY_COMMON_H
+
+#define _GNU_SOURCE
+#define AFB_BINDING_VERSION 3
+#include <afb/afb-binding.h>
+
+afb_api_t get_local_api(void);
+
+#endif // AGL_IDENTITY_COMMON_H
diff --git a/src/aia-get.c b/src/aia-get.c
index 56c82b0..4536e25 100644
--- a/src/aia-get.c
+++ b/src/aia-get.c
@@ -27,26 +27,6 @@
#include "curl-wrap.h"
#include "oidc-agent.h"
-/*
-#include <errno.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <json-c/json.h>
-
-#include <afb/afb-binding.h>
-#include <afb/afb-req-itf.h>
-#include <afb/afb-event-itf.h>
-#include <afb/afb-service-itf.h>
-
-
-#include "u2f-bluez.h"
-*/
-
-
struct keyrequest {
struct keyrequest *next;
int dead;
diff --git a/src/curl-wrap.c b/src/curl-wrap.c
index 9f010fb..626f321 100644
--- a/src/curl-wrap.c
+++ b/src/curl-wrap.c
@@ -69,15 +69,15 @@ int curl_wrap_perform(CURL *curl, char **result, size_t *size)
buffer.size = 0;
buffer.data = NULL;
- /* Perform the request, res will get the return code */
+ /* Perform the request, res will get the return code */
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
- /* Perform the request, res will get the return code */
+ /* Perform the request, res will get the return code */
code = curl_easy_perform(curl);
rc = code == CURLE_OK;
- /* Check for no errors */
+ /* Check for no errors */
if (rc) {
/* no error */
if (size)
diff --git a/src/curl-wrap.h b/src/curl-wrap.h
index 2e44f47..dcdcef3 100644
--- a/src/curl-wrap.h
+++ b/src/curl-wrap.h
@@ -20,9 +20,6 @@
#include <curl/curl.h>
-extern char *curl_wrap_url (const char *base, const char *path,
- const char *const *query, size_t * size);
-
extern int curl_wrap_perform (CURL * curl, char **result, size_t * size);
extern void curl_wrap_do(CURL *curl, void (*callback)(void *closure, int status, CURL *curl, const char *result, size_t size), void *closure);
diff --git a/src/test-aia-uds-bluez.c b/src/test-aia-uds-bluez.c
deleted file mode 100644
index 4a084a5..0000000
--- a/src/test-aia-uds-bluez.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2015, 2016, 2017 "IoT.bzh"
- * Author: José Bollo <jose.bollo@iot.bzh>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define _GNU_SOURCE
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <string.h>
-#include <errno.h>
-
-#include <systemd/sd-bus.h>
-
-#include "aia-uds-bluez.h"
-
-
-void p(const char *tag, const struct aia_uds_value *value)
-{
- printf("%10s %c %.*s\n", tag, value->changed?'*':' ', (int)value->length, value->data);
-}
-
-void onchg(const struct aia_uds *uds)
-{
- printf("\n");
- p("first name", &uds->first_name);
- p("last name", &uds->last_name);
- p("email", &uds->email);
- p("language", &uds->language);
-}
-
-int main()
-{
- sd_bus *bus;
- sd_id128_t id;
- int rc;
-
- aia_uds_set_on_change(onchg);
- rc = sd_bus_default_system(&bus);
- rc = sd_id128_randomize(&id);
- rc = sd_bus_set_server(bus, 1, id);
- rc = sd_bus_start(bus);
- rc = aia_uds_init(bus);
- rc = aia_uds_advise(1, NULL, NULL);
- for (;;) {
- rc = sd_bus_process(bus, NULL);
- if (rc < 0)
- break;
- else if (rc == 0)
- rc = sd_bus_wait(bus, (uint64_t) -1);
- }
-}
-