X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuhttpd.git;a=blobdiff_plain;f=ubus.c;h=c9b0ea5665191616d445ae8dcd05f2f357a06230;hp=d3cb6df1ab4d757bd26e152411f4020264e4139e;hb=18ce3a61dea1d5db4f58e767f4c78123a7bd1667;hpb=eb098bcfb6b8ee61cb6ce164aea7f847ffa30dcb diff --git a/ubus.c b/ubus.c index d3cb6df..c9b0ea5 100644 --- a/ubus.c +++ b/ubus.c @@ -35,6 +35,7 @@ static struct ubus_context *ctx; static struct blob_buf buf; #define UH_UBUS_MAX_POST_SIZE 4096 +#define UH_UBUS_DEFAULT_SID "00000000000000000000000000000000" enum { RPC_JSONRPC, @@ -214,7 +215,7 @@ static void uh_ubus_request_free(struct client *cl) struct dispatch_ubus *du = &cl->dispatch.ubus; blob_buf_free(&du->buf); - uloop_timeout_cancel(&cl->timeout); + uloop_timeout_cancel(&du->timeout); if (du->jsobj) json_object_put(du->jsobj); @@ -233,15 +234,21 @@ static void uh_ubus_single_error(struct client *cl, enum rpc_error type) ops->request_done(cl); } -static void uh_ubus_send_request(struct client *cl, json_object *obj) +static void uh_ubus_send_request(struct client *cl, json_object *obj, struct blob_attr *args) { struct dispatch *d = &cl->dispatch; struct dispatch_ubus *du = &d->ubus; - int ret; + struct blob_attr *cur; + static struct blob_buf req; + int ret, rem; + + blob_buf_init(&req, 0); + blobmsg_for_each_attr(cur, args, rem) + blobmsg_add_blob(&req, cur); blob_buf_init(&du->buf, 0); memset(&du->req, 0, sizeof(du->req)); - ret = ubus_invoke_async(ctx, du->obj, du->func, buf.head, &du->req); + ret = ubus_invoke_async(ctx, du->obj, du->func, req.head, &du->req); if (ret) return uh_ubus_json_error(cl, ERROR_INTERNAL); @@ -250,7 +257,7 @@ static void uh_ubus_send_request(struct client *cl, json_object *obj) ubus_complete_request_async(ctx, &du->req); du->timeout.cb = uh_ubus_timeout_cb; - uloop_timeout_set(&du->timeout, conf.script_timeout); + uloop_timeout_set(&du->timeout, conf.script_timeout * 1000); du->req_pending = true; } @@ -371,12 +378,12 @@ static void uh_ubus_handle_request_object(struct client *cl, struct json_object goto error; } - if (!uh_ubus_allowed(du->sid, data.object, data.function)) { + if (!conf.ubus_noauth && !uh_ubus_allowed(du->sid, data.object, data.function)) { err = ERROR_ACCESS; goto error; } - uh_ubus_send_request(cl, obj); + uh_ubus_send_request(cl, obj, data.data); return; error: @@ -443,15 +450,21 @@ static void uh_ubus_handle_request(struct client *cl, char *url, struct path_inf blob_buf_init(&buf, 0); - url += strlen(conf.ubus_prefix); - while (*url == '/') - url++; + if (conf.ubus_noauth) { + sid = UH_UBUS_DEFAULT_SID; + } + else { + url += strlen(conf.ubus_prefix); + while (*url == '/') + url++; - sep = strchr(url, '/'); - if (sep) - *sep = 0; + sep = strchr(url, '/'); + if (sep) + *sep = 0; + + sid = url; + } - sid = url; if (strlen(sid) != 32 || cl->request.method != UH_HTTP_MSG_POST) return ops->client_error(cl, 400, "Bad Request", "Invalid Request");