summaryrefslogtreecommitdiff
path: root/gui/greeter/greeter_item_pam.c
diff options
context:
space:
mode:
Diffstat (limited to 'gui/greeter/greeter_item_pam.c')
-rw-r--r--gui/greeter/greeter_item_pam.c448
1 files changed, 0 insertions, 448 deletions
diff --git a/gui/greeter/greeter_item_pam.c b/gui/greeter/greeter_item_pam.c
deleted file mode 100644
index fb93f4ac..00000000
--- a/gui/greeter/greeter_item_pam.c
+++ /dev/null
@@ -1,448 +0,0 @@
-/* GDM - The GNOME Display Manager
- * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "config.h"
-
-#include <string.h>
-#include <gtk/gtk.h>
-#include <glib/gi18n.h>
-#include <gdk/gdkkeysyms.h>
-
-#include "gdm-common.h"
-#include "gdm-socket-protocol.h"
-
-#include "greeter.h"
-#include "greeter_item.h"
-#include "greeter_item_pam.h"
-#include "greeter_item_ulist.h"
-#include "greeter_item_timed.h"
-#include "greeter_parser.h"
-#include "greeter_configuration.h"
-#include "greeter_canvas_item.h"
-#include "gdm.h"
-#include "gdmwm.h"
-#include "gdmcommon.h"
-
-static gboolean messages_to_give = FALSE;
-static gboolean replace_msg = TRUE;
-static guint err_box_clear_handler = 0;
-
-gchar *greeter_current_user = NULL;
-
-gboolean require_quarter = FALSE;
-
-extern gboolean greeter_probably_login_prompt;
-extern GtkButton *gtk_ok_button;
-extern GtkButton *gtk_start_again_button;
-
-static void
-greeter_item_pam_error_set (gboolean display)
-{
- GreeterItemInfo *info;
- GnomeCanvasItem *item;
-
- info = greeter_lookup_id ("pam-error-logo");
-
- if (info)
- {
- if (info->group_item != NULL)
- item = GNOME_CANVAS_ITEM (info->group_item);
- else
- item = info->item;
-
- if (display)
- gnome_canvas_item_show (item);
- else
- gnome_canvas_item_hide (item);
- }
-}
-
-void
-greeter_item_pam_set_user (const char *user)
-{
- g_free (greeter_current_user);
- greeter_current_user = g_strdup (user);
- greeter_item_ulist_set_user (user);
-}
-
-static gboolean
-evil (GtkEntry *entry, const char *user)
-{
- /* do not translate */
- if (strcmp (user, "Gimme Random Cursor") == 0) {
- gdm_common_setup_cursor (((rand () >> 3) % (GDK_LAST_CURSOR/2)) * 2);
- gtk_entry_set_text (GTK_ENTRY (entry), "");
- return TRUE;
- /* do not translate */
- } else if (strcmp (user, "Require Quater") == 0 ||
- strcmp (user, "Require Quarter") == 0) {
- /* btw, note that I misspelled quarter before and
- * thus this checks for Quater as well as Quarter to
- * keep compatibility which is obviously important for
- * something like this */
- require_quarter = TRUE;
- gtk_entry_set_text (GTK_ENTRY (entry), "");
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-set_text (GreeterItemInfo *info, const char *text)
-{
- greeter_canvas_item_break_set_string (info,
- text,
- FALSE /* markup */,
- info->data.text.real_max_width,
- NULL /* width */,
- NULL /* height */,
- NULL /* canvas */,
- info->item);
-}
-
-void
-greeter_item_pam_login (GtkEntry *entry, GreeterItemInfo *info)
-{
- const char *str;
- char *tmp;
- GreeterItemInfo *error_info;
-
- if (gtk_ok_button != NULL)
- gtk_widget_set_sensitive (GTK_WIDGET (gtk_ok_button), FALSE);
- if (gtk_start_again_button != NULL)
- gtk_widget_set_sensitive (GTK_WIDGET (gtk_start_again_button), FALSE);
-
- greeter_ignore_buttons (TRUE);
-
- str = gtk_entry_get_text (GTK_ENTRY (entry));
- if (greeter_probably_login_prompt &&
- /* evilness */
- evil (entry, str))
- {
- /* obviously being 100% reliable is not an issue for
- this test */
- gtk_entry_set_text (GTK_ENTRY (entry), "");
- return;
- }
-
- if (greeter_probably_login_prompt &&
- ve_string_empty (str) &&
- greeter_item_timed_is_timed ())
- {
- /* timed interruption */
- printf ("%c%c%c\n", STX, BEL, GDM_INTERRUPT_TIMED_LOGIN);
- fflush (stdout);
- return;
- }
-
- gtk_widget_set_sensitive (GTK_WIDGET (entry), FALSE);
-
- /* clear the err_box */
- if (err_box_clear_handler > 0)
- {
- g_source_remove (err_box_clear_handler);
- err_box_clear_handler = 0;
- }
- error_info = greeter_lookup_id ("pam-error");
- if (error_info) {
- greeter_item_pam_error_set (FALSE);
- set_text (error_info, "");
- }
-
- tmp = ve_locale_from_utf8 (str);
- printf ("%c%s\n", STX, tmp);
- fflush (stdout);
- g_free (tmp);
-}
-
-static gboolean
-pam_key_release_event (GtkWidget *entry, GdkEventKey *event, gpointer data)
-{
- GreeterItemInfo *entry_info = greeter_lookup_id ("user-pw-entry");
-
- if (entry_info && entry_info->item &&
- GNOME_IS_CANVAS_WIDGET (entry_info->item) &&
- GTK_IS_ENTRY (GNOME_CANVAS_WIDGET (entry_info->item)->widget))
- {
- const char *login_string;
- GtkWidget *entry = GNOME_CANVAS_WIDGET (entry_info->item)->widget;
-
- if (gtk_ok_button != NULL)
- {
- /*
- * Set ok button to sensitive only if there are characters in
- * the entry field
- */
- login_string = gtk_entry_get_text (GTK_ENTRY (entry));
- if (login_string != NULL && login_string[0] != '\0')
- gtk_widget_set_sensitive (GTK_WIDGET (gtk_ok_button), TRUE);
- else
- gtk_widget_set_sensitive (GTK_WIDGET (gtk_ok_button), FALSE);
- }
- }
- return FALSE;
-}
-
-gboolean
-greeter_item_pam_setup (void)
-{
- GreeterItemInfo *entry_info;
-
- greeter_item_pam_error_set (FALSE);
-
- entry_info = greeter_lookup_id ("user-pw-entry");
- if (entry_info && entry_info->item &&
- GNOME_IS_CANVAS_WIDGET (entry_info->item) &&
- GTK_IS_ENTRY (GNOME_CANVAS_WIDGET (entry_info->item)->widget))
- {
- GtkWidget *entry = GNOME_CANVAS_WIDGET (entry_info->item)->widget;
- gtk_widget_grab_focus (entry);
-
- if ( ! DOING_GDM_DEVELOPMENT)
- {
- /* hack. For some reason if we leave it blank,
- * we'll get a little bit of activity on first keystroke,
- * this way we get rid of it, it will be cleared for the
- * first prompt anyway. */
- gtk_entry_set_text (GTK_ENTRY (entry), "...");
-
- /* initially insensitive */
- gtk_widget_set_sensitive (entry, FALSE);
- }
-
- g_signal_connect (entry, "activate",
- G_CALLBACK (greeter_item_pam_login), entry_info);
- g_signal_connect (G_OBJECT (entry), "key_release_event",
- G_CALLBACK (pam_key_release_event), NULL);
- }
-
- return TRUE;
-}
-
-
-void
-greeter_item_pam_prompt (const char *message,
- int entry_len,
- gboolean entry_visible)
-{
- GreeterItemInfo *conversation_info;
- GreeterItemInfo *entry_info;
- GtkWidget *entry;
-
- conversation_info = greeter_lookup_id ("pam-prompt");
- entry_info = greeter_lookup_id ("user-pw-entry");
-
- if (conversation_info)
- {
- set_text (conversation_info, message);
-
- /*
- * Add Accessibility text for entry field.
- * Might be nice to set ATK_RELATION_LABEL_FOR, LABELLED_BY between
- * the label (pam-prompt) and the entry, but gdmgreeter doesn't use real
- * GTK widgets for text fields. For now, just set the entry field's
- * name.
- */
- if (entry_info != NULL)
- {
- GnomeCanvasWidget *item = GNOME_CANVAS_WIDGET (entry_info->item);
- if (item != NULL)
- {
- GtkWidget *widget = item->widget;
- if (widget != NULL)
- {
- AtkObject *atk_widget;
- atk_widget = gtk_widget_get_accessible (widget);
- if (atk_widget != NULL)
- {
- atk_object_set_name (atk_widget, message);
- }
- }
- }
- }
- }
-
- if (entry_info && entry_info->item &&
- GNOME_IS_CANVAS_WIDGET (entry_info->item))
- {
- entry = GNOME_CANVAS_WIDGET (entry_info->item)->widget;
-
- gtk_entry_set_visibility (GTK_ENTRY (entry), entry_visible);
- gtk_widget_set_sensitive (GTK_WIDGET (entry), TRUE);
- gtk_entry_set_max_length (GTK_ENTRY (entry), entry_len);
- gtk_entry_set_text (GTK_ENTRY (entry), "");
- gtk_widget_grab_focus (entry);
- }
-
- messages_to_give = FALSE;
- replace_msg = TRUE;
-}
-
-void
-greeter_item_pam_message (const char *message)
-{
- GreeterItemInfo *message_info;
- char *oldtext;
- char *newtext;
-
- /* the user has not yet seen messages */
- messages_to_give = TRUE;
-
- message_info = greeter_lookup_id ("pam-message");
-
- if (message_info)
- {
- /* HAAAAAAACK. Sometimes pam sends many many messages, SO
- * we try to collect them until the next prompt or reset or
- * whatnot */
- if ( ! replace_msg &&
- /* empty message is for clearing */
- ! ve_string_empty (message))
- {
- g_object_get (G_OBJECT (message_info->item),
- "text", &oldtext,
- NULL);
- if (strlen (oldtext) > 0)
- {
- newtext = g_strdup_printf ("%s\n%s", oldtext, message);
- set_text (message_info, newtext);
- g_free (newtext);
- }
- else
- set_text (message_info, message);
- }
- else
- set_text (message_info, message);
- }
- replace_msg = FALSE;
-}
-
-
-static gboolean
-error_clear (gpointer data)
-{
- GreeterItemInfo *error_info = data;
- err_box_clear_handler = 0;
-
- set_text (error_info, "");
- greeter_item_pam_error_set (FALSE);
-
- return FALSE;
-}
-
-void
-greeter_item_pam_error (const char *message)
-{
- GreeterItemInfo *error_info;
-
- /* The message I got from pam had a silly newline
- * in the beginning. That may make sense for a
- * terminal based conversation, but it sucks for
- * us, so skip it.
- */
- if (message[0] == '\n')
- message++;
-
- error_info = greeter_lookup_id ("pam-error");
- if (error_info)
- {
- set_text (error_info, message);
-
- if (err_box_clear_handler > 0)
- g_source_remove (err_box_clear_handler);
-
- if (strlen (message) == 0)
- err_box_clear_handler = 0;
- else
- err_box_clear_handler = g_timeout_add (30000,
- error_clear,
- error_info);
- greeter_item_pam_error_set (TRUE);
- }
-}
-
-static GtkWidget *
-hig_dialog_new (GtkWindow *parent,
- GtkDialogFlags flags,
- GtkMessageType type,
- GtkButtonsType buttons,
- const gchar *primary_message,
- const gchar *secondary_message)
-{
- GtkWidget *dialog;
-
- dialog = gtk_message_dialog_new (GTK_WINDOW (parent),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- type,
- buttons,
- "%s", primary_message);
-
- gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
- "%s", secondary_message);
-
- gtk_window_set_title (GTK_WINDOW (dialog), "");
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
- gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 14);
-
- return dialog;
-}
-
-void
-greeter_item_pam_leftover_messages (void)
-{
- if (messages_to_give)
- {
- char *oldtext = NULL;
- GreeterItemInfo *message_info;
-
- message_info = greeter_lookup_id ("pam-message");
-
- if (message_info != NULL)
- {
- g_object_get (G_OBJECT (message_info->item),
- "text", &oldtext,
- NULL);
- }
-
- if ( ! ve_string_empty (oldtext))
- {
- GtkWidget *dlg;
-
- /* we should be now fine for focusing new windows */
- gdm_wm_focus_new_windows (TRUE);
-
- dlg = hig_dialog_new (NULL /* parent */,
- GTK_DIALOG_MODAL /* flags */,
- GTK_MESSAGE_INFO,
- GTK_BUTTONS_OK,
- oldtext,
- "");
- gtk_dialog_set_has_separator (GTK_DIALOG (dlg), FALSE);
- gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
- gdm_wm_center_window (GTK_WINDOW (dlg));
-
- gdm_wm_no_login_focus_push ();
- gtk_dialog_run (GTK_DIALOG (dlg));
- gtk_widget_destroy (dlg);
- gdm_wm_no_login_focus_pop ();
- }
- messages_to_give = FALSE;
- }
-}
-