Esempio n. 1
0
static void
unlock_or_complete_this_prompt (GkdSecretCreate *self)
{
	GkdSecretUnlock *unlock;
	GkdSecretPrompt *prompt;

	g_object_ref (self);
	prompt = GKD_SECRET_PROMPT (self);

	unlock = gkd_secret_unlock_new (gkd_secret_prompt_get_service (prompt),
	                                gkd_secret_prompt_get_caller (prompt),
	                                gkd_secret_dispatch_get_object_path (GKD_SECRET_DISPATCH (self)));
	gkd_secret_unlock_queue (unlock, self->result_path);

	/*
	 * If any need to be unlocked, then replace this prompt
	 * object with an unlock prompt object, and call the prompt
	 * method.
	 */
	if (gkd_secret_unlock_have_queued (unlock)) {
		gkd_secret_service_publish_dispatch (gkd_secret_prompt_get_service (prompt),
		                                     gkd_secret_prompt_get_caller (prompt),
		                                     GKD_SECRET_DISPATCH (unlock));
		gkd_secret_unlock_call_prompt (unlock, gkd_secret_prompt_get_window_id (prompt));
	}

	g_object_unref (unlock);
	g_object_unref (self);
}
Esempio n. 2
0
static gboolean
create_collection_with_secret (GkdSecretCreate *self, GkdSecretSecret *master)
{
	DBusError derr = DBUS_ERROR_INIT;
	GkdSecretService *service;
	gchar *identifier;

	g_assert (GKD_SECRET_IS_CREATE (self));
	g_assert (master);
	g_assert (!self->result_path);

	self->result_path = gkd_secret_create_with_secret (self->pkcs11_attrs, master, &derr);

	if (!self->result_path) {
		g_warning ("couldn't create new collection: %s", derr.message);
		dbus_error_free (&derr);
		return FALSE;
	}

	if (self->alias) {
		if (!gkd_secret_util_parse_path (self->result_path, &identifier, NULL))
			g_assert_not_reached ();
		service = gkd_secret_prompt_get_service (GKD_SECRET_PROMPT (self));
		gkd_secret_service_set_alias (service, self->alias, identifier);
		g_free (identifier);
	}

	return TRUE;
}
Esempio n. 3
0
static gboolean
create_collection_with_secret (GkdSecretCreate *self, GkdSecretSecret *master)
{
    GError *error = NULL;
    GkdSecretService *service;
    gchar *identifier;

    g_assert (GKD_SECRET_IS_CREATE (self));
    g_assert (master);
    g_assert (!self->result_path);

    self->result_path = gkd_secret_create_with_secret (self->attributes, master, &error);

    if (!self->result_path) {
        g_warning ("couldn't create new collection: %s", error->message);
        g_error_free (error);
        return FALSE;
    }

    service = gkd_secret_prompt_get_service (GKD_SECRET_PROMPT (self));

    if (self->alias) {
        if (!gkd_secret_util_parse_path (self->result_path, &identifier, NULL))
            g_assert_not_reached ();
        gkd_secret_service_set_alias (service, self->alias, identifier);
        g_free (identifier);
    }

    /* Notify the callers that a collection was created */
    gkd_secret_service_emit_collection_created (service, self->result_path);

    return TRUE;
}
Esempio n. 4
0
static void
perform_prompting (GkdSecretCreate *self)
{
    GkdSecretPrompt *prompt = GKD_SECRET_PROMPT (self);

    /* Does the alias exist? */
    if (locate_alias_collection_if_exists (self)) {
        unlock_or_complete_this_prompt (self);

        /* Have we gotten a password yet? */
    } else if (self->master == NULL) {
        setup_password_prompt (self);
        gcr_prompt_password_async (GCR_PROMPT (self),
                                   gkd_secret_prompt_get_cancellable (prompt),
                                   on_prompt_password_complete, NULL);

        /* Check that the password is not empty */
    } else if (!self->confirmed) {
        setup_confirmation_prompt (self);
        gcr_prompt_confirm_async (GCR_PROMPT (self),
                                  gkd_secret_prompt_get_cancellable (prompt),
                                  on_prompt_confirmation_complete, NULL);

        /* Actually create the keyring */
    } else  if (create_collection_with_secret (self, self->master)) {
        gkd_secret_prompt_complete (prompt);

        /* Failed */
    } else {
        gkd_secret_prompt_dismiss (prompt);
    }
}
Esempio n. 5
0
static void
on_prompt_password_complete (GObject *source,
                             GAsyncResult *result,
                             gpointer user_data)
{
    GkdSecretCreate *self = GKD_SECRET_CREATE (source);
    GkdSecretPrompt *prompt = GKD_SECRET_PROMPT (source);
    GError *error = NULL;

    gcr_prompt_password_finish (GCR_PROMPT (source), result, &error);

    if (error != NULL) {
        gkd_secret_prompt_dismiss_with_error (prompt, error);
        g_error_free (error);
        return;
    }

    self->master = gkd_secret_prompt_take_secret (prompt);
    if (self->master == NULL) {
        gkd_secret_prompt_dismiss (prompt);
        return;
    }

    /* If the password strength is greater than zero, then don't confirm */
    if (gcr_prompt_get_password_strength (GCR_PROMPT (source)) > 0)
        self->confirmed = TRUE;

    perform_prompting (self);
}
Esempio n. 6
0
static gboolean
locate_alias_collection_if_exists (GkdSecretCreate *self)
{
	GkdSecretService *service;
	GkdSecretObjects *objects;
	GckObject *collection;
	const gchar *identifier;
	const gchar *caller;
	gchar *path;

	if (!self->alias)
		return FALSE;

	g_assert (!self->result_path);

	service = gkd_secret_prompt_get_service (GKD_SECRET_PROMPT (self));
	caller = gkd_secret_prompt_get_caller (GKD_SECRET_PROMPT (self));
	objects = gkd_secret_prompt_get_objects (GKD_SECRET_PROMPT (self));

	identifier = gkd_secret_service_get_alias (service, self->alias);
	if (!identifier)
		return FALSE;

	/* Make sure it actually exists */
	path = gkd_secret_util_build_path (SECRET_COLLECTION_PREFIX, identifier, -1);
	collection = gkd_secret_objects_lookup_collection (objects, caller, path);

	if (collection) {
		self->result_path = path;
		g_object_unref (collection);
		return TRUE;
	} else {
		g_free (path);
		return FALSE;
	}
}
Esempio n. 7
0
static void
on_prompt_confirmation_complete (GObject *source,
                                 GAsyncResult *result,
                                 gpointer user_data)
{
    GkdSecretCreate *self = GKD_SECRET_CREATE (source);
    GkdSecretPrompt *prompt = GKD_SECRET_PROMPT (source);
    GError *error = NULL;

    self->confirmed = gcr_prompt_confirm_finish (GCR_PROMPT (source), result, &error);
    if (error != NULL) {
        gkd_secret_prompt_dismiss_with_error (prompt, error);
        g_error_free (error);
        return;
    }

    /* If not confirmed, then prompt again */
    if (!self->confirmed) {
        gkd_secret_secret_free (self->master);
        self->master = NULL;
    }

    perform_prompting (self);
}