]> git.ipfire.org Git - pakfire.git/commitdiff
cli: Check for root privileges when needed
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 2 Nov 2023 08:23:43 +0000 (08:23 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 2 Nov 2023 08:23:43 +0000 (08:23 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
32 files changed:
src/cli/lib/build.c
src/cli/lib/clean.c
src/cli/lib/client-build.c
src/cli/lib/command.c
src/cli/lib/command.h
src/cli/lib/dist.c
src/cli/lib/image.c
src/cli/lib/image_create.c
src/cli/lib/info.c
src/cli/lib/install.c
src/cli/lib/provides.c
src/cli/lib/remove.c
src/cli/lib/repo.c
src/cli/lib/repo_compose.c
src/cli/lib/repo_create.c
src/cli/lib/repo_delete.c
src/cli/lib/repo_list.c
src/cli/lib/repo_show.c
src/cli/lib/repolist.c
src/cli/lib/requires.c
src/cli/lib/search.c
src/cli/lib/shell.c
src/cli/lib/sync.c
src/cli/lib/update.c
src/cli/lib/upload.c
src/cli/lib/upload_create.c
src/cli/lib/upload_delete.c
src/cli/lib/upload_list.c
src/cli/pakfire-builder.c
src/cli/pakfire-client.c
src/cli/pakfire-daemon.c
src/cli/pakfire.c

index 59b559a46346b521dc6632e3daa74572d5f01649..cb8d9c778301ebe4294cca485ec3434f933f9bbe 100644 (file)
@@ -151,7 +151,7 @@ int cli_build(void* data, int argc, char* argv[]) {
        struct cli_config* cli_config = data;
 
        // Parse the command line
-       r = cli_parse(options, NULL, NULL, NULL, parse, argc, argv, &config);
+       r = cli_parse(options, NULL, NULL, NULL, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index 5fc6f67c0129d1189a4d3d92f797b1f95b2dd26a..232ae6be4bb5477535a75a567d394947e53e6e67 100644 (file)
@@ -34,7 +34,7 @@ int cli_clean(void* data, int argc, char* argv[]) {
        struct cli_config* config = data;
 
        // Parse the command line
-       r = cli_parse(NULL, NULL, NULL, doc, NULL, argc, argv, NULL);
+       r = cli_parse(NULL, NULL, NULL, doc, NULL, 0, argc, argv, NULL);
        if (r)
                goto ERROR;
 
index 39c7dc68d16e3de04a0c62066d3dbba011dfff06..e76b72075fd17042eb94f92a6b54be49b847689a 100644 (file)
@@ -106,7 +106,7 @@ int cli_client_build(void* data, int argc, char* argv[]) {
        struct cli_config* cli_config = data;
 
        // Parse the command line
-       r = cli_parse(options, NULL, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(options, NULL, args_doc, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index f224ab7f93d651dae7c1625b8376b279fe7bb292..28a13fb6ff30f6a567bdc14ffd210e6b0a01ee26 100644 (file)
@@ -23,6 +23,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 
 #include "command.h"
 
@@ -83,6 +84,7 @@ struct command_ctx {
        const struct argp_option* options;
        const struct command* commands;
        command_parse parse;
+       int flags;
        void* data;
 
        // The selected command
@@ -131,6 +133,12 @@ static error_t __command_parse(int key, char* arg, struct argp_state* state) {
 
                // Perform some final checks when parsing has been completed
                case ARGP_KEY_SUCCESS:
+                       // Check for root privileges
+                       if (ctx->flags & CLI_REQUIRE_ROOT) {
+                               if (getuid() || getgid())
+                                       argp_failure(state, EXIT_FAILURE, 0, "Must be run as root");
+                       }
+
                        if (ctx->command) {
                                int args = count_arguments(ctx->argc, ctx->argv);
 
@@ -163,7 +171,7 @@ static error_t __command_parse(int key, char* arg, struct argp_state* state) {
 
 int cli_parse(const struct argp_option* options, const struct command* commands,
                const char* args_doc, const char* doc,
-               command_parse parse, int argc, char** argv, void* data) {
+               command_parse parse, int flags, int argc, char** argv, void* data) {
        int r;
 
        // Setup context
@@ -171,6 +179,7 @@ int cli_parse(const struct argp_option* options, const struct command* commands,
                .options  = options,
                .commands = commands,
                .parse    = parse,
+               .flags    = flags,
                .data     = data,
        };
 
index c03e34fffc824ab0c8d05493dd753072f682eb5d..2d72fe9d45cc8d914274c014f8bca6a9f5097250 100644 (file)
 
 typedef error_t (*command_parse)(int key, char* arg, struct argp_state* state, void* data);
 
+typedef enum cli_command_flags {
+       CLI_REQUIRE_ROOT = (1 << 0),
+} cli_command_flags_t;
+
 struct command {
        const char* verb;
        int (*callback)(void* config, int argc, char* argv[]);
@@ -37,6 +41,7 @@ struct command {
 };
 
 int cli_parse(const struct argp_option* options, const struct command* commands,
-       const char* args_doc, const char* doc, command_parse parse, int argc, char** argv, void* data);
+       const char* args_doc, const char* doc, command_parse parse, int flags,
+       int argc, char** argv, void* data);
 
 #endif /* PAKFIRE_CLI_COMMAND_H */
index 5e1cad1af916490ac99985280c3689f55844ae84..4350354e016b341bf4cdb19af3ee9efdb6900af5 100644 (file)
@@ -70,7 +70,7 @@ int cli_dist(void* data, int argc, char* argv[]) {
        struct cli_config* cli_config = data;
 
        // Parse the command line
-       r = cli_parse(NULL, NULL, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(NULL, NULL, args_doc, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index 60678bd5f247cb2b1d4a2c6d01904adf4b4abf8e..c803e3a655ad0434afd596675fe46833684d648a 100644 (file)
@@ -28,5 +28,5 @@ int cli_image(void* data, int argc, char* argv[]) {
                { NULL },
        };
 
-       return cli_parse(NULL, commands, NULL, NULL, NULL, argc, argv, data);
+       return cli_parse(NULL, commands, NULL, NULL, NULL, 0, argc, argv, data);
 }
index cc2eb19d43a179bb255c8dfb9e40708194928423..090f37eee826bc0e6528d8596e54519c28e20e71 100644 (file)
@@ -70,7 +70,7 @@ int cli_image_create(void* data, int argc, char* argv[]) {
        };
 
        // Parse the command line
-       r = cli_parse(NULL, NULL, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(NULL, NULL, args_doc, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index 6941070998b8f212c77b886bea12a8b2b4c3e321..311919a1aeb14652d18323fe8869836e7574e9f2 100644 (file)
@@ -91,7 +91,7 @@ int cli_info(void* data, int argc, char* argv[]) {
        struct cli_config* cli_config = data;
 
        // Parse the command line
-       r = cli_parse(options, NULL, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(options, NULL, args_doc, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index 8f33695670d01cd5f221918fe6b2662965481c3f..2502a31c15c84de5a270cb9dfe4298d0c0ee8914 100644 (file)
@@ -116,7 +116,7 @@ int cli_install(void* data, int argc, char* argv[]) {
        struct cli_config* cli_config = data;
 
        // Parse the command line
-       r = cli_parse(options, NULL, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(options, NULL, args_doc, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index a02025a1dc5de68bba17e505f34b13d585d64b5f..3fb2751d37cbf60d9946f663f135172c8e3f5516 100644 (file)
@@ -66,7 +66,7 @@ int cli_provides(void* data, int argc, char* argv[]) {
        struct config config = {};
 
        // Parse the command line
-       r = cli_parse(NULL, NULL, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(NULL, NULL, args_doc, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index bf4ef056c34d6bacda6d4f221fd040cd8b39417b..7c654aa13b5c60021f69ea29d64ffba7c8e8cee2 100644 (file)
@@ -96,7 +96,7 @@ int cli_remove(void* data, int argc, char* argv[]) {
        struct cli_config* cli_config = data;
 
        // Parse the command line
-       r = cli_parse(options, NULL, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(options, NULL, args_doc, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index bf37a83227c7ffa17ffe2d742592aa23f8465ccb..1fb80d5e0b7d9b6340bc46245552cc19fbc9bdce 100644 (file)
@@ -32,7 +32,7 @@ int cli_repo(void* data, int argc, char* argv[]) {
                { NULL },
        };
 
-       return cli_parse(NULL, commands, NULL, NULL, NULL, argc, argv, data);
+       return cli_parse(NULL, commands, NULL, NULL, NULL, 0, argc, argv, data);
 }
 
 int cli_repo_client(void* data, int argc, char* argv[]) {
@@ -44,5 +44,5 @@ int cli_repo_client(void* data, int argc, char* argv[]) {
                { NULL },
        };
 
-       return cli_parse(NULL, commands, NULL, NULL, NULL, argc, argv, data);
+       return cli_parse(NULL, commands, NULL, NULL, NULL, 0, argc, argv, data);
 }
index b460c3858f0a52c7654ea0de1a2918714255fe5d..120b5ab9ceae197c17d2214761aeefd621f47427 100644 (file)
@@ -114,7 +114,7 @@ int cli_repo_compose(void* data, int argc, char* argv[]) {
        };
 
        // Parse the command line
-       r = cli_parse(options, NULL, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(options, NULL, args_doc, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index e09b96d52f7b06c1f8cb983d8f6c47f2cac1740a..f825f47bbadc51842cfe39298cb1b1f27113507f 100644 (file)
@@ -82,7 +82,7 @@ int cli_repo_create(void* data, int argc, char* argv[]) {
        struct cli_config* cli_config = data;
 
        // Parse the command line
-       r = cli_parse(options, NULL, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(options, NULL, args_doc, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index cf70d882229d6b04baf25057c848c5dd58690222..84a0ace4ce17d942cdaed1f11c096a2878c06094 100644 (file)
@@ -69,7 +69,7 @@ int cli_repo_delete(void* data, int argc, char* argv[]) {
        struct cli_config* cli_config = data;
 
        // Parse the command line
-       r = cli_parse(NULL, NULL, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(NULL, NULL, args_doc, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index fa82897eca8d337976c2ea224b04bd6e4f4fe44b..a00c2bb79a4021287909401bb1899ac051d26b2a 100644 (file)
@@ -61,7 +61,7 @@ int cli_repo_list(void* data, int argc, char* argv[]) {
        struct cli_config* cli_config = data;
 
        // Parse the command line
-       r = cli_parse(NULL, NULL, NULL, doc, parse, argc, argv, &config);
+       r = cli_parse(NULL, NULL, NULL, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index 18e18180eda75de9c46230b73dc2c0e8e4e460c5..9bdc7c7943bbf8bbebd629c7a5e5ca82874e58b6 100644 (file)
@@ -67,7 +67,7 @@ int cli_repo_show(void* data, int argc, char* argv[]) {
        struct cli_config* cli_config = data;
 
        // Parse the command line
-       r = cli_parse(NULL, NULL, NULL, doc, parse, argc, argv, &config);
+       r = cli_parse(NULL, NULL, NULL, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index c9bc4a357d263eecf1bd78933bdf7663de044af0..b2d9a689f158fa798e754eab27245543e6a84f6a 100644 (file)
@@ -38,7 +38,7 @@ int cli_repolist(void* data, int argc, char* argv[]) {
        struct cli_config* cli_config = data;
 
        // Parse the command line
-       r = cli_parse(NULL, NULL, NULL, doc, NULL, argc, argv, NULL);
+       r = cli_parse(NULL, NULL, NULL, doc, NULL, 0, argc, argv, NULL);
        if (r)
                goto ERROR;
 
index ceefea211e88bf35ba9347d88bb70d5b10ca26ea..f9d349febdceab76a2c7360d4ea64b2bb6dad0ca 100644 (file)
@@ -66,7 +66,7 @@ int cli_requires(void* data, int argc, char* argv[]) {
        struct config config = {};
 
        // Parse the command line
-       r = cli_parse(NULL, NULL, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(NULL, NULL, args_doc, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index fc40fd703b43bcf243b4fa763aa1f3c7c2d2bf3d..9aa7c986bdc245b1000599fbadd8a7b895745d92 100644 (file)
@@ -66,7 +66,7 @@ int cli_search(void* data, int argc, char* argv[]) {
        struct config config = {};
 
        // Parse the command line
-       r = cli_parse(NULL, NULL, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(NULL, NULL, args_doc, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index 7ad2d971a993ebb58d0aaa439976da0ccf22874c..819a3830dc2e9ba74baf9c08501c22b1ff33fb63 100644 (file)
@@ -86,7 +86,7 @@ int cli_shell(void* data, int argc, char* argv[]) {
        };
 
        // Parse the command line
-       r = cli_parse(options, NULL, NULL, doc, parse, argc, argv, &config);
+       r = cli_parse(options, NULL, NULL, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index b602c556dc8230a9fa79799388e4d1a802927cd9..b5ea449df369d433e6e3efe7027bebc63cd6f527 100644 (file)
@@ -81,7 +81,7 @@ int cli_sync(void* data, int argc, char* argv[]) {
        struct cli_config* cli_config = data;
 
        // Parse the command line
-       r = cli_parse(options, NULL, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(options, NULL, args_doc, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index 9f374c920d2548aa58fc6aeb6fd43adf681e7ebe..b80ef2431ad9224c2911422a2cc58a2d255afbc9 100644 (file)
@@ -132,7 +132,7 @@ int cli_update(void* data, int argc, char* argv[]) {
        struct cli_config* cli_config = data;
 
        // Parse the command line
-       r = cli_parse(options, NULL, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(options, NULL, args_doc, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index 5a5dfd83817dfda184b399965e6a0d46fb09075a..5c33050062b46cb7b6e5edb2b5e80c892217d8ba 100644 (file)
@@ -37,5 +37,5 @@ int cli_upload(void* data, int argc, char* argv[]) {
                { NULL },
        };
 
-       return cli_parse(NULL, commands, args_doc, NULL, NULL, argc, argv, data);
+       return cli_parse(NULL, commands, args_doc, NULL, NULL, 0, argc, argv, data);
 }
index 78e7d2e2fd6740f32b952c74f9d9eb4bfa47bdab..e0d3b4498dc4b6d6e35658fa8a2496b9c87302df 100644 (file)
@@ -64,7 +64,7 @@ int cli_upload_create(void* data, int argc, char* argv[]) {
        struct cli_config* cli_config = data;
 
        // Parse the command line
-       r = cli_parse(NULL, NULL, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(NULL, NULL, args_doc, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index 2b32335c5253afe7d37734b9b6bd4c97e7ffdada..eeb09191f15956158895a8fe78870c27ff0da200 100644 (file)
@@ -68,7 +68,7 @@ int cli_upload_delete(void* data, int argc, char* argv[]) {
        struct cli_config* cli_config = data;
 
        // Parse the command line
-       r = cli_parse(NULL, NULL, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(NULL, NULL, args_doc, doc, parse, 0, argc, argv, &config);
        if (r)
                goto ERROR;
 
index 3d3eb88b12204ffc8ba396cbc7548e7b451c882c..c8e5697e40092e6dbb638fa6292bcc9fc49f3967 100644 (file)
@@ -37,7 +37,7 @@ int cli_upload_list(void* data, int argc, char* argv[]) {
        struct cli_config* cli_config = data;
 
        // Parse the command line
-       r = cli_parse(NULL, NULL, NULL, doc, NULL, argc, argv, NULL);
+       r = cli_parse(NULL, NULL, NULL, doc, NULL, 0, argc, argv, NULL);
        if (r)
                goto ERROR;
 
index bc5675429f6fc9f8e394ba39c065916da1f99216..adcabfde4034bc83f50e8cfceb78b0c012d6ec86 100644 (file)
@@ -175,7 +175,8 @@ int main(int argc, char* argv[]) {
        };
 
        // Parse the command line and run any commands
-       r = cli_parse(options, commands, args_doc, NULL, parse, argc, argv, &config);
+       r = cli_parse(options, commands, args_doc, NULL,
+               parse, CLI_REQUIRE_ROOT, argc, argv, &config);
 
 ERROR:
        if (ctx)
index 934cc419a8a210c49569954bfec0fc44f9281270..b0d957e8db2fa8686881a50f722a19ad48dc5fe3 100644 (file)
@@ -94,7 +94,8 @@ int main(int argc, char* argv[]) {
        };
 
        // Parse the command line and run any commands
-       r = cli_parse(options, commands, args_doc, doc, parse, argc, argv, &config);
+       r = cli_parse(options, commands, args_doc, doc,
+               parse, 0, argc, argv, &config);
 
 ERROR:
        if (ctx)
index 17c3e5a191339431a60c8c4aabc216b275c89e79..788f8f5a5f6c0590bc325ed4cd3f66d27943038e 100644 (file)
@@ -64,7 +64,8 @@ int main(int argc, char* argv[]) {
                goto ERROR;
 
        // Parse the command line and run any commands
-       r = cli_parse(options, NULL, NULL, doc, parse, argc, argv, ctx);
+       r = cli_parse(options, NULL, NULL, doc, parse,
+               CLI_REQUIRES_ROOT, argc, argv, ctx);
        if (r)
                goto ERROR;
 
index b60cd25d9bfda2e15965557b39a5e812bf699d9e..78e97f8a23ddd6958bb7e3d18d510b4c7a729456 100644 (file)
@@ -165,7 +165,8 @@ int main(int argc, char* argv[]) {
        };
 
        // Parse the command line and run any commands
-       r = cli_parse(options, commands, args_doc, NULL, parse, argc, argv, &config);
+       r = cli_parse(options, commands, args_doc, NULL, parse,
+               CLI_REQUIRE_ROOT, argc, argv, &config);
 
 ERROR:
        if (ctx)