2006-12-28 23:05:20 +00:00
diff -upr gdm-2.16.1-pre/config/gdm.conf.in gdm-2.16.1-post/config/gdm.conf.in
--- gdm-2.16.1-pre/config/gdm.conf.in 2006-11-08 00:02:48.000000000 -0600
+++ gdm-2.16.1-post/config/gdm.conf.in 2006-11-08 00:02:57.000000000 -0600
@@ -498,6 +498,9 @@ SoundOnLogin=false
# list of libraries, one per line, and load each library in the file.
PreFetchProgram=@GDMPREFETCHCMD@
+# Set to true to show the domain login GUI elements.
+#ShowDomain=false
+
# The chooser is what's displayed when a user wants an indirect XDMCP session,
# or selects Run XDMCP chooser from the system menu
[chooser]
diff -upr gdm-2.16.1-pre/config/gdm.conf.in.orig gdm-2.16.1-post/config/gdm.conf.in.orig
--- gdm-2.16.1-pre/config/gdm.conf.in.orig 2006-08-03 12:36:26.000000000 -0500
+++ gdm-2.16.1-post/config/gdm.conf.in.orig 2006-11-08 00:02:57.000000000 -0600
@@ -67,11 +67,11 @@ TimedLoginDelay=30
# The greeter for local (non-xdmcp) logins. Change gdmlogin to gdmgreeter to
# get the new graphical greeter.
-#Greeter=@libexecdir@/gdmlogin
+Greeter=@libexecdir@/gdmgreeter
# The greeter for xdmcp logins, usually you want a less graphically intensive
# greeter here so it's better to leave this with gdmlogin
-#RemoteGreeter=@libexecdir@/gdmlogin
+RemoteGreeter=@libexecdir@/gdmgreeter
# Launch the greeter with an additional list of colon separated GTK+ modules.
# This is useful for enabling additional feature support e.g. GNOME
@@ -85,10 +85,12 @@ TimedLoginDelay=30
# This value will be overridden with the value from /etc/default/login if it
# contains "ROOT=<pathvalue>".
#DefaultPath=@GDM_USER_PATH@
2007-01-12 15:12:54 +00:00
+DefaultPath=/usr/local/bin:/usr/bin:/usr/X11R6/bin:/bin:/var/lib/dosemu:/usr/games:/opt/bin:/opt/kde3/bin:/opt/kde2/bin:/opt/kde/bin:/usr/openwin/bin:/opt/cross/bin
2006-12-28 23:05:20 +00:00
# Default path for root. The profile scripts will likely override this value.
# This value will be overridden with the value from /etc/default/login if it
# contains "SUROOT=<pathvalue>".
#RootPath=/sbin:/usr/sbin:@GDM_USER_PATH@
2007-01-12 15:12:54 +00:00
+RootPath=/usr/local/bin:/usr/bin:/usr/X11R6/bin:/bin:/usr/local/bin:/usr/bin:/usr/X11R6/bin:/bin:/var/lib/dosemu:/usr/games:/opt/bin:/opt/kde3/bin:/opt/kde2/bin:/opt/kde/bin:/usr/openwin/bin:/opt/cross/bin
2006-12-28 23:05:20 +00:00
# If you are having trouble with using a single server for a long time and want
# GDM to kill/restart the server, turn this on. On Solaris, this value is
@@ -127,6 +129,9 @@ XKeepsCrashing=@gdmconfdir@/XKeepsCrashi
#RebootCommand=@REBOOT_COMMAND@
#HaltCommand=@HALT_COMMAND@
#SuspendCommand=@SUSPEND_COMMAND@
+RebootCommand=/sbin/shutdown -r now
+HaltCommand=/sbin/shutdown -h now
+SuspendCommand=/usr/bin/powersave --suspend-to-disk
# Probably should not touch the below this is the standard setup.
ServAuthDir=@authdir@
# This is our standard startup script. A bit different from a normal X
@@ -137,7 +142,7 @@ BaseXsession=@gdmconfdir@/Xsession
# really a PATH style variable since 2.4.4.2 to allow actual interoperability
# with KDM. Note that <dmconfdir>/Sessions is there for backwards
# compatibility reasons with 2.4.4.x.
-#SessionDesktopDir=/etc/X11/sessions/:@dmconfdir@/Sessions/:@datadir@/gdm/BuiltInSessions/:@datadir@/xsessions/
+SessionDesktopDir=/usr/share/xsessions/:@EXPANDED_SYSCONFDIR@/dm/Sessions/:@EXPANDED_DATADIR@/gdm/BuiltInSessions/
# This is the default .desktop session. One of the ones in SessionDesktopDir
#DefaultSession=gnome.desktop
# Better leave this blank and HOME will be used. You can use syntax ~/ below
@@ -220,7 +225,7 @@ RelaxPermissions=0
# example, home directories owned by some other user.
CheckDirOwner=true
# Number of seconds to wait after a failed login
-#RetryDelay=1
+RetryDelay=1
# Maximum size of a file we wish to read. This makes it hard for a user to DoS
# us by using a large file.
#UserMaxFile=65536
@@ -281,17 +286,18 @@ Enable=false
#PingIntervalSeconds=15
# The port. 177 is the standard port so better keep it that way.
#Port=177
-# Willing script, none is shipped and by default we'll send hostname system id.
-# But if you supply something here, the output of this script will be sent as
-# status of this host so that the chooser can display it. You could for
-# example send load, or mail details for some user, or some such.
-#Willing=@gdmconfdir@/Xwilling
+#Willing script, none is shipped, X11's one is used by default. If
+# none is present we'll send hostname system id. But if you supply
+# something here, the output of this script will be sent as status of
+# this host so that the chooser can display it. You could for example
+# send load, or mail details for some user, or some such.
+Willing=/etc/X11/xdm/Xwilling
[gui]
# The specific gtkrc file we use. It should be the full path to the gtkrc that
# we need. Unless you need a specific gtkrc that doesn't correspond to a
# specific theme, then just use the GtkTheme key.
-#GtkRC=@datadir@/themes/Default/gtk-2.0/gtkrc
+GtkRC=@datadir@/themes/Industrial/gtk-2.0/gtkrc
# The GTK+ theme to use for the GUI.
#GtkTheme=Default
@@ -318,7 +324,7 @@ Enable=false
#TitleBar=true
# Don't allow user to move the standard login window. Only makes sense if
# TitleBar is on.
-#LockPosition=false
+LockPosition=true
# Set a position for the standard login window rather then just centering the
# window. If you enter negative values for the position it is taken as an
# offset from the right or bottom edge.
@@ -339,7 +345,7 @@ Browser=false
# User ID's less than the MinimalUID value will not be included in the face
# browser or in the gdmselection list for Automatic/Timed login. They will not
# be displayed regardless of the settings for Include and Exclude.
-#MinimalUID=100
+MinimalUID=500
# Users listed in Include will be included in the face browser and in the
# gdmsetup selection list for Automatic/Timed login. Users should be separated
# by commas.
@@ -356,7 +362,7 @@ Browser=false
# large numbers of users and this feature should not be used in such
# environments. The setting of IncludeAll does nothing if Include is set to a
# non-empty value.
-#IncludeAll=false
+IncludeAll=true
# If user or user.png exists in this dir it will be used as his picture.
#GlobalFaceDir=@datadir@/pixmaps/faces/
@@ -370,7 +376,7 @@ Browser=false
#ChooserButtonLogo=@pixmapdir@/gdm-foot-logo.png
# The standard greeter should shake if a user entered the wrong username or
# password. Kind of cool looking
-#Quiver=true
+Quiver=false
# The Actions menu (formerly system menu) is shown in the greeter, this is the
# menu that contains reboot, shutdown, suspend, config and chooser. None of
@@ -407,12 +413,12 @@ DefaultRemoteWelcome=true
# Background settings for the standard greeter:
# Type can be 0=None, 1=Image & Color, 2=Color, 3=Image
#BackgroundType=2
-#BackgroundImage=
+BackgroundImage=0
#BackgroundScaleToFit=true
# The Standard greeter (gdmlogin) uses BackgroundColor as the background
# color, while the themed greeter (gdmgreeter) uses GraphicalThemedColor
# as the background color.
-BackgroundColor=#76848F
+BackgroundColor=#000000
GraphicalThemedColor=#76848F
# XDMCP session should only get a color, this is the sanest setting since you
# don't want to take up too much bandwidth
@@ -454,7 +460,7 @@ GraphicalThemedColor=#76848F
# list then provide a list that is delimited by /: to the GraphicalThemes
# key and set GraphicalThemeRand to true. Otherwise use GraphicalTheme
# and specify just one theme.
-#GraphicalTheme=circles
+GraphicalTheme=GDM-SuSE
#GraphicalThemes=circles/:happygnome
GraphicalThemeDir=@datadir@/gdm/themes/
GraphicalThemeRand=false
@@ -471,6 +477,7 @@ GraphicalThemeRand=false
# executable (see daemon/SoundProgram) it will play that file instead of just
# beeping.
#SoundOnLogin=true
+SoundOnLogin=false
#SoundOnLoginFile=
# If SoundOnLoginSuccess, then the greeter will play a sound (as above) when a
# user successfully logs in.
@@ -558,7 +565,7 @@ Gestures=false
# Definition of the standard X server.
[server-Standard]
name=Standard server
-command=@X_SERVER@ @X_CONFIG_OPTIONS@ @XEVIE_OPTION@
+command=@X_SERVER@ @X_CONFIG_OPTIONS@ @XEVIE_OPTION@ -br
flexible=true
# Indicates that the X server should be started at a different process
# priority. Values can be any integer value accepted by the setpriority C
diff -upr gdm-2.16.1-pre/configure.ac gdm-2.16.1-post/configure.ac
--- gdm-2.16.1-pre/configure.ac 2006-11-08 00:02:48.000000000 -0600
+++ gdm-2.16.1-post/configure.ac 2006-11-08 00:02:57.000000000 -0600
@@ -844,6 +844,9 @@ AC_SUBST(GDMPREFETCH)
AC_SUBST(GDMPREFETCHLIST)
AC_SUBST(GDMPREFETCHCMD)
+GDM_SCRATCH_DIR="${localstatedir}/gdm"
+AC_DEFINE_UNQUOTED(GDM_SCRATCH_DIR, "$GDM_SCRATCH_DIR", [GDM scratch dir])
+
AC_ARG_ENABLE(secureremote,
[ --enable-secureremote=[yes/no] Enable to offer a secure X connection through ssh [default=no]],,
enable_secureremote=no)
diff -upr gdm-2.16.1-pre/daemon/gdmconfig.c gdm-2.16.1-post/daemon/gdmconfig.c
--- gdm-2.16.1-pre/daemon/gdmconfig.c 2006-07-17 13:43:51.000000000 -0500
+++ gdm-2.16.1-post/daemon/gdmconfig.c 2006-11-08 00:04:46.000000000 -0600
@@ -231,6 +231,7 @@ static gint GdmFlexiReapDelayMinutes;
static gint GdmBackgroundProgramInitialDelay = 30;
static gint GdmBackgroundProgramRestartDelay = 30;
+static gboolean GdmShowDomain;
static gboolean GdmAllowGtkThemeChange;
static gboolean GdmTitleBar;
static gboolean GdmIncludeAll;
@@ -348,6 +349,7 @@ gdm_config_init (void)
realkey_hash = g_hash_table_new (g_str_hash, g_str_equal);
/* boolean values */
+ gdm_config_add_hash (GDM_KEY_SHOW_DOMAIN, &GdmShowDomain, &bool_type);
gdm_config_add_hash (GDM_KEY_ALLOW_REMOTE_ROOT, &GdmAllowRemoteRoot, &bool_type);
gdm_config_add_hash (GDM_KEY_ALLOW_ROOT, &GdmAllowRoot, &bool_type);
gdm_config_add_hash (GDM_KEY_ALLOW_REMOTE_AUTOLOGIN,
diff -upr gdm-2.16.1-pre/daemon/gdm.h gdm-2.16.1-post/daemon/gdm.h
--- gdm-2.16.1-pre/daemon/gdm.h 2006-08-23 22:47:43.000000000 -0500
+++ gdm-2.16.1-post/daemon/gdm.h 2006-11-08 00:02:57.000000000 -0600
@@ -384,6 +384,8 @@ enum {
#define GDM_KEY_GRAPHICAL_THEME_DIR "greeter/GraphicalThemeDir=" DATADIR "/gdm/themes/"
#define GDM_KEY_GRAPHICAL_THEMED_COLOR "greeter/GraphicalThemedColor=#76848F"
+#define GDM_KEY_SHOW_DOMAIN "greeter/ShowDomain=false"
+
#define GDM_KEY_INFO_MSG_FILE "greeter/InfoMsgFile="
#define GDM_KEY_INFO_MSG_FONT "greeter/InfoMsgFont="
@@ -725,6 +727,7 @@ void gdm_final_cleanup (void);
#define GDM_NOTIFY_TIMED_LOGIN_DELAY "TimedLoginDelay" /* <seconds> */
#define GDM_NOTIFY_TIMED_LOGIN_ENABLE "TimedLoginEnable" /* <true/false as int> */
#define GDM_NOTIFY_DISALLOW_TCP "DisallowTCP" /* <true/false as int> */
+#define GDM_NOTIFY_SHOW_DOMAIN "ShowDomain" /* <trye/false as int> */
#define GDM_NOTIFY_SOUND_ON_LOGIN_FILE "SoundOnLoginFile" /* <sound file> */
#define GDM_NOTIFY_SOUND_ON_LOGIN_SUCCESS_FILE "SoundOnLoginSuccessFile" /* <sound file> */
#define GDM_NOTIFY_SOUND_ON_LOGIN_FAILURE_FILE "SoundOnLoginFailureFile" /* <sound file> */
diff -upr gdm-2.16.1-pre/daemon/verify-pam.c gdm-2.16.1-post/daemon/verify-pam.c
--- gdm-2.16.1-pre/daemon/verify-pam.c 2006-06-09 16:07:41.000000000 -0500
+++ gdm-2.16.1-post/daemon/verify-pam.c 2006-11-08 00:02:57.000000000 -0600
@@ -57,6 +57,8 @@ static char *tmp_PAM_USER = NULL;
/* this is another hack */
static gboolean did_we_ask_for_password = FALSE;
+static gboolean is_account_disabled = FALSE;
+static gboolean is_account_expired = FALSE;
static char *selected_user = NULL;
@@ -430,6 +432,7 @@ perhaps_translate_message (const char *m
g_hash_table_insert (hash, "You are required to change your password immediately (password aged)", _("You are required to change your password immediately (password aged)"));
g_hash_table_insert (hash, "You are required to change your password immediately (root enforced)", _("You are required to change your password immediately (root enforced)"));
g_hash_table_insert (hash, "Your account has expired; please contact your system administrator", _("Your account has expired; please contact your system administrator"));
+ g_hash_table_insert (hash, "Your account is disabled. Please contact your system administrator", _("Your account is disabled. Please contact your system administrator"));
g_hash_table_insert (hash, "No password supplied", _("No password supplied"));
g_hash_table_insert (hash, "Password unchanged", _("Password unchanged"));
g_hash_table_insert (hash, "Can not get username", _("Can not get username"));
@@ -502,8 +505,9 @@ gdm_verify_pam_conv (int num_msg, struct
for (replies = 0; replies < num_msg; replies++) {
gboolean islogin = FALSE;
- const char *m = msg[replies]->msg;
- m = perhaps_translate_message (m);
+ const char *m_untranslated = msg[replies]->msg;
+ const char *m;
+ m = perhaps_translate_message (m_untranslated);
switch (msg[replies]->msg_style) {
@@ -589,6 +593,12 @@ gdm_verify_pam_conv (int num_msg, struct
case PAM_ERROR_MSG:
/* PAM sent a message that should displayed to the user */
+
+ if (strstr (m_untranslated, "account is disabled"))
+ is_account_disabled = TRUE;
+ else if (strstr (m_untranslated, "account has expired"))
+ is_account_expired = TRUE;
+
gdm_slave_greeter_ctl_no_ret (GDM_ERRDLG, m);
reply[replies].resp_retcode = PAM_SUCCESS;
reply[replies].resp = NULL;
@@ -1125,7 +1135,11 @@ authenticate_again:
/* Only give this message if we actually asked for
password, otherwise it would be silly to say that
the password may have been wrong */
- if (did_we_ask_for_password) {
+ if (is_account_disabled) {
+ basemsg = _("\nYour account has been disabled.");
+ } else if (is_account_expired) {
+ basemsg = _("\nYour account has expired.");
+ } else if (did_we_ask_for_password) {
basemsg = _("\nIncorrect username or password. "
"Letters must be typed in the correct "
"case.");
@@ -1134,7 +1148,7 @@ authenticate_again:
"Letters must be typed in the correct "
"case.");
}
- if (is_capslock) {
+ if (is_capslock && !is_account_disabled && !is_account_expired) {
msg = g_strconcat (basemsg, " ",
_("Caps Lock is on."),
NULL);
@@ -1250,6 +1264,8 @@ gdm_verify_setup_user (GdmDisplay *d, co
/* Start authentication session */
did_we_ask_for_password = FALSE;
+ is_account_disabled = FALSE;
+ is_account_expired = FALSE;
if ((pamerr = pam_authenticate (pamh, null_tok)) != PAM_SUCCESS) {
if (gdm_slave_action_pending ()) {
gdm_error (_("Couldn't authenticate user"));
diff -upr gdm-2.16.1-pre/gui/greeter/greeter.c gdm-2.16.1-post/gui/greeter/greeter.c
--- gdm-2.16.1-pre/gui/greeter/greeter.c 2006-11-08 00:02:48.000000000 -0600
+++ gdm-2.16.1-post/gui/greeter/greeter.c 2006-11-08 00:02:57.000000000 -0600
@@ -121,6 +121,53 @@ get_random_theme ()
return theme;
}
+static gchar *errdlg_message = NULL;
+
+static void
+show_errdlg_messages (void)
+{
+ gchar *tmp;
+ GtkWidget *dlg;
+
+ if (!errdlg_message)
+ return;
+
+ /* we should be now fine for focusing new windows */
+ gdm_wm_focus_new_windows (TRUE);
+
+ tmp = ve_locale_to_utf8 (errdlg_message);
+ dlg = ve_hig_dialog_new (NULL /* parent */,
+ GTK_DIALOG_MODAL /* flags */,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_OK,
+ tmp,
+ "");
+ g_free (tmp);
+ g_free (errdlg_message);
+ errdlg_message = NULL;
+
+ 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 ();
+}
+
+static void
+append_errdlg_message (const gchar *message)
+{
+ if (errdlg_message) {
+ gchar *tmp;
+
+ tmp = g_strjoin ("\n\n", errdlg_message, message, NULL);
+ g_free (errdlg_message);
+ errdlg_message = tmp;
+ } else {
+ errdlg_message = g_strdup (message);
+ }
+}
+
static gboolean
greeter_ctrl_handler (GIOChannel *source,
GIOCondition cond,
@@ -184,6 +231,8 @@ process_operation (guchar op_code,
break;
case GDM_PROMPT:
+ show_errdlg_messages ();
+
tmp = ve_locale_to_utf8 (args);
if (tmp != NULL && strcmp (tmp, _("Username:")) == 0) {
gdm_common_login_sound (gdm_config_get_string (GDM_KEY_SOUND_PROGRAM),
@@ -205,6 +254,8 @@ process_operation (guchar op_code,
break;
case GDM_NOECHO:
+ show_errdlg_messages ();
+
tmp = ve_locale_to_utf8 (args);
if (tmp != NULL && strcmp (tmp, _("Password:")) == 0)
@@ -217,6 +268,8 @@ process_operation (guchar op_code,
break;
case GDM_MSG:
+ show_errdlg_messages ();
+
tmp = ve_locale_to_utf8 (args);
greeter_item_pam_message (tmp);
g_free (tmp);
@@ -225,6 +278,8 @@ process_operation (guchar op_code,
break;
case GDM_ERRBOX:
+ show_errdlg_messages ();
+
tmp = ve_locale_to_utf8 (args);
greeter_item_pam_error (tmp);
g_free (tmp);
@@ -234,30 +289,17 @@ process_operation (guchar op_code,
break;
case GDM_ERRDLG:
- /* we should be now fine for focusing new windows */
- gdm_wm_focus_new_windows (TRUE);
-
tmp = ve_locale_to_utf8 (args);
- dlg = ve_hig_dialog_new (NULL /* parent */,
- GTK_DIALOG_MODAL /* flags */,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK,
- tmp,
- "");
+ append_errdlg_message (tmp);
g_free (tmp);
- 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 ();
-
printf ("%c\n", STX);
fflush (stdout);
break;
case GDM_SESS:
+ show_errdlg_messages ();
+
tmp = ve_locale_to_utf8 (args);
session = gdm_session_lookup (tmp);
g_free (tmp);
@@ -274,6 +316,8 @@ process_operation (guchar op_code,
break;
case GDM_LANG:
+ show_errdlg_messages ();
+
language = greeter_language_get_language (args);
if (greeter_language_get_save_language () == GTK_RESPONSE_CANCEL)
printf ("%c%s\n", STX, GDM_RESPONSE_CANCEL);
@@ -284,6 +328,8 @@ process_operation (guchar op_code,
break;
case GDM_SSESS:
+ show_errdlg_messages ();
+
if (gdm_get_save_session () == GTK_RESPONSE_YES)
printf ("%cY\n", STX);
else
@@ -293,6 +339,8 @@ process_operation (guchar op_code,
break;
case GDM_SLANG:
+ show_errdlg_messages ();
+
if (greeter_language_get_save_language () == GTK_RESPONSE_YES)
printf ("%cY\n", STX);
else
@@ -325,6 +373,8 @@ process_operation (guchar op_code,
break;
case GDM_QUIT:
+ show_errdlg_messages ();
+
greeter_item_timed_stop ();
if (require_quarter) {
@@ -429,6 +479,8 @@ process_operation (guchar op_code,
break;
case GDM_SAVEDIE:
+ show_errdlg_messages ();
+
/* Set busy cursor */
gdm_common_setup_cursor (GDK_WATCH);
@@ -448,6 +500,8 @@ process_operation (guchar op_code,
break;
default:
+ show_errdlg_messages ();
+
gdm_common_fail_greeter ("Unexpected greeter command received: '%c'", op_code);
break;
}
@@ -773,6 +827,7 @@ gdm_read_config (void)
gdm_config_get_bool (GDM_KEY_SOUND_ON_LOGIN);
gdm_config_get_bool (GDM_KEY_DEFAULT_WELCOME);
gdm_config_get_bool (GDM_KEY_DEFAULT_REMOTE_WELCOME);
+ gdm_config_get_bool (GDM_KEY_SHOW_DOMAIN);
/* Keys not to include in reread_config */
gdm_config_get_string (GDM_KEY_SESSION_DESKTOP_DIR);
@@ -832,7 +887,8 @@ greeter_reread_config (int sig, gpointer
gdm_config_reload_bool (GDM_KEY_GRAPHICAL_THEME_RAND) ||
gdm_config_reload_bool (GDM_KEY_SHOW_LAST_SESSION) ||
gdm_config_reload_bool (GDM_KEY_ALLOW_ROOT) ||
- gdm_config_reload_bool (GDM_KEY_ALLOW_REMOTE_ROOT)) {
+ gdm_config_reload_bool (GDM_KEY_ALLOW_REMOTE_ROOT) ||
+ gdm_config_reload_bool (GDM_KEY_SHOW_DOMAIN)) {
/* Set busy cursor */
gdm_common_setup_cursor (GDK_WATCH);
diff -upr gdm-2.16.1-pre/gui/greeter/greeter_canvas_item.c gdm-2.16.1-post/gui/greeter/greeter_canvas_item.c
--- gdm-2.16.1-pre/gui/greeter/greeter_canvas_item.c 2006-11-08 00:02:48.000000000 -0600
+++ gdm-2.16.1-post/gui/greeter/greeter_canvas_item.c 2006-11-08 00:02:57.000000000 -0600
@@ -20,6 +20,8 @@
#include <math.h>
#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
#include <gtk/gtk.h>
#include <glib/gi18n.h>
#include <librsvg/rsvg.h>
@@ -40,6 +42,10 @@
#include "greeter_canvas_item.h"
#include "greeter_configuration.h"
#include "greeter_canvas_text.h"
+#include "greeter_parser.h"
+
+#define WBINFO_DOMAINS_MAX 64
+#define WBINFO_READ_MAX 256
static void
apply_tint (GdkPixbuf *pixbuf, guint32 tint_color)
@@ -376,6 +382,189 @@ set_root_pixmap (GdkPixmap *pixmap)
return FALSE;
}
+gboolean greeter_can_do_domain_login = FALSE;
+gchar *greeter_domain_separator = NULL;
+
+gboolean greeter_wbinfo_was_run = FALSE;
+gboolean greeter_wbinfo_is_running = FALSE;
+GPid greeter_wbinfo_pid;
+GIOChannel *greeter_wbinfo_channel;
+GString *greeter_wbinfo_output;
+
+static void
+wbinfo_end (void)
+{
+ GreeterItemInfo *domain_entry_item_info;
+ GtkWidget *domain_entry = NULL;
+ gint wbinfo_status = 0;
+ gchar *wbinfo_output;
+ GtkListStore *domain_list_store;
+ gchar **tokens = NULL;
+ gchar *own_domain = NULL;
+ gint select_index = 0;
+ GtkTreeIter iter;
+ const gchar *text;
+ gint i;
+
+ if (!greeter_wbinfo_is_running)
+ return;
+
+ greeter_wbinfo_is_running = FALSE;
+ waitpid (greeter_wbinfo_pid, &wbinfo_status, 0);
+ g_spawn_close_pid (greeter_wbinfo_pid);
+
+ wbinfo_output = g_string_free (greeter_wbinfo_output, FALSE);
+
+ domain_entry_item_info = greeter_lookup_id ("domain-entry");
+ if (domain_entry_item_info && domain_entry_item_info->item &&
+ GNOME_IS_CANVAS_WIDGET (domain_entry_item_info->item)) {
+ domain_entry = GNOME_CANVAS_WIDGET (domain_entry_item_info->item)->widget;
+ } else {
+ g_free (wbinfo_output);
+ return;
+ }
+
+ /* Set up the domain store model */
+
+ domain_list_store = gtk_list_store_new (1, G_TYPE_STRING);
+
+ /* The "local login" entry */
+
+ gtk_list_store_append (domain_list_store, &iter);
+ gtk_list_store_set (domain_list_store, &iter,
+ 0, _("<Local>"),
+ -1);
+
+ /* Process wbinfo output, if any */
+
+ if (WEXITSTATUS (wbinfo_status) == 0 && wbinfo_output && *wbinfo_output) {
+ /* The first line of output should be the domain separator,
+ * and any remaining lines are trusted domains. */
+ tokens = g_strsplit_set (wbinfo_output, "\n\r", WBINFO_DOMAINS_MAX + 1);
+ }
+
+ g_free (wbinfo_output);
+ g_free (greeter_domain_separator);
+ greeter_domain_separator = NULL;
+
+ if (tokens && tokens [0]) {
+ greeter_can_do_domain_login = TRUE;
+ greeter_domain_separator = g_strdup (tokens [0]);
+
+ own_domain = tokens [1];
+
+ /* Generate a sorted list of domains for the domain selector combo. */
+
+ g_qsort_with_data (&tokens [1],
+ g_strv_length (tokens) - 1,
+ sizeof (gchar *),
+ (GCompareDataFunc) g_ascii_strcasecmp,
+ NULL);
+
+ for (i = 1; tokens [i]; i++) {
+ /* Ensure no blank entries */
+ if (!strlen (tokens [i]))
+ continue;
+
+ gtk_list_store_append (domain_list_store, &iter);
+ gtk_list_store_set (domain_list_store, &iter,
+ 0, tokens [i],
+ -1);
+
+ if (tokens [i] == own_domain)
+ select_index = i;
+ }
+
+ } else {
+ greeter_can_do_domain_login = FALSE;
+ }
+
+ if (tokens)
+ g_strfreev (tokens);
+
+ /* Assign model and default selection to widget */
+
+ gtk_combo_box_set_model (GTK_COMBO_BOX (domain_entry),
+ GTK_TREE_MODEL (domain_list_store));
+ gtk_combo_box_entry_set_text_column (GTK_COMBO_BOX_ENTRY (domain_entry), 0);
+
+ /* Default to our own domain, but only if the entry was empty */
+ text = gtk_entry_get_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (domain_entry))));
+ if (!text || !*text)
+ gtk_combo_box_set_active (GTK_COMBO_BOX (domain_entry), select_index);
+
+ g_object_unref (domain_list_store);
+}
+
+static gboolean
+wbinfo_on_output (GIOChannel *channel, GIOCondition condition, gpointer data)
+{
+ gchar buf [WBINFO_READ_MAX];
+ gsize bytes_read;
+ GIOStatus status;
+
+ status = g_io_channel_read_chars (channel, buf, WBINFO_READ_MAX, &bytes_read, NULL);
+
+ if (bytes_read < 1) {
+ wbinfo_end ();
+ return FALSE;
+ }
+
+ g_string_append_len (greeter_wbinfo_output, buf, bytes_read);
+ return TRUE;
+}
+
+static void
+wbinfo_begin (void)
+{
+ gchar *wbinfo_args [] = { "wbinfo", "--separator", "--own-domain", "--trusted-domains", NULL };
+ gchar *wbinfo_env [] = { NULL };
+ gint wbinfo_stdout_fd;
+
+ if (greeter_wbinfo_was_run)
+ return;
+
+ greeter_wbinfo_was_run = TRUE;
+
+ /* Lame guess, in case winbind isn't running, but gets started later. This
+ * is a workaround for testing and broken systems. */
+ greeter_domain_separator = g_strdup ("\\");
+
+ if (!g_spawn_async_with_pipes ("/",
+ wbinfo_args,
+ wbinfo_env,
+ G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL |
+ G_SPAWN_DO_NOT_REAP_CHILD,
+ NULL /* child setup function */,
+ NULL /* child setup user_data */,
+ &greeter_wbinfo_pid,
+ NULL /* &wbinfo_stdin_fd */,
+ &wbinfo_stdout_fd,
+ NULL /* &wbinfo_stderr_fd */,
+ NULL))
+ return;
+
+ greeter_wbinfo_is_running = TRUE;
+ greeter_wbinfo_output = g_string_new ("");
+
+ fcntl (wbinfo_stdout_fd, F_SETFL, O_NONBLOCK);
+
+ greeter_wbinfo_channel = g_io_channel_unix_new (wbinfo_stdout_fd);
+ g_io_channel_set_encoding (greeter_wbinfo_channel, NULL, NULL);
+ g_io_channel_set_close_on_unref (greeter_wbinfo_channel, TRUE);
+ g_io_add_watch (greeter_wbinfo_channel, G_IO_IN | G_IO_HUP, wbinfo_on_output, NULL);
+ g_io_channel_unref (greeter_wbinfo_channel); /* Watch holds remaining ref */
+}
+
+static gboolean
+deselect_entry_text (GtkEntry *entry)
+{
+ gtk_editable_select_region (GTK_EDITABLE (entry), 0, 0);
+ gtk_editable_set_position (GTK_EDITABLE (entry), -1);
+
+ return FALSE;
+}
+
void
greeter_item_create_canvas_item (GreeterItemInfo *item)
{
@@ -661,6 +850,48 @@ greeter_item_create_canvas_item (Greeter
break;
+ case GREETER_ITEM_TYPE_COMBO_BOX_ENTRY:
+ entry = gtk_combo_box_entry_new ();
+
+ gtk_widget_set_name (entry, "domain-entry");
+
+ gtk_entry_set_has_frame (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (entry))), FALSE);
+ gtk_widget_modify_font (entry, item->data.text.fonts[GREETER_ITEM_STATE_NORMAL]);
+
+ get_gdk_color_from_rgb (&c, item->data.text.colors[GREETER_ITEM_STATE_NORMAL]);
+ gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &c);
+
+ item->item = gnome_canvas_item_new (group,
+ GNOME_TYPE_CANVAS_WIDGET,
+ "widget", entry,
+ "x", x1,
+ "y", y1,
+ "height", (double)rect.height,
+ "width", (double)rect.width,
+ NULL);
+
+ /* cursor blinking is evil on remote displays, don't do it forever */
+ gdm_common_setup_blinking_entry (gtk_bin_get_child (GTK_BIN (entry)));
+
+ /* Recall the last used domain */
+ if (g_file_get_contents (GDM_SCRATCH_DIR "/last_domain", &text, NULL, NULL)) {
+ GtkWidget *temp_entry;
+
+ temp_entry = gtk_bin_get_child (GTK_BIN (entry));
+
+ gtk_entry_set_text (GTK_ENTRY (temp_entry), text);
+
+ /* The set text gets selected. It looks bad. Avoid that. */
+ g_idle_add_full (G_PRIORITY_LOW, (GSourceFunc) deselect_entry_text, temp_entry, NULL);
+
+ g_free (text);
+ }
+
+ /* Query wbinfo */
+ wbinfo_begin ();
+
+ break;
+
case GREETER_ITEM_TYPE_LIST:
/* Note a list type must be setup later and we will add the list store
* to it then, depending on the type. Likely userlist is the
Only in gdm-2.16.1-post/gui/greeter: greeter_canvas_item.c.orig
diff -upr gdm-2.16.1-pre/gui/greeter/greeter_configuration.h gdm-2.16.1-post/gui/greeter/greeter_configuration.h
--- gdm-2.16.1-pre/gui/greeter/greeter_configuration.h 2005-04-18 21:57:56.000000000 -0500
+++ gdm-2.16.1-post/gui/greeter/greeter_configuration.h 2006-11-08 00:02:57.000000000 -0600
@@ -62,6 +62,7 @@ extern gchar *GdmSoundOnLoginFailureFile
extern gboolean GdmSoundOnLoginReady;
extern gboolean GdmSoundOnLoginSuccess;
extern gboolean GdmSoundOnLoginFailure;
+extern gboolean GdmShowDomain;
extern gboolean GDM_IS_LOCAL;
extern gboolean DOING_GDM_DEVELOPMENT;
diff -upr gdm-2.16.1-pre/gui/greeter/greeter.h gdm-2.16.1-post/gui/greeter/greeter.h
--- gdm-2.16.1-pre/gui/greeter/greeter.h 2005-10-06 16:30:26.000000000 -0500
+++ gdm-2.16.1-post/gui/greeter/greeter.h 2006-11-08 00:02:57.000000000 -0600
@@ -27,6 +27,9 @@ extern GtkWidget *window;
extern gboolean greeter_probably_login_prompt;
+extern gboolean greeter_can_do_domain_login;
+extern gchar *greeter_domain_separator;
+
void greeter_ignore_buttons (gboolean val);
#endif
diff -upr gdm-2.16.1-pre/gui/greeter/greeter_item.c gdm-2.16.1-post/gui/greeter/greeter_item.c
--- gdm-2.16.1-pre/gui/greeter/greeter_item.c 2006-04-26 21:10:16.000000000 -0500
+++ gdm-2.16.1-post/gui/greeter/greeter_item.c 2006-11-08 00:02:57.000000000 -0600
@@ -209,6 +209,10 @@ greeter_item_is_visible (GreeterItemInfo
strcmp (info->show_type, "suspend") == 0))
return FALSE;
+ if ( ! gdm_config_get_bool (GDM_KEY_SHOW_DOMAIN) &&
+ g_str_has_prefix (info->show_type, "domain"))
+ return FALSE;
+
if (( ! gdm_config_get_bool (GDM_KEY_TIMED_LOGIN_ENABLE) ||
ve_string_empty (gdm_config_get_string (GDM_KEY_TIMED_LOGIN))) &&
(info->show_type != NULL &&
diff -upr gdm-2.16.1-pre/gui/greeter/greeter_item.h gdm-2.16.1-post/gui/greeter/greeter_item.h
--- gdm-2.16.1-pre/gui/greeter/greeter_item.h 2006-04-26 21:10:16.000000000 -0500
+++ gdm-2.16.1-post/gui/greeter/greeter_item.h 2006-11-08 00:02:57.000000000 -0600
@@ -47,7 +47,8 @@ enum _GreeterItemType {
GREETER_ITEM_TYPE_LABEL,
GREETER_ITEM_TYPE_ENTRY,
GREETER_ITEM_TYPE_LIST,
- GREETER_ITEM_TYPE_BUTTON
+ GREETER_ITEM_TYPE_BUTTON,
+ GREETER_ITEM_TYPE_COMBO_BOX_ENTRY
};
/* Make sure to adjust the bitfield in the structure if
@@ -147,7 +148,7 @@ struct _GreeterItemInfo {
union {
/* Note: we want to have alphas, colors and have_color coincide for all types
that have it */
-#define GREETER_ITEM_TYPE_IS_TEXT(info) ((info)->item_type == GREETER_ITEM_TYPE_LABEL || (info)->item_type == GREETER_ITEM_TYPE_ENTRY)
+#define GREETER_ITEM_TYPE_IS_TEXT(info) ((info)->item_type == GREETER_ITEM_TYPE_LABEL || (info)->item_type == GREETER_ITEM_TYPE_ENTRY || (info)->item_type == GREETER_ITEM_TYPE_COMBO_BOX_ENTRY)
struct {
guint8 alphas[GREETER_ITEM_STATE_MAX];
guint32 colors[GREETER_ITEM_STATE_MAX];
diff -upr gdm-2.16.1-pre/gui/greeter/greeter_item_pam.c gdm-2.16.1-post/gui/greeter/greeter_item_pam.c
--- gdm-2.16.1-pre/gui/greeter/greeter_item_pam.c 2006-06-09 16:07:42.000000000 -0500
+++ gdm-2.16.1-post/gui/greeter/greeter_item_pam.c 2006-11-08 00:02:57.000000000 -0600
@@ -36,6 +36,7 @@
#include "gdm.h"
#include "gdmwm.h"
#include "gdmcommon.h"
+#include "gdmconfig.h"
static gboolean messages_to_give = FALSE;
static gboolean replace_msg = TRUE;
@@ -115,11 +116,29 @@ set_text (GreeterItemInfo *info, const c
info->item);
}
+static void
+domain_entry_set_sensitive (gboolean sensitive)
+{
+ if (gdm_config_get_bool (GDM_KEY_SHOW_DOMAIN))
+ {
+ GreeterItemInfo *domain_entry_item_info;
+ GtkWidget *domain_entry = NULL;
+
+ domain_entry_item_info = greeter_lookup_id ("domain-entry");
+ if (domain_entry_item_info && domain_entry_item_info->item &&
+ GNOME_IS_CANVAS_WIDGET (domain_entry_item_info->item))
+ domain_entry = GNOME_CANVAS_WIDGET (domain_entry_item_info->item)->widget;
+
+ if (domain_entry)
+ gtk_widget_set_sensitive (domain_entry, sensitive);
+ }
+}
+
void
greeter_item_pam_login (GtkEntry *entry, GreeterItemInfo *info)
{
const char *str;
- char *tmp;
+ char *tmp, *tmp2;
GreeterItemInfo *error_info;
greeter_ignore_buttons (TRUE);
@@ -146,6 +165,7 @@ greeter_item_pam_login (GtkEntry *entry,
}
gtk_widget_set_sensitive (GTK_WIDGET (entry), FALSE);
+ domain_entry_set_sensitive (FALSE);
/* clear the err_box */
if (err_box_clear_handler > 0)
@@ -160,6 +180,33 @@ greeter_item_pam_login (GtkEntry *entry,
}
tmp = ve_locale_from_utf8 (str);
+
+ /* Prepend the domain if applicable */
+ if (greeter_probably_login_prompt && gdm_config_get_bool (GDM_KEY_SHOW_DOMAIN))
+ {
+ GreeterItemInfo *domain_entry_item_info;
+ GtkWidget *domain_entry = NULL;
+
+ domain_entry_item_info = greeter_lookup_id ("domain-entry");
+ if (domain_entry_item_info && domain_entry_item_info->item &&
+ GNOME_IS_CANVAS_WIDGET (domain_entry_item_info->item))
+ domain_entry = GNOME_CANVAS_WIDGET (domain_entry_item_info->item)->widget;
+
+ if (domain_entry && (str = gtk_combo_box_get_active_text (GTK_COMBO_BOX (domain_entry))) && *str &&
+ strcmp (str, _("<Local>")))
+ {
+ g_file_set_contents (GDM_SCRATCH_DIR "/last_domain", str, strlen (str), NULL);
+
+ tmp2 = g_strdup_printf ("%s%s%s", str, greeter_domain_separator, tmp);
+ g_free (tmp);
+ tmp = tmp2;
+ }
+ else
+ {
+ g_remove (GDM_SCRATCH_DIR "/last_domain");
+ }
+ }
+
printf ("%c%s\n", STX, tmp);
fflush (stdout);
g_free (tmp);
@@ -213,6 +260,7 @@ greeter_item_pam_setup (void)
/* initially insensitive */
gtk_widget_set_sensitive (entry, FALSE);
+ domain_entry_set_sensitive (FALSE);
}
g_signal_connect (entry, "activate",
@@ -252,6 +300,9 @@ greeter_item_pam_prompt (const char *mes
gtk_entry_set_max_length (GTK_ENTRY (entry), entry_len);
gtk_entry_set_text (GTK_ENTRY (entry), "");
gtk_widget_grab_focus (entry);
+
+ /* Domain selector should only be accessed when entering the user name */
+ domain_entry_set_sensitive (entry_visible);
}
messages_to_give = FALSE;
diff -upr gdm-2.16.1-pre/gui/greeter/greeter_parser.c gdm-2.16.1-post/gui/greeter/greeter_parser.c
--- gdm-2.16.1-pre/gui/greeter/greeter_parser.c 2006-08-02 21:32:39.000000000 -0500
+++ gdm-2.16.1-post/gui/greeter/greeter_parser.c 2006-11-08 00:02:57.000000000 -0600
@@ -394,6 +394,11 @@ parse_stock (xmlNodePtr node,
g_free (*translated_text);
*translated_text = g_strdup (_("Username:"));
}
+ else if (g_ascii_strcasecmp ((char *) prop, "domain-label") == 0)
+ {
+ g_free (*translated_text);
+ *translated_text = g_strdup (_("Domain:"));
+ }
else if (g_ascii_strcasecmp ((char *) prop, "ok") == 0)
{
g_free (*translated_text);
@@ -1552,6 +1557,15 @@ parse_entry (xmlNodePtr node,
}
static gboolean
+parse_combo_box_entry (xmlNodePtr node,
+ GreeterItemInfo *info,
+ GError **error)
+{
+ /* A ComboBoxEntry is just an Entry with a dropdown list */
+ return parse_entry (node, info, error);
+}
+
+static gboolean
parse_items (xmlNodePtr node,
GList **items_out,
GreeterItemInfo *parent,
@@ -1606,6 +1620,8 @@ parse_items (xmlNodePtr node,
item_type = GREETER_ITEM_TYPE_LIST;
else if (strcmp ((char *) type, "button") == 0)
item_type = GREETER_ITEM_TYPE_BUTTON;
+ else if (strcmp ((char *) type, "combo-box-entry") == 0)
+ item_type = GREETER_ITEM_TYPE_COMBO_BOX_ENTRY;
else
{
g_set_error (error,
@@ -1650,6 +1666,9 @@ parse_items (xmlNodePtr node,
case GREETER_ITEM_TYPE_BUTTON:
res = parse_gtkbutton (child, info, error);
break;
+ case GREETER_ITEM_TYPE_COMBO_BOX_ENTRY:
+ res = parse_combo_box_entry (child, info, error);
+ break;
default:
g_set_error (error,
GREETER_PARSER_ERROR,