static gboolean on_smartcard_event (GIOChannel *io_channel, GIOCondition condition, gpointer data) { GdmSmartcardExtension *extension; extension = GDM_SMARTCARD_EXTENSION (data); if (condition & G_IO_IN) { char buffer[1024]; ssize_t num_bytes; num_bytes = read (g_io_channel_unix_get_fd (io_channel), buffer, sizeof (buffer)); if (num_bytes < 0 && errno != EINTR) return FALSE; if (num_bytes != 1) { g_debug ("buffer: %s\n", buffer); return TRUE; } if (buffer[0] == 'I') { extension->priv->number_of_tokens++; } else { extension->priv->number_of_tokens--; } if (extension->priv->number_of_tokens == 1) { if (!_gdm_login_extension_emit_choose_user (GDM_LOGIN_EXTENSION (extension), GDM_SMARTCARD_EXTENSION_SERVICE_NAME)) { g_debug ("could not choose smart card user, cancelling..."); _gdm_login_extension_emit_cancel (GDM_LOGIN_EXTENSION (extension)); extension->priv->select_when_ready = TRUE; } else { g_debug ("chose smart card user!"); } } else if (extension->priv->number_of_tokens == 0) { _gdm_login_extension_emit_cancel (GDM_LOGIN_EXTENSION (extension)); } return TRUE; } if (condition & G_IO_HUP) { return FALSE; } return TRUE; }
void gdm_extension_list_add_extension (GdmExtensionList *extension_list, GdmLoginExtension *extension) { GtkWidget *image; GtkWidget *button; GIcon *icon; char *description; if (extension_list->priv->extensions == NULL) { button = gtk_radio_button_new (NULL); } else { GdmLoginExtension *previous_extension; GtkRadioButton *previous_button; previous_extension = GDM_LOGIN_EXTENSION (extension_list->priv->extensions->data); previous_button = GTK_RADIO_BUTTON (g_object_get_data (G_OBJECT (previous_extension), "gdm-extension-list-button")); button = gtk_radio_button_new_from_widget (previous_button); } g_object_set_data (G_OBJECT (extension), "gdm-extension-list-button", button); g_object_set (G_OBJECT (button), "draw-indicator", FALSE, NULL); g_object_set_data (G_OBJECT (button), "gdm-extension", extension); g_signal_connect_swapped (button, "toggled", G_CALLBACK (on_extension_toggled), extension_list); gtk_button_set_focus_on_click (GTK_BUTTON (button), FALSE); gtk_widget_set_sensitive (button, gdm_login_extension_is_enabled (extension)); g_signal_connect_swapped (G_OBJECT (extension), "enabled", G_CALLBACK (on_extension_enabled), extension_list); g_signal_connect_swapped (G_OBJECT (extension), "disabled", G_CALLBACK (on_extension_disabled), extension_list); icon = gdm_login_extension_get_icon (extension); image = gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_SMALL_TOOLBAR); g_object_unref (icon); gtk_widget_show (image); gtk_container_add (GTK_CONTAINER (button), image); description = gdm_login_extension_get_description (extension); gtk_widget_set_tooltip_text (button, description); g_free (description); gtk_widget_show (button); gtk_container_add (GTK_CONTAINER (extension_list->priv->box), button); extension_list->priv->extensions = g_list_append (extension_list->priv->extensions, g_object_ref (extension)); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button))) { g_signal_emit (extension_list, signals[ACTIVATED], 0, extension); } }
static void request_answer (GdmSmartcardExtension *extension) { const char *text; if (!extension->priv->answer_pending) { _gdm_login_extension_emit_answer (GDM_LOGIN_EXTENSION (extension), NULL); return; } extension->priv->answer_pending = FALSE; text = gtk_entry_get_text (GTK_ENTRY (extension->priv->prompt_entry)); _gdm_login_extension_emit_answer (GDM_LOGIN_EXTENSION (extension), text); gtk_widget_hide (extension->priv->prompt_entry); gtk_label_set_text (GTK_LABEL (extension->priv->prompt_label), ""); gtk_entry_set_text (GTK_ENTRY (extension->priv->prompt_entry), ""); gtk_action_set_visible (extension->priv->login_action, FALSE); }
static void gdm_password_extension_init (GdmPasswordExtension *extension) { extension->priv = G_TYPE_INSTANCE_GET_PRIVATE (extension, GDM_TYPE_PASSWORD_EXTENSION, GdmPasswordExtensionPrivate); extension->priv->icon = g_themed_icon_new ("dialog-password"); create_page (extension); create_actions (extension); extension->priv->message_queue = g_queue_new (); gdm_password_extension_reset (GDM_LOGIN_EXTENSION (extension)); }
static void gdm_smartcard_extension_init (GdmSmartcardExtension *extension) { extension->priv = G_TYPE_INSTANCE_GET_PRIVATE (extension, GDM_TYPE_SMARTCARD_EXTENSION, GdmSmartcardExtensionPrivate); extension->priv->icon = g_themed_icon_new ("gdm-smartcard"); create_page (extension); create_actions (extension); extension->priv->message_queue = g_queue_new (); extension->priv->settings = g_settings_new ("org.gnome.login-screen"); gdm_smartcard_extension_reset (GDM_LOGIN_EXTENSION (extension)); }
static void activate_first_available_extension (GdmExtensionList *extension_list) { GList *node; node = extension_list->priv->extensions; while (node != NULL) { GdmLoginExtension *extension; extension = GDM_LOGIN_EXTENSION (node->data); if (gdm_extension_list_set_active_extension (extension_list, extension)) { break; } node = node->next; } }
static void gdm_fingerprint_extension_init (GdmFingerprintExtension *extension) { extension->priv = G_TYPE_INSTANCE_GET_PRIVATE (extension, GDM_TYPE_FINGERPRINT_EXTENSION, GdmFingerprintExtensionPrivate); extension->priv->icon = g_themed_icon_new ("gdm-fingerprint"); create_page (extension); create_actions (extension); extension->priv->message_queue = g_queue_new (); extension->priv->settings = g_settings_new ("org.gnome.login-screen"); extension->priv->bus_connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL); gdm_fingerprint_extension_reset (GDM_LOGIN_EXTENSION (extension)); }
static gboolean dequeue_message (GdmSmartcardExtension *extension) { if (!g_queue_is_empty (extension->priv->message_queue)) { int duration; gboolean needs_beep; QueuedMessage *message; message = (QueuedMessage *) g_queue_pop_head (extension->priv->message_queue); switch (message->type) { case GDM_SERVICE_MESSAGE_TYPE_INFO: needs_beep = FALSE; break; case GDM_SERVICE_MESSAGE_TYPE_PROBLEM: needs_beep = TRUE; break; default: g_assert_not_reached (); } set_message (extension, message->text); duration = (int) (g_utf8_strlen (message->text, -1) / 66.0) * 1000; duration = CLAMP (duration, 400, 3000); extension->priv->message_timeout_id = g_timeout_add (duration, (GSourceFunc) dequeue_message, extension); if (needs_beep) { gdk_window_beep (gtk_widget_get_window (GTK_WIDGET (extension))); } free_queued_message (message); } else { extension->priv->message_timeout_id = 0; _gdm_login_extension_emit_message_queue_empty (GDM_LOGIN_EXTENSION (extension)); } return FALSE; }