ubus: clear the right timeout on rpc connection teardowns
[project/uhttpd.git] / ubus.c
diff --git a/ubus.c b/ubus.c
index d3cb6df..c9b0ea5 100644 (file)
--- 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");