コード例 #1
0
static void 
on_find_objects(GP11Session *session, GAsyncResult *result, SeahorsePkcs11Refresher *self)
{
	GList *objects, *l;
	GError *err = NULL;
	gulong handle;
	
	g_assert (SEAHORSE_IS_PKCS11_REFRESHER (self));
	
	objects = gp11_session_find_objects_finish (session, result, &err);
	if (err != NULL) {
		seahorse_pkcs11_mark_complete (SEAHORSE_OPERATION (self), err);
		return;
	}

	/* Remove all objects that were found, from the check table */
	for (l = objects; l; l = g_list_next (l)) {
		seahorse_pkcs11_source_receive_object (self->source, l->data);
		handle = gp11_object_get_handle (l->data);
		g_hash_table_remove (self->checks, &handle);
	}

	/* Remove everything not found from the context */
	g_hash_table_foreach_remove (self->checks, remove_each_object, NULL);

	seahorse_pkcs11_mark_complete (SEAHORSE_OPERATION (self), NULL);
}
コード例 #2
0
static GP11Object*
create_credential (GP11Session *session, GP11Object *object,
                   const gchar *secret, GError **error)
{
	GP11Attributes *attrs;
	GP11Object *cred;

	g_return_val_if_fail (GP11_IS_SESSION (session), NULL);
	g_return_val_if_fail (!object || GP11_IS_OBJECT (object), NULL);

	if (!secret)
		secret = "";

	attrs = gp11_attributes_newv (CKA_CLASS, GP11_ULONG, CKO_G_CREDENTIAL,
	                              CKA_VALUE, strlen (secret), secret,
	                              CKA_MATE_TRANSIENT, GP11_BOOLEAN, TRUE,
	                              CKA_TOKEN, GP11_BOOLEAN, TRUE,
	                              GP11_INVALID);

	if (object)
		gp11_attributes_add_ulong (attrs, CKA_G_OBJECT,
		                           gp11_object_get_handle (object));

	cred = gp11_session_create_object_full (session, attrs, NULL, error);
	gp11_attributes_unref (attrs);

	if (cred != NULL)
		gp11_object_set_session (cred, session);

	return cred;
}
コード例 #3
0
static GP11Object*
create_login_keyring (GP11Session *session, GP11Object *cred, GError **error)
{
	GP11Object *login;
	const gchar *label;

	g_return_val_if_fail (GP11_IS_SESSION (session), NULL);
	g_return_val_if_fail (GP11_IS_OBJECT (cred), NULL);

	/* TRANSLATORS: This is the display label for the login keyring */
	label = _("Login");

	login = gp11_session_create_object (session, error,
	                                    CKA_CLASS, GP11_ULONG, CKO_G_COLLECTION,
	                                    CKA_ID, (gsize)5, "login",
	                                    CKA_LABEL, strlen (label), label,
	                                    CKA_G_CREDENTIAL, GP11_ULONG, gp11_object_get_handle (cred),
	                                    CKA_TOKEN, GP11_BOOLEAN, TRUE,
	                                    GP11_INVALID);

	if (login != NULL)
		gp11_object_set_session (login, session);
	return login;
}
コード例 #4
0
static void
gp11_object_get_property (GObject *obj, guint prop_id, GValue *value, 
                          GParamSpec *pspec)
{
	GP11Object *self = GP11_OBJECT (obj);

	switch (prop_id) {
	case PROP_MODULE:
		g_value_take_object (value, gp11_object_get_module (self));
		break;
	case PROP_SLOT:
		g_value_take_object (value, gp11_object_get_slot (self));
		break;
	case PROP_SESSION:
		g_value_take_object (value, gp11_object_get_session (self));
		break;
	case PROP_HANDLE:
		g_value_set_ulong (value, gp11_object_get_handle (self));
		break;
	default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
		break;
	}
}
コード例 #5
0
static gboolean
change_or_create_login (GP11Module *module, const gchar *original, const gchar *master)
{
	GError *error = NULL;
	GP11Session *session;
	GP11Object *login = NULL;
	GP11Object *ocred = NULL;
	GP11Object *mcred = NULL;
	gboolean success = FALSE;

	g_return_val_if_fail (GP11_IS_MODULE (module), FALSE);
	g_return_val_if_fail (original, FALSE);
	g_return_val_if_fail (master, FALSE);

	/* Find the login object */
	session = lookup_login_session (module);
	login = lookup_login_keyring (session);

	/* Create the new credential we'll be changing to */
	mcred = create_credential (session, NULL, master, &error);
	if (mcred == NULL) {
		g_warning ("couldn't create new login credential: %s", egg_error_message (error));
		g_clear_error (&error);

	/* Create original credentials */
	} else if (login) {
		ocred = create_credential (session, login, original, &error);
		if (ocred == NULL) {
			if (g_error_matches (error, GP11_ERROR, CKR_PIN_INCORRECT)) {
				g_message ("couldn't change login master password, "
				           "original password was wrong: %s",
				           egg_error_message (error));
				gkm_wrap_layer_hint_login_unlock_failure ();
			} else {
				g_warning ("couldn't create original login credential: %s",
				           egg_error_message (error));
			}
			g_clear_error (&error);
		}
	}

	/* No keyring? try to create */
	if (!login && mcred) {
		login = create_login_keyring (session, mcred, &error);
		if (login == NULL) {
			g_warning ("couldn't create login keyring: %s", egg_error_message (error));
			g_clear_error (&error);
		} else {
			success = TRUE;
		}

	/* Change the master password */
	} else if (login && ocred && mcred) {
		if (!gp11_object_set (login, &error,
		                      CKA_G_CREDENTIAL, GP11_ULONG, gp11_object_get_handle (mcred),
		                      GP11_INVALID)) {
			g_warning ("couldn't change login master password: %s", egg_error_message (error));
			g_clear_error (&error);
		} else {
			success = TRUE;
		}
	}

	if (ocred) {
		gp11_object_destroy (ocred, NULL);
		g_object_unref (ocred);
	}
	if (mcred)
		g_object_unref (mcred);
	if (login)
		g_object_unref (login);
	if (session)
		g_object_unref (session);

	return success;
}