X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?p=src%2Fapp-framework-binder.git;a=blobdiff_plain;f=src%2Fafb-hreq.c;h=6be2ee5c3c3958569efc59eb831379f31c926589;hp=4d5f659c24a369ca5f98a956cd00f80a7b78ca87;hb=74a7ebbea3d36158aabbda85d2aeb5a1b3a9daa9;hpb=7386e1c5090b4e76036bc212f2a2cf32920bb160 diff --git a/src/afb-hreq.c b/src/afb-hreq.c index 4d5f659c..6be2ee5c 100644 --- a/src/afb-hreq.c +++ b/src/afb-hreq.c @@ -44,6 +44,7 @@ #include "afb-session.h" #include "afb-cred.h" #include "afb-token.h" +#include "afb-error-text.h" #include "verbose.h" #include "locale-root.h" @@ -921,9 +922,13 @@ static struct json_object *req_json(struct afb_xreq *xreq) return obj; } +static inline const char *get_json_string(json_object *obj) +{ + return json_object_to_json_string_ext(obj, JSON_C_TO_STRING_PLAIN|JSON_C_TO_STRING_NOSLASHESCAPE); +} static ssize_t send_json_cb(json_object *obj, uint64_t pos, char *buf, size_t max) { - ssize_t len = stpncpy(buf, json_object_to_json_string_ext(obj, JSON_C_TO_STRING_PLAIN|JSON_C_TO_STRING_NOSLASHESCAPE)+pos, max) - buf; + ssize_t len = stpncpy(buf, get_json_string(obj)+pos, max) - buf; return len ? : (ssize_t)MHD_CONTENT_READER_END_OF_STREAM; } @@ -944,8 +949,20 @@ static void req_reply(struct afb_xreq *xreq, struct json_object *object, const c if (reqid != NULL && json_object_object_get_ex(reply, "request", &sub)) json_object_object_add(sub, "reqid", json_object_new_string(reqid)); - response = MHD_create_response_from_callback((uint64_t)strlen(json_object_to_json_string_ext(reply, JSON_C_TO_STRING_PLAIN|JSON_C_TO_STRING_NOSLASHESCAPE)), SIZE_RESPONSE_BUFFER, (void*)send_json_cb, reply, (void*)json_object_put); - afb_hreq_reply(hreq, MHD_HTTP_OK, response, NULL); + response = MHD_create_response_from_callback( + (uint64_t)strlen(get_json_string(reply)), + SIZE_RESPONSE_BUFFER, + (void*)send_json_cb, + reply, + (void*)json_object_put); + + /* handle authorisation feedback */ + if (error == afb_error_text_invalid_token) + afb_hreq_reply(hreq, MHD_HTTP_UNAUTHORIZED, response, MHD_HTTP_HEADER_WWW_AUTHENTICATE, "error=\"invalid_token\"", NULL); + else if (error == afb_error_text_insufficient_scope) + afb_hreq_reply(hreq, MHD_HTTP_FORBIDDEN, response, MHD_HTTP_HEADER_WWW_AUTHENTICATE, "error=\"insufficient_scope\"", NULL); + else + afb_hreq_reply(hreq, MHD_HTTP_OK, response, NULL); } void afb_hreq_call(struct afb_hreq *hreq, struct afb_apiset *apiset, const char *api, size_t lenapi, const char *verb, size_t lenverb)