PolicyKit: Branch 'master'
David Zeuthen
david at kemper.freedesktop.org
Wed Dec 5 19:48:02 PST 2007
src/kit/kit-string.c | 4
src/polkit-grant/polkit-authorization-db-write.c | 293 +++++++++++++++--------
src/polkit-grant/polkit-explicit-grant-helper.c | 35 +-
src/polkit-grant/polkit-grant-helper.c | 28 +-
src/polkit/polkit-authorization-constraint.c | 200 +++++----------
src/polkit/polkit-authorization-constraint.h | 26 --
src/polkit/polkit-authorization-db.c | 42 ++-
src/polkit/polkit-authorization-db.h | 4
src/polkit/polkit-authorization.c | 137 ++++++----
src/polkit/polkit-authorization.h | 23 +
src/polkit/polkit-private.h | 2
tools/polkit-auth.c | 66 ++---
12 files changed, 493 insertions(+), 367 deletions(-)
New commits:
commit a386f3c61f84b726ca47808599c110c057eba04c
Author: David Zeuthen <davidz at redhat.com>
Date: Wed Dec 5 22:44:50 2007 -0500
refactor constraints API so there is one entry per constraint in the auth file
This makes things a lot more future proof and, perhaps, also easier to
understand.
diff --git a/src/kit/kit-string.c b/src/kit/kit-string.c
index a56d257..579e568 100644
--- a/src/kit/kit-string.c
+++ b/src/kit/kit-string.c
@@ -413,7 +413,7 @@ _to_hex (unsigned int nibble)
* this limit then the return value is the number of characters (not
* including the trailing zero) which would have been written to the
* final string if enough space had been available. Thus, a return
- * value of size or more means that the output was truncated.
+ * value of @buf_size or more means that the output was truncated.
*/
size_t
kit_string_percent_encode (char *buf, size_t buf_size, const char *s)
@@ -625,7 +625,7 @@ out:
* this limit then the return value is the number of characters (not
* including the trailing zero) which would have been written to the
* final string if enough space had been available. Thus, a return
- * value of size or more means that the output was truncated.
+ * value of @buf_size or more means that the output was truncated.
*
* If an uneven number of strings are given, this function will return
* zero and errno will be set to EINVAL.
diff --git a/src/polkit-grant/polkit-authorization-db-write.c b/src/polkit-grant/polkit-authorization-db-write.c
index dd904a2..a6e8099 100644
--- a/src/polkit-grant/polkit-authorization-db-write.c
+++ b/src/polkit-grant/polkit-authorization-db-write.c
@@ -84,7 +84,7 @@ out:
}
polkit_bool_t
-_polkit_authorization_db_auth_file_add (const char *root, polkit_bool_t transient, uid_t uid, char *str_to_add)
+_polkit_authorization_db_auth_file_add (polkit_bool_t transient, uid_t uid, char *str_to_add)
{
int fd;
char *contents;
@@ -95,8 +95,14 @@ _polkit_authorization_db_auth_file_add (const char *root, polkit_bool_t transien
polkit_bool_t ret;
struct stat statbuf;
struct passwd *pw;
+ const char *root;
char *newline = "\n";
+ if (transient)
+ root = PACKAGE_LOCALSTATE_DIR "/run/PolicyKit";
+ else
+ root = PACKAGE_LOCALSTATE_DIR "/lib/PolicyKit";
+
ret = FALSE;
path = NULL;
path_tmp = NULL;
@@ -213,6 +219,83 @@ out:
return ret;
}
+/* returns -1 on error */
+static int
+_write_constraints (char *buf, size_t buf_size, PolKitAuthorizationConstraint **constraints)
+{
+ unsigned int n;
+ unsigned int m;
+
+ kit_return_val_if_fail (constraints != NULL, 0);
+
+ for (n = 0, m = 0; constraints[n] != NULL; n++) {
+ PolKitAuthorizationConstraint *c;
+ const char *key;
+ char value[1024];
+
+ c = constraints[n];
+
+ key = "constraint";
+
+ if (polkit_authorization_constraint_to_string (c, value, sizeof (value)) >= sizeof (value)) {
+ kit_warning ("Constraint %d is too large!", n);
+ m = -1;
+ goto out;
+ }
+
+ if (m < buf_size)
+ buf[m] = ':';
+ m++;
+
+ m += kit_string_percent_encode (buf + m, buf_size - m > 0 ? buf_size - m : 0, key);
+
+ if (m < buf_size)
+ buf[m] = '=';
+ m++;
+
+ m += kit_string_percent_encode (buf + m, buf_size - m > 0 ? buf_size - m : 0, value);
+ }
+
+ if (m < buf_size)
+ buf[m] = '\0';
+
+out:
+ return m;
+}
+
+static polkit_bool_t
+_add_caller_constraints (char *buf, size_t buf_size, PolKitCaller *caller)
+{
+ PolKitAuthorizationConstraint *constraints[64];
+ size_t num_constraints;
+ polkit_bool_t ret;
+ int num_written;
+ unsigned int n;
+
+ ret = FALSE;
+
+ num_constraints = polkit_authorization_constraint_get_from_caller (caller, constraints, 64);
+ if (num_constraints >= 64) {
+ goto out;
+ }
+
+ num_written = _write_constraints (buf, buf_size, constraints);
+ if (num_written == -1) {
+ goto out;
+ }
+
+ if ((size_t) num_written >= buf_size) {
+ goto out;
+ }
+
+ ret = TRUE;
+
+out:
+ for (n = 0; n < num_constraints && n < 64 && constraints[n] != NULL; n++) {
+ polkit_authorization_constraint_unref (constraints[n]);
+ }
+ return ret;
+}
/**
* polkit_authorization_db_add_entry_process_one_shot:
@@ -251,8 +334,6 @@ polkit_authorization_db_add_entry_process_one_shot (PolKitAuthorizationDB *authd
polkit_bool_t ret;
polkit_uint64_t pid_start_time;
struct timeval now;
- PolKitAuthorizationConstraint *constraint;
- char cbuf[256];
g_return_val_if_fail (authdb != NULL, FALSE);
g_return_val_if_fail (action != NULL, FALSE);
@@ -276,12 +357,6 @@ polkit_authorization_db_add_entry_process_one_shot (PolKitAuthorizationDB *authd
return FALSE;
}
- constraint = polkit_authorization_constraint_get_from_caller (caller);
- if (polkit_authorization_constraint_to_string (constraint, cbuf, sizeof (cbuf)) >= sizeof (cbuf)) {
- g_warning ("buffer for auth constraint is too small");
- return FALSE;
- }
-
char pid_buf[32];
char pid_st_buf[32];
char now_buf[32];
@@ -292,21 +367,25 @@ polkit_authorization_db_add_entry_process_one_shot (PolKitAuthorizationDB *authd
snprintf (now_buf, sizeof (now_buf), "%Lu", (polkit_uint64_t) now.tv_sec);
snprintf (uid_buf, sizeof (uid_buf), "%d", user_authenticated_as);
- if (kit_string_entry_create (auth_buf, sizeof (auth_buf),
- "scope", "process-one-shot",
- "pid", pid_buf,
- "pid-start-time", pid_st_buf,
- "action-id", action_id,
- "when", now_buf,
- "auth-as", uid_buf,
- "constraint", cbuf,
- NULL) >= sizeof (auth_buf)) {
+ size_t len;
+ if ((len = kit_string_entry_create (auth_buf, sizeof (auth_buf),
+ "scope", "process-one-shot",
+ "pid", pid_buf,
+ "pid-start-time", pid_st_buf,
+ "action-id", action_id,
+ "when", now_buf,
+ "auth-as", uid_buf,
+ NULL)) >= sizeof (auth_buf)) {
+ g_warning ("authbuf for is too small");
+ return FALSE;
+ }
+
+ if (!_add_caller_constraints (auth_buf + len, sizeof (auth_buf) - len, caller)) {
g_warning ("authbuf for is too small");
return FALSE;
}
- ret = _polkit_authorization_db_auth_file_add (PACKAGE_LOCALSTATE_DIR "/run/PolicyKit",
- TRUE,
+ ret = _polkit_authorization_db_auth_file_add (TRUE,
caller_uid,
auth_buf);
return ret;
@@ -349,8 +428,6 @@ polkit_authorization_db_add_entry_process (PolKitAuthorizationDB *authd
polkit_bool_t ret;
polkit_uint64_t pid_start_time;
struct timeval now;
- PolKitAuthorizationConstraint *constraint;
- char cbuf[256];
g_return_val_if_fail (authdb != NULL, FALSE);
g_return_val_if_fail (action != NULL, FALSE);
@@ -374,12 +451,6 @@ polkit_authorization_db_add_entry_process (PolKitAuthorizationDB *authd
return FALSE;
}
- constraint = polkit_authorization_constraint_get_from_caller (caller);
- if (polkit_authorization_constraint_to_string (constraint, cbuf, sizeof (cbuf)) >= sizeof (cbuf)) {
- g_warning ("buffer for auth constraint is too small");
- return FALSE;
- }
-
char pid_buf[32];
char pid_st_buf[32];
char now_buf[32];
@@ -390,21 +461,25 @@ polkit_authorization_db_add_entry_process (PolKitAuthorizationDB *authd
snprintf (now_buf, sizeof (now_buf), "%Lu", (polkit_uint64_t) now.tv_sec);
snprintf (uid_buf, sizeof (uid_buf), "%d", user_authenticated_as);
- if (kit_string_entry_create (auth_buf, sizeof (auth_buf),
- "scope", "process",
- "pid", pid_buf,
- "pid-start-time", pid_st_buf,
- "action-id", action_id,
- "when", now_buf,
- "auth-as", uid_buf,
- "constraint", cbuf,
- NULL) >= sizeof (auth_buf)) {
+ size_t len;
+ if ((len = kit_string_entry_create (auth_buf, sizeof (auth_buf),
+ "scope", "process",
+ "pid", pid_buf,
+ "pid-start-time", pid_st_buf,
+ "action-id", action_id,
+ "when", now_buf,
+ "auth-as", uid_buf,
+ NULL)) >= sizeof (auth_buf)) {
+ g_warning ("authbuf for is too small");
+ return FALSE;
+ }
+
+ if (!_add_caller_constraints (auth_buf + len, sizeof (auth_buf) - len, caller)) {
g_warning ("authbuf for is too small");
return FALSE;
}
- ret = _polkit_authorization_db_auth_file_add (PACKAGE_LOCALSTATE_DIR "/run/PolicyKit",
- TRUE,
+ ret = _polkit_authorization_db_auth_file_add (TRUE,
caller_uid,
auth_buf);
return ret;
@@ -448,8 +523,6 @@ polkit_authorization_db_add_entry_session (PolKitAuthorizationDB *authd
char *session_objpath;
polkit_bool_t ret;
struct timeval now;
- PolKitAuthorizationConstraint *constraint;
- char cbuf[256];
g_return_val_if_fail (authdb != NULL, FALSE);
g_return_val_if_fail (action != NULL, FALSE);
@@ -467,12 +540,6 @@ polkit_authorization_db_add_entry_session (PolKitAuthorizationDB *authd
if (!polkit_session_get_uid (session, &session_uid))
return FALSE;
- constraint = polkit_authorization_constraint_get_from_caller (caller);
- if (polkit_authorization_constraint_to_string (constraint, cbuf, sizeof (cbuf)) >= sizeof (cbuf)) {
- g_warning ("buffer for auth constraint is too small");
- return FALSE;
- }
-
if (gettimeofday (&now, NULL) != 0) {
g_warning ("Error calling gettimeofday: %m");
return FALSE;
@@ -484,20 +551,24 @@ polkit_authorization_db_add_entry_session (PolKitAuthorizationDB *authd
snprintf (now_buf, sizeof (now_buf), "%Lu", (polkit_uint64_t) now.tv_sec);
snprintf (uid_buf, sizeof (uid_buf), "%d", user_authenticated_as);
- if (kit_string_entry_create (auth_buf, sizeof (auth_buf),
- "scope", "session",
- "session-id", session_objpath,
- "action-id", action_id,
- "when", now_buf,
- "auth-as", uid_buf,
- "constraint", cbuf,
- NULL) >= sizeof (auth_buf)) {
+ size_t len;
+ if ((len = kit_string_entry_create (auth_buf, sizeof (auth_buf),
+ "scope", "session",
+ "session-id", session_objpath,
+ "action-id", action_id,
+ "when", now_buf,
+ "auth-as", uid_buf,
+ NULL)) >= sizeof (auth_buf)) {
g_warning ("authbuf for is too small");
return FALSE;
}
- ret = _polkit_authorization_db_auth_file_add (PACKAGE_LOCALSTATE_DIR "/run/PolicyKit",
- TRUE,
+ if (!_add_caller_constraints (auth_buf + len, sizeof (auth_buf) - len, caller)) {
+ g_warning ("authbuf for is too small");
+ return FALSE;
+ }
+
+ ret = _polkit_authorization_db_auth_file_add (TRUE,
session_uid,
auth_buf);
return ret;
@@ -538,8 +609,6 @@ polkit_authorization_db_add_entry_always (PolKitAuthorizationDB *authd
char *action_id;
polkit_bool_t ret;
struct timeval now;
- PolKitAuthorizationConstraint *constraint;
- char cbuf[256];
g_return_val_if_fail (authdb != NULL, FALSE);
g_return_val_if_fail (action != NULL, FALSE);
@@ -556,31 +625,28 @@ polkit_authorization_db_add_entry_always (PolKitAuthorizationDB *authd
return FALSE;
}
- constraint = polkit_authorization_constraint_get_from_caller (caller);
- if (polkit_authorization_constraint_to_string (constraint, cbuf, sizeof (cbuf)) >= sizeof (cbuf)) {
- g_warning ("buffer for auth constraint is too small");
- return FALSE;
- }
-
char now_buf[32];
char uid_buf[32];
char auth_buf[1024];
snprintf (now_buf, sizeof (now_buf), "%Lu", (polkit_uint64_t) now.tv_sec);
snprintf (uid_buf, sizeof (uid_buf), "%d", user_authenticated_as);
- if (kit_string_entry_create (auth_buf, sizeof (auth_buf),
- "scope", "always",
- "action-id", action_id,
- "when", now_buf,
- "auth-as", uid_buf,
- "constraint", cbuf,
- NULL) >= sizeof (auth_buf)) {
+ size_t len;
+ if ((len = kit_string_entry_create (auth_buf, sizeof (auth_buf),
+ "scope", "always",
+ "action-id", action_id,
+ "when", now_buf,
+ "auth-as", uid_buf,
+ NULL)) >= sizeof (auth_buf)) {
+ g_warning ("authbuf for is too small");
+ return FALSE;
+ }
+ if (!_add_caller_constraints (auth_buf + len, sizeof (auth_buf) - len, caller)) {
g_warning ("authbuf for is too small");
return FALSE;
}
- ret = _polkit_authorization_db_auth_file_add (PACKAGE_LOCALSTATE_DIR "/lib/PolicyKit",
- FALSE,
+ ret = _polkit_authorization_db_auth_file_add (FALSE,
uid,
auth_buf);
return ret;
@@ -589,12 +655,34 @@ polkit_authorization_db_add_entry_always (PolKitAuthorizationDB *authd
typedef struct {
char *action_id;
- PolKitAuthorizationConstraint *constraint;
+ unsigned int _check_constraint_num;
+ PolKitAuthorizationConstraint **constraints;
polkit_bool_t is_authorized;
polkit_bool_t is_negative_authorized;
} CheckDataGrant;
+static polkit_bool_t
+_check_constraints_for_grant (PolKitAuthorization *auth, PolKitAuthorizationConstraint *authc, void *user_data)
+{
+ CheckDataGrant *cd = (CheckDataGrant *) user_data;
+ polkit_bool_t ret;
+
+ ret = FALSE;
+
+ if (cd->constraints [cd->_check_constraint_num] == NULL)
+ goto no_match;
+
+ if (!polkit_authorization_constraint_equal (authc, cd->constraints[cd->_check_constraint_num]))
+ goto no_match;
+
+ cd->_check_constraint_num += 1;
+ return FALSE;
+
+no_match:
+ return TRUE;
+}
+
static polkit_bool_t
_check_auth_for_grant (PolKitAuthorizationDB *authdb, PolKitAuthorization *auth, void *user_data)
{
@@ -611,7 +699,16 @@ _check_auth_for_grant (PolKitAuthorizationDB *authdb, PolKitAuthorization *auth,
if (!polkit_authorization_was_granted_explicitly (auth, &pimp, &is_negative))
goto no_match;
- if (!polkit_authorization_constraint_equal (polkit_authorization_get_constraint (auth), cd->constraint))
+ /* This checks that the number of authorizations are the
+ * same.. as well as that the authorizations are similar one
+ * by one..
+ *
+ * TODO: FIXME: this relies on the ordering, e.g. we don't
+ * catch local+active if there is an active+local one already.
+ */
+ cd->_check_constraint_num = 0;
+ if (polkit_authorization_constraints_foreach (auth, _check_constraints_for_grant, cd) ||
+ cd->constraints [cd->_check_constraint_num] != NULL)
goto no_match;
if (is_negative) {
@@ -633,7 +730,7 @@ static polkit_bool_t
_grant_internal (PolKitAuthorizationDB *authdb,
PolKitAction *action,
uid_t uid,
- PolKitAuthorizationConstraint *constraint,
+ PolKitAuthorizationConstraint **constraints,
PolKitError **error,
polkit_bool_t is_negative)
{
@@ -641,7 +738,7 @@ _grant_internal (PolKitAuthorizationDB *authdb,
char *helper_argv[6] = {PACKAGE_LIBEXEC_DIR "/polkit-explicit-grant-helper", NULL, NULL, NULL, NULL, NULL};
gboolean ret;
gint exit_status;
- char cbuf[256];
+ char cbuf[1024];
CheckDataGrant cd;
polkit_bool_t did_exist;
@@ -649,7 +746,6 @@ _grant_internal (PolKitAuthorizationDB *authdb,
g_return_val_if_fail (authdb != NULL, FALSE);
g_return_val_if_fail (action != NULL, FALSE);
- g_return_val_if_fail (constraint != NULL, FALSE);
if (!polkit_action_get_action_id (action, &(cd.action_id))) {
polkit_error_set_error (error,
@@ -658,16 +754,29 @@ _grant_internal (PolKitAuthorizationDB *authdb,
goto out;
}
- if (polkit_authorization_constraint_to_string (constraint, cbuf, sizeof (cbuf)) >= sizeof (cbuf)) {
- g_warning ("buffer for auth constraint is too small");
- polkit_error_set_error (error,
- POLKIT_ERROR_GENERAL_ERROR,
- "buffer for auth constraint is too small");
- goto out;
+ if (constraints == NULL) {
+ cbuf[0] = '\0';
+ } else {
+ int num_written;
+ num_written = _write_constraints (cbuf, sizeof (cbuf), constraints);
+ if (num_written == -1) {
+ polkit_error_set_error (error,
+ POLKIT_ERROR_GENERAL_ERROR,
+ "one of the given constraints did not fit");
+ goto out;
+ }
+
+ if ((size_t) num_written >= sizeof (cbuf)) {
+ g_warning ("buffer for auth constraint is too small");
+ polkit_error_set_error (error,
+ POLKIT_ERROR_GENERAL_ERROR,
+ "buffer for auth constraint is too small");
+ goto out;
+ }
}
/* check if we have the auth already */
- cd.constraint = constraint;
+ cd.constraints = constraints;
cd.is_authorized = FALSE;
cd.is_negative_authorized = FALSE;
polkit_authorization_db_foreach_for_uid (authdb,
@@ -753,7 +862,7 @@ out:
* @authdb: authorization database
* @action: action
* @uid: uid to grant to
- * @constraint: what constraint to put on the authorization
+ * @constraints: Either %NULL or a %NULL terminated list of constraint to put on the authorization
* @error: return location for error
*
* Grants an authorization to a user for a specific action. This
@@ -770,10 +879,10 @@ polkit_bool_t
polkit_authorization_db_grant_to_uid (PolKitAuthorizationDB *authdb,
PolKitAction *action,
uid_t uid,
- PolKitAuthorizationConstraint *constraint,
+ PolKitAuthorizationConstraint **constraints,
PolKitError **error)
{
- return _grant_internal (authdb, action, uid, constraint, error, FALSE);
+ return _grant_internal (authdb, action, uid, constraints, error, FALSE);
}
/**
@@ -781,7 +890,7 @@ polkit_authorization_db_grant_to_uid (PolKitAuthorizationDB *authdb,
* @authdb: authorization database
* @action: action
* @uid: uid to grant to
- * @constraint: what constraint to put on the authorization
+ * @constraints: Either %NULL or a %NULL terminated list of constraint to put on the authorization
* @error: return location for error
*
* Grants a negative authorization to a user for a specific action. If
@@ -803,8 +912,8 @@ polkit_bool_t
polkit_authorization_db_grant_negative_to_uid (PolKitAuthorizationDB *authdb,
PolKitAction *action,
uid_t uid,
- PolKitAuthorizationConstraint *constraint,
+ PolKitAuthorizationConstraint **constraints,
PolKitError **error)
{
- return _grant_internal (authdb, action, uid, constraint, error, TRUE);
+ return _grant_internal (authdb, action, uid, constraints, error, TRUE);
}
diff --git a/src/polkit-grant/polkit-explicit-grant-helper.c b/src/polkit-grant/polkit-explicit-grant-helper.c
index 0e9d8ae..75b8d2e 100644
--- a/src/polkit-grant/polkit-explicit-grant-helper.c
+++ b/src/polkit-grant/polkit-explicit-grant-helper.c
@@ -115,16 +115,11 @@ main (int argc, char *argv[])
}
char *authc_str;
- PolKitAuthorizationConstraint *authc;
+ size_t authc_str_len;
- /* second is the auth constraint */
+ /* second is the textual form of the auth constraint */
authc_str = argv[2];
- authc = polkit_authorization_constraint_from_string (authc_str);
- if (authc == NULL) {
- syslog (LOG_NOTICE, "auth constraint is malformed [uid=%d]", getuid ());
- fprintf (stderr, "polkit-explicit-grant-helper: auth constraint is malformed. This incident has been logged.\n");
- goto out;
- }
+ authc_str_len = strlen (authc_str);
#define TARGET_UID 0
int target;
@@ -190,19 +185,25 @@ main (int argc, char *argv[])
snprintf (now_buf, sizeof (now_buf), "%Lu", (polkit_uint64_t) now.tv_sec);
snprintf (uid_buf, sizeof (uid_buf), "%d", invoking_uid);
- if (kit_string_entry_create (auth_buf, sizeof (auth_buf),
- "scope", is_negative ? "grant-negative" : "grant",
- "action-id", action_id,
- "when", now_buf,
- "granted-by", uid_buf,
- "constraint", authc_str,
- NULL) >= sizeof (auth_buf)) {
+ size_t len;
+ if ((len = kit_string_entry_create (auth_buf, sizeof (auth_buf),
+ "scope", is_negative ? "grant-negative" : "grant",
+ "action-id", action_id,
+ "when", now_buf,
+ "granted-by", uid_buf,
+ NULL)) >= sizeof (auth_buf)) {
kit_warning ("polkit-explicit-grant-helper: authbuf is too small");
goto out;
}
+ if (authc_str_len > 0) {
+ if (sizeof (auth_buf) - len < authc_str_len + 1) {
+ kit_warning ("polkit-explicit-grant-helper: authbuf is too small");
+ goto out;
+ }
+ strncpy (auth_buf + len, authc_str, authc_str_len + 1);
+ }
- if (_polkit_authorization_db_auth_file_add (PACKAGE_LOCALSTATE_DIR "/lib/PolicyKit",
- FALSE,
+ if (_polkit_authorization_db_auth_file_add (FALSE,
target_uid,
auth_buf)) {
ret = 0;
diff --git a/src/polkit-grant/polkit-grant-helper.c b/src/polkit-grant/polkit-grant-helper.c
index c2f74ad..a3edefc 100644
--- a/src/polkit-grant/polkit-grant-helper.c
+++ b/src/polkit-grant/polkit-grant-helper.c
@@ -640,19 +640,20 @@ main (int argc, char *argv[])
fprintf (stderr, "polkit-grant-helper: no uid for caller\n");
goto out;
}
- if (!polkit_caller_get_ck_session (caller, &session)) {
- fprintf (stderr, "polkit-grant-helper: caller is not in a session\n");
- goto out;
- }
- if (!polkit_session_get_ck_objref (session, &session_objpath)) {
- fprintf (stderr, "polkit-grant-helper: caller is not in a session\n");
- goto out;
+
+ /* This user does not have to be in a session.. for example, one might
+ * use <allow_any>auth_admin</allow_any>...
+ */
+ session = NULL;
+ session_objpath = NULL;
+ if (polkit_caller_get_ck_session (caller, &session) && session != NULL) {
+ if (!polkit_session_get_ck_objref (session, &session_objpath)) {
+ session = NULL;
+ session_objpath = NULL;
+ }
}
- /* Use libpolkit to
- *
- * - figure out if the caller can really auth to do the action
- * - learn what ConsoleKit session the caller belongs to
+ /* Use libpolkit to figure out if the caller can really auth to do the action
*/
if (!verify_with_polkit (context, caller, action, &result, &admin_users))
goto out;
@@ -838,6 +839,11 @@ main (int argc, char *argv[])
case POLKIT_RESULT_ONLY_VIA_ADMIN_AUTH_KEEP_SESSION:
case POLKIT_RESULT_ONLY_VIA_SELF_AUTH_KEEP_SESSION:
+ if (session == NULL || session_objpath == NULL) {
+ fprintf (stderr, "polkit-grant-helper: cannot grant to session when not in a session\n");
+ ret = 2;
+ goto out;
+ }
dbres = polkit_authorization_db_add_entry_session (polkit_context_get_authorization_db (context),
action,
caller,
diff --git a/src/polkit/polkit-authorization-constraint.c b/src/polkit/polkit-authorization-constraint.c
index bbc4fe7..f864d72 100644
--- a/src/polkit/polkit-authorization-constraint.c
+++ b/src/polkit/polkit-authorization-constraint.c
@@ -71,20 +71,14 @@
struct _PolKitAuthorizationConstraint
{
int refcount;
- PolKitAuthorizationConstraintFlags flags;
+ PolKitAuthorizationConstraintType type;
};
-static PolKitAuthorizationConstraint _null_constraint = {-1, 0};
-
static PolKitAuthorizationConstraint _local_constraint = {-1,
- POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_LOCAL};
+ POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_LOCAL};
static PolKitAuthorizationConstraint _active_constraint = {-1,
- POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_ACTIVE};
-
-static PolKitAuthorizationConstraint _local_active_constraint = {-1,
- POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_LOCAL |
- POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_ACTIVE};
+ POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_ACTIVE};
PolKitAuthorizationConstraint *
_polkit_authorization_constraint_new (const char *entry_in_auth_file)
@@ -153,7 +147,7 @@ void
polkit_authorization_constraint_debug (PolKitAuthorizationConstraint *authc)
{
kit_return_if_fail (authc != NULL);
- _pk_debug ("PolKitAuthorizationConstraint: refcount=%d", authc->refcount);
+ _pk_debug ("PolKitAuthorizationConstraint: refcount=%d type=%d", authc->refcount, authc->type);
}
/**
@@ -180,7 +174,7 @@ polkit_authorization_constraint_validate (PolKitAuthorizationConstraint *authc)
* @session: the session
*
* Determine if the given session satisfies the conditions imposed by
- * the given constraint
+ * the given constraint.
*
* Returns: #TRUE if, and only if, the given session satisfies the
* conditions imposed by the given constraint.
@@ -203,12 +197,12 @@ polkit_authorization_constraint_check_session (PolKitAuthorizationConstraint *au
polkit_session_get_ck_is_local (session, &is_local);
polkit_session_get_ck_is_active (session, &is_active);
- if (authc->flags & POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_LOCAL) {
+ if (authc->type == POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_LOCAL) {
if (!is_local)
goto out;
}
- if (authc->flags & POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_ACTIVE) {
+ if (authc->type == POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_ACTIVE) {
if (!is_active)
goto out;
}
@@ -247,7 +241,8 @@ polkit_authorization_constraint_check_caller (PolKitAuthorizationConstraint *aut
if (polkit_caller_get_ck_session (caller, &session) && session != NULL) {
ret = polkit_authorization_constraint_check_session (authc, session);
} else {
- if (authc->flags == 0) {
+ if (authc->type != POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_LOCAL &&
+ authc->type != POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_ACTIVE) {
ret = TRUE;
}
}
@@ -256,44 +251,22 @@ polkit_authorization_constraint_check_caller (PolKitAuthorizationConstraint *aut
}
/**
- * polkit_authorization_constraint_get_flags:
+ * polkit_authorization_constraint_type:
* @authc: the object
*
* Describe the constraint; this is only useful when inspecting an
* authorization to present information to the user (e.g. as
* polkit-auth(1) does).
*
- * Note that the flags returned may not fully describe the constraint
- * and shouldn't be used to perform checking against #PolKitCaller or
- * #PolKitSession objects. Use the
- * polkit_authorization_constraint_check_caller() and
- * polkit_authorization_constraint_check_session() methods for that
- * instead.
- *
- * Returns: flags from #PolKitAuthorizationConstraintFlags
+ * Returns: type from #PolKitAuthorizationConstraintFlags
*
* Since: 0.7
*/
-PolKitAuthorizationConstraintFlags
-polkit_authorization_constraint_get_flags (PolKitAuthorizationConstraint *authc)
+PolKitAuthorizationConstraintType
+polkit_authorization_constraint_type (PolKitAuthorizationConstraint *authc)
{
kit_return_val_if_fail (authc != NULL, FALSE);
- return authc->flags;
-}
-
-/**
- * polkit_authorization_constraint_get_null:
- *
- * Get a #PolKitAuthorizationConstraint object that represents no constraints.
- *
- * Returns: the constraint; the caller shall not unref this object
- *
- * Since: 0.7
- */
-PolKitAuthorizationConstraint *
-polkit_authorization_constraint_get_null (void)
-{
- return &_null_constraint;
+ return authc->type;
}
/**
@@ -329,23 +302,6 @@ polkit_authorization_constraint_get_require_active (void)
}
/**
- * polkit_authorization_constraint_get_require_local_active:
- *
- * Get a #PolKitAuthorizationConstraint object that represents the
- * constraint that the session or caller must be local and in an
- * active session.
- *
- * Returns: the constraint; the caller shall not unref this object
- *
- * Since: 0.7
- */
-PolKitAuthorizationConstraint *
-polkit_authorization_constraint_get_require_local_active (void)
-{
- return &_local_active_constraint;
-}
-
-/**
* polkit_authorization_constraint_to_string:
* @authc: the object
* @out_buf: buffer to store the string representation in
@@ -367,19 +323,15 @@ polkit_authorization_constraint_to_string (PolKitAuthorizationConstraint *authc,
{
kit_return_val_if_fail (authc != NULL, buf_size);
- switch (authc->flags) {
+ switch (authc->type) {
default:
- case 0:
return snprintf (out_buf, buf_size, "none");
- case POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_LOCAL:
+ case POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_LOCAL:
return snprintf (out_buf, buf_size, "local");
- case POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_ACTIVE:
+ case POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_ACTIVE:
return snprintf (out_buf, buf_size, "active");
-
- case POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_LOCAL|POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_ACTIVE:
- return snprintf (out_buf, buf_size, "local+active");
}
}
@@ -401,18 +353,12 @@ polkit_authorization_constraint_from_string (const char *str)
ret = NULL;
- if (strcmp (str, "none") == 0) {
- ret = polkit_authorization_constraint_get_null ();
- goto out;
- } else if (strcmp (str, "local") == 0) {
+ if (strcmp (str, "local") == 0) {
ret = polkit_authorization_constraint_get_require_local ();
goto out;
} else if (strcmp (str, "active") == 0) {
ret = polkit_authorization_constraint_get_require_active ();
goto out;
- } else if (strcmp (str, "local+active") == 0) {
- ret = polkit_authorization_constraint_get_require_local_active ();
- goto out;
}
out:
@@ -422,54 +368,69 @@ out:
/**
* polkit_authorization_constraint_get_from_caller:
* @caller: caller
+ * @out_array: return location for constraints
+ * @array_size: size of the passed array
*
- * Given a caller, return the most restrictive constraint
- * possible. For example, if the caller is local and active, a
- * constraint requiring this will be returned.
+ * Given a caller, return the set of most restrictive constraints
+ * possible. For example, if the caller is local and active, a set
+ * constraints requiring this will be returned.
*
* This function is typically used when the caller obtains an
- * authorization through authentication; the goal is to put a
+ * authorization through authentication; the goal is to put
* constraints on the authorization such that it's only valid when the
* caller is in the context as where she obtained it.
*
- * Returns: a #PolKitConstraint object; this function will never return #NULL.
+ * The caller must unref all the created objects using
+ * polkit_authorization_constraint_unref().
+ *
+ * Returns: This function do not create more than @array_size constraints
+ * (including the trailing %NULL). If the output was truncated due to
+ * this limit then the return value is the number of objects (not
+ * including the trailing %NULL) which would have been written to the
+ * final array if enough space had been available. Thus, a return
+ * value of @array_size or more means that the output was truncated.
*/
-PolKitAuthorizationConstraint *
-polkit_authorization_constraint_get_from_caller (PolKitCaller *caller)
+size_t
+polkit_authorization_constraint_get_from_caller (PolKitCaller *caller,
+ PolKitAuthorizationConstraint **out_array,
+ size_t array_size)
{
+ unsigned int ret;
polkit_bool_t is_local;
polkit_bool_t is_active;
PolKitSession *session;
- PolKitAuthorizationConstraint *ret;
- /* caller is not in a session so use the null constraint */
+ kit_return_val_if_fail (caller != NULL, 0);
+ kit_return_val_if_fail (out_array != NULL, 0);
+
+ ret = 0;
+
if (!polkit_caller_get_ck_session (caller, &session) || session == NULL) {
- ret = polkit_authorization_constraint_get_null ();
goto out;
}
-
+
polkit_session_get_ck_is_local (session, &is_local);
polkit_session_get_ck_is_active (session, &is_active);
if (is_local) {
- if (is_active) {
- ret = polkit_authorization_constraint_get_require_local_active ();
- } else {
- ret = polkit_authorization_constraint_get_require_local ();
- }
- } else {
- if (is_active) {
- ret = polkit_authorization_constraint_get_require_active ();
- } else {
- ret = polkit_authorization_constraint_get_null ();
- }
+ if (ret < array_size)
+ out_array[ret] = polkit_authorization_constraint_get_require_local ();
+ ret++;
+ }
+
+ if (is_active) {
+ if (ret < array_size)
+ out_array[ret] = polkit_authorization_constraint_get_require_active ();
+ ret++;
}
out:
+ if (ret < array_size)
+ out_array[ret] = NULL;
+
return ret;
}
-
/**
* polkit_authorization_constraint_equal:
* @a: first constraint
@@ -487,7 +448,8 @@ polkit_authorization_constraint_equal (PolKitAuthorizationConstraint *a, PolKitA
kit_return_val_if_fail (a != NULL, FALSE);
kit_return_val_if_fail (b != NULL, FALSE);
- return a->flags == b->flags;
+ /* When we add more types this needs expansion */
+ return a->type == b->type;
}
#ifdef POLKIT_BUILD_TESTS
@@ -506,11 +468,8 @@ _tst1 (PolKitSession *s, PolKitAuthorizationConstraint *ac, polkit_bool_t *out_r
*out_result = polkit_authorization_constraint_check_session (ac, s);
if ((c = polkit_caller_new ()) != NULL) {
- if (ac->flags == 0) {
- kit_assert (polkit_authorization_constraint_check_caller (ac, c) == TRUE);
- } else {
- kit_assert (polkit_authorization_constraint_check_caller (ac, c) == FALSE);
- }
+ /* we know that the ac's passed always will be REQUIRE_ACTIVE or REQUIRE_LOCAL */
+ kit_assert (polkit_authorization_constraint_check_caller (ac, c) == FALSE);
kit_assert (polkit_caller_set_ck_session (c, s));
kit_assert (*out_result == polkit_authorization_constraint_check_caller (ac, c));
@@ -539,6 +498,7 @@ _tst2 (PolKitAuthorizationConstraint *ac)
}
}
+#if 0
static polkit_bool_t
_tst3 (PolKitSession *s, PolKitAuthorizationConstraint *compare_to, polkit_bool_t *ret)
{
@@ -572,18 +532,18 @@ _tst3 (PolKitSession *s, PolKitAuthorizationConstraint *compare_to, polkit_bool_
out:
return is_oom;
}
+#endif
static polkit_bool_t
_run_test (void)
{
PolKitAuthorizationConstraint *ac;
- PolKitAuthorizationConstraintFlags flags;
+ PolKitAuthorizationConstraintType type;
PolKitSession *s_active;
PolKitSession *s_inactive;
PolKitSession *s_active_remote;
PolKitSession *s_inactive_remote;
polkit_bool_t ret;
- int n;
if ((s_active = polkit_session_new ()) != NULL) {
if (!polkit_session_set_ck_objref (s_active, "/session1")) {
@@ -627,22 +587,10 @@ _run_test (void)
}
}
- /* null constraint */
- kit_assert ((ac = polkit_authorization_constraint_get_null ()) != NULL);
- polkit_authorization_constraint_ref (ac);
- polkit_authorization_constraint_unref (ac);
- flags = polkit_authorization_constraint_get_flags (ac);
- kit_assert (flags == 0);
- kit_assert (_tst1 (s_active, ac, &ret) || ret == TRUE);
- kit_assert (_tst1 (s_inactive, ac, &ret) || ret == TRUE);
- kit_assert (_tst1 (s_active_remote, ac, &ret) || ret == TRUE);
- kit_assert (_tst1 (s_inactive_remote, ac, &ret) || ret == TRUE);
- _tst2 (ac);
-
/* local constraint */
kit_assert ((ac = polkit_authorization_constraint_get_require_local ()) != NULL);
- flags = polkit_authorization_constraint_get_flags (ac);
- kit_assert (flags == POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_LOCAL);
+ type = polkit_authorization_constraint_type (ac);
+ kit_assert (type == POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_LOCAL);
kit_assert (_tst1 (s_active, ac, &ret) || ret == TRUE);
kit_assert (_tst1 (s_inactive, ac, &ret) || ret == TRUE);
kit_assert (_tst1 (s_active_remote, ac, &ret) || ret == FALSE);
@@ -651,25 +599,16 @@ _run_test (void)
/* active constraint */
kit_assert ((ac = polkit_authorization_constraint_get_require_active ()) != NULL);
- flags = polkit_authorization_constraint_get_flags (ac);
- kit_assert (flags == POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_ACTIVE);
+ type = polkit_authorization_constraint_type (ac);
+ kit_assert (type == POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_ACTIVE);
kit_assert (_tst1 (s_active, ac, &ret) || ret == TRUE);
kit_assert (_tst1 (s_inactive, ac, &ret) || ret == FALSE);
kit_assert (_tst1 (s_active_remote, ac, &ret) || ret == TRUE);
kit_assert (_tst1 (s_inactive_remote, ac, &ret) || ret == FALSE);
_tst2 (ac);
- /* local+active constraint */
- kit_assert ((ac = polkit_authorization_constraint_get_require_local_active ()) != NULL);
- flags = polkit_authorization_constraint_get_flags (ac);
- kit_assert (flags == (POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_LOCAL|
- POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_ACTIVE));
- kit_assert (_tst1 (s_active, ac, &ret) || ret == TRUE);
- kit_assert (_tst1 (s_inactive, ac, &ret) || ret == FALSE);
- kit_assert (_tst1 (s_active_remote, ac, &ret) || ret == FALSE);
- kit_assert (_tst1 (s_inactive_remote, ac, &ret) || ret == FALSE);
- _tst2 (ac);
+#if 0
for (n = 0; n < 4; n++) {
PolKitSession *s;
polkit_bool_t expected[4];
@@ -710,8 +649,9 @@ _run_test (void)
kit_assert (_tst3 (s, polkit_authorization_constraint_get_require_active (), &ret) || ret == expected[2]);
kit_assert (_tst3 (s, polkit_authorization_constraint_get_null (), &ret) || ret == expected[3]);
}
+#endif
- if ((ac = _polkit_authorization_constraint_new ("local+active")) != NULL) {
+ if ((ac = _polkit_authorization_constraint_new ("local")) != NULL) {
polkit_authorization_constraint_validate (ac);
polkit_authorization_constraint_debug (ac);
polkit_authorization_constraint_ref (ac);
diff --git a/src/polkit/polkit-authorization-constraint.h b/src/polkit/polkit-authorization-constraint.h
index 84144a4..9c0dd80 100644
--- a/src/polkit/polkit-authorization-constraint.h
+++ b/src/polkit/polkit-authorization-constraint.h
@@ -44,38 +44,32 @@
POLKIT_BEGIN_DECLS
/**
- * PolKitAuthorizationConstraintFlags:
- * @POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_LOCAL: the session or
+ * PolKitAuthorizationConstraintType:
+ * @POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_LOCAL: the session or
* caller must be local
- * @POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_ACTIVE: the session or
+ * @POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_ACTIVE: the session or
* caller must be in an active session
- * @POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_LOCAL_ACTIVE: short
- * hand for the flags POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_LOCAL
- * and POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_ACTIVE.
*
- * This enumeration describes different conditions, not mutually
- * exclusive, to help describe an authorization constraint.
+ * This enumeration describes the type of the authorization
+ * constraint.
*/
typedef enum {
- POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_LOCAL = 1 << 0,
- POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_ACTIVE = 1 << 1,
- POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_LOCAL_ACTIVE = (1 << 0) | (1 << 1)
-} PolKitAuthorizationConstraintFlags;
+ POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_LOCAL,
+ POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_ACTIVE
+} PolKitAuthorizationConstraintType;
struct _PolKitAuthorizationConstraint;
typedef struct _PolKitAuthorizationConstraint PolKitAuthorizationConstraint;
-PolKitAuthorizationConstraint *polkit_authorization_constraint_get_null (void);
PolKitAuthorizationConstraint *polkit_authorization_constraint_get_require_local (void);
PolKitAuthorizationConstraint *polkit_authorization_constraint_get_require_active (void);
-PolKitAuthorizationConstraint *polkit_authorization_constraint_get_require_local_active (void);
PolKitAuthorizationConstraint *polkit_authorization_constraint_ref (PolKitAuthorizationConstraint *authc);
void polkit_authorization_constraint_unref (PolKitAuthorizationConstraint *authc);
void polkit_authorization_constraint_debug (PolKitAuthorizationConstraint *authc);
polkit_bool_t polkit_authorization_constraint_validate (PolKitAuthorizationConstraint *authc);
-PolKitAuthorizationConstraintFlags polkit_authorization_constraint_get_flags (PolKitAuthorizationConstraint *authc);
+PolKitAuthorizationConstraintType polkit_authorization_constraint_type (PolKitAuthorizationConstraint *authc);
polkit_bool_t polkit_authorization_constraint_check_session (PolKitAuthorizationConstraint *authc,
PolKitSession *session);
@@ -86,7 +80,7 @@ polkit_bool_t polkit_authorization_constraint_check_caller (PolKitAuthorizationC
size_t polkit_authorization_constraint_to_string (PolKitAuthorizationConstraint *authc, char *out_buf, size_t buf_size);
PolKitAuthorizationConstraint *polkit_authorization_constraint_from_string (const char *str);
-PolKitAuthorizationConstraint *polkit_authorization_constraint_get_from_caller (PolKitCaller *caller);
+size_t polkit_authorization_constraint_get_from_caller (PolKitCaller *caller, PolKitAuthorizationConstraint **out_array, size_t array_size);
polkit_bool_t polkit_authorization_constraint_equal (PolKitAuthorizationConstraint *a,
PolKitAuthorizationConstraint *b);
diff --git a/src/polkit/polkit-authorization-db.c b/src/polkit/polkit-authorization-db.c
index 8bc0636..259e841 100644
--- a/src/polkit/polkit-authorization-db.c
+++ b/src/polkit/polkit-authorization-db.c
@@ -627,21 +627,32 @@ typedef struct {
} CheckDataSession;
static polkit_bool_t
+_check_constraint_session (PolKitAuthorization *auth, PolKitAuthorizationConstraint *authc, void *user_data)
+{
+ PolKitSession *session = (PolKitSession *) user_data;
+
+ if (!polkit_authorization_constraint_check_session (authc, session))
+ goto no_match;
+
+ return FALSE;
+no_match:
+ return TRUE;
+}
+
+static polkit_bool_t
_check_auth_for_session (PolKitAuthorizationDB *authdb, PolKitAuthorization *auth, void *user_data)
{
polkit_bool_t ret;
uid_t pimp_uid;
polkit_bool_t is_negative;
CheckDataSession *cd = (CheckDataSession *) user_data;
- PolKitAuthorizationConstraint *constraint;
ret = FALSE;
if (strcmp (polkit_authorization_get_action_id (auth), cd->action_id) != 0)
goto no_match;
- constraint = polkit_authorization_get_constraint (auth);
- if (!polkit_authorization_constraint_check_session (constraint, cd->session))
+ if (polkit_authorization_constraints_foreach (auth, _check_constraint_session, cd->session))
goto no_match;
switch (polkit_authorization_get_scope (auth))
@@ -772,6 +783,19 @@ typedef struct {
} CheckData;
static polkit_bool_t
+_check_constraint_caller (PolKitAuthorization *auth, PolKitAuthorizationConstraint *authc, void *user_data)
+{
+ PolKitCaller *caller = (PolKitCaller *) user_data;
+
+ if (!polkit_authorization_constraint_check_caller (authc, caller))
+ goto no_match;
+
+ return FALSE;
+no_match:
+ return TRUE;
+}
+
+static polkit_bool_t
_check_auth_for_caller (PolKitAuthorizationDB *authdb, PolKitAuthorization *auth, void *user_data)
{
polkit_bool_t ret;
@@ -780,15 +804,13 @@ _check_auth_for_caller (PolKitAuthorizationDB *authdb, PolKitAuthorization *auth
pid_t caller_pid;
polkit_uint64_t caller_pid_start_time;
CheckData *cd = (CheckData *) user_data;
- PolKitAuthorizationConstraint *constraint;
ret = FALSE;
if (strcmp (polkit_authorization_get_action_id (auth), cd->action_id) != 0)
goto no_match;
- constraint = polkit_authorization_get_constraint (auth);
- if (!polkit_authorization_constraint_check_caller (constraint, cd->caller))
+ if (polkit_authorization_constraints_foreach (auth, _check_constraint_caller, cd->caller))
goto no_match;
switch (polkit_authorization_get_scope (auth))
@@ -1143,7 +1165,7 @@ _run_test (void)
const char test_pu1_run[] =
"";
const char test_pu1_lib[] =
- "scope=grant:action-id=org.freedesktop.policykit.read:when=1194634242:granted-by=0:constraint=none\n";
+ "scope=grant:action-id=org.freedesktop.policykit.read:when=1194634242:granted-by=0\n";
const char test_pu2_run[] =
"";
const char test_pu2_lib[] =
@@ -1170,9 +1192,9 @@ _run_test (void)
goto out;
if (snprintf (test_pu3_run, sizeof (test_pu3_run),
- "scope=process:pid=%d:pid-start-time=%lld:action-id=org.example.per-process:when=1196307507:auth-as=500:constraint=none\n"
- "scope=process-one-shot:pid=%d:pid-start-time=%lld:action-id=org.example.per-process-one-shot:when=1196307507:auth-as=500:constraint=none\n"
- "scope=session:session-id=%%2FSession1:action-id=org.example.per-session:when=1196307507:auth-as=500:constraint=none\n",
+ "scope=process:pid=%d:pid-start-time=%lld:action-id=org.example.per-process:when=1196307507:auth-as=500\n"
+ "scope=process-one-shot:pid=%d:pid-start-time=%lld:action-id=org.example.per-process-one-shot:when=1196307507:auth-as=500\n"
+ "scope=session:session-id=%%2FSession1:action-id=org.example.per-session:when=1196307507:auth-as=500\n",
getpid (), start_time,
getpid (), start_time) >= (int) sizeof (test_pu3_run))
goto fail;
diff --git a/src/polkit/polkit-authorization-db.h b/src/polkit/polkit-authorization-db.h
index 68e0374..c206a32 100644
--- a/src/polkit/polkit-authorization-db.h
+++ b/src/polkit/polkit-authorization-db.h
@@ -149,13 +149,13 @@ polkit_bool_t polkit_authorization_db_add_entry_always (PolKitAuthoriz
polkit_bool_t polkit_authorization_db_grant_to_uid (PolKitAuthorizationDB *authdb,
PolKitAction *action,
uid_t uid,
- PolKitAuthorizationConstraint *constraint,
+ PolKitAuthorizationConstraint **constraints,
PolKitError **error);
polkit_bool_t polkit_authorization_db_grant_negative_to_uid (PolKitAuthorizationDB *authdb,
PolKitAction *action,
uid_t uid,
- PolKitAuthorizationConstraint *constraint,
+ PolKitAuthorizationConstraint **constraints,
PolKitError **error);
polkit_bool_t polkit_authorization_db_revoke_entry (PolKitAuthorizationDB *authdb,
diff --git a/src/polkit/polkit-authorization.c b/src/polkit/polkit-authorization.c
index 3ab8b5f..25ef297 100644
--- a/src/polkit/polkit-authorization.c
+++ b/src/polkit/polkit-authorization.c
@@ -74,7 +74,7 @@ struct _PolKitAuthorization
char *entry_in_auth_file;
PolKitAuthorizationScope scope;
- PolKitAuthorizationConstraint *constraint;
+ KitList *constraints;
char *action_id;
uid_t uid;
@@ -101,7 +101,7 @@ _polkit_authorization_get_authfile_entry (PolKitAuthorization *auth)
/**
- * polkit_authorization_get_type:
+ * polkit_authorization_type:
* @auth: the authorization object
*
* Determine the type of authorization.
@@ -111,7 +111,7 @@ _polkit_authorization_get_authfile_entry (PolKitAuthorization *auth)
* Since: 0.7
*/
PolKitAuthorizationType
-polkit_authorization_get_type (PolKitAuthorization *auth)
+polkit_authorization_type (PolKitAuthorization *auth)
{
return POLKIT_AUTHORIZATION_TYPE_UID;
}
@@ -127,13 +127,13 @@ typedef struct {
} EntryParserData;
enum {
- ATTR_PID = 1<<0,
+ ATTR_PID = 1<<0,
ATTR_PID_START_TIME = 1<<1,
- ATTR_SESSION_ID = 1<<2,
- ATTR_ACTION_ID = 1<<3,
- ATTR_WHEN = 1<<4,
- ATTR_AUTH_AS = 1<<5,
- ATTR_GRANTED_BY = 1<<6,
+ ATTR_SESSION_ID = 1<<2,
+ ATTR_ACTION_ID = 1<<3,
+ ATTR_WHEN = 1<<4,
+ ATTR_AUTH_AS = 1<<5,
+ ATTR_GRANTED_BY = 1<<6,
};
static kit_bool_t
@@ -249,9 +249,17 @@ _parse_entry (const char *key, const char *value, void *user_data)
goto error;
} else if (strcmp (key, "constraint") == 0) {
- auth->constraint = polkit_authorization_constraint_from_string (value);
- if (auth->constraint == NULL)
+ PolKitAuthorizationConstraint *c;
+ KitList *l;
+
+ c = polkit_authorization_constraint_from_string (value);
+ if (c == NULL)
+ goto error;
+
+ l = kit_list_append (auth->constraints, c);
+ if (l == NULL)
goto error;
+ auth->constraints = l;
}
ret = TRUE;
@@ -337,6 +345,8 @@ polkit_authorization_ref (PolKitAuthorization *auth)
void
polkit_authorization_unref (PolKitAuthorization *auth)
{
+ KitList *l;
+
kit_return_if_fail (auth != NULL);
auth->refcount--;
if (auth->refcount > 0)
@@ -345,8 +355,14 @@ polkit_authorization_unref (PolKitAuthorization *auth)
kit_free (auth->entry_in_auth_file);
kit_free (auth->action_id);
kit_free (auth->session_id);
- if (auth->constraint != NULL)
- polkit_authorization_constraint_unref (auth->constraint);
+
+ for (l = auth->constraints; l != NULL; l = l->next) {
+ PolKitAuthorizationConstraint *c = (PolKitAuthorizationConstraint *) l->data;
+ polkit_authorization_constraint_unref (c);
+ }
+ if (auth->constraints != NULL)
+ kit_list_free (auth->constraints);
+
kit_free (auth);
}
@@ -414,7 +430,8 @@ polkit_authorization_get_action_id (PolKitAuthorization *auth)
* Get the scope of the authorization; e.g. whether it's confined to a
* single process, a single session or can be retained
* indefinitely. Also keep in mind that an authorization is subject to
- * constraints, see polkit_authorization_get_constraint() for details.
+ * constraints, see polkit_authorization_constraints_foreach() for
+ * details.
*
* Returns: the scope
*
@@ -590,20 +607,35 @@ polkit_authorization_was_granted_explicitly (PolKitAuthorization *auth,
}
/**
- * polkit_authorization_get_constraint:
+ * polkit_authorization_constraints_foreach:
* @auth: the object
+ * @cb: callback function
+ * @user_data: user data
*
- * Get the constraint associated with an authorization.
+ * Iterate over all constraints associated with an authorization.
*
- * Returns: The constraint. Caller shall not unref this object.
+ * Returns: %TRUE if the caller short-circuited the iteration.
*
* Since: 0.7
*/
-PolKitAuthorizationConstraint *
-polkit_authorization_get_constraint (PolKitAuthorization *auth)
+polkit_bool_t
+polkit_authorization_constraints_foreach (PolKitAuthorization *auth,
+ PolKitAuthorizationConstraintsForeachFunc cb,
+ void *user_data)
{
- kit_return_val_if_fail (auth != NULL, FALSE);
- return auth->constraint;
+ KitList *i;
+
+ kit_return_val_if_fail (auth != NULL, TRUE);
+ kit_return_val_if_fail (cb != NULL, TRUE);
+
+ for (i = auth->constraints; i != NULL; i = i->next) {
+ PolKitAuthorizationConstraint *c = i->data;
+
+ if (cb (auth, c, user_data))
+ return TRUE;
+ }
+
+ return FALSE;
}
#ifdef POLKIT_BUILD_TESTS
@@ -648,23 +680,23 @@ _run_test (void)
"scope=process:granted-by=1:granted-by=2",
/* malformed components */
- "scope=process:pid=14485xyz:pid-start-time=26817340:action-id=org.gnome.policykit.examples.frobnicate:when=1194631763:auth-as=500:constraint=local%2Bactive",
- "scope=process:pid=14485:pid-start-time=26817340xyz:action-id=org.gnome.policykit.examples.frobnicate:when=1194631763:auth-as=500:constraint=local%2Bactive",
- "scope=process:pid=14485:pid-start-time=26817340:0xyaction-id=org.gnome.policykit.examples.frobnicate:when=1194631763:auth-as=500:constraint=local%2Bactive",
- "scope=process:pid=14485:pid-start-time=26817340:action-id=org.gnome.policykit.examples.frobnicate:when=1194631763xyz:auth-as=500:constraint=local%2Bactive",
- "scope=process:pid=14485:pid-start-time=26817340:action-id=org.gnome.policykit.examples.frobnicate:when=1194631763:500xyz:constraint=local%2Bactive",
+ "scope=process:pid=14485xyz:pid-start-time=26817340:action-id=org.gnome.policykit.examples.frobnicate:when=1194631763:auth-as=500:constraint=local",
+ "scope=process:pid=14485:pid-start-time=26817340xyz:action-id=org.gnome.policykit.examples.frobnicate:when=1194631763:auth-as=500:constraint=local",
+ "scope=process:pid=14485:pid-start-time=26817340:0xyaction-id=org.gnome.policykit.examples.frobnicate:when=1194631763:auth-as=500:constraint=local",
+ "scope=process:pid=14485:pid-start-time=26817340:action-id=org.gnome.policykit.examples.frobnicate:when=1194631763xyz:auth-as=500:constraint=local",
+ "scope=process:pid=14485:pid-start-time=26817340:action-id=org.gnome.policykit.examples.frobnicate:when=1194631763:500xyz:constraint=local",
"scope=process:pid=14485:pid-start-time=26817340:action-id=org.gnome.policykit.examples.frobnicate:when=1194631763:auth-as=500:constraint=MALFORMED_CONSTRAINT",
/* TODO: validate ConsoleKit paths
- "scope=session:xyz/org/freedesktop/ConsoleKit/Session1:action-id=org.gnome.policykit.examples.punch:1194631779:auth-as=500:constraint=local%2Bactive",*/
- "scope=session:/org/freedesktop/ConsoleKit/Session1:0xyaction-id=org.gnome.policykit.examples.punch:1194631779:auth-as=500:constraint=local%2Bactive",
- "scope=session:/org/freedesktop/ConsoleKit/Session1:action-id=org.gnome.policykit.examples.punch:1194631779xyz:auth-as=500:constraint=local%2Bactive",
- "scope=session:/org/freedesktop/ConsoleKit/Session1:action-id=org.gnome.policykit.examples.punch:1194631779:500xyz:constraint=local%2Bactive",
+ "scope=session:xyz/org/freedesktop/ConsoleKit/Session1:action-id=org.gnome.policykit.examples.punch:1194631779:auth-as=500:constraint=local",*/
+ "scope=session:/org/freedesktop/ConsoleKit/Session1:0xyaction-id=org.gnome.policykit.examples.punch:1194631779:auth-as=500:constraint=local",
+ "scope=session:/org/freedesktop/ConsoleKit/Session1:action-id=org.gnome.policykit.examples.punch:1194631779xyz:auth-as=500:constraint=local",
+ "scope=session:/org/freedesktop/ConsoleKit/Session1:action-id=org.gnome.policykit.examples.punch:1194631779:500xyz:constraint=local",
"scope=session:/org/freedesktop/ConsoleKit/Session1:action-id=org.gnome.policykit.examples.punch:1194631779:auth-as=500:constraint=MALFORMED",
- "scope=always:action-id=0xyorg.gnome.clockapplet.mechanism.settimezone:when=1193598494:auth-as=500:constraint=local%2Bactive",
- "scope=always:action-id=org.gnome.clockapplet.mechanism.settimezone:when=xyz1193598494:auth-as=500:constraint=local%2Bactive",
- "scope=always:action-id=org.gnome.clockapplet.mechanism.settimezone:when=1193598494:auth-as=xyz500:constraint=local%2Bactive",
+ "scope=always:action-id=0xyorg.gnome.clockapplet.mechanism.settimezone:when=1193598494:auth-as=500:constraint=local",
+ "scope=always:action-id=org.gnome.clockapplet.mechanism.settimezone:when=xyz1193598494:auth-as=500:constraint=local",
+ "scope=always:action-id=org.gnome.clockapplet.mechanism.settimezone:when=1193598494:auth-as=xyz500:constraint=local",
"scope=always:action-id=org.gnome.clockapplet.mechanism.settimezone:when=1193598494:auth-as=500:constraint=MALFORMED",
"scope=grant:action-id=0xyorg.freedesktop.policykit.read:when=1194634242:granted-by=0:constraint=none",
@@ -672,86 +704,86 @@ _run_test (void)
"scope=grant:action-id=org.freedesktop.policykit.read:when=1194634242:granted-by=xyz0:constraint=none",
"scope=grant:action-id=org.freedesktop.policykit.read:when=1194634242:granted-by=0:constraint=MALFORMED",
- "random-future-key=some-value:scope=always:action-id=org.gnome.clockapplet.mechanism.settimezone:when=1193598494:auth-as500:constraint=local%2Bactive",
+ "random-future-key=some-value:scope=always:action-id=org.gnome.clockapplet.mechanism.settimezone:when=1193598494:auth-as500:constraint=local",
};
size_t num_invalid_auths = sizeof (invalid_auths) / sizeof (const char *);
TestAuth valid_auths[] = {
{
- "scope=always:action-id=org.gnome.clockapplet.mechanism.settimezone:when=1193598494:auth-as=500:constraint=local%2Bactive",
+ "scope=always:action-id=org.gnome.clockapplet.mechanism.settimezone:when=1193598494:auth-as=500",
POLKIT_AUTHORIZATION_TYPE_UID,
POLKIT_AUTHORIZATION_SCOPE_ALWAYS,
"org.gnome.clockapplet.mechanism.settimezone",
1193598494,
0, 0, NULL,
- polkit_authorization_constraint_get_require_local_active (),
+ NULL,
FALSE, 500
},
{
- "scope=process:pid=14485:pid-start-time=26817340:action-id=org.gnome.policykit.examples.frobnicate:when=1194631763:auth-as=500:constraint=local%2Bactive",
+ "scope=process:pid=14485:pid-start-time=26817340:action-id=org.gnome.policykit.examples.frobnicate:when=1194631763:auth-as=500",
POLKIT_AUTHORIZATION_TYPE_UID,
POLKIT_AUTHORIZATION_SCOPE_PROCESS,
"org.gnome.policykit.examples.frobnicate",
1194631763,
14485, 26817340, NULL,
- polkit_authorization_constraint_get_require_local_active (),
+ NULL,
FALSE, 500
},
{
- "scope=process:pid=14485:pid-start-time=26817340:action-id=org.gnome.policykit.examples.tweak:when=1194631774:auth-as=0:constraint=local%2Bactive",
+ "scope=process:pid=14485:pid-start-time=26817340:action-id=org.gnome.policykit.examples.tweak:when=1194631774:auth-as=0",
POLKIT_AUTHORIZATION_TYPE_UID,
POLKIT_AUTHORIZATION_SCOPE_PROCESS,
"org.gnome.policykit.examples.tweak",
1194631774,
14485, 26817340, NULL,
- polkit_authorization_constraint_get_require_local_active (),
+ NULL,
FALSE, 0
},
{
- "scope=session:session-id=%2Forg%2Ffreedesktop%2FConsoleKit%2FSession1:action-id=org.gnome.policykit.examples.punch:when=1194631779:auth-as=500:constraint=local%2Bactive",
+ "scope=session:session-id=%2Forg%2Ffreedesktop%2FConsoleKit%2FSession1:action-id=org.gnome.policykit.examples.punch:when=1194631779:auth-as=500",
POLKIT_AUTHORIZATION_TYPE_UID,
POLKIT_AUTHORIZATION_SCOPE_SESSION,
"org.gnome.policykit.examples.punch",
1194631779,
0, 0, "/org/freedesktop/ConsoleKit/Session1",
- polkit_authorization_constraint_get_require_local_active (),
+ NULL,
FALSE, 500
},
{
- "scope=process-one-shot:pid=27860:pid-start-time=26974819:action-id=org.gnome.policykit.examples.jump:when=1194633344:auth-as=500:constraint=local%2Bactive",
+ "scope=process-one-shot:pid=27860:pid-start-time=26974819:action-id=org.gnome.policykit.examples.jump:when=1194633344:auth-as=500",
POLKIT_AUTHORIZATION_TYPE_UID,
POLKIT_AUTHORIZATION_SCOPE_PROCESS_ONE_SHOT,
"org.gnome.policykit.examples.jump",
1194633344,
27860, 26974819, NULL,
- polkit_authorization_constraint_get_require_local_active (),
+ NULL,
FALSE, 500
},
{
- "scope=grant:action-id=org.freedesktop.policykit.read:when=1194634242:granted-by=0:constraint=none",
+ "scope=grant:action-id=org.freedesktop.policykit.read:when=1194634242:granted-by=0",
POLKIT_AUTHORIZATION_TYPE_UID,
POLKIT_AUTHORIZATION_SCOPE_ALWAYS,
"org.freedesktop.policykit.read",
1194634242,
0, 0, NULL,
- polkit_authorization_constraint_get_null (),
+ NULL,
TRUE, 0
},
/* this test ensures we can add new key/value pairs in the future */
{
- "scope=grant:FUTURE-KEY=FUTURE-VALUE:action-id=org.freedesktop.policykit.read:when=1194634242:granted-by=0:constraint=none",
+ "scope=grant:FUTURE-KEY=FUTURE-VALUE:action-id=org.freedesktop.policykit.read:when=1194634242:granted-by=0",
POLKIT_AUTHORIZATION_TYPE_UID,
POLKIT_AUTHORIZATION_SCOPE_ALWAYS,
"org.freedesktop.policykit.read",
1194634242,
0, 0, NULL,
- polkit_authorization_constraint_get_null (),
+ NULL,
TRUE, 0
},
@@ -761,7 +793,7 @@ _run_test (void)
pid_t pid;
polkit_uint64_t pid_start_time;
const char *s;
- PolKitAuthorizationConstraint *ac;
+ //PolKitAuthorizationConstraint *ac;
uid_t uid;
polkit_bool_t is_neg;
@@ -774,7 +806,7 @@ _run_test (void)
polkit_authorization_debug (a);
polkit_authorization_validate (a);
- kit_assert (t->type == polkit_authorization_get_type (a));
+ kit_assert (t->type == polkit_authorization_type (a));
kit_assert (t->scope == polkit_authorization_get_scope (a));
kit_assert (t->time_of_grant == polkit_authorization_get_time_of_grant (a));
kit_assert (500 == polkit_authorization_get_uid (a));
@@ -799,8 +831,9 @@ _run_test (void)
kit_assert (t->time_of_grant == polkit_authorization_get_time_of_grant (a));
- kit_assert ((ac = polkit_authorization_get_constraint (a)) != NULL &&
- polkit_authorization_constraint_equal (ac, t->constraint));
+ //TODO:
+ //kit_assert ((ac = polkit_authorization_get_constraint (a)) != NULL &&
+ // polkit_authorization_constraint_equal (ac, t->constraint));
if (t->explicit) {
kit_assert (!polkit_authorization_was_granted_via_defaults (a, &uid));
diff --git a/src/polkit/polkit-authorization.h b/src/polkit/polkit-authorization.h
index efe7965..5428a04 100644
--- a/src/polkit/polkit-authorization.h
+++ b/src/polkit/polkit-authorization.h
@@ -89,7 +89,7 @@ typedef enum {
POLKIT_AUTHORIZATION_TYPE_UID,
} PolKitAuthorizationType;
-PolKitAuthorizationType polkit_authorization_get_type (PolKitAuthorization *auth);
+PolKitAuthorizationType polkit_authorization_type (PolKitAuthorization *auth);
const char *polkit_authorization_get_action_id (PolKitAuthorization *auth);
@@ -97,8 +97,6 @@ uid_t polkit_authorization_get_uid (PolKitAuthorization *auth);
time_t polkit_authorization_get_time_of_grant (PolKitAuthorization *auth);
-PolKitAuthorizationConstraint *polkit_authorization_get_constraint (PolKitAuthorization *auth);
-
PolKitAuthorizationScope polkit_authorization_get_scope (PolKitAuthorization *auth);
@@ -116,6 +114,25 @@ polkit_bool_t polkit_authorization_was_granted_explicitly (PolKitAuthorization
uid_t *out_by_whom,
polkit_bool_t *out_is_negative);
+/**
+ * PolKitAuthorizationConstraintsForeachFunc:
+ * @auth: authorization
+ * @authc: authorization constraint
+ * @user_data: user data
+ *
+ * Callback function for polkit_authorization_constraints_foreach().
+ *
+ * Returns: Pass #TRUE to short-circuit, e.g. stop the iteration
+ */
+typedef polkit_bool_t (*PolKitAuthorizationConstraintsForeachFunc) (PolKitAuthorization *auth,
+ PolKitAuthorizationConstraint *authc,
+ void *user_data);
+
+polkit_bool_t
+polkit_authorization_constraints_foreach (PolKitAuthorization *auth,
+ PolKitAuthorizationConstraintsForeachFunc cb,
+ void *user_data);
+
POLKIT_END_DECLS
#endif /* POLKIT_AUTHORIZATION_H */
diff --git a/src/polkit/polkit-private.h b/src/polkit/polkit-private.h
index 25f74cd..dd8f741 100644
--- a/src/polkit/polkit-private.h
+++ b/src/polkit/polkit-private.h
@@ -57,7 +57,7 @@ const char *_polkit_authorization_get_authfile_entry (PolKitAuthorization *auth)
PolKitAuthorizationConstraint *_polkit_authorization_constraint_new (const char *entry_in_auth_file);
-polkit_bool_t _polkit_authorization_db_auth_file_add (const char *root, polkit_bool_t transient, uid_t uid, char *str_to_add);
+polkit_bool_t _polkit_authorization_db_auth_file_add (polkit_bool_t transient, uid_t uid, char *str_to_add);
PolKitAuthorizationDB *_polkit_authorization_db_new (void);
void _polkit_authorization_db_invalidate_cache (PolKitAuthorizationDB *authdb);
diff --git a/tools/polkit-auth.c b/tools/polkit-auth.c
index 8e6a22c..2bf5248 100644
--- a/tools/polkit-auth.c
+++ b/tools/polkit-auth.c
@@ -63,7 +63,6 @@ static char *opt_revoke_action_id;
static char *opt_user;
static char *opt_grant_action_id;
static char *opt_block_action_id;
-static char *opt_constraint;
typedef struct {
gboolean obtained_privilege;
@@ -388,6 +387,19 @@ get_name_from_uid (uid_t uid)
return name;
}
+static polkit_bool_t
+_print_constraint (PolKitAuthorization *auth, PolKitAuthorizationConstraint *authc, void *user_data)
+{
+ switch (polkit_authorization_constraint_type (authc)) {
+ case POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_LOCAL:
+ printf (" Constraint: Session must be on a local console\n");
+ break;
+ case POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_ACTIVE:
+ printf (" Constraint: Session must be active\n");
+ break;
+ }
+ return FALSE;
+}
static polkit_bool_t
auth_iterator_cb (PolKitAuthorizationDB *authdb,
@@ -431,8 +443,6 @@ auth_iterator_cb (PolKitAuthorizationDB *authdb,
polkit_bool_t is_negative;
pid_t pid;
polkit_uint64_t pid_start_time;
- const char *cstr;
- PolKitAuthorizationConstraint *constraint;
PolKitAction *pk_action;
PolKitResult pk_result;
char exe[PATH_MAX];
@@ -483,20 +493,7 @@ auth_iterator_cb (PolKitAuthorizationDB *authdb,
}
printf (" Obtained: %s\n", time_string);
- constraint = polkit_authorization_get_constraint (auth);
- cstr = "None";
- switch (polkit_authorization_constraint_get_flags (constraint)) {
- case POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_LOCAL:
- cstr = "Session must be on a local console";
- break;
- case POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_ACTIVE:
- cstr = "Session must be active";
- break;
- case POLKIT_AUTHORIZATION_CONSTRAINT_REQUIRE_LOCAL_ACTIVE:
- cstr = "Session must be active and on a local console";
- break;
- }
- printf (" Constraints: %s\n", cstr);
+ polkit_authorization_constraints_foreach (auth, _print_constraint, NULL);
if (is_negative) {
printf (" Negative: Yes\n");
@@ -650,6 +647,8 @@ ensure_dbus_and_ck (void)
return FALSE;
}
+#define MAX_CONSTRAINTS 64
+
int
main (int argc, char *argv[])
{
@@ -660,6 +659,8 @@ main (int argc, char *argv[])
uid_t uid;
pid_t pid;
char *s;
+ PolKitAuthorizationConstraint *constraints[MAX_CONSTRAINTS];
+ unsigned int num_constraints = 0;
ret = 1;
@@ -712,7 +713,6 @@ main (int argc, char *argv[])
opt_obtain_action_id = NULL;
opt_grant_action_id = NULL;
opt_block_action_id = NULL;
- opt_constraint = NULL;
opt_revoke_action_id = NULL;
opt_show_obtainable = FALSE;
opt_user = NULL;
@@ -756,7 +756,20 @@ main (int argc, char *argv[])
} else if (strcmp (opt, "block") == 0) {
opt_block_action_id = strdup (optarg);
} else if (strcmp (opt, "constraint") == 0) {
- opt_constraint = strdup (optarg);
+ PolKitAuthorizationConstraint *c;
+
+ c = polkit_authorization_constraint_from_string (optarg);
+ if (c == NULL) {
+ fprintf (stderr, "polkit-auth: constraint '%s' not recognized\n", optarg);
+ goto out;
+ }
+
+ if (num_constraints >= MAX_CONSTRAINTS - 1) {
+ fprintf (stderr, "polkit-auth: Too many constraints specified\n");
+ goto out;
+ }
+ constraints[num_constraints++] = c;
+
} else if (strcmp (opt, "revoke") == 0) {
opt_revoke_action_id = strdup (optarg);
} else if (strcmp (opt, "show-obtainable") == 0) {
@@ -824,7 +837,6 @@ main (int argc, char *argv[])
opt_block_action_id != NULL) {
PolKitAction *pk_action;
PolKitError *pk_error;
- PolKitAuthorizationConstraint *constraint;
polkit_bool_t res;
if (opt_user == NULL && uid == 0) {
@@ -838,28 +850,20 @@ main (int argc, char *argv[])
else
polkit_action_set_action_id (pk_action, opt_grant_action_id);
- if (opt_constraint != NULL) {
- constraint = polkit_authorization_constraint_from_string (opt_constraint);
- if (constraint == NULL) {
- fprintf (stderr, "polkit-auth: constraint '%s' not recognized\n", opt_constraint);
- goto out;
- }
- } else {
- constraint = polkit_authorization_constraint_get_null ();
- }
+ constraints[num_constraints] = NULL;
pk_error = NULL;
if (opt_block_action_id != NULL) {
res = polkit_authorization_db_grant_negative_to_uid (pk_authdb,
pk_action,
uid,
- constraint,
+ constraints,
&pk_error);
} else {
res = polkit_authorization_db_grant_to_uid (pk_authdb,
pk_action,
uid,
- constraint,
+ constraints,
&pk_error);
}
More information about the hal-commit
mailing list