Commit graph

19 commits

Author SHA1 Message Date
Jo-Philipp Wich
f57ca519ac cgi-io: close pipe descriptors early
In the command read side, close the superfluous write end of the pipe
early to ensure that EOF is reliably detected. Without that change, splice
calls to read from the pipe will occasionally hang until the CGI process
is eventually killed due to timeout.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit dde503da13)
2019-12-18 17:11:14 +01:00
Jo-Philipp Wich
9e434da4e0 cgi-io: implement exec action
Implement a new "cgi-exec" applet which allows to invoke remote commands
and stream their stdandard output back to the client via HTTP. This is
needed in cases where large amounts of data or binary encoded contents
such as tar archives need to be transferred, which are unsuitable to be
transported via ubus directly.

The exec call is guarded by the same ACL semantics as rpcd's file plugin,
means in order to be able to execute a command remotely, the ubus session
identified by the given session ID must have read access to the "exec"
function of the "cgi-io" scope and an explicit "exec" permission rule for
the invoked command in the "file" scope.

In order to initiate a transfer, a POST request in x-www-form-urlencoded
format must be sent to the applet, with one field "sessionid" holding
the login session and another field "command" specifiying the commandline
to invoke.

Further optional fields are "filename" which - if present - will cause
the download applet to set a Content-Dispostition header and "mimetype"
which allows to let the applet respond with a specific type instead of
the default "application/octet-stream".

Below is an example for the required ACL rules to grant exec access to
both the "date" and "iptables" commands. The "date" rule specifies the
base name of the executable and thus allows invocation with arbitrary
parameters while the latter "iptables" rule merely allows one specific
set of arguments which must appear exactly in the given order.

    ubus call session grant '{
        "ubus_rpc_session": "...",
        "scope": "cgi-io",
        "objects": [
            [ "exec", "read" ]
        ]
    }'

    ubus call session grant '{
        "ubus_rpc_session": "...",
        "scope": "file",
        "objects": [
            [ "/bin/date", "exec" ],
            [ "/usr/sbin/iptables -n -v -L", "exec" ]
        ]
   }'

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit b2a890f6ad)
2019-12-18 17:11:11 +01:00
Petr Štetiar
6a4c0cab44 cgi-io: iron out extra compiler warnings
Fixes following errors:

 main.c:458:37: error: comparison of integer expressions of different signedness: ‘int’ and ‘size_t’ {aka ‘long unsigned int’} [-Werror=sign-compare]
 main.c:463:17: error: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Werror=sign-compare]
 main.c:518:35: error: comparison of integer expressions of different signedness: ‘ssize_t’ {aka ‘long int’} and ‘size_t’ {aka ‘long unsigned int’} [-Werror=sign-compare]
 main.c:157:3: error: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Werror=unused-result]
 main.c:763:3: error: ignoring return value of ‘chdir’, declared with attribute warn_unused_result [-Werror=unused-result]

Signed-off-by: Petr Štetiar <ynezz@true.cz>
(cherry picked from commit bb6cdb804c)
2019-10-11 16:13:29 +02:00
Petr Štetiar
6677274844 cgi-io: cmake: enable extra compiler warnings
Spotting issues during compilation is cheaper.

Signed-off-by: Petr Štetiar <ynezz@true.cz>
(cherry picked from commit 4e7411a8d0)
2019-10-11 16:13:20 +02:00
Petr Štetiar
0698c1ab29 cgi-io: cmake: fix libraries lookup
In order to make it compile properly in more environments.

Signed-off-by: Petr Štetiar <ynezz@true.cz>
(cherry picked from commit fd47e99be4)
2019-10-11 16:13:11 +02:00
Ansuel Smith
af5585ac88 cgi-io: fix read after end errors
Currently cgi-io try to read data after the data ended.
- Adds "-" to whitelist char
- In main_upload is tried to consume the buffer while it's already readed by the while loop before

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
(cherry picked from commit 535b2b6bd8)
2019-10-11 14:33:24 +02:00
Jo-Philipp Wich
92bea7f8e9 cgi-io: use splice() to stream backup archive
This improves the I/O performance when outputting large backups.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit a8b4a28372)
2019-10-11 14:33:24 +02:00
Jo-Philipp Wich
a1e87b4e0e cgi-io: pass appropriate HTTP error codes to failure()
Instead of always replying with a generic 500 internal server error code,
use more appropriate codes such as 403 to indicate denied permissions.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 8c22db6531)
2019-10-11 14:33:23 +02:00
Jo-Philipp Wich
13075d4d51 cgi-io: add download operation
Add a new `cgi-download` applet which allows to retrieve the contents
of regular files or block devices.

In order to initiate a transfer, a POST request in x-www-form-urlencoded
format must be sent to the applet, with one field "sessionid" holding
the login session and another field "path" containing the file path to
download.

Further optional fields are "filename" which - if present - will cause
the download applet to set a Content-Dispostition header and "mimetype"
which allows to let the applet respond with a specific type instead of
the default "application/octet-stream".

Below is an example for the required acl rules to grant download access
to files or block devices:

    ubus call session grant '{
        "ubus_rpc_session": "...",
        "scope": "cgi-io",
        "objects": [
            [ "download", "read" ]
        ]
    }'

    ubus call session grant '{
        "ubus_rpc_session": "...",
        "scope": "file",
        "objects": [
            [ "/etc/config/*", "read" ],
            [ "/dev/mtdblock*", "read" ]
        ]
    }'

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit ab2a2b080d)
2019-10-11 14:33:23 +02:00
Jo-Philipp Wich
0fc83858fc cgi-io: use different acl scopes for path and command permissions
Use the `cgi-io` scope to check for permission to execute the requested
command (`upload`, `backup`) and the `file` scope to check path
permissions.

The reasoning of this change is that `cgi-io` is usually used in
conjunction with `rpcd-mod-file` to transfer large file data out
of band and `rpcd-mod-file` already uses the `file` scope to manage
file path access permissions. After this change, both `rpc-mod-file`
and `cgi-io` can share the same path acl rules.

Write access to a path can be granted by using an ubus call in the
following form:

    ubus call session grant '{
        "ubus_rpc_session": "...",
        "scope": "file",
        "objects": [
            [ "/var/lib/uploads/*", "write" ]
        ]
    }'

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit c8a86c8c8e)
2019-10-11 14:31:49 +02:00
Jo-Philipp Wich
76d741c990 cgi-io: require whitelisting upload locations
Introduce further ACL checks to verify that the request-supplied
upload location may be written to. This prevents overwriting things
like /bin/busybox and allows to confine uploads to specific directories.

To setup the required ACLs, the following ubus command may be used
on the command line:

ubus call session grant '{
  "ubus_rpc_session": "d41d8cd98f00b204e9800998ecf8427e",
  "scope": "cgi-io",
  "objects": [
    [ "/etc/certificates/*", "write" ],
    [ "/var/uploads/*", "write" ]
  ]
}'

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 22be9a1c01)
2019-10-11 14:04:11 +02:00
Sven Eckelmann
1142f52078
treewide: Change .*GPL.*+ licenses to SPDX compatible identifier
The CONTRIBUTING.md requests an (or multiple) SPDX identifier for GPL
licenses. But a lot of packages did use a different, non-SPDX style with a
"+" at the end instead of "-or-later".

Signed-off-by: Sven Eckelmann <sven@narfation.org>
(cherry-picked from bbb1ea7345)
2019-09-26 19:36:25 -07:00
Jianhui Zhao
63ea52965f cgi-io: Fix bug
The installation name is inconsistent with the code

Signed-off-by: Jianhui Zhao <jianhuizhao329@gmail.com>
2019-05-30 10:03:29 +08:00
Jo-Philipp Wich
46d0799c43 cgi-io: support SHA256 checksums for file uploads
Report SHA256 checksums in addition to the MD5 ones to make cgi-io suitable
for sysupgrade image verification.

Also allow stat(), md5sum and/or sha256sum to fail and respond with a JSON
null value instead, leaving it to the frontend to handle errors as needed.

Fixes #4790.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2017-11-13 17:16:29 +01:00
Jo-Philipp Wich
f6f750ad17 cgi-io: fix stray semicolon
Remove an improperly placed semicolon in order to solve the following
compiler error:

.../main.c:144:3: error: this 'if' clause does not guard... [-Werror=misleading-indentation]
    if (execl("/bin/busybox", "/bin/busybox", "md5sum", file, NULL));
    ^~
    .../main.c:145:4: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
    return NULL;
    ^~~~~~
    cc1: all warnings being treated as errors

Fixes #4723.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2017-08-18 14:28:33 +02:00
Daniel Golle
e7b5bdd9e9 cgi-io: merge changes from luci2-io-helper
luci2-io-helper: bugfix buckup script read timeout

Reading files from stdin will block for ever. The uhttpd is killing the
backup process after script_timeout.

Switching read to non blocking mode and add a waitpid for the slave
process does not end in a script_timeout anymore.

Signed-off-by: Florian Eckert <Eckert.Florian@googlemail.com>
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
2017-06-19 12:49:59 +02:00
Florian Fainelli
0b85489a97 cgi-io: Find and search for libubus.h
Fixes build errors with external toolchains:

[ 33%] Building C object CMakeFiles/cgi-io.dir/main.c.o
/home/florian/dev/openwrt/trunk/build_dir/target-mipsel-unknown-linux-gnu_glibc/cgi-io/main.c:30:21:
fatal error: libubus.h: No such file or directory
 #include <libubus.h>
                     ^
compilation terminated.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
2017-06-18 12:45:30 -07:00
Jo-Philipp Wich
9843f170d7 treewide: replace my defunct email address
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2016-06-07 12:00:59 +02:00
John Crispin
fe31939c0e cgi-io: add a small helper cgi that can be used by RPCD based UIs
Signed-off-by: John Crispin <blogic@openwrt.org>
2015-10-02 14:00:25 +02:00