~ilidrissi.amine/ubuntu/maverick/gdm/gdm.fix-617044

« back to all changes in this revision

Viewing changes to debian/patches/16_gdmserver_user_manager.patch

  • Committer: Bazaar Package Importer
  • Author(s): Sebastien Bacher, Robert Ancell
  • Date: 2010-06-09 12:23:38 UTC
  • Revision ID: james.westby@ubuntu.com-20100609122338-btnxecezfmmjg7yg
Tags: 2.30.2-0ubuntu2
* Upload to maverick, the new version has new bugs which means it doesn't 
  qualify for lucid-updates right now, a new update to lucid will be done
  using the current lucid version until those issues are resolved

[ Robert Ancell ]
* debian/patches/16_gdmserver_user_manager.patch:
* debian/patches/24_system_uid.patch:
  - Update to match IncludeAll behaviour in greeter (LP: #471542)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#
 
2
## Description: add some description
 
3
## Origin/Author: add some origin or author
 
4
## Bug: bug URL
2
5
# Description: Add org.gnome.DisplayManager.UserManager interface to gdmserver to be shared between greeter, configuration applet and FUSA applet
3
6
# Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gdm/+bug/423450
4
7
# Upstream: https://bugzilla.gnome.org/show_bug.cgi?id=593996
8
11
Date: Fri, 11 Sep 2009 16:01:30 +1000
9
12
Subject: [PATCH] Add org.gnome.DisplayManager.UserManager interface to gdmserver
10
13
 
11
 
diff -Nur -x '*.orig' -x '*~' gdm-2.28.1/configure.ac gdm-2.28.1.new/configure.ac
12
 
--- gdm-2.28.1/configure.ac     2009-11-26 17:07:28.317717514 +0100
13
 
+++ gdm-2.28.1.new/configure.ac 2009-11-26 17:07:45.585319608 +0100
14
 
@@ -65,6 +65,7 @@
 
14
diff -Nur -x '*.orig' -x '*~' gdm-2.30.2/configure.ac gdm-2.30.2.new/configure.ac
 
15
--- gdm-2.30.2/configure.ac     2010-06-09 14:09:07.617036046 +1000
 
16
+++ gdm-2.30.2.new/configure.ac 2010-06-09 14:09:08.137025806 +1000
 
17
@@ -64,6 +64,7 @@
15
18
         polkit-gobject-1 >= $POLKIT_GOBJECT_REQUIRED_VERSION
16
19
         gobject-2.0 >= $GLIB_REQUIRED_VERSION
17
20
         gio-2.0 >= $GLIB_REQUIRED_VERSION
19
22
 )
20
23
 AC_SUBST(COMMON_CFLAGS)
21
24
 AC_SUBST(COMMON_LIBS)
22
 
@@ -961,6 +962,17 @@
 
25
@@ -979,6 +980,17 @@
23
26
 fi
24
27
 AC_SUBST(logdir, $GDM_LOG_DIR)
25
28
 
37
40
 withval=""
38
41
 AC_ARG_WITH(at-bindir,
39
42
             AS_HELP_STRING([--with-at-bindir=<PATH>]
40
 
diff -Nur -x '*.orig' -x '*~' gdm-2.28.1/daemon/gdm-user.c gdm-2.28.1.new/daemon/gdm-user.c
41
 
--- gdm-2.28.1/daemon/gdm-user.c        1970-01-01 01:00:00.000000000 +0100
42
 
+++ gdm-2.28.1.new/daemon/gdm-user.c    2009-11-26 17:07:31.427725843 +0100
43
 
@@ -0,0 +1,596 @@
 
43
diff -Nur -x '*.orig' -x '*~' gdm-2.30.2/daemon/gdm-user.c gdm-2.30.2.new/daemon/gdm-user.c
 
44
--- gdm-2.30.2/daemon/gdm-user.c        1970-01-01 10:00:00.000000000 +1000
 
45
+++ gdm-2.30.2.new/daemon/gdm-user.c    2010-06-09 14:09:08.137025806 +1000
 
46
@@ -0,0 +1,747 @@
44
47
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
45
48
+ *
46
49
+ * Copyright (C) 2004-2005 James M. Cape <jcape@ignore-your.tv>.
79
82
+#define GDM_IS_USER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDM_TYPE_USER))
80
83
+#define GDM_USER_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), GDM_TYPE_USER, GdmUserClass))
81
84
+
 
85
+#define GLOBAL_FACEDIR    DATADIR "/faces"
 
86
+#define MAX_ICON_SIZE     128
 
87
+#define MAX_FILE_SIZE     65536
 
88
+#define MINIMAL_UID       100
 
89
+
82
90
+enum {
83
91
+        PROP_0,
 
92
+        PROP_MANAGER,
84
93
+        PROP_REAL_NAME,
 
94
+        PROP_DISPLAY_NAME,
85
95
+        PROP_USER_NAME,
86
96
+        PROP_UID,
87
97
+        PROP_HOME_DIR,
99
109
+struct _GdmUser {
100
110
+        GObject         parent;
101
111
+
 
112
+        GdmUserManager *manager;
 
113
+
102
114
+        uid_t           uid;
103
115
+        char           *user_name;
104
116
+        char           *real_name;
 
117
+        char           *display_name;
105
118
+        char           *home_dir;
106
119
+        char           *shell;
107
120
+        char           *icon_url;
190
203
+}
191
204
+
192
205
+static void
 
206
+_gdm_user_set_login_frequency (GdmUser *user,
 
207
+                               gulong   login_frequency)
 
208
+{
 
209
+        user->login_frequency = login_frequency;
 
210
+        g_object_notify (G_OBJECT (user), "login-frequency");
 
211
+}
 
212
+
 
213
+static void
193
214
+gdm_user_set_property (GObject      *object,
194
215
+                       guint         param_id,
195
216
+                       const GValue *value,
200
221
+        user = GDM_USER (object);
201
222
+
202
223
+        switch (param_id) {
 
224
+        case PROP_MANAGER:
 
225
+                user->manager = g_value_get_object (value);
 
226
+                g_assert (user->manager);
 
227
+                break;
203
228
+        case PROP_LOGIN_FREQUENCY:
204
 
+                user->login_frequency = g_value_get_ulong (value);
205
 
+                g_object_notify (G_OBJECT (user), "login-frequency");
 
229
+                _gdm_user_set_login_frequency (user, g_value_get_ulong (value));
206
230
+                break;
207
231
+        default:
208
232
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
221
245
+        user = GDM_USER (object);
222
246
+
223
247
+        switch (param_id) {
 
248
+        case PROP_MANAGER:
 
249
+                g_value_set_object (value, user->manager);
 
250
+                break;
224
251
+        case PROP_USER_NAME:
225
252
+                g_value_set_string (value, user->user_name);
226
253
+                break;
227
254
+        case PROP_REAL_NAME:
228
255
+                g_value_set_string (value, user->real_name);
229
256
+                break;
 
257
+        case PROP_DISPLAY_NAME:
 
258
+                g_value_set_string (value, user->display_name);
 
259
+                break;
230
260
+        case PROP_HOME_DIR:
231
261
+                g_value_set_string (value, user->home_dir);
232
262
+                break;
260
290
+        gobject_class->finalize = gdm_user_finalize;
261
291
+
262
292
+        g_object_class_install_property (gobject_class,
 
293
+                                         PROP_MANAGER,
 
294
+                                         g_param_spec_object ("manager",
 
295
+                                                              _("Manager"),
 
296
+                                                              _("The user manager object this user is controlled by."),
 
297
+                                                              GDM_TYPE_USER_MANAGER,
 
298
+                                                              (G_PARAM_READWRITE |
 
299
+                                                               G_PARAM_CONSTRUCT_ONLY)));
 
300
+
 
301
+        g_object_class_install_property (gobject_class,
263
302
+                                         PROP_REAL_NAME,
264
303
+                                         g_param_spec_string ("real-name",
265
304
+                                                              "Real Name",
268
307
+                                                              G_PARAM_READABLE));
269
308
+
270
309
+        g_object_class_install_property (gobject_class,
 
310
+                                         PROP_DISPLAY_NAME,
 
311
+                                         g_param_spec_string ("display-name",
 
312
+                                                              "Display Name",
 
313
+                                                              "The unique name to display for this user.",
 
314
+                                                              NULL,
 
315
+                                                              G_PARAM_READABLE));
 
316
+
 
317
+        g_object_class_install_property (gobject_class,
271
318
+                                         PROP_UID,
272
319
+                                         g_param_spec_ulong ("uid",
273
320
+                                                             "User ID",
345
392
+                return;
346
393
+        }
347
394
+
348
 
+        g_signal_emit (user, signals[ICON_CHANGED], 0);
 
395
+        _gdm_user_icon_changed (user);
349
396
+}
350
397
+
351
398
+static void
352
399
+update_icon_monitor (GdmUser *user)
353
400
+{
354
401
+        GFile  *file;
355
 
+        GError *error = NULL;
 
402
+        GError *error;
 
403
+        char   *path;
356
404
+
357
 
+        if (user->icon_url != NULL) {
358
 
+                g_free (user->icon_url);
359
 
+                user->icon_url = NULL;
360
 
+        }
361
 
+        if (user->home_dir != NULL) {
362
 
+                gchar *filename;
363
 
+                filename = g_build_filename (user->home_dir, ".face", NULL);
364
 
+                user->icon_url = g_strjoin(NULL, "file://", filename, NULL);
365
 
+                g_free (filename);
366
 
+        }
367
 
+        g_object_notify (G_OBJECT (user), "icon-url");
 
405
+        if (user->home_dir == NULL) {
 
406
+                return;
 
407
+        }
368
408
+
369
409
+        if (user->icon_monitor != NULL) {
370
410
+                g_file_monitor_cancel (user->icon_monitor);
371
411
+                user->icon_monitor = NULL;
372
412
+        }
373
413
+
374
 
+        if (user->icon_url == NULL) {
375
 
+                return;
376
 
+        }
377
 
+
378
 
+        g_debug ("adding monitor for '%s'", user->icon_url);
379
 
+        file = g_file_new_for_uri (user->icon_url);
 
414
+        path = g_build_filename (user->home_dir, ".face", NULL);
 
415
+        g_debug ("adding monitor for '%s'", path);
 
416
+        file = g_file_new_for_path (path);
 
417
+        error = NULL;
380
418
+        user->icon_monitor = g_file_monitor_file (file,
381
419
+                                                  G_FILE_MONITOR_NONE,
382
420
+                                                  NULL,
387
425
+                                  G_CALLBACK (on_icon_monitor_changed),
388
426
+                                  user);
389
427
+        } else {
390
 
+                g_warning ("Unable to monitor %s: %s", user->icon_url, error->message);
 
428
+                g_warning ("Unable to monitor %s: %s", path, error->message);
391
429
+                g_error_free (error);
392
430
+        }
393
431
+        g_object_unref (file);
 
432
+
 
433
+        g_free (user->icon_url);
 
434
+        user->icon_url = g_strjoin(NULL, "file://", path, NULL);
 
435
+        g_object_notify (G_OBJECT (user), "icon-url");
 
436
+
 
437
+        g_free (path);
394
438
+}
395
439
+
396
440
+static void
397
441
+gdm_user_init (GdmUser *user)
398
442
+{
 
443
+        user->manager = NULL;
399
444
+        user->user_name = NULL;
400
445
+        user->real_name = NULL;
 
446
+        user->display_name = NULL;
401
447
+        user->sessions = NULL;
 
448
+        user->icon_url = NULL;
402
449
+}
403
450
+
404
451
+static void
412
459
+
413
460
+        g_free (user->user_name);
414
461
+        g_free (user->real_name);
 
462
+        g_free (user->display_name);
 
463
+        g_free (user->icon_url);
415
464
+
416
465
+        if (G_OBJECT_CLASS (gdm_user_parent_class)->finalize)
417
466
+                (*G_OBJECT_CLASS (gdm_user_parent_class)->finalize) (object);
430
479
+_gdm_user_update (GdmUser             *user,
431
480
+                  const struct passwd *pwent)
432
481
+{
433
 
+        gchar *real_name;
 
482
+        gchar *real_name = NULL;
434
483
+
435
484
+        g_return_if_fail (GDM_IS_USER (user));
436
485
+        g_return_if_fail (pwent != NULL);
439
488
+
440
489
+        /* Display Name */
441
490
+        if (pwent->pw_gecos && pwent->pw_gecos[0] != '\0') {
442
 
+                gchar *first_comma;
443
 
+                gchar *real_name_utf8;
444
 
+
445
 
+                real_name_utf8 = g_locale_to_utf8 (pwent->pw_gecos, -1, NULL, NULL, NULL);
446
 
+
447
 
+                first_comma = strchr (real_name_utf8, ',');
 
491
+                gchar *first_comma = NULL;
 
492
+                gchar *valid_utf8_name = NULL;
 
493
+
 
494
+                if (g_utf8_validate (pwent->pw_gecos, -1, NULL)) {
 
495
+                        valid_utf8_name = pwent->pw_gecos;
 
496
+                        first_comma = g_utf8_strchr (valid_utf8_name, -1, ',');
 
497
+                } else {
 
498
+                        g_warning ("User %s has invalid UTF-8 in GECOS field. "
 
499
+                                   "It would be a good thing to check /etc/passwd.",
 
500
+                                   pwent->pw_name ? pwent->pw_name : "");
 
501
+                }
 
502
+
448
503
+                if (first_comma) {
449
 
+                        real_name = g_strndup (real_name_utf8, first_comma - real_name_utf8);
450
 
+                        g_free (real_name_utf8);
 
504
+                        real_name = g_strndup (valid_utf8_name,
 
505
+                                                  (first_comma - valid_utf8_name));
 
506
+                } else if (valid_utf8_name) {
 
507
+                        real_name = g_strdup (valid_utf8_name);
451
508
+                } else {
452
 
+                        real_name = real_name_utf8;
 
509
+                        real_name = NULL;
453
510
+                }
454
511
+
455
 
+                if (real_name[0] == '\0') {
 
512
+                if (real_name && real_name[0] == '\0') {
456
513
+                        g_free (real_name);
457
514
+                        real_name = NULL;
458
515
+                }
472
529
+                g_free (real_name);
473
530
+        }
474
531
+
 
532
+        /* Unique Display Name */
 
533
+        if ((!user->real_name && user->display_name) ||
 
534
+            (user->real_name &&
 
535
+             user->display_name &&
 
536
+             strncmp (user->real_name, user->display_name, strlen (user->real_name)) != 0)) {
 
537
+                g_free (user->display_name);
 
538
+                user->display_name = NULL;
 
539
+                g_object_notify (G_OBJECT (user), "display-name");
 
540
+        }
 
541
+
475
542
+        /* UID */
476
543
+        if (pwent->pw_uid != user->uid) {
477
544
+                user->uid = pwent->pw_uid;
516
583
+}
517
584
+
518
585
+/**
 
586
+ * _gdm_user_icon_changed:
 
587
+ * @user: the user to emit the signal for.
 
588
+ *
 
589
+ * Emits the "icon-changed" signal for @user.
 
590
+ *
 
591
+ * Since: 1.0
 
592
+ **/
 
593
+void
 
594
+_gdm_user_icon_changed (GdmUser *user)
 
595
+{
 
596
+        g_return_if_fail (GDM_IS_USER (user));
 
597
+
 
598
+        g_signal_emit (user, signals[ICON_CHANGED], 0);
 
599
+}
 
600
+
 
601
+/**
519
602
+ * gdm_user_get_uid:
520
603
+ * @user: the user object to examine.
521
604
+ *
555
638
+}
556
639
+
557
640
+/**
 
641
+ * gdm_user_get_display_name:
 
642
+ * @user: the user object to examine.
 
643
+ *
 
644
+ * Retrieves the unique display name of @user.
 
645
+ *
 
646
+ * Returns: a pointer to an array of characters which must not be modified or
 
647
+ *  freed, or %NULL.
 
648
+ *
 
649
+ * Since: 1.0
 
650
+ **/
 
651
+G_CONST_RETURN gchar *
 
652
+gdm_user_get_display_name (GdmUser *user)
 
653
+{
 
654
+        g_return_val_if_fail (GDM_IS_USER (user), NULL);
 
655
+
 
656
+        return (user->display_name ? user->display_name
 
657
+                : gdm_user_get_real_name (user));
 
658
+}
 
659
+
 
660
+/**
558
661
+ * gdm_user_get_user_name:
559
662
+ * @user: the user object to examine.
560
663
+ *
622
725
+        return user->login_frequency;
623
726
+}
624
727
+
625
 
+G_CONST_RETURN gchar *
 
728
+int
 
729
+gdm_user_collate (GdmUser *user1,
 
730
+                  GdmUser *user2)
 
731
+{
 
732
+        const char *str1;
 
733
+        const char *str2;
 
734
+        gulong      num1;
 
735
+        gulong      num2;
 
736
+
 
737
+        g_return_val_if_fail (GDM_IS_USER (user1), 0);
 
738
+        g_return_val_if_fail (GDM_IS_USER (user2), 0);
 
739
+
 
740
+        if (user1->real_name != NULL) {
 
741
+                str1 = user1->real_name;
 
742
+        } else {
 
743
+                str1 = user1->user_name;
 
744
+        }
 
745
+
 
746
+        if (user2->real_name != NULL) {
 
747
+                str2 = user2->real_name;
 
748
+        } else {
 
749
+                str2 = user2->user_name;
 
750
+        }
 
751
+
 
752
+        num1 = user1->login_frequency;
 
753
+        num2 = user2->login_frequency;
 
754
+        g_debug ("Login freq 1=%u 2=%u", (guint)num1, (guint)num2);
 
755
+        if (num1 > num2) {
 
756
+                return -1;
 
757
+        }
 
758
+
 
759
+        if (num1 < num2) {
 
760
+                return 1;
 
761
+        }
 
762
+
 
763
+        /* if login frequency is equal try names */
 
764
+        if (str1 == NULL && str2 != NULL) {
 
765
+                return -1;
 
766
+        }
 
767
+
 
768
+        if (str1 != NULL && str2 == NULL) {
 
769
+                return 1;
 
770
+        }
 
771
+
 
772
+        if (str1 == NULL && str2 == NULL) {
 
773
+                return 0;
 
774
+        }
 
775
+
 
776
+        return g_utf8_collate (str1, str2);
 
777
+}
 
778
+
 
779
+G_CONST_RETURN char *
626
780
+gdm_user_get_icon_url (GdmUser *user)
627
781
+{
628
782
+        g_return_val_if_fail (GDM_IS_USER (user), NULL);
637
791
+         */   
638
792
+        return user->icon_url;
639
793
+}
640
 
diff -Nur -x '*.orig' -x '*~' gdm-2.28.1/daemon/gdm-user.h gdm-2.28.1.new/daemon/gdm-user.h
641
 
--- gdm-2.28.1/daemon/gdm-user.h        1970-01-01 01:00:00.000000000 +0100
642
 
+++ gdm-2.28.1.new/daemon/gdm-user.h    2009-11-26 17:07:31.427725843 +0100
643
 
@@ -0,0 +1,53 @@
 
794
diff -Nur -x '*.orig' -x '*~' gdm-2.30.2/daemon/gdm-user.h gdm-2.30.2.new/daemon/gdm-user.h
 
795
--- gdm-2.30.2/daemon/gdm-user.h        1970-01-01 10:00:00.000000000 +1000
 
796
+++ gdm-2.30.2.new/daemon/gdm-user.h    2010-06-09 14:09:08.137025806 +1000
 
797
@@ -0,0 +1,57 @@
644
798
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
645
799
+ *
646
800
+ * Copyright (C) 2004-2005 James M. Cape <jcape@ignore-your.tv>.
679
833
+
680
834
+typedef struct _GdmUser GdmUser;
681
835
+
682
 
+GType                  gdm_user_get_type            (void) G_GNUC_CONST;
683
 
+
684
 
+uid_t                  gdm_user_get_uid             (GdmUser   *user);
685
 
+G_CONST_RETURN gchar  *gdm_user_get_user_name       (GdmUser   *user);
686
 
+G_CONST_RETURN gchar  *gdm_user_get_real_name       (GdmUser   *user);
687
 
+G_CONST_RETURN gchar  *gdm_user_get_home_directory  (GdmUser   *user);
688
 
+G_CONST_RETURN gchar  *gdm_user_get_shell           (GdmUser   *user);
689
 
+guint                  gdm_user_get_num_sessions    (GdmUser   *user);
690
 
+GList                 *gdm_user_get_sessions        (GdmUser   *user);
691
 
+gulong                 gdm_user_get_login_frequency (GdmUser   *user);
692
 
+G_CONST_RETURN gchar  *gdm_user_get_icon_url        (GdmUser   *user);
 
836
+GType                 gdm_user_get_type            (void) G_GNUC_CONST;
 
837
+
 
838
+uid_t                 gdm_user_get_uid             (GdmUser   *user);
 
839
+G_CONST_RETURN char  *gdm_user_get_user_name       (GdmUser   *user);
 
840
+G_CONST_RETURN char  *gdm_user_get_real_name       (GdmUser   *user);
 
841
+G_CONST_RETURN char  *gdm_user_get_display_name    (GdmUser   *user);
 
842
+G_CONST_RETURN char  *gdm_user_get_home_directory  (GdmUser   *user);
 
843
+G_CONST_RETURN char  *gdm_user_get_shell           (GdmUser   *user);
 
844
+guint                 gdm_user_get_num_sessions    (GdmUser   *user);
 
845
+GList                *gdm_user_get_sessions        (GdmUser   *user);
 
846
+gulong                gdm_user_get_login_frequency (GdmUser   *user);
 
847
+G_CONST_RETURN char  *gdm_user_get_icon_url        (GdmUser   *user);
 
848
+
 
849
+gint                  gdm_user_collate             (GdmUser   *user1,
 
850
+                                                    GdmUser   *user2);
693
851
+
694
852
+G_END_DECLS
695
853
+
696
854
+#endif
697
 
diff -Nur -x '*.orig' -x '*~' gdm-2.28.1/daemon/gdm-user-manager.c gdm-2.28.1.new/daemon/gdm-user-manager.c
698
 
--- gdm-2.28.1/daemon/gdm-user-manager.c        1970-01-01 01:00:00.000000000 +0100
699
 
+++ gdm-2.28.1.new/daemon/gdm-user-manager.c    2009-11-26 17:07:31.437723273 +0100
700
 
@@ -0,0 +1,1538 @@
 
855
diff -Nur -x '*.orig' -x '*~' gdm-2.30.2/daemon/gdm-user-manager.c gdm-2.30.2.new/daemon/gdm-user-manager.c
 
856
--- gdm-2.30.2/daemon/gdm-user-manager.c        1970-01-01 10:00:00.000000000 +1000
 
857
+++ gdm-2.30.2.new/daemon/gdm-user-manager.c    2010-06-09 14:09:31.967221528 +1000
 
858
@@ -0,0 +1,1730 @@
701
859
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
702
860
+ *
703
861
+ * Copyright (C) 2007-2008 William Jon McCann <mccann@jhu.edu>
747
905
+#include "gdm-user-manager.h"
748
906
+#include "gdm-user-manager-glue.h"
749
907
+#include "gdm-user-private.h"
 
908
+#include "gdm-settings-keys.h"
750
909
+
751
910
+#define GDM_USER_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_USER_MANAGER, GdmUserManagerPrivate))
752
911
+
763
922
+#define CK_SEAT_INTERFACE    "org.freedesktop.ConsoleKit.Seat"
764
923
+#define CK_SESSION_INTERFACE "org.freedesktop.ConsoleKit.Session"
765
924
+
 
925
+/* Prefs Defaults */
 
926
+#define DEFAULT_ALLOW_ROOT      TRUE
 
927
+#define DEFAULT_MAX_ICON_SIZE   128
 
928
+#define DEFAULT_USER_MAX_FILE   65536
 
929
+
766
930
+#ifdef __sun
767
931
+#define DEFAULT_MINIMAL_UID     100
768
932
+#else
774
938
+#endif
775
939
+#define PATH_PASSWD     "/etc/passwd"
776
940
+
 
941
+#define DEFAULT_GLOBAL_FACE_DIR DATADIR "/faces"
 
942
+#define DEFAULT_USER_ICON       "stock_person"
 
943
+
777
944
+#define LOGIN_CACHE_FILE CACHEDIR "/login_frequency.cache"
778
945
+
779
 
+#define DEFAULT_EXCLUDE         { "bin",        \
780
 
+                                  "root",       \
781
 
+                                  "daemon",     \
782
 
+                                  "adm",        \
783
 
+                                  "lp",         \
784
 
+                                  "sync",       \
785
 
+                                  "shutdown",   \
786
 
+                                  "halt",       \
787
 
+                                  "mail",       \
788
 
+                                  "news",       \
789
 
+                                  "uucp",       \
790
 
+                                  "operator",   \
791
 
+                                  "nobody",     \
792
 
+                                  "nobody4",    \
793
 
+                                  "noaccess",   \
794
 
+                                  GDM_USERNAME, \
795
 
+                                  "postgres",   \
796
 
+                                  "pvm",        \
797
 
+                                  "rpm",        \
798
 
+                                  "nfsnobody",  \
799
 
+                                  "pcap",       \
800
 
+                                  NULL }
801
 
+
802
946
+struct GdmUserManagerPrivate
803
947
+{
804
948
+        GHashTable            *users;
805
949
+        GHashTable            *sessions;
806
 
+        GHashTable            *exclusions;
807
950
+        GHashTable            *shells;
808
951
+        DBusGConnection       *connection;
809
952
+        DBusGProxy            *seat_proxy;
812
955
+        GFileMonitor          *passwd_monitor;
813
956
+        GFileMonitor          *shells_monitor;
814
957
+
 
958
+        GSList                *exclude;
 
959
+        GSList                *include;
 
960
+        gboolean               include_all;
 
961
+
815
962
+        guint                  reload_id;
816
963
+        guint                  ck_history_id;
817
964
+
818
 
+        guint8                 loaded_passwd : 1;    
 
965
+        guint8                 loaded_passwd : 1;
 
966
+        guint8                 users_dirty : 1;
819
967
+        guint8                 loaded_cache : 1;
 
968
+        guint8                 loading_users : 1;    
820
969
+};
821
970
+
822
971
+enum {
 
972
+        LOADING_USERS,
823
973
+        USERS_LOADED,
824
974
+        USER_ADDED,
825
975
+        USER_REMOVED,
833
983
+static void     gdm_user_manager_init       (GdmUserManager      *user_manager);
834
984
+static void     gdm_user_manager_finalize   (GObject             *object);
835
985
+
 
986
+static gpointer user_manager_object = NULL;
 
987
+
836
988
+G_DEFINE_TYPE (GdmUserManager, gdm_user_manager, G_TYPE_OBJECT)
837
989
+
838
990
+GQuark
961
1113
+        return x11_display;
962
1114
+}
963
1115
+
 
1116
+static gint
 
1117
+match_name_cmpfunc (gconstpointer a,
 
1118
+                    gconstpointer b)
 
1119
+{
 
1120
+        if (a == NULL || b == NULL) {
 
1121
+                return -1;
 
1122
+        }
 
1123
+
 
1124
+        return g_strcmp0 ((char *) a,
 
1125
+                          (char *) b);
 
1126
+}
 
1127
+
 
1128
+static gboolean
 
1129
+user_in_exclude_list (GdmUserManager *manager,
 
1130
+                      const char *user)
 
1131
+{
 
1132
+        GSList   *found;
 
1133
+        gboolean  ret = FALSE;
 
1134
+
 
1135
+        g_debug ("checking exclude list");
 
1136
+
 
1137
+        /* always exclude the "gdm" user. */
 
1138
+        if (user == NULL || (strcmp (user, GDM_USERNAME) == 0)) {
 
1139
+                return TRUE;
 
1140
+        }
 
1141
+
 
1142
+        if (manager->priv->exclude != NULL) {
 
1143
+                found = g_slist_find_custom (manager->priv->exclude,
 
1144
+                                             user,
 
1145
+                                             match_name_cmpfunc);
 
1146
+                if (found != NULL) {
 
1147
+                        ret = TRUE;
 
1148
+                }
 
1149
+        }
 
1150
+        return ret;
 
1151
+}
 
1152
+
964
1153
+static gboolean
965
1154
+maybe_add_session_for_user (GdmUserManager *manager,
966
1155
+                            GdmUser        *user,
990
1179
+                goto out;
991
1180
+        }
992
1181
+
993
 
+        if (g_hash_table_lookup (manager->priv->exclusions, gdm_user_get_user_name (user))) {
 
1182
+        if (user_in_exclude_list (manager, gdm_user_get_user_name (user))) {
994
1183
+                g_debug ("GdmUserManager: excluding user '%s'", gdm_user_get_user_name (user));
995
1184
+                goto out;
996
1185
+        }
1077
1266
+{
1078
1267
+        GdmUser *user;
1079
1268
+
1080
 
+        user = g_object_new (GDM_TYPE_USER, NULL);
 
1269
+        user = g_object_new (GDM_TYPE_USER, "manager", manager, NULL);
1081
1270
+        g_signal_connect (user,
1082
1271
+                          "sessions-changed",
1083
1272
+                          G_CALLBACK (on_user_sessions_changed),
1089
1278
+        return user;
1090
1279
+}
1091
1280
+
 
1281
+static gint
 
1282
+match_real_name_cmpfunc (gconstpointer a,
 
1283
+                         gconstpointer b)
 
1284
+{
 
1285
+        if (a == b)
 
1286
+                return -1;
 
1287
+
 
1288
+        return g_strcmp0 (gdm_user_get_real_name ((GdmUser *) a),
 
1289
+                          gdm_user_get_real_name ((GdmUser *) b));
 
1290
+}
 
1291
+
 
1292
+static gboolean
 
1293
+match_real_name_hrfunc (gpointer key,
 
1294
+                        gpointer value,
 
1295
+                        gpointer user_data)
 
1296
+{
 
1297
+        return (g_strcmp0 (user_data, gdm_user_get_real_name (value)) == 0);
 
1298
+}
 
1299
+
1092
1300
+static void
1093
1301
+add_user (GdmUserManager *manager,
1094
1302
+          GdmUser        *user)
1095
1303
+{
 
1304
+        GdmUser *dup;
 
1305
+
1096
1306
+        add_sessions_for_user (manager, user);
 
1307
+        dup = g_hash_table_find (manager->priv->users,
 
1308
+                                 match_real_name_hrfunc,
 
1309
+                                 (char *) gdm_user_get_real_name (user));
 
1310
+        if (dup != NULL) {
 
1311
+                //_gdm_user_show_full_display_name (user);
 
1312
+                //_gdm_user_show_full_display_name (dup);
 
1313
+        }
1097
1314
+        g_hash_table_insert (manager->priv->users,
1098
1315
+                             g_strdup (gdm_user_get_user_name (user)),
1099
1316
+                             g_object_ref (user));
1235
1452
+        errno = 0;
1236
1453
+        pwent = getpwuid (uid);
1237
1454
+        if (pwent == NULL) {
1238
 
+                g_warning ("Unable to lookup user id %d: %s", (int)uid, g_strerror (errno));
 
1455
+                g_warning ("Unable to lookup user ID %d: %s", (int)uid, g_strerror (errno));
1239
1456
+                return;
1240
1457
+        }
1241
1458
+
1242
1459
+        /* check exclusions up front */
1243
 
+        if (g_hash_table_lookup (manager->priv->exclusions, pwent->pw_name)) {
 
1460
+        if (user_in_exclude_list (manager, pwent->pw_name)) {
1244
1461
+                g_debug ("GdmUserManager: excluding user '%s'", pwent->pw_name);
1245
1462
+                return;
1246
1463
+        }
1384
1601
+ *
1385
1602
+ * Returns: a pointer to a #GdmUser object.
1386
1603
+ **/
1387
 
+static GdmUser *
 
1604
+GdmUser *
1388
1605
+gdm_user_manager_get_user (GdmUserManager *manager,
1389
1606
+                           const char     *username)
1390
1607
+{
1408
1625
+        return user;
1409
1626
+}
1410
1627
+
1411
 
+static GdmUser *
 
1628
+GdmUser *
1412
1629
+gdm_user_manager_get_user_by_uid (GdmUserManager *manager,
1413
1630
+                                  uid_t           uid)
1414
1631
+{
1442
1659
+        *list = g_slist_prepend (*list, value);
1443
1660
+}
1444
1661
+
 
1662
+GSList *
 
1663
+gdm_user_manager_list_users (GdmUserManager *manager)
 
1664
+{
 
1665
+        GSList *retval;
 
1666
+
 
1667
+        g_return_val_if_fail (GDM_IS_USER_MANAGER (manager), NULL);
 
1668
+
 
1669
+        retval = NULL;
 
1670
+        g_hash_table_foreach (manager->priv->users, listify_hash_values_hfunc, &retval);
 
1671
+
 
1672
+        return g_slist_sort (retval, (GCompareFunc) gdm_user_collate);
 
1673
+}
 
1674
+
1445
1675
+static gboolean
1446
1676
+parse_value_as_ulong (const char *value,
1447
1677
+                      gulong     *ulongval)
1544
1774
+                return;
1545
1775
+        }
1546
1776
+
1547
 
+        if (g_hash_table_lookup (manager->priv->exclusions, username)) {
 
1777
+        if (user_in_exclude_list (manager, username)) {
1548
1778
+                g_debug ("GdmUserManager: excluding user '%s'", username);
1549
1779
+                g_free (username);
1550
1780
+                return;
1628
1858
+                else
1629
1859
+                        g_warning ("Unable to write to login cache file: %s", LOGIN_CACHE_FILE);
1630
1860
+
 
1861
+                if (manager->priv->loading_users) {
 
1862
+                        g_signal_emit (G_OBJECT (manager), signals[USERS_LOADED], 0);
 
1863
+                        manager->priv->loading_users = FALSE;
 
1864
+                }
 
1865
+
1631
1866
+                manager->priv->ck_history_id = 0;
1632
1867
+                return FALSE;
1633
1868
+        }
1711
1946
+}
1712
1947
+
1713
1948
+static void
 
1949
+add_included_user (char *username, GdmUserManager *manager)
 
1950
+{
 
1951
+        GdmUser     *user;
 
1952
+
 
1953
+        g_debug ("Adding included user %s", username);
 
1954
+        /*
 
1955
+         * The call to gdm_user_manager_get_user will add the user if it is
 
1956
+         * valid and not already in the hash.
 
1957
+         */
 
1958
+        user = gdm_user_manager_get_user (manager, username);
 
1959
+        if (user == NULL) {
 
1960
+                g_debug ("GdmUserManager: unable to lookup user '%s'", username);
 
1961
+                g_free (username);
 
1962
+                return;
 
1963
+        }
 
1964
+}
 
1965
+
 
1966
+static void
 
1967
+add_included_users (GdmUserManager *manager)
 
1968
+{
 
1969
+        /* Add users who are specifically included */
 
1970
+        if (manager->priv->include != NULL) {
 
1971
+                g_slist_foreach (manager->priv->include,
 
1972
+                                 (GFunc)add_included_user,
 
1973
+                                 (gpointer)manager);
 
1974
+        }
 
1975
+}
 
1976
+
 
1977
+static void
1714
1978
+reload_passwd (GdmUserManager *manager)
1715
1979
+{
1716
1980
+        struct passwd *pwent;
1717
1981
+        GSList        *old_users;
1718
1982
+        GSList        *new_users;
1719
1983
+        GSList        *list;
 
1984
+        GSList        *dup;
1720
1985
+        FILE          *fp;
1721
1986
+
1722
1987
+        old_users = NULL;
1736
2001
+        for (list = old_users; list; list = list->next) {
1737
2002
+                if (gdm_user_get_num_sessions (list->data) > 0) {
1738
2003
+                        g_object_freeze_notify (G_OBJECT (list->data));
 
2004
+                        //_gdm_user_show_short_display_name (list->data);
1739
2005
+                        new_users = g_slist_prepend (new_users, g_object_ref (list->data));
1740
2006
+                }
1741
2007
+        }
1742
2008
+
1743
 
+        for (pwent = fgetpwent (fp); pwent != NULL; pwent = fgetpwent (fp)) {
1744
 
+                GdmUser *user;
1745
 
+
1746
 
+                user = NULL;
1747
 
+
1748
 
+                /* Skip users below MinimalUID... */
1749
 
+                if (pwent->pw_uid < DEFAULT_MINIMAL_UID) {
1750
 
+                        continue;
1751
 
+                }
1752
 
+
1753
 
+                /* ...And users w/ invalid shells... */
1754
 
+                if (pwent->pw_shell == NULL ||
1755
 
+                    !g_hash_table_lookup (manager->priv->shells, pwent->pw_shell)) {
1756
 
+                        g_debug ("GdmUserManager: skipping user with bad shell: %s", pwent->pw_name);
1757
 
+                        continue;
1758
 
+                }
1759
 
+
1760
 
+                /* ...And explicitly excluded users */
1761
 
+                if (g_hash_table_lookup (manager->priv->exclusions, pwent->pw_name)) {
1762
 
+                        g_debug ("GdmUserManager: explicitly skipping user: %s", pwent->pw_name);
1763
 
+                        continue;
1764
 
+                }
1765
 
+
1766
 
+                user = g_hash_table_lookup (manager->priv->users, pwent->pw_name);
1767
 
+
1768
 
+                /* Update users already in the *new* list */
1769
 
+                if (g_slist_find (new_users, user)) {
 
2009
+        if (manager->priv->include_all != TRUE) {
 
2010
+                g_debug ("GdmUserManager: include_all is FALSE");
 
2011
+        } else {
 
2012
+                g_debug ("GdmUserManager: include_all is TRUE");
 
2013
+
 
2014
+                for (pwent = fgetpwent (fp);
 
2015
+                     pwent != NULL;
 
2016
+                     pwent = fgetpwent (fp)) {
 
2017
+                        GdmUser *user;
 
2018
+
 
2019
+                        user = NULL;
 
2020
+
 
2021
+                        /* Skip users below MinimalUID... */
 
2022
+                        if (pwent->pw_uid < DEFAULT_MINIMAL_UID) {
 
2023
+                                continue;
 
2024
+                        }
 
2025
+
 
2026
+                        /* ...And users w/ invalid shells... */
 
2027
+                        if (pwent->pw_shell == NULL ||
 
2028
+                            !g_hash_table_lookup (manager->priv->shells,
 
2029
+                                                  pwent->pw_shell)) {
 
2030
+                                g_debug ("GdmUserManager: skipping user with bad shell: %s", pwent->pw_name);
 
2031
+                                continue;
 
2032
+                        }
 
2033
+
 
2034
+                        /* ...And explicitly excluded users */
 
2035
+                        if (user_in_exclude_list (manager, pwent->pw_name)) {
 
2036
+                                g_debug ("GdmUserManager: explicitly skipping user: %s", pwent->pw_name);
 
2037
+                                continue;
 
2038
+                        }
 
2039
+
 
2040
+                        user = g_hash_table_lookup (manager->priv->users,
 
2041
+                                                    pwent->pw_name);
 
2042
+
 
2043
+                        /* Update users already in the *new* list */
 
2044
+                        if (g_slist_find (new_users, user)) {
 
2045
+                                _gdm_user_update (user, pwent);
 
2046
+                                continue;
 
2047
+                        }
 
2048
+
 
2049
+                        if (user == NULL) {
 
2050
+                                user = create_user (manager);
 
2051
+                        } else {
 
2052
+                                g_object_ref (user);
 
2053
+                        }
 
2054
+
 
2055
+                        /* Freeze & update users not already in the new list */
 
2056
+                        g_object_freeze_notify (G_OBJECT (user));
1770
2057
+                        _gdm_user_update (user, pwent);
1771
 
+                        continue;
1772
 
+                }
1773
 
+
1774
 
+                if (user == NULL) {
1775
 
+                        user = create_user (manager);
1776
 
+                } else {
1777
 
+                        g_object_ref (user);
1778
 
+                }
1779
 
+
1780
 
+                /* Freeze & update users not already in the new list */
1781
 
+                g_object_freeze_notify (G_OBJECT (user));
1782
 
+                _gdm_user_update (user, pwent);
1783
 
+
1784
 
+                new_users = g_slist_prepend (new_users, user);
 
2058
+
 
2059
+                        new_users = g_slist_prepend (new_users, user);
 
2060
+                }
1785
2061
+        }
1786
2062
+
1787
2063
+        /* Go through and handle removed users */
1793
2069
+                }
1794
2070
+        }
1795
2071
+
1796
 
+        /* Go through and handle added users */
 
2072
+        /* Go through and handle added users or update display names */
1797
2073
+        for (list = new_users; list; list = list->next) {
1798
 
+                if (!g_slist_find (old_users, list->data)) {
 
2074
+                if (g_slist_find (old_users, list->data)) {
 
2075
+                        dup = g_slist_find_custom (new_users,
 
2076
+                                                   list->data,
 
2077
+                                                   match_real_name_cmpfunc);
 
2078
+                        if (dup != NULL) {
 
2079
+                                //_gdm_user_show_full_display_name (list->data);
 
2080
+                                //_gdm_user_show_full_display_name (dup->data);
 
2081
+                        }
 
2082
+                } else {
1799
2083
+                        add_user (manager, list->data);
1800
2084
+                }
1801
2085
+        }
1802
2086
+
 
2087
+        add_included_users (manager);
 
2088
+
1803
2089
+        if (!manager->priv->loaded_passwd) {
1804
2090
+                g_signal_emit (manager, signals[USERS_LOADED], 0);
1805
2091
+                manager->priv->loaded_passwd = TRUE;
1834
2120
+        }
1835
2121
+    
1836
2122
+        g_io_channel_close (channel);
 
2123
+    
 
2124
+        if (manager->priv->loading_users) {
 
2125
+                g_signal_emit (G_OBJECT (manager), signals[USERS_LOADED], 0);
 
2126
+                manager->priv->loading_users = FALSE;
 
2127
+        }    
1837
2128
+}
1838
2129
+
1839
2130
+static void
1840
2131
+reload_users (GdmUserManager *manager)
1841
2132
+{
1842
 
+        reload_passwd (manager);
1843
2133
+        if (!manager->priv->loaded_cache) {
1844
2134
+                load_login_frequency_cache (manager);
1845
2135
+                manager->priv->loaded_cache = TRUE;
1846
2136
+        }
1847
2137
+        reload_ck_history (manager);
 
2138
+        reload_passwd (manager);
1848
2139
+}
1849
2140
+
1850
2141
+static gboolean
1863
2154
+                return;
1864
2155
+        }
1865
2156
+
 
2157
+        g_signal_emit (G_OBJECT (manager), signals[LOADING_USERS], 0);
 
2158
+        manager->priv->loading_users = TRUE;
1866
2159
+        manager->priv->reload_id = g_idle_add ((GSourceFunc)reload_users_timeout, manager);
1867
2160
+}
1868
2161
+
1928
2221
+
1929
2222
+        object_class->finalize = gdm_user_manager_finalize;
1930
2223
+
 
2224
+        signals [LOADING_USERS] =
 
2225
+                g_signal_new ("loading-users",
 
2226
+                              G_TYPE_FROM_CLASS (klass),
 
2227
+                              G_SIGNAL_RUN_LAST,
 
2228
+                              G_STRUCT_OFFSET (GdmUserManagerClass, loading_users),
 
2229
+                              NULL, NULL,
 
2230
+                              g_cclosure_marshal_VOID__VOID,
 
2231
+                              G_TYPE_NONE, 0);
1931
2232
+        signals [USERS_LOADED] =
1932
2233
+                g_signal_new ("users-loaded",
1933
2234
+                              G_TYPE_FROM_CLASS (klass),
1934
2235
+                              G_SIGNAL_RUN_LAST,
1935
2236
+                              G_STRUCT_OFFSET (GdmUserManagerClass, users_loaded),
1936
2237
+                              NULL, NULL,
1937
 
+                              g_cclosure_marshal_VOID__OBJECT,
 
2238
+                              g_cclosure_marshal_VOID__VOID,
1938
2239
+                              G_TYPE_NONE, 0);
1939
2240
+        signals [USER_ADDED] =
1940
2241
+                g_signal_new ("user-added",
1967
2268
+}
1968
2269
+
1969
2270
+static void
 
2271
+gdm_set_string_list (char *value, GSList **retval)
 
2272
+{
 
2273
+        char **temp_array;
 
2274
+        int    i;
 
2275
+
 
2276
+        *retval = NULL;
 
2277
+
 
2278
+        if (value == NULL || *value == '\0') {
 
2279
+                g_debug ("Not adding NULL user");
 
2280
+                *retval = NULL;
 
2281
+                return;
 
2282
+        }
 
2283
+
 
2284
+        temp_array = g_strsplit (value, ",", 0);
 
2285
+        for (i = 0; temp_array[i] != NULL; i++) {
 
2286
+                g_debug ("Adding value %s", temp_array[i]);
 
2287
+                g_strstrip (temp_array[i]);
 
2288
+                *retval = g_slist_prepend (*retval, g_strdup (temp_array[i]));
 
2289
+        }
 
2290
+
 
2291
+        g_strfreev (temp_array);
 
2292
+}
 
2293
+
 
2294
+static void
1970
2295
+gdm_user_manager_init (GdmUserManager *manager)
1971
2296
+{
1972
2297
+        int            i;
1973
2298
+        GFile         *file;
1974
2299
+        GError        *error;
1975
 
+        const char    *exclude_default[] = DEFAULT_EXCLUDE;
 
2300
+        char          *temp;
 
2301
+        gboolean       res;
1976
2302
+
1977
2303
+        manager->priv = GDM_USER_MANAGER_GET_PRIVATE (manager);
1978
2304
+
 
2305
+        /* exclude/include */
 
2306
+        g_debug ("Setting users to include:");
 
2307
+        res = gdm_settings_direct_get_string  (GDM_KEY_INCLUDE,
 
2308
+                                               &temp);
 
2309
+        gdm_set_string_list (temp, &manager->priv->include);
 
2310
+
 
2311
+        g_debug ("Setting users to exclude:");
 
2312
+        res = gdm_settings_direct_get_string  (GDM_KEY_EXCLUDE,
 
2313
+                                               &temp);
 
2314
+        gdm_set_string_list (temp, &manager->priv->exclude);
 
2315
+
 
2316
+        res = gdm_settings_direct_get_boolean (GDM_KEY_INCLUDE_ALL,
 
2317
+                                               &manager->priv->include_all);
 
2318
+
1979
2319
+        /* sessions */
1980
2320
+        manager->priv->sessions = g_hash_table_new_full (g_str_hash,
1981
2321
+                                                         g_str_equal,
1982
2322
+                                                         g_free,
1983
2323
+                                                         g_free);
1984
2324
+
1985
 
+        /* exclusions */
1986
 
+        manager->priv->exclusions = g_hash_table_new_full (g_str_hash,
1987
 
+                                                           g_str_equal,
1988
 
+                                                           g_free,
1989
 
+                                                           NULL);
1990
 
+        for (i = 0; exclude_default[i] != NULL; i++) {
1991
 
+                g_hash_table_insert (manager->priv->exclusions,
1992
 
+                                     g_strdup (exclude_default [i]),
1993
 
+                                     GUINT_TO_POINTER (TRUE));
1994
 
+        }
1995
 
+
1996
 
+        /* /etc/shells */
1997
 
+        manager->priv->shells = g_hash_table_new_full (g_str_hash,
1998
 
+                                                       g_str_equal,
1999
 
+                                                       g_free,
2000
 
+                                                       NULL);
2001
 
+        reload_shells (manager);
2002
 
+        file = g_file_new_for_path (_PATH_SHELLS);
2003
 
+        error = NULL;
2004
 
+        manager->priv->shells_monitor = g_file_monitor_file (file,
2005
 
+                                                             G_FILE_MONITOR_NONE,
2006
 
+                                                             NULL,
2007
 
+                                                             &error);
2008
 
+        if (manager->priv->shells_monitor != NULL) {
2009
 
+                g_signal_connect (manager->priv->shells_monitor,
2010
 
+                                  "changed",
2011
 
+                                  G_CALLBACK (on_shells_monitor_changed),
2012
 
+                                  manager);
2013
 
+        } else {
2014
 
+                g_warning ("Unable to monitor %s: %s", _PATH_SHELLS, error->message);
2015
 
+                g_error_free (error);
2016
 
+        }
2017
 
+        g_object_unref (file);
2018
 
+
2019
 
+        /* /etc/passwd */
 
2325
+        /* users */
2020
2326
+        manager->priv->users = g_hash_table_new_full (g_str_hash,
2021
2327
+                                                      g_str_equal,
2022
2328
+                                                      g_free,
2023
2329
+                                                      (GDestroyNotify) g_object_run_dispose);
2024
 
+        file = g_file_new_for_path (PATH_PASSWD);
2025
 
+        manager->priv->passwd_monitor = g_file_monitor_file (file,
2026
 
+                                                             G_FILE_MONITOR_NONE,
2027
 
+                                                             NULL,
2028
 
+                                                             &error);
2029
 
+        if (manager->priv->passwd_monitor != NULL) {
2030
 
+                g_signal_connect (manager->priv->passwd_monitor,
2031
 
+                                  "changed",
2032
 
+                                  G_CALLBACK (on_passwd_monitor_changed),
2033
 
+                                  manager);
2034
 
+        } else {
2035
 
+                g_warning ("Unable to monitor %s: %s", PATH_PASSWD, error->message);
2036
 
+                g_error_free (error);
 
2330
+
 
2331
+        if (manager->priv->include_all == TRUE) {
 
2332
+                /* /etc/shells */
 
2333
+                manager->priv->shells = g_hash_table_new_full (g_str_hash,
 
2334
+                                                               g_str_equal,
 
2335
+                                                               g_free,
 
2336
+                                                               NULL);
 
2337
+                reload_shells (manager);
 
2338
+                file = g_file_new_for_path (_PATH_SHELLS);
 
2339
+                error = NULL;
 
2340
+                manager->priv->shells_monitor = g_file_monitor_file (file,
 
2341
+                                                                     G_FILE_MONITOR_NONE,
 
2342
+                                                                     NULL,
 
2343
+                                                                     &error);
 
2344
+                if (manager->priv->shells_monitor != NULL) {
 
2345
+                        g_signal_connect (manager->priv->shells_monitor,
 
2346
+                                          "changed",
 
2347
+                                          G_CALLBACK (on_shells_monitor_changed),
 
2348
+                                          manager);
 
2349
+                } else {
 
2350
+                        g_warning ("Unable to monitor %s: %s", _PATH_SHELLS, error->message);
 
2351
+                        g_error_free (error);
 
2352
+                }
 
2353
+                g_object_unref (file);
 
2354
+
 
2355
+                /* /etc/passwd */
 
2356
+                file = g_file_new_for_path (PATH_PASSWD);
 
2357
+                manager->priv->passwd_monitor = g_file_monitor_file (file,
 
2358
+                                                                     G_FILE_MONITOR_NONE,
 
2359
+                                                                     NULL,
 
2360
+                                                                     &error);
 
2361
+                if (manager->priv->passwd_monitor != NULL) {
 
2362
+                        g_signal_connect (manager->priv->passwd_monitor,
 
2363
+                                          "changed",
 
2364
+                                          G_CALLBACK (on_passwd_monitor_changed),
 
2365
+                                          manager);
 
2366
+                } else {
 
2367
+                        g_warning ("Unable to monitor %s: %s", PATH_PASSWD, error->message);
 
2368
+                        g_error_free (error);
 
2369
+                }
 
2370
+                g_object_unref (file);
2037
2371
+        }
2038
 
+        g_object_unref (file);
2039
 
+
2040
2372
+
2041
2373
+        get_seat_proxy (manager);
2042
2374
+
2043
2375
+        queue_reload_users (manager);
2044
2376
+
 
2377
+        manager->priv->users_dirty = FALSE;
 
2378
+
2045
2379
+        dbus_g_connection_register_g_object (manager->priv->connection, GDM_USER_MANAGER_DBUS_PATH, G_OBJECT (manager));
2046
2380
+}
2047
2381
+
2057
2391
+
2058
2392
+        g_return_if_fail (manager->priv != NULL);
2059
2393
+
 
2394
+        if (manager->priv->exclude != NULL) {
 
2395
+                g_slist_free (manager->priv->exclude);
 
2396
+        }
 
2397
+
 
2398
+        if (manager->priv->include != NULL) {
 
2399
+                g_slist_free (manager->priv->include);
 
2400
+        }
 
2401
+
2060
2402
+        if (manager->priv->seat_proxy != NULL) {
2061
2403
+                g_object_unref (manager->priv->seat_proxy);
2062
2404
+        }
2085
2427
+}
2086
2428
+
2087
2429
+GdmUserManager *
2088
 
+gdm_user_manager_new (void)
 
2430
+gdm_user_manager_ref_default (void)
2089
2431
+{
2090
 
+        return GDM_USER_MANAGER (g_object_new (GDM_TYPE_USER_MANAGER, NULL));
 
2432
+        if (user_manager_object != NULL) {
 
2433
+                g_object_ref (user_manager_object);
 
2434
+        } else {
 
2435
+                user_manager_object = g_object_new (GDM_TYPE_USER_MANAGER, NULL);
 
2436
+                g_object_add_weak_pointer (user_manager_object,
 
2437
+                                           (gpointer *) &user_manager_object);
 
2438
+        }
 
2439
+
 
2440
+        return GDM_USER_MANAGER (user_manager_object);
2091
2441
+}
2092
2442
+
2093
2443
+/*
2236
2586
+        *is_loaded = user_manager->priv->loaded_passwd;
2237
2587
+        return TRUE;
2238
2588
+}
2239
 
diff -Nur -x '*.orig' -x '*~' gdm-2.28.1/daemon/gdm-user-manager.h gdm-2.28.1.new/daemon/gdm-user-manager.h
2240
 
--- gdm-2.28.1/daemon/gdm-user-manager.h        1970-01-01 01:00:00.000000000 +0100
2241
 
+++ gdm-2.28.1.new/daemon/gdm-user-manager.h    2009-11-26 17:07:31.437723273 +0100
2242
 
@@ -0,0 +1,93 @@
 
2589
diff -Nur -x '*.orig' -x '*~' gdm-2.30.2/daemon/gdm-user-manager.h gdm-2.30.2.new/daemon/gdm-user-manager.h
 
2590
--- gdm-2.30.2/daemon/gdm-user-manager.h        1970-01-01 10:00:00.000000000 +1000
 
2591
+++ gdm-2.30.2.new/daemon/gdm-user-manager.h    2010-06-09 14:09:08.137025806 +1000
 
2592
@@ -0,0 +1,106 @@
2243
2593
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2244
2594
+ *
2245
2595
+ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
2288
2638
+{
2289
2639
+        GObjectClass   parent_class;
2290
2640
+
 
2641
+        void          (* loading_users)             (GdmUserManager *user_manager);
2291
2642
+        void          (* users_loaded)              (GdmUserManager *user_manager);
2292
2643
+        void          (* user_added)                (GdmUserManager *user_manager,
2293
2644
+                                                     gint64          uid);
2297
2648
+                                                     gint64          uid);
2298
2649
+} GdmUserManagerClass;
2299
2650
+
 
2651
+typedef enum
 
2652
+{
 
2653
+        GDM_USER_MANAGER_ERROR_GENERAL,
 
2654
+        GDM_USER_MANAGER_ERROR_KEY_NOT_FOUND
 
2655
+} GdmUserManagerError;
 
2656
+
2300
2657
+#define GDM_USER_MANAGER_ERROR gdm_user_manager_error_quark ()
2301
2658
+
2302
2659
+GQuark              gdm_user_manager_error_quark           (void);
2303
2660
+GType               gdm_user_manager_get_type              (void);
2304
2661
+
2305
 
+GdmUserManager *    gdm_user_manager_new                   (void);
 
2662
+GdmUserManager *    gdm_user_manager_ref_default           (void);
 
2663
+
 
2664
+GSList *            gdm_user_manager_list_users            (GdmUserManager *manager);
 
2665
+GdmUser *           gdm_user_manager_get_user              (GdmUserManager *manager,
 
2666
+                                                            const char     *user_name);
 
2667
+GdmUser *           gdm_user_manager_get_user_by_uid       (GdmUserManager *manager,
 
2668
+                                                            uid_t           uid);
2306
2669
+
2307
2670
+gboolean            gdm_user_manager_count_users           (GdmUserManager *user_manager,
2308
2671
+                                                            gint           *user_count,
2333
2696
+G_END_DECLS
2334
2697
+
2335
2698
+#endif /* __GDM_USER_MANAGER_H */
2336
 
diff -Nur -x '*.orig' -x '*~' gdm-2.28.1/daemon/gdm-user-manager.xml gdm-2.28.1.new/daemon/gdm-user-manager.xml
2337
 
--- gdm-2.28.1/daemon/gdm-user-manager.xml      1970-01-01 01:00:00.000000000 +0100
2338
 
+++ gdm-2.28.1.new/daemon/gdm-user-manager.xml  2009-11-26 17:07:31.437723273 +0100
 
2699
diff -Nur -x '*.orig' -x '*~' gdm-2.30.2/daemon/gdm-user-manager.xml gdm-2.30.2.new/daemon/gdm-user-manager.xml
 
2700
--- gdm-2.30.2/daemon/gdm-user-manager.xml      1970-01-01 10:00:00.000000000 +1000
 
2701
+++ gdm-2.30.2.new/daemon/gdm-user-manager.xml  2010-06-09 14:09:08.137025806 +1000
2339
2702
@@ -0,0 +1,56 @@
2340
2703
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
2341
2704
+<node name="/org/gnome/DisplayManager/UserManager">
2393
2756
+    
2394
2757
+  </interface>
2395
2758
+</node>
2396
 
diff -Nur -x '*.orig' -x '*~' gdm-2.28.1/daemon/gdm-user-private.h gdm-2.28.1.new/daemon/gdm-user-private.h
2397
 
--- gdm-2.28.1/daemon/gdm-user-private.h        1970-01-01 01:00:00.000000000 +0100
2398
 
+++ gdm-2.28.1.new/daemon/gdm-user-private.h    2009-11-26 17:07:31.437723273 +0100
2399
 
@@ -0,0 +1,42 @@
 
2759
diff -Nur -x '*.orig' -x '*~' gdm-2.30.2/daemon/gdm-user-private.h gdm-2.30.2.new/daemon/gdm-user-private.h
 
2760
--- gdm-2.30.2/daemon/gdm-user-private.h        1970-01-01 10:00:00.000000000 +1000
 
2761
+++ gdm-2.30.2.new/daemon/gdm-user-private.h    2010-06-09 14:09:08.137025806 +1000
 
2762
@@ -0,0 +1,45 @@
2400
2763
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2401
2764
+ *
2402
2765
+ * Copyright (C) 2004-2005 James M. Cape <jcape@ignore-your.tv>.
2436
2799
+void _gdm_user_remove_session   (GdmUser             *user,
2437
2800
+                                 const char          *session_id);
2438
2801
+
 
2802
+void _gdm_user_icon_changed     (GdmUser             *user);
 
2803
+
 
2804
+
2439
2805
+G_END_DECLS
2440
2806
+
2441
2807
+#endif /* !__GDM_USER_PRIVATE__ */
2442
 
diff -Nur -x '*.orig' -x '*~' gdm-2.28.1/daemon/main.c gdm-2.28.1.new/daemon/main.c
2443
 
--- gdm-2.28.1/daemon/main.c    2009-10-20 00:12:45.000000000 +0200
2444
 
+++ gdm-2.28.1.new/daemon/main.c        2009-11-26 17:07:31.437723273 +0100
 
2808
diff -Nur -x '*.orig' -x '*~' gdm-2.30.2/daemon/main.c gdm-2.30.2.new/daemon/main.c
 
2809
--- gdm-2.30.2/daemon/main.c    2010-03-18 08:27:16.000000000 +1100
 
2810
+++ gdm-2.30.2.new/daemon/main.c        2010-06-09 14:09:08.137025806 +1000
2445
2811
@@ -43,6 +43,7 @@
2446
2812
 #include <dbus/dbus-glib.h>
2447
2813
 #include <dbus/dbus-glib-lowlevel.h>
2450
2816
 #include "gdm-manager.h"
2451
2817
 #include "gdm-log.h"
2452
2818
 #include "gdm-common.h"
2453
 
@@ -59,6 +60,7 @@
2454
 
 
2455
 
 extern char **environ;
2456
 
 
2457
 
+static GdmUserManager  *user_manager  = NULL;
2458
 
 static GdmManager      *manager       = NULL;
2459
 
 static GdmSettings     *settings      = NULL;
2460
 
 static uid_t            gdm_uid       = -1;
2461
 
@@ -580,6 +582,12 @@
 
2819
@@ -597,6 +598,8 @@
2462
2820
                 goto out;
2463
2821
         }
2464
2822
 
2465
 
+        user_manager = gdm_user_manager_new ();
2466
 
+        if (user_manager == NULL) {
2467
 
+                g_warning ("Could not construct user manager object");
2468
 
+                exit (1);
2469
 
+        }
 
2823
+        gdm_user_manager_ref_default ();
2470
2824
+
2471
 
         if (! gdm_settings_direct_init (settings, GDMCONFDIR "/gdm.schemas", "/")) {
2472
 
                 g_warning ("Unable to initialize settings");
2473
 
                 goto out;
2474
 
diff -Nur -x '*.orig' -x '*~' gdm-2.28.1/daemon/Makefile.am gdm-2.28.1.new/daemon/Makefile.am
2475
 
--- gdm-2.28.1/daemon/Makefile.am       2009-11-26 17:07:26.267716612 +0100
2476
 
+++ gdm-2.28.1.new/daemon/Makefile.am   2009-11-26 17:07:31.437723273 +0100
 
2825
         gdm_log_set_debug (is_debug_set ());
 
2826
 
 
2827
         gdm_daemon_change_user (&gdm_uid, &gdm_gid);
 
2828
diff -Nur -x '*.orig' -x '*~' gdm-2.30.2/daemon/Makefile.am gdm-2.30.2.new/daemon/Makefile.am
 
2829
--- gdm-2.30.2/daemon/Makefile.am       2010-03-27 00:28:03.000000000 +1100
 
2830
+++ gdm-2.30.2.new/daemon/Makefile.am   2010-06-09 14:09:08.137025806 +1000
2477
2831
@@ -9,6 +9,7 @@
2478
2832
        -DDATADIR=\"$(datadir)\"                        \
2479
2833
        -DDMCONFDIR=\"$(dmconfdir)\"                    \
2482
2836
        -DLIBDIR=\"$(libdir)\"                          \
2483
2837
        -DLIBEXECDIR=\"$(libexecdir)\"                  \
2484
2838
        -DLOGDIR=\"$(logdir)\"                          \
2485
 
@@ -34,6 +35,7 @@
 
2839
@@ -35,6 +36,7 @@
2486
2840
        gdm-session-direct-glue.h               \
2487
2841
        gdm-manager-glue.h                      \
2488
2842
        gdm-display-glue.h                      \
2490
2844
        gdm-xdmcp-greeter-display-glue.h        \
2491
2845
        gdm-xdmcp-chooser-display-glue.h        \
2492
2846
        gdm-static-display-glue.h               \
2493
 
@@ -45,6 +47,8 @@
 
2847
@@ -46,6 +48,8 @@
2494
2848
 
2495
2849
 gdm-manager-glue.h: gdm-manager.xml Makefile.am
2496
2850
        dbus-binding-tool --prefix=gdm_manager --mode=glib-server --output=gdm-manager-glue.h $(srcdir)/gdm-manager.xml
2499
2853
 gdm-slave-glue.h: gdm-slave.xml Makefile.am
2500
2854
        dbus-binding-tool --prefix=gdm_slave --mode=glib-server --output=gdm-slave-glue.h $(srcdir)/gdm-slave.xml
2501
2855
 gdm-simple-slave-glue.h: gdm-simple-slave.xml Makefile.am
2502
 
@@ -306,6 +310,11 @@
 
2856
@@ -298,6 +302,11 @@
2503
2857
        gdm-product-display.h           \
2504
2858
        gdm-manager.c                   \
2505
2859
        gdm-manager.h                   \
2511
2865
        gdm-slave-proxy.c               \
2512
2866
        gdm-slave-proxy.h               \
2513
2867
        $(NULL)
2514
 
@@ -368,6 +377,7 @@
 
2868
@@ -360,6 +369,7 @@
2515
2869
        gdm-session-direct.xml          \
2516
2870
        gdm-manager.xml                 \
2517
2871
        gdm-display.xml                 \
2519
2873
        gdm-xdmcp-greeter-display.xml   \
2520
2874
        gdm-xdmcp-chooser-display.xml   \
2521
2875
        gdm-static-display.xml          \
2522
 
diff -Nur -x '*.orig' -x '*~' gdm-2.28.1/data/gdm.conf.in gdm-2.28.1.new/data/gdm.conf.in
2523
 
--- gdm-2.28.1/data/gdm.conf.in 2009-11-26 17:07:29.477742113 +0100
2524
 
+++ gdm-2.28.1.new/data/gdm.conf.in     2009-11-26 17:07:31.437723273 +0100
 
2876
diff -Nur -x '*.orig' -x '*~' gdm-2.30.2/data/gdm.conf.in gdm-2.30.2.new/data/gdm.conf.in
 
2877
--- gdm-2.30.2/data/gdm.conf.in 2010-06-09 14:09:07.597026241 +1000
 
2878
+++ gdm-2.30.2.new/data/gdm.conf.in     2010-06-09 14:09:08.137025806 +1000
2525
2879
@@ -8,6 +8,8 @@
2526
2880
     <allow own="org.gnome.DisplayManager"/>
2527
2881