~ubuntu-branches/ubuntu/quantal/lightdm/quantal

« back to all changes in this revision

Viewing changes to src/display.c

  • Committer: Package Import Robot
  • Author(s): Robert Ancell, Robert Ancell, Michael Terry
  • Date: 2012-08-30 10:15:16 UTC
  • mfrom: (1.1.31)
  • Revision ID: package-import@ubuntu.com-20120830101516-e4y8358adii2wdgl
Tags: 1.3.3-0ubuntu1
[ Robert Ancell ]
* New upstream release:
  - Add a new remote session type. These sessions create a temporary local
    account and authenticate against a remote server. The session is an
    application that accesses that remote session (e.g. VNC, RDP etc)
  - Support multiple simultaneous PAM prompts (LP: #1043593)
  - Set utmp ut_host field to the X display address (LP: #1027760)
  - Correctly reap unused authentication sessions (LP: #990661)
* debian/liblightdm-gobject-1-0.symbols:
  - Updated

[ Michael Terry ]
* debian/patches/06_disable_remote_login.patch:
  - Always return an error when trying to log in to remote sessions,
    until the FFe is granted (which is bug 1040221)

Show diffs side-by-side

added added

removed removed

Lines of Context:
35
35
};
36
36
static guint signals[LAST_SIGNAL] = { 0 };
37
37
 
38
 
typedef enum
39
 
{
40
 
    SESSION_NONE = 0,
41
 
    SESSION_GREETER_PRE_CONNECT,
42
 
    SESSION_GREETER,
43
 
    SESSION_GREETER_AUTHENTICATED,
44
 
    SESSION_USER
45
 
} SessionType;
46
 
 
47
38
struct DisplayPrivate
48
39
{
49
40
    /* Display server */
62
53
    gboolean greeter_is_lock;
63
54
 
64
55
    /* Session requested to log into */
 
56
    SessionType user_session_type;
65
57
    gchar *user_session;
66
58
 
67
59
    /* Program to run sessions through */
220
212
}
221
213
 
222
214
void
223
 
display_set_user_session (Display *display, const gchar *session_name)
 
215
display_set_user_session (Display *display, SessionType type, const gchar *session_name)
224
216
{
225
217
    g_return_if_fail (display != NULL);
226
218
    g_free (display->priv->user_session);
 
219
    display->priv->user_session_type = type;
227
220
    display->priv->user_session = g_strdup (session_name);
228
221
}
229
222
 
349
342
}
350
343
 
351
344
static gboolean
352
 
greeter_start_session_cb (Greeter *greeter, const gchar *session_name, Display *display)
 
345
greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *session_name, Display *display)
353
346
{
354
347
    /* If no session requested, use the previous one */
355
348
    if (!session_name && !greeter_get_guest_authenticated (greeter))
357
350
        User *user;
358
351
 
359
352
        user = session_get_user (greeter_get_authentication_session (greeter));
 
353
        type = SESSION_TYPE_LOCAL;
360
354
        session_name = user_get_xsession (user);
361
355
    }
362
356
 
364
358
    if (session_name)
365
359
    {
366
360
        g_debug ("Using session %s", session_name);
367
 
        display_set_user_session (display, session_name);
 
361
        display_set_user_session (display, type, session_name);
368
362
    }
369
363
 
370
364
    /* Stop this display if that session already exists and can switch to it */
474
468
        if (session_name)
475
469
        {
476
470
            g_debug ("Autologin using session %s", session_name);
477
 
            display_set_user_session (display, session_name);
 
471
            display_set_user_session (display, SESSION_TYPE_LOCAL, session_name);
478
472
        }
479
473
 
480
474
        g_signal_emit (display, signals[START_SESSION], 0, &result);
493
487
}
494
488
 
495
489
static gboolean
496
 
autologin (Display *display, const gchar *username, const gchar *service, gboolean start_greeter_if_fail)
 
490
autologin (Display *display, const gchar *username, const gchar *service, gboolean start_greeter_if_fail, gboolean is_guest)
497
491
{
498
492
    display->priv->start_greeter_if_fail = start_greeter_if_fail;
499
493
 
502
496
    display->priv->session = create_session (display);
503
497
    g_signal_connect (display->priv->session, "authentication-complete", G_CALLBACK (autologin_authentication_complete_cb), display);
504
498
    g_signal_connect_after (display->priv->session, "stopped", G_CALLBACK (user_session_stopped_cb), display);
505
 
    return session_start (display->priv->session, service, username, TRUE, FALSE);
 
499
    return session_start (display->priv->session, service, username, TRUE, FALSE, is_guest);
506
500
}
507
501
 
508
502
static gboolean
518
512
        return FALSE;
519
513
    }
520
514
 
521
 
    result = autologin (display, username, service, start_greeter_if_fail);
 
515
    result = autologin (display, username, service, start_greeter_if_fail, TRUE);
522
516
    g_free (username);
523
517
 
524
518
    return result;
700
694
 
701
695
    user = session_get_user (display->priv->session);
702
696
 
703
 
    /* Store this session name so we automatically use it next time */
704
 
    user_set_xsession (user, display->priv->user_session);
705
 
 
706
697
    /* Find the command to run for the selected session */
707
 
    // FIXME: This is X specific, move into xsession.c
708
 
    sessions_dir = config_get_string (config_get_instance (), "LightDM", "xsessions-directory");
 
698
    if (display->priv->user_session_type == SESSION_TYPE_LOCAL)
 
699
    {
 
700
        sessions_dir = config_get_string (config_get_instance (), "LightDM", "xsessions-directory");
 
701
 
 
702
        /* Store this session name so we automatically use it next time */
 
703
        user_set_xsession (user, display->priv->user_session);
 
704
    }
 
705
    else
 
706
        sessions_dir = config_get_string (config_get_instance (), "LightDM", "remote-sessions-directory");
709
707
    filename = g_strdup_printf ("%s.desktop", display->priv->user_session);
710
708
    path = g_build_filename (sessions_dir, filename, NULL);
711
709
    g_free (sessions_dir);
777
775
    else if (display->priv->autologin_user)
778
776
    {
779
777
        g_debug ("Automatically logging in user %s", display->priv->autologin_user);
780
 
        result = autologin (display, display->priv->autologin_user, AUTOLOGIN_SERVICE, TRUE);
 
778
        result = autologin (display, display->priv->autologin_user, AUTOLOGIN_SERVICE, TRUE, FALSE);
781
779
    }
782
780
    else if (display->priv->select_user_hint)
783
781
    {
784
782
        g_debug ("Logging in user %s", display->priv->select_user_hint);
785
 
        result = autologin (display, display->priv->select_user_hint, USER_SERVICE, TRUE);
 
783
        result = autologin (display, display->priv->select_user_hint, USER_SERVICE, TRUE, FALSE);
786
784
    }
787
785
 
788
786
    /* If no session started, start a greeter */