aboutsummaryrefslogtreecommitdiffstats
path: root/sway/commands/permit.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/commands/permit.c')
-rw-r--r--sway/commands/permit.c39
1 files changed, 36 insertions, 3 deletions
diff --git a/sway/commands/permit.c b/sway/commands/permit.c
index c55f46d8..66fa4e2a 100644
--- a/sway/commands/permit.c
+++ b/sway/commands/permit.c
@@ -1,7 +1,9 @@
1#define _XOPEN_SOURCE 500
1#include <string.h> 2#include <string.h>
2#include "sway/commands.h" 3#include "sway/commands.h"
3#include "sway/config.h" 4#include "sway/config.h"
4#include "sway/security.h" 5#include "sway/security.h"
6#include "util.h"
5#include "log.h" 7#include "log.h"
6 8
7static enum secure_feature get_features(int argc, char **argv, 9static enum secure_feature get_features(int argc, char **argv,
@@ -47,12 +49,29 @@ struct cmd_results *cmd_permit(int argc, char **argv) {
47 return error; 49 return error;
48 } 50 }
49 51
50 struct feature_policy *policy = get_feature_policy(argv[0]); 52 bool assign_perms = true;
51 policy->features |= get_features(argc, argv, &error); 53 char *program = NULL;
52 54
55 if (!strcmp(argv[0], "*")) {
56 program = strdup(argv[0]);
57 } else {
58 program = resolve_path(argv[0]);
59 }
60 if (!program) {
61 sway_assert(program, "Unable to resolve IPC permit target '%s'."
62 " will issue empty policy", argv[0]);
63 assign_perms = false;
64 program = strdup(argv[0]);
65 }
66
67 struct feature_policy *policy = get_feature_policy(program);
68 if (assign_perms) {
69 policy->features |= get_features(argc, argv, &error);
70 }
53 sway_log(L_DEBUG, "Permissions granted to %s for features %d", 71 sway_log(L_DEBUG, "Permissions granted to %s for features %d",
54 policy->program, policy->features); 72 policy->program, policy->features);
55 73
74 free(program);
56 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 75 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
57} 76}
58 77
@@ -65,11 +84,25 @@ struct cmd_results *cmd_reject(int argc, char **argv) {
65 return error; 84 return error;
66 } 85 }
67 86
68 struct feature_policy *policy = get_feature_policy(argv[0]); 87 char *program = NULL;
88 if (!strcmp(argv[0], "*")) {
89 program = strdup(argv[0]);
90 } else {
91 program = resolve_path(argv[0]);
92 }
93 if (!program) {
94 // Punt
95 sway_log(L_INFO, "Unable to resolve IPC reject target '%s'."
96 " Will use provided path", argv[0]);
97 program = strdup(argv[0]);
98 }
99
100 struct feature_policy *policy = get_feature_policy(program);
69 policy->features &= ~get_features(argc, argv, &error); 101 policy->features &= ~get_features(argc, argv, &error);
70 102
71 sway_log(L_DEBUG, "Permissions granted to %s for features %d", 103 sway_log(L_DEBUG, "Permissions granted to %s for features %d",
72 policy->program, policy->features); 104 policy->program, policy->features);
73 105
106 free(program);
74 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 107 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
75} 108}