~lightdm-team/lightdm/1.4

« back to all changes in this revision

Viewing changes to src/display-manager.c

  • Committer: robert.ancell at canonical
  • Date: 2010-08-23 05:21:13 UTC
  • Revision ID: robert.ancell@canonical.com-20100823052113-qvlggtumxgb95j44
Connect up SwitchToUser()

Show diffs side-by-side

added added

removed removed

Lines of Context:
220
220
    }
221
221
}
222
222
 
 
223
static guchar
 
224
atox (char c)
 
225
{
 
226
    if (c >= '0' && c <= '9')
 
227
        return c - '0';
 
228
    if (c >= 'a' && c <= 'f')
 
229
        return c - 'a' + 10;
 
230
    if (c >= 'A' && c <= 'F')
 
231
        return c - 'A' + 10;
 
232
    return 0;
 
233
}
 
234
 
 
235
static void
 
236
string_to_xdm_auth_key (const gchar *key, guchar *data)
 
237
{
 
238
    gint i;
 
239
 
 
240
    memset (data, 0, sizeof (data));
 
241
    if (strncmp (key, "0x", 2) == 0 || strncmp (key, "0X", 2) == 0)
 
242
    {
 
243
        for (i = 0; i < 8; i++)
 
244
        {
 
245
            if (key[i*2] == '\0')
 
246
                break;
 
247
            data[i] |= atox (key[i*2]) << 8;
 
248
            if (key[i*2+1] == '\0')
 
249
                break;
 
250
            data[i] |= atox (key[i*2+1]);
 
251
        }
 
252
    }
 
253
    else
 
254
    {
 
255
        for (i = 1; i < 8 && key[i-1]; i++)
 
256
           data[i] = key[i-1];
 
257
    }
 
258
}
 
259
 
 
260
static XServer *
 
261
make_xserver (DisplayManager *manager, gchar *config_section)
 
262
{
 
263
    gint display_number;
 
264
    XServer *xserver;
 
265
    XAuthorization *authorization = NULL;
 
266
    gchar *xdmcp_manager, *filename, *path, *xserver_command;
 
267
 
 
268
    if (config_section && g_key_file_has_key (manager->priv->config, config_section, "display-number", NULL))
 
269
        display_number = g_key_file_get_integer (manager->priv->config, config_section, "display-number", NULL);
 
270
    else
 
271
        display_number = get_free_display_number (manager);
 
272
 
 
273
    xdmcp_manager = config_section ? g_key_file_get_string (manager->priv->config, config_section, "xdmcp-manager", NULL) : NULL;
 
274
    if (xdmcp_manager)
 
275
    {
 
276
        gint port;
 
277
        gchar *key;
 
278
 
 
279
        xserver = xserver_new (XSERVER_TYPE_LOCAL_TERMINAL, xdmcp_manager, display_number);
 
280
 
 
281
        port = g_key_file_get_integer (manager->priv->config, config_section, "xdmcp-port", NULL);
 
282
        if (port > 0)
 
283
            xserver_set_port (xserver, port);
 
284
        key = g_key_file_get_string (manager->priv->config, config_section, "key", NULL);
 
285
        if (key)
 
286
        {
 
287
            guchar data[8];
 
288
 
 
289
            string_to_xdm_auth_key (key, data);
 
290
            xserver_set_authentication (xserver, "XDM-AUTHENTICATION-1", data, 8);
 
291
            authorization = xauth_new ("XDM-AUTHORIZATION-1", data, 8);
 
292
        }
 
293
    }
 
294
    else
 
295
    {
 
296
        xserver = xserver_new (XSERVER_TYPE_LOCAL, NULL, display_number);
 
297
        authorization = xauth_new_cookie ();
 
298
    }
 
299
    g_free (xdmcp_manager);
 
300
 
 
301
    path = get_authorization_path (manager);
 
302
    xserver_set_authorization (xserver, authorization, path);
 
303
    g_object_unref (authorization);
 
304
    g_free (path);
 
305
 
 
306
    filename = g_strdup_printf ("%s.log", xserver_get_address (xserver));
 
307
    path = g_build_filename (manager->priv->log_dir, filename, NULL);
 
308
    g_debug ("Logging to %s", path);
 
309
    xserver_set_log_file (xserver, path);
 
310
    g_free (filename);
 
311
    g_free (path);
 
312
 
 
313
    /* Allow X server to be Xephyr */
 
314
    if (getenv ("DISPLAY"))
 
315
        xserver_set_env (xserver, "DISPLAY", getenv ("DISPLAY"));
 
316
    if (getenv ("XAUTHORITY"))
 
317
        xserver_set_env (xserver, "XAUTHORITY", getenv ("XAUTHORITY"));
 
318
    xserver_command = g_key_file_get_string (manager->priv->config, "LightDM", "xserver", NULL);
 
319
    if (xserver_command)
 
320
        xserver_set_command (xserver, xserver_command);
 
321
    g_free (xserver_command);
 
322
 
 
323
    if (manager->priv->test_mode)
 
324
        xserver_set_command (xserver, "Xephyr");
 
325
  
 
326
    return xserver;
 
327
}
 
328
 
223
329
static Display *
224
330
add_display (DisplayManager *manager)
225
331
{
257
363
gboolean
258
364
display_manager_switch_to_user (DisplayManager *manager, char *username, GError *error)
259
365
{
 
366
    GList *link;
 
367
    Display *display;
 
368
    XServer *xserver;
 
369
 
 
370
    for (link = manager->priv->displays; link; link = link->next)
 
371
    {
 
372
        display = link->data;
 
373
        const gchar *session_user;
 
374
 
 
375
        session_user = display_get_session_user (display);
 
376
        if (session_user && strcmp (session_user, username) == 0)
 
377
        {
 
378
            g_debug ("Switching to user %s session on display %s", username, xserver_get_address (display_get_xserver (display)));
 
379
            //display_focus (display);
 
380
            return TRUE;
 
381
        }
 
382
    }
 
383
 
 
384
    g_debug ("Starting new display for user %s", username);
 
385
    display = add_display (manager);
 
386
    xserver = make_xserver (manager, NULL);
 
387
    display_start (display, xserver, NULL, 0);
 
388
    g_object_unref (xserver);
 
389
 
260
390
    return TRUE;
261
391
}
262
392
 
298
428
    return result;
299
429
}
300
430
 
301
 
static guchar
302
 
atox (char c)
303
 
{
304
 
    if (c >= '0' && c <= '9')
305
 
        return c - '0';
306
 
    if (c >= 'a' && c <= 'f')
307
 
        return c - 'a' + 10;
308
 
    if (c >= 'A' && c <= 'F')
309
 
        return c - 'A' + 10;
310
 
    return 0;
311
 
}
312
 
 
313
 
static void
314
 
string_to_xdm_auth_key (const gchar *key, guchar *data)
315
 
{
316
 
    gint i;
317
 
 
318
 
    memset (data, 0, sizeof (data));
319
 
    if (strncmp (key, "0x", 2) == 0 || strncmp (key, "0X", 2) == 0)
320
 
    {
321
 
        for (i = 0; i < 8; i++)
322
 
        {
323
 
            if (key[i*2] == '\0')
324
 
                break;
325
 
            data[i] |= atox (key[i*2]) << 8;
326
 
            if (key[i*2+1] == '\0')
327
 
                break;
328
 
            data[i] |= atox (key[i*2+1]);
329
 
        }
330
 
    }
331
 
    else
332
 
    {
333
 
        for (i = 1; i < 8 && key[i-1]; i++)
334
 
           data[i] = key[i-1];
335
 
    }
336
 
}
337
 
 
338
431
static void
339
432
setup_auth_dir (DisplayManager *manager)
340
433
{
394
487
    for (i = tokens; *i; i++)
395
488
    {
396
489
        Display *display;
397
 
        gchar *xserver_command, *default_user, *xdmcp_manager, *display_name;
 
490
        gchar *default_user, *display_name;
398
491
        gint user_timeout;
399
 
        guint display_number;
400
492
        XServer *xserver;
401
493
 
402
494
        display_name = *i;
419
511
                g_debug ("Starting session for user %s in %d seconds", default_user, user_timeout);
420
512
        }
421
513
 
422
 
        if (g_key_file_has_key (manager->priv->config, display_name, "display-number", NULL))
423
 
            display_number = g_key_file_get_integer (manager->priv->config, display_name, "display-number", NULL);
424
 
        else
425
 
            display_number = get_free_display_number (manager);
426
 
 
427
 
        xdmcp_manager = g_key_file_get_string (manager->priv->config, display_name, "xdmcp-manager", NULL);
428
 
        if (xdmcp_manager)
429
 
        {
430
 
            gint port;
431
 
            gchar *filename, *path, *key;
432
 
 
433
 
            xserver = xserver_new (XSERVER_TYPE_LOCAL_TERMINAL, xdmcp_manager, display_number);
434
 
 
435
 
            filename = g_strdup_printf ("%s.log", xserver_get_address (xserver));
436
 
            path = g_build_filename (manager->priv->log_dir, filename, NULL);
437
 
            g_debug ("Logging to %s", path);
438
 
            xserver_set_log_file (xserver, path);
439
 
            g_free (filename);
440
 
            g_free (path);
441
 
 
442
 
            port = g_key_file_get_integer (manager->priv->config, display_name, "xdmcp-port", NULL);
443
 
            if (port > 0)
444
 
                xserver_set_port (xserver, port);
445
 
            key = g_key_file_get_string (manager->priv->config, display_name, "key", NULL);
446
 
            if (key)
447
 
            {
448
 
                guchar data[8];
449
 
                gchar *path;
450
 
                XAuthorization *authorization;
451
 
 
452
 
                string_to_xdm_auth_key (key, data);
453
 
                xserver_set_authentication (xserver, "XDM-AUTHENTICATION-1", data, 8);
454
 
 
455
 
                authorization = xauth_new ("XDM-AUTHORIZATION-1", data, 8);
456
 
                path = get_authorization_path (manager);
457
 
                xserver_set_authorization (xserver, authorization, path);
458
 
 
459
 
                g_object_unref (authorization);              
460
 
                g_free (path);
461
 
            }
462
 
        }
463
 
        else
464
 
        {
465
 
            gchar *filename, *path;
466
 
            XAuthorization *authorization;
467
 
 
468
 
            xserver = xserver_new (XSERVER_TYPE_LOCAL, NULL, display_number);
469
 
 
470
 
            filename = g_strdup_printf ("%s.log", xserver_get_address (xserver));
471
 
            path = g_build_filename (manager->priv->log_dir, filename, NULL);
472
 
            g_debug ("Logging to %s", path);
473
 
            xserver_set_log_file (xserver, path);
474
 
            g_free (filename);
475
 
            g_free (path);
476
 
 
477
 
            authorization = xauth_new_cookie ();
478
 
            path = get_authorization_path (manager);
479
 
 
480
 
            xserver_set_authorization (xserver, authorization, path);
481
 
 
482
 
            g_object_unref (authorization);
483
 
            g_free (path);
484
 
        }
485
 
        g_free (xdmcp_manager);
486
 
 
487
 
        /* Allow X server to be Xephyr */
488
 
        if (getenv ("DISPLAY"))
489
 
            xserver_set_env (xserver, "DISPLAY", getenv ("DISPLAY"));
490
 
        if (getenv ("XAUTHORITY"))
491
 
            xserver_set_env (xserver, "XAUTHORITY", getenv ("XAUTHORITY"));
492
 
 
493
 
        xserver_command = g_key_file_get_string (manager->priv->config, "LightDM", "xserver", NULL);
494
 
        if (xserver_command)
495
 
            xserver_set_command (xserver, xserver_command);
496
 
        g_free (xserver_command);
497
 
 
498
 
        if (manager->priv->test_mode)
499
 
            xserver_set_command (xserver, "Xephyr");
 
514
        xserver = make_xserver (manager, display_name);
500
515
 
501
516
        display_start (display, xserver, default_user, user_timeout);
502
517
        g_object_unref (xserver);