summaryrefslogtreecommitdiff
path: root/src/libaccountsservice/act-user-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libaccountsservice/act-user-manager.c')
-rw-r--r--src/libaccountsservice/act-user-manager.c245
1 files changed, 244 insertions, 1 deletions
diff --git a/src/libaccountsservice/act-user-manager.c b/src/libaccountsservice/act-user-manager.c
index 3c9ccac..68adc67 100644
--- a/src/libaccountsservice/act-user-manager.c
+++ b/src/libaccountsservice/act-user-manager.c
@@ -86,6 +86,7 @@
* @ACT_USER_MANAGER_ERROR_USER_DOES_NOT_EXIST: The user does not exist
* @ACT_USER_MANAGER_ERROR_PERMISSION_DENIED: Permission denied
* @ACT_USER_MANAGER_ERROR_NOT_SUPPORTED: Operation not supported
+ * @ACT_USER_MANAGER_ERROR_USER_NOT_GUEST: The user is not a guest account
*
* Various error codes returned by the accounts service.
*/
@@ -255,7 +256,8 @@ static const GDBusErrorEntry error_entries[] = {
{ ACT_USER_MANAGER_ERROR_USER_EXISTS, "org.freedesktop.Accounts.Error.UserExists" },
{ ACT_USER_MANAGER_ERROR_USER_DOES_NOT_EXIST, "org.freedesktop.Accounts.Error.UserDoesNotExist" },
{ ACT_USER_MANAGER_ERROR_PERMISSION_DENIED, "org.freedesktop.Accounts.Error.PermissionDenied" },
- { ACT_USER_MANAGER_ERROR_NOT_SUPPORTED, "org.freedesktop.Accounts.Error.NotSupported" }
+ { ACT_USER_MANAGER_ERROR_NOT_SUPPORTED, "org.freedesktop.Accounts.Error.NotSupported" },
+ { ACT_USER_MANAGER_ERROR_USER_NOT_GUEST, "org.freedesktop.Accounts.Error.UserNotGuest" }
};
GQuark
@@ -3121,6 +3123,130 @@ act_user_manager_create_user_finish (ActUserManager *manager,
}
/**
+ * act_user_manager_create_guest:
+ * @manager: a #ActUserManager
+ * @error: a #GError
+ *
+ * Creates a guest account on the system.
+ *
+ * Returns: (transfer full): user object
+ *
+ * Since: 0.6.46
+ */
+ActUser *
+act_user_manager_create_guest (ActUserManager *manager,
+ GError **error)
+{
+ GError *local_error = NULL;
+ gboolean res;
+ gchar *path;
+ ActUser *user;
+
+ g_debug ("ActUserManager: Creating guest");
+
+ g_assert (manager->priv->accounts_proxy != NULL);
+
+ local_error = NULL;
+ res = accounts_accounts_call_create_guest_sync (manager->priv->accounts_proxy,
+ &path,
+ NULL,
+ &local_error);
+ if (! res) {
+ g_propagate_error (error, local_error);
+ return NULL;
+ }
+
+ user = add_new_user_for_object_path (path, manager);
+
+ g_free (path);
+
+ return user;
+}
+
+/**
+ * act_user_manager_create_guest_async:
+ * @manager: a #ActUserManager
+ * @cancellable: (allow-none): optional #GCancellable object,
+ * %NULL to ignore
+ * @callback: (scope async): a #GAsyncReadyCallback to call
+ * when the request is satisfied
+ * @user_data: (closure): the data to pass to @callback
+ *
+ * Asynchronously creates a guest account on the system.
+ *
+ * For more details, see act_user_manager_create_guest(), which
+ * is the synchronous version of this call.
+ *
+ * Since: 0.6.46
+ */
+void
+act_user_manager_create_guest_async (ActUserManager *manager,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GTask *task;
+
+ g_return_if_fail (ACT_IS_USER_MANAGER (manager));
+ g_return_if_fail (manager->priv->accounts_proxy != NULL);
+
+ g_debug ("ActUserManager: Creating guest (async)");
+
+ g_assert (manager->priv->accounts_proxy != NULL);
+
+ task = g_task_new (G_OBJECT (manager),
+ cancellable,
+ callback, user_data);
+
+ accounts_accounts_call_create_guest (manager->priv->accounts_proxy,
+ cancellable,
+ act_user_manager_async_complete_handler, task);
+}
+
+/**
+ * act_user_manager_create_guest_finish:
+ * @manager: a #ActUserManager
+ * @result: a #GAsyncResult
+ * @error: a #GError
+ *
+ * Finishes an asynchronous guest creation.
+ *
+ * See act_user_manager_create_guest_async().
+ *
+ * Returns: (transfer full): user object
+ *
+ * Since: 0.6.46
+ */
+ActUser *
+act_user_manager_create_guest_finish (ActUserManager *manager,
+ GAsyncResult *result,
+ GError **error)
+{
+ GAsyncResult *inner_result;
+ ActUser *user = NULL;
+ gchar *path;
+ GError *remote_error = NULL;
+
+ inner_result = g_task_propagate_pointer (G_TASK (result), error);
+ if (inner_result == NULL) {
+ return FALSE;
+ }
+
+ if (accounts_accounts_call_create_guest_finish (manager->priv->accounts_proxy,
+ &path, inner_result, &remote_error)) {
+ user = add_new_user_for_object_path (path, manager);
+ g_free (path);
+ }
+
+ if (remote_error) {
+ g_dbus_error_strip_remote_error (remote_error);
+ g_propagate_error (error, remote_error);
+ }
+
+ return user;
+}
+
+/**
* act_user_manager_cache_user:
* @manager: a #ActUserManager
* @username: a user name
@@ -3479,3 +3605,120 @@ act_user_manager_delete_user_finish (ActUserManager *manager,
return success;
}
+
+/**
+ * act_user_manager_delete_guest:
+ * @manager: a #ActUserManager
+ * @user: an #ActUser object
+ * @error: a #GError
+ *
+ * Deletes a guest account on the system.
+ *
+ * Returns: %TRUE if the user account was successfully deleted
+ *
+ * Since: 0.6.46
+ */
+gboolean
+act_user_manager_delete_guest (ActUserManager *manager,
+ ActUser *user,
+ GError **error)
+{
+ GError *local_error = NULL;
+
+ g_debug ("ActUserManager: Deleting guest '%s' (uid %ld)", act_user_get_user_name (user), (long) act_user_get_uid (user));
+
+ g_return_val_if_fail (ACT_IS_USER_MANAGER (manager), FALSE);
+ g_return_val_if_fail (ACT_IS_USER (user), FALSE);
+ g_return_val_if_fail (manager->priv->accounts_proxy != NULL, FALSE);
+
+ if (!accounts_accounts_call_delete_guest_sync (manager->priv->accounts_proxy,
+ act_user_get_uid (user),
+ NULL,
+ &local_error)) {
+ g_propagate_error (error, local_error);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * act_user_manager_delete_guest_async:
+ * @manager: a #ActUserManager
+ * @user: a #ActUser object
+ * @remove_files: %TRUE to delete the users home directory
+ * @cancellable: (allow-none): optional #GCancellable object,
+ * %NULL to ignore
+ * @callback: (scope async): a #GAsyncReadyCallback to call
+ * when the request is satisfied
+ * @user_data: (closure): the data to pass to @callback
+ *
+ * Asynchronously deletes a user account from the system.
+ *
+ * For more details, see act_user_manager_delete_guest(), which
+ * is the synchronous version of this call.
+ *
+ * Since: 0.6.46
+ */
+void
+act_user_manager_delete_guest_async (ActUserManager *manager,
+ ActUser *user,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GTask *task;
+
+ g_return_if_fail (ACT_IS_USER_MANAGER (manager));
+ g_return_if_fail (ACT_IS_USER (user));
+ g_return_if_fail (manager->priv->accounts_proxy != NULL);
+
+ task = g_task_new (G_OBJECT (manager),
+ cancellable,
+ callback, user_data);
+
+ g_debug ("ActUserManager: Deleting (async) guest '%s' (uid %ld)", act_user_get_user_name (user), (long) act_user_get_uid (user));
+
+ accounts_accounts_call_delete_guest (manager->priv->accounts_proxy,
+ act_user_get_uid (user),
+ cancellable,
+ act_user_manager_async_complete_handler, task);
+}
+
+/**
+ * act_user_manager_delete_guest_finish:
+ * @manager: a #ActUserManager
+ * @result: a #GAsyncResult
+ * @error: a #GError
+ *
+ * Finishes an asynchronous guest account deletion.
+ *
+ * See act_user_manager_delete_guest_async().
+ *
+ * Returns: %TRUE if the guest account was successfully deleted
+ *
+ * Since: 0.6.46
+ */
+gboolean
+act_user_manager_delete_guest_finish (ActUserManager *manager,
+ GAsyncResult *result,
+ GError **error)
+{
+ GAsyncResult *inner_result;
+ gboolean success;
+ GError *remote_error = NULL;
+
+ inner_result = g_task_propagate_pointer (G_TASK (result), error);
+ if (inner_result == NULL) {
+ return FALSE;
+ }
+
+ success = accounts_accounts_call_delete_guest_finish (manager->priv->accounts_proxy,
+ inner_result, &remote_error);
+ if (remote_error) {
+ g_dbus_error_strip_remote_error (remote_error);
+ g_propagate_error (error, remote_error);
+ }
+
+ return success;
+}