summaryrefslogtreecommitdiff
path: root/capplets/about-me/gnome-about-me-password.c
diff options
context:
space:
mode:
Diffstat (limited to 'capplets/about-me/gnome-about-me-password.c')
-rw-r--r--capplets/about-me/gnome-about-me-password.c333
1 files changed, 0 insertions, 333 deletions
diff --git a/capplets/about-me/gnome-about-me-password.c b/capplets/about-me/gnome-about-me-password.c
deleted file mode 100644
index 0f2faad3d..000000000
--- a/capplets/about-me/gnome-about-me-password.c
+++ /dev/null
@@ -1,333 +0,0 @@
-/* gnome-about-me.c
- * Copyright (C) 2002 Diego Gonzalez
- *
- * Written by: Diego Gonzalez <diego@pemas.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, 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.
- *
- * Parts of this code come from Gnome-System-Tools.
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <gnome.h>
-#include <pwd.h>
-#include <glade/glade.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <sys/wait.h>
-#include <termios.h>
-#include <pty.h>
-
-#include "capplet-util.h"
-
-typedef struct {
- GtkWidget *dialog;
- GtkWidget *old_password;
- GtkWidget *new_password;
- GtkWidget *retyped_password;
-
- /* Communication with the passwd program */
- FILE *backend_stream;
- int backend_master_fd;
- int backend_pid;
- guint timeout_id;
-} PasswordDialog;
-
-enum
-{
- RESPONSE_APPLY = 1,
- RESPONSE_CLOSE
-};
-
-static void passdlg_set_busy (PasswordDialog *dlg, gboolean busy);
-
-#define REDRAW_NCHARS 1
-
-static gboolean
-wait_child (PasswordDialog *pdialog)
-{
- GtkWidget *dialog;
- gint status, pid;
- gchar *primary_text = NULL;
- gchar *secondary_text = NULL;
-
- pid = waitpid (pdialog->backend_pid, &status, WNOHANG);
-
- if (pid > 0) {
-
- if (WIFEXITED (status) && (WEXITSTATUS(status) == 0)) {
- passdlg_set_busy (pdialog, FALSE);
- primary_text = g_strdup (_("Password changed successfully"));
-
- dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_INFO,
- GTK_BUTTONS_CLOSE,
- primary_text, secondary_text);
- g_signal_connect (G_OBJECT (dialog), "response",
- G_CALLBACK (gtk_widget_destroy), NULL);
- gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
- gtk_widget_show (dialog);
-
- return FALSE;
- } else if ((WIFEXITED (status)) && (WEXITSTATUS (status)) && (WEXITSTATUS(status) < 255)) {
- /* the proccess was running su */
- primary_text = g_strdup (_("The entered password is invalid"));
- secondary_text = g_strdup (_("Check that you typed it correctly "
- "and that you haven't activated the \"caps lock\" key"));
- } else if ((WIFEXITED (status)) && (WEXITSTATUS (status)) && (WEXITSTATUS (status) == 255)) {
- primary_text = g_strdup (_("Could not run passwd"));
- secondary_text = g_strdup (_("Check that you have permissions to run this command"));
- } else {
- primary_text = g_strdup (_("An unexpected error has ocurred"));
- }
-
- if (primary_text) {
- passdlg_set_busy (pdialog, FALSE);
- dialog = gtk_message_dialog_new (NULL,
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_CLOSE,
- primary_text, secondary_text);
-
- g_signal_connect (G_OBJECT (dialog), "response",
- G_CALLBACK (gtk_widget_destroy), NULL);
- gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
- gtk_widget_show (dialog);
-
- g_free (primary_text);
- g_free (secondary_text);
- }
-
- return FALSE;
- }
-
- return TRUE;
-}
-
-static gboolean
-is_string_complete (gchar *str, GSList *list)
-{
- GSList *elem;
-
- if (strlen (str) == 0)
- return FALSE;
-
- for (elem = list; elem; elem = g_slist_next (elem))
- if (g_strrstr (str, elem->data) != NULL)
- return TRUE;
-
- return FALSE;
-}
-
-static char *
-read_from_backend_va (PasswordDialog *pdialog, gchar *needle, va_list ap)
-{
- GString *str = g_string_new ("");
- gboolean may_exit = FALSE;
- gint i = 0;
- gchar c, *ptr, *arg;
- GSList *list = NULL;
-
- list = g_slist_prepend (list, needle);
-
- while ((arg = va_arg (ap, char*)) != NULL)
- list = g_slist_prepend (list, arg);
- va_end (ap);
-
- while (!is_string_complete (str->str, list)) {
- c = fgetc (pdialog->backend_stream);
- i++;
-
- if (*str->str)
- g_string_append_c (str, c);
- else {
- /* the string is still empty, read with O_NONBLOCK until
- * it gets a char, this is done for not blocking the UI
- */
- if (c != EOF) {
- g_string_append_c (str, c);
- fcntl (pdialog->backend_master_fd, F_SETFL, 0);
- }
- usleep (500);
- }
-
- /* ugly hack for redrawing UI without too much overload */
- if (i == REDRAW_NCHARS) {
- while (gtk_events_pending ())
- gtk_main_iteration ();
- i = 0;
- }
- }
-
- fcntl (pdialog->backend_master_fd, F_SETFL, O_NONBLOCK);
- ptr = str->str;
- g_string_free (str, FALSE);
-
- return ptr;
-}
-
-static gchar*
-read_from_backend (PasswordDialog *pdialog, gchar *needle, ...)
-{
- va_list ap;
-
- va_start (ap, needle);
- return read_from_backend_va (pdialog, needle, ap);
-}
-
-static void
-write_to_backend (PasswordDialog *pdialog, char *str)
-{
- gint nread = 0;
- int ret;
-
- /* turn the descriptor blocking for writing the configuration */
- fcntl (pdialog->backend_master_fd, F_SETFL, 0);
-
- do {
- ret = fputc (str [nread], pdialog->backend_stream);
-
- if (ret != EOF)
- nread++;
-
- /* ugly hack for redrawing UI */
- if (nread % REDRAW_NCHARS == 0)
- while (gtk_events_pending ())
- gtk_main_iteration ();
- } while (nread < strlen (str));
-
- while (fflush (pdialog->backend_stream) != 0);
-
- fcntl (pdialog->backend_master_fd, F_SETFL, O_NONBLOCK);
-}
-
-static void
-passdlg_set_busy (PasswordDialog *pdialog, gboolean busy)
-{
- GtkWindow *toplevel = GTK_WINDOW (pdialog->dialog);
- GdkCursor *cursor = NULL;
- GdkDisplay *display;
-
- display = gtk_widget_get_display (GTK_WIDGET (toplevel));
- if (busy)
- cursor = gdk_cursor_new_for_display (display, GDK_WATCH);
-
- gdk_window_set_cursor (GTK_WIDGET (toplevel)->window, cursor);
- gdk_display_flush (display);
-
- if (busy)
- gdk_cursor_unref (cursor);
-}
-
-
-static void
-passdlg_button_clicked_cb (GtkDialog *dialog, gint response_id, PasswordDialog *pdialog)
-{
-
- char *new_password;
- char *retyped_password;
- char *old_password;
- char *args[2];
- gchar *s;
-
- if (response_id == GTK_RESPONSE_OK) {
- /* */
- old_password = g_strdup_printf ("%s\n", gtk_entry_get_text (GTK_ENTRY (pdialog->old_password)));
- new_password = g_strdup_printf ("%s\n", gtk_entry_get_text (GTK_ENTRY (pdialog->new_password)));
- retyped_password = g_strdup_printf ("%s\n", gtk_entry_get_text (GTK_ENTRY (pdialog->retyped_password)));
-
- /* Set the busy cursor as this can be a long process */
- passdlg_set_busy (pdialog, TRUE);
-
- /* Prepare the execution environment of passwd */
- args[0] = "/usr/bin/passwd";
- args[1] = NULL;
-
- pdialog->backend_pid = forkpty (&pdialog->backend_master_fd, NULL, NULL, NULL);
- if (pdialog->backend_pid < 0) {
- g_warning ("could not fork to backend");
- gtk_main_quit ();
- } else if (pdialog->backend_pid == 0) {
- execv (args[0], args);
- exit (255);
- } else {
- fcntl (pdialog->backend_master_fd, F_SETFL, O_NONBLOCK);
- pdialog->timeout_id = g_timeout_add (1000, (GSourceFunc) wait_child, pdialog);
- pdialog->backend_stream = fdopen (pdialog->backend_master_fd, "a+");
- }
-
- /* Send current password to backend */
- s = read_from_backend (pdialog, "assword:", ": ", NULL);
- write_to_backend (pdialog, old_password);
-
- s = read_from_backend (pdialog, "assword:", ": ", "\n", NULL);
- while (strlen(s) < 4) {
- usleep(1000);
- s = read_from_backend (pdialog, "assword:", ": ", "\n", NULL);
- }
-
- /* Send new password to backend */
- write_to_backend (pdialog, new_password);
-
- s = read_from_backend (pdialog, "assword:", ": ", "\n", NULL);
- while (strlen(s) < 4) {
- usleep(1000);
- s = read_from_backend (pdialog, "assword:", ": ", "\n", NULL);
- }
-
- /* Send new and retyped password to backend */
- write_to_backend (pdialog, retyped_password);
- s = read_from_backend (pdialog, "assword:", ": ", "\n", NULL);
- while (strlen(s) < 4) {
- usleep(1000);
- s = read_from_backend (pdialog, "\n", NULL);
- }
-
- } else {
- gtk_main_quit ();
- }
-}
-
-void
-gnome_about_me_password (void)
-{
- PasswordDialog *pdialog;
- GladeXML *dialog;
-
- pdialog = g_new0 (PasswordDialog, 1);
-
- dialog = glade_xml_new (GNOMECC_DATA_DIR "/interfaces/gnome-about-me.glade", "change-password", NULL);
-
- pdialog->dialog = WID ("change-password");
- g_signal_connect (G_OBJECT (pdialog->dialog), "response",
- G_CALLBACK (passdlg_button_clicked_cb), pdialog);
-
- pdialog->old_password = WID ("old-password");
- pdialog->new_password = WID ("new-password");
- pdialog->retyped_password = WID ("retyped-password");
-
- gtk_window_set_resizable (GTK_WINDOW (pdialog->dialog), FALSE);
- gtk_widget_show_all (pdialog->dialog);
- gtk_main ();
-
- gtk_widget_destroy (pdialog->dialog);
- g_object_unref (G_OBJECT (dialog));
- g_free (pdialog);
-}