[PATCH 2/2] polkit: port authorize to use GTask
Ben Chan
benchan at chromium.org
Thu Apr 6 19:38:44 UTC 2017
---
src/mm-auth-provider-polkit.c | 89 ++++++++++++++++++++-----------------------
1 file changed, 41 insertions(+), 48 deletions(-)
diff --git a/src/mm-auth-provider-polkit.c b/src/mm-auth-provider-polkit.c
index 34f6c770..ef15e87e 100644
--- a/src/mm-auth-provider-polkit.c
+++ b/src/mm-auth-provider-polkit.c
@@ -41,24 +41,16 @@ mm_auth_provider_polkit_new (void)
/*****************************************************************************/
typedef struct {
- MMAuthProvider *self;
- GCancellable *cancellable;
PolkitSubject *subject;
gchar *authorization;
GDBusMethodInvocation *invocation;
- GSimpleAsyncResult *result;
} AuthorizeContext;
static void
-authorize_context_complete_and_free (AuthorizeContext *ctx)
+authorize_context_free (AuthorizeContext *ctx)
{
- g_simple_async_result_complete (ctx->result);
- g_object_unref (ctx->result);
- if (ctx->cancellable)
- g_object_unref (ctx->cancellable);
g_object_unref (ctx->invocation);
g_object_unref (ctx->subject);
- g_object_unref (ctx->self);
g_free (ctx->authorization);
g_free (ctx);
}
@@ -68,54 +60,56 @@ authorize_finish (MMAuthProvider *self,
GAsyncResult *res,
GError **error)
{
- return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error);
+ return g_task_propagate_boolean (G_TASK (res), error);
}
static void
check_authorization_ready (PolkitAuthority *authority,
GAsyncResult *res,
- AuthorizeContext *ctx)
+ GTask *task)
{
PolkitAuthorizationResult *pk_result;
GError *error = NULL;
+ AuthorizeContext *ctx;
- if (g_cancellable_is_cancelled (ctx->cancellable)) {
- g_simple_async_result_set_error (ctx->result,
- MM_CORE_ERROR,
- MM_CORE_ERROR_CANCELLED,
- "PolicyKit authorization attempt cancelled");
- authorize_context_complete_and_free (ctx);
+ if (g_cancellable_is_cancelled (g_task_get_cancellable (task))) {
+ g_task_return_new_error (task,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_CANCELLED,
+ "PolicyKit authorization attempt cancelled");
+ g_object_unref (task);
return;
}
+ ctx = g_task_get_task_data (task);
pk_result = polkit_authority_check_authorization_finish (authority, res, &error);
if (!pk_result) {
- g_simple_async_result_set_error (ctx->result,
- MM_CORE_ERROR,
- MM_CORE_ERROR_FAILED,
- "PolicyKit authorization failed: '%s'",
- error->message);
+ g_task_return_new_error (task,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_FAILED,
+ "PolicyKit authorization failed: '%s'",
+ error->message);
g_error_free (error);
} else {
if (polkit_authorization_result_get_is_authorized (pk_result))
/* Good! */
- g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
+ g_task_return_boolean (task, TRUE);
else if (polkit_authorization_result_get_is_challenge (pk_result))
- g_simple_async_result_set_error (ctx->result,
- MM_CORE_ERROR,
- MM_CORE_ERROR_UNAUTHORIZED,
- "PolicyKit authorization failed: challenge needed for '%s'",
- ctx->authorization);
+ g_task_return_new_error (task,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_UNAUTHORIZED,
+ "PolicyKit authorization failed: challenge needed for '%s'",
+ ctx->authorization);
else
- g_simple_async_result_set_error (ctx->result,
- MM_CORE_ERROR,
- MM_CORE_ERROR_UNAUTHORIZED,
- "PolicyKit authorization failed: not authorized for '%s'",
- ctx->authorization);
+ g_task_return_new_error (task,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_UNAUTHORIZED,
+ "PolicyKit authorization failed: not authorized for '%s'",
+ ctx->authorization);
g_object_unref (pk_result);
}
- authorize_context_complete_and_free (ctx);
+ g_object_unref (task);
}
static void
@@ -128,32 +122,31 @@ authorize (MMAuthProvider *self,
{
MMAuthProviderPolkit *polkit = MM_AUTH_PROVIDER_POLKIT (self);
AuthorizeContext *ctx;
+ GTask *task;
/* When creating the object, we actually allowed errors when looking for the
* authority. If that is the case, we'll just forbid any incoming
* authentication request */
if (!polkit->priv->authority) {
- g_simple_async_report_error_in_idle (G_OBJECT (self),
- callback,
- user_data,
- MM_CORE_ERROR,
- MM_CORE_ERROR_FAILED,
- "PolicyKit authorization error: "
- "'authority not found'");
+ g_task_report_new_error (self,
+ callback,
+ user_data,
+ authorize,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_FAILED,
+ "PolicyKit authorization error: "
+ "'authority not found'");
return;
}
ctx = g_new (AuthorizeContext, 1);
- ctx->self = g_object_ref (self);
ctx->invocation = g_object_ref (invocation);
ctx->authorization = g_strdup (authorization);
- ctx->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
- ctx->result = g_simple_async_result_new (G_OBJECT (self),
- callback,
- user_data,
- authorize);
ctx->subject = polkit_system_bus_name_new (g_dbus_method_invocation_get_sender (ctx->invocation));
+ task = g_task_new (self, cancellable, callback, user_data);
+ g_task_set_task_data (task, ctx, (GDestroyNotify)authorize_context_free);
+
polkit_authority_check_authorization (polkit->priv->authority,
ctx->subject,
authorization,
@@ -161,7 +154,7 @@ authorize (MMAuthProvider *self,
POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION,
ctx->cancellable,
(GAsyncReadyCallback)check_authorization_ready,
- ctx);
+ task);
}
/*****************************************************************************/
--
2.12.2.715.g7642488e1d-goog
More information about the ModemManager-devel
mailing list