static struct blob_buf buf;
#define UH_UBUS_MAX_POST_SIZE 4096
+#define UH_UBUS_DEFAULT_SID "00000000000000000000000000000000"
enum {
RPC_JSONRPC,
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);
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);
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;
}
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:
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");