144
145
#define REQUEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), request_get_type (), Request))
145
146
G_DEFINE_TYPE_WITH_CODE (Request, request, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_RESULT, request_iface_init));
148
static gboolean from_server_cb (GIOChannel *source, GIOCondition condition, gpointer data);
148
151
lightdm_greeter_error_get_type (void)
152
155
if (G_UNLIKELY(enum_type == 0)) {
153
156
static const GEnumValue values[] = {
157
{ LIGHTDM_GREETER_ERROR_COMMUNICATION_ERROR, "LIGHTDM_GREETER_ERROR_COMMUNICATION_ERROR", "communication-error" },
154
158
{ LIGHTDM_GREETER_ERROR_CONNECTION_FAILED, "LIGHTDM_GREETER_ERROR_CONNECTION_FAILED", "connection-failed" },
155
159
{ LIGHTDM_GREETER_ERROR_SESSION_FAILED, "LIGHTDM_GREETER_ERROR_SESSION_FAILED", "session-failed" },
160
{ LIGHTDM_GREETER_ERROR_NO_AUTOLOGIN, "LIGHTDM_GREETER_ERROR_NO_AUTOLOGIN", "no-autologin" },
161
{ LIGHTDM_GREETER_ERROR_INVALID_USER, "LIGHTDM_GREETER_ERROR_INVALID_USER", "invalid-user" },
156
162
{ 0, NULL, NULL }
158
164
enum_type = g_enum_register_static (g_intern_static_string ("LightDMGreeterError"), values);
234
request_new (GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
240
request_new (LightDMGreeter *greeter, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
236
242
Request *request;
238
244
request = g_object_new (request_get_type (), NULL);
245
request->greeter = g_object_ref (greeter);
240
247
request->cancellable = g_object_ref (cancellable);
241
248
request->callback = callback;
280
write_int (guint8 *buffer, gint buffer_length, guint32 value, gsize *offset)
297
write_int (guint8 *buffer, gint buffer_length, guint32 value, gsize *offset, GError **error)
282
299
if (*offset + 4 >= buffer_length)
301
g_set_error_literal (error, LIGHTDM_GREETER_ERROR, LIGHTDM_GREETER_ERROR_COMMUNICATION_ERROR,
302
"Not enough buffer space to write integer");
284
305
buffer[*offset] = value >> 24;
285
306
buffer[*offset+1] = (value >> 16) & 0xFF;
286
307
buffer[*offset+2] = (value >> 8) & 0xFF;
287
308
buffer[*offset+3] = value & 0xFF;
292
write_string (guint8 *buffer, gint buffer_length, const gchar *value, gsize *offset)
315
write_string (guint8 *buffer, gint buffer_length, const gchar *value, gsize *offset, GError **error)
297
320
length = strlen (value);
298
write_int (buffer, buffer_length, length, offset);
321
if (!write_int (buffer, buffer_length, length, offset, error))
299
323
if (*offset + length >= buffer_length)
325
g_set_error (error, LIGHTDM_GREETER_ERROR, LIGHTDM_GREETER_ERROR_COMMUNICATION_ERROR,
326
"Not enough buffer space to write string of length %d octets", length);
302
330
memcpy (buffer + *offset, value, length);
303
331
*offset += length;
352
382
return int_length ();
356
write_header (guint8 *buffer, gint buffer_length, guint32 id, guint32 length, gsize *offset)
386
write_header (guint8 *buffer, gint buffer_length, guint32 id, guint32 length, gsize *offset, GError **error)
358
write_int (buffer, buffer_length, id, offset);
359
write_int (buffer, buffer_length, length, offset);
388
return write_int (buffer, buffer_length, id, offset, error) &&
389
write_int (buffer, buffer_length, length, offset, error);
370
send_message (LightDMGreeter *greeter, guint8 *message, gsize message_length)
400
connect_to_daemon (LightDMGreeter *greeter, GError **error)
402
LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
403
const gchar *to_server_fd, *from_server_fd;
405
if (priv->to_server_channel || priv->from_server_channel)
408
to_server_fd = g_getenv ("LIGHTDM_TO_SERVER_FD");
409
from_server_fd = g_getenv ("LIGHTDM_FROM_SERVER_FD");
410
if (!to_server_fd || !from_server_fd)
412
g_set_error_literal (error, LIGHTDM_GREETER_ERROR, LIGHTDM_GREETER_ERROR_CONNECTION_FAILED,
413
"Unable to determine socket to daemon");
417
priv->to_server_channel = g_io_channel_unix_new (atoi (to_server_fd));
418
priv->from_server_channel = g_io_channel_unix_new (atoi (from_server_fd));
419
g_io_add_watch (priv->from_server_channel, G_IO_IN, from_server_cb, greeter);
421
if (!g_io_channel_set_encoding (priv->to_server_channel, NULL, error) ||
422
!g_io_channel_set_encoding (priv->from_server_channel, NULL, error))
429
send_message (LightDMGreeter *greeter, guint8 *message, gsize message_length, GError **error)
372
431
LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
374
433
gsize data_length;
375
GError *error = NULL;
376
434
guint32 stated_length;
435
GError *flush_error = NULL;
378
if (!priv->to_server_channel)
437
if (!connect_to_daemon (greeter, error))
381
440
/* Double check that we're sending well-formed messages. If we say we're
386
445
stated_length = HEADER_SIZE + get_message_length (message, message_length);
387
446
if (stated_length != message_length)
389
g_warning ("Refusing to write malformed packet to daemon: declared size is %u, but actual size is %zu", stated_length, message_length);
448
g_set_error (error, LIGHTDM_GREETER_ERROR, LIGHTDM_GREETER_ERROR_COMMUNICATION_ERROR,
449
"Refusing to write malformed packet to daemon: declared size is %u, but actual size is %zu",
450
stated_length, message_length);
397
458
GIOStatus status;
460
GError *write_error = NULL;
400
status = g_io_channel_write_chars (priv->to_server_channel, data, data_length, &n_written, &error);
402
g_warning ("Error writing to daemon: %s", error->message);
403
g_clear_error (&error);
404
if (status != G_IO_STATUS_NORMAL)
462
status = g_io_channel_write_chars (priv->to_server_channel, data, data_length, &n_written, &write_error);
464
g_set_error (error, LIGHTDM_GREETER_ERROR, LIGHTDM_GREETER_ERROR_COMMUNICATION_ERROR,
465
"Failed to write to daemon: %s",
466
write_error->message);
467
g_clear_error (&write_error);
468
if (status != G_IO_STATUS_NORMAL)
406
470
data_length -= n_written;
407
471
data += n_written;
410
474
g_debug ("Wrote %zi bytes to daemon", message_length);
411
g_io_channel_flush (priv->to_server_channel, &error);
413
g_warning ("Failed to flush data to daemon: %s", error->message);
414
g_clear_error (&error);
475
if (!g_io_channel_flush (priv->to_server_channel, &flush_error))
477
g_set_error (error, LIGHTDM_GREETER_ERROR, LIGHTDM_GREETER_ERROR_COMMUNICATION_ERROR,
478
"Failed to write to daemon: %s",
479
flush_error->message);
480
g_clear_error (&flush_error);
606
674
request = g_list_nth_data (priv->start_session_requests, 0);
609
request->return_code = read_int (message, message_length, offset);
610
request_complete (request, G_OBJECT (greeter));
679
return_code = read_int (message, message_length, offset);
680
if (return_code == 0)
681
request->result = TRUE;
683
request->error = g_error_new (LIGHTDM_GREETER_ERROR, LIGHTDM_GREETER_ERROR_SESSION_FAILED,
684
"Session returned error code %d", return_code);
685
request_complete (request);
611
686
priv->start_session_requests = g_list_remove (priv->start_session_requests, request);
612
687
g_object_unref (request);
677
recv_message (LightDMGreeter *greeter, gsize *length, gboolean block)
754
recv_message (LightDMGreeter *greeter, gboolean block, guint8 **message, gsize *length, GError **error)
679
756
LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
680
757
gsize n_to_read, n_read;
682
GError *error = NULL;
684
if (!priv->from_server_channel)
759
if (!connect_to_daemon (greeter, error))
687
762
/* Read the header, or the whole message if we already have that */
688
763
n_to_read = HEADER_SIZE;
694
769
GIOStatus status;
770
GError *read_error = NULL;
695
772
status = g_io_channel_read_chars (priv->from_server_channel,
696
773
(gchar *) priv->read_buffer + priv->n_read,
697
774
n_to_read - priv->n_read,
701
g_warning ("Error reading from server: %s", error->message);
702
g_clear_error (&error);
703
777
if (status != G_IO_STATUS_NORMAL)
779
g_set_error (error, LIGHTDM_GREETER_ERROR, LIGHTDM_GREETER_ERROR_COMMUNICATION_ERROR,
780
"Failed to read from daemon: %s",
781
read_error->message);
782
g_clear_error (&read_error);
706
786
g_debug ("Read %zi bytes from daemon", n_read);
719
805
if (n_to_read > 0)
721
807
priv->read_buffer = g_realloc (priv->read_buffer, HEADER_SIZE + n_to_read);
722
return recv_message (greeter, length, block);
808
return recv_message (greeter, block, message, length, error);
726
buffer = priv->read_buffer;
727
*length = priv->n_read;
813
*message = priv->read_buffer;
815
g_free (priv->read_buffer);
817
*length = priv->n_read;
729
819
priv->read_buffer = g_malloc (priv->n_read);
730
820
priv->n_read = 0;
738
828
LightDMGreeter *greeter = data;
740
830
gsize message_length;
831
GError *error = NULL;
742
833
/* Read one message and process it */
743
message = recv_message (greeter, &message_length, FALSE);
834
if (!recv_message (greeter, FALSE, &message, &message_length, &error))
836
// FIXME: Should push this up to the client somehow
837
g_warning ("Failed to read from daemon: %s\n", error->message);
838
g_clear_error (&error);
839
return G_SOURCE_REMOVE;
746
844
handle_message (greeter, message, message_length);
747
845
g_free (message);
848
return G_SOURCE_CONTINUE;
754
send_connect (LightDMGreeter *greeter, gboolean resettable)
852
send_connect (LightDMGreeter *greeter, gboolean resettable, GError **error)
756
854
guint8 message[MAX_MESSAGE_LENGTH];
757
855
gsize offset = 0;
759
857
g_debug ("Connecting to display manager...");
760
write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONNECT, string_length (VERSION) + int_length (), &offset);
761
write_string (message, MAX_MESSAGE_LENGTH, VERSION, &offset);
762
write_int (message, MAX_MESSAGE_LENGTH, resettable ? 1 : 0, &offset);
764
return send_message (greeter, message, offset);
858
return write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONNECT, string_length (VERSION) + int_length (), &offset, error) &&
859
write_string (message, MAX_MESSAGE_LENGTH, VERSION, &offset, error) &&
860
write_int (message, MAX_MESSAGE_LENGTH, resettable ? 1 : 0, &offset, error) &&
861
send_message (greeter, message, offset, error);
768
send_start_session (LightDMGreeter *greeter, const gchar *session)
865
send_start_session (LightDMGreeter *greeter, const gchar *session, GError **error)
770
867
guint8 message[MAX_MESSAGE_LENGTH];
771
868
gsize offset = 0;
776
873
g_debug ("Starting default session");
778
write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_START_SESSION, string_length (session), &offset);
779
write_string (message, MAX_MESSAGE_LENGTH, session, &offset);
780
return send_message (greeter, message, offset);
875
return write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_START_SESSION, string_length (session), &offset, error) &&
876
write_string (message, MAX_MESSAGE_LENGTH, session, &offset, error) &&
877
send_message (greeter, message, offset, error);
784
send_ensure_shared_data_dir (LightDMGreeter *greeter, const gchar *username)
881
send_ensure_shared_data_dir (LightDMGreeter *greeter, const gchar *username, GError **error)
786
883
guint8 message[MAX_MESSAGE_LENGTH];
787
884
gsize offset = 0;
789
886
g_debug ("Ensuring data directory for user %s", username);
791
write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_ENSURE_SHARED_DIR, string_length (username), &offset);
792
write_string (message, MAX_MESSAGE_LENGTH, username, &offset);
793
return send_message (greeter, message, offset);
888
return write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_ENSURE_SHARED_DIR, string_length (username), &offset, error) &&
889
write_string (message, MAX_MESSAGE_LENGTH, username, &offset, error) &&
890
send_message (greeter, message, offset, error);
812
909
LightDMGreeterPrivate *priv;
813
910
Request *request;
911
GError *error = NULL;
815
913
g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
817
915
priv = GET_PRIVATE (greeter);
819
request = request_new (cancellable, callback, user_data);
820
priv->connect_requests = g_list_append (priv->connect_requests, request);
821
send_connect (greeter, priv->resettable);
917
request = request_new (greeter, cancellable, callback, user_data);
918
if (send_connect (greeter, priv->resettable, &error))
919
priv->connect_requests = g_list_append (priv->connect_requests, request);
922
request->error = error;
923
request_complete (request);
924
g_object_unref (request);
867
966
priv = GET_PRIVATE (greeter);
869
968
/* Read until we are connected */
870
send_connect (greeter, priv->resettable);
871
request = request_new (NULL, NULL, NULL);
969
if (!send_connect (greeter, priv->resettable, error))
971
request = request_new (greeter, NULL, NULL, NULL);
872
972
priv->connect_requests = g_list_append (priv->connect_requests, g_object_ref (request));
876
976
gsize message_length;
878
message = recv_message (greeter, &message_length, TRUE);
978
if (!recv_message (greeter, TRUE, &message, &message_length, error))
881
980
handle_message (greeter, message, message_length);
882
981
g_free (message);
883
982
} while (!request->complete);
1154
1253
* lightdm_greeter_authenticate:
1155
1254
* @greeter: A #LightDMGreeter
1156
1255
* @username: (allow-none): A username or #NULL to prompt for a username.
1256
* @error: return location for a #GError, or %NULL
1158
1258
* Starts the authentication procedure for a user.
1260
* Return value: #TRUE if authentication request sent.
1161
lightdm_greeter_authenticate (LightDMGreeter *greeter, const gchar *username)
1263
lightdm_greeter_authenticate (LightDMGreeter *greeter, const gchar *username, GError **error)
1163
1265
LightDMGreeterPrivate *priv;
1164
1266
guint8 message[MAX_MESSAGE_LENGTH];
1165
1267
gsize offset = 0;
1167
g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1269
g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
1169
1271
priv = GET_PRIVATE (greeter);
1171
g_return_if_fail (priv->connected);
1273
g_return_val_if_fail (priv->connected, FALSE);
1173
1275
priv->cancelling_authentication = FALSE;
1174
1276
priv->authenticate_sequence_number++;
1183
1285
g_debug ("Starting authentication for user %s...", username);
1184
write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE, int_length () + string_length (username), &offset);
1185
write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset);
1186
write_string (message, MAX_MESSAGE_LENGTH, username, &offset);
1187
send_message (greeter, message, offset);
1286
return write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE, int_length () + string_length (username), &offset, error) &&
1287
write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset, error) &&
1288
write_string (message, MAX_MESSAGE_LENGTH, username, &offset, error) &&
1289
send_message (greeter, message, offset, error);
1191
1293
* lightdm_greeter_authenticate_as_guest:
1192
1294
* @greeter: A #LightDMGreeter
1295
* @error: return location for a #GError, or %NULL
1194
1297
* Starts the authentication procedure for the guest user.
1299
* Return value: #TRUE if authentication request sent.
1197
lightdm_greeter_authenticate_as_guest (LightDMGreeter *greeter)
1302
lightdm_greeter_authenticate_as_guest (LightDMGreeter *greeter, GError **error)
1199
1304
LightDMGreeterPrivate *priv;
1200
1305
guint8 message[MAX_MESSAGE_LENGTH];
1201
1306
gsize offset = 0;
1203
g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1308
g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
1205
1310
priv = GET_PRIVATE (greeter);
1207
g_return_if_fail (priv->connected);
1312
g_return_val_if_fail (priv->connected, FALSE);
1209
1314
priv->cancelling_authentication = FALSE;
1210
1315
priv->authenticate_sequence_number++;
1214
1319
priv->authentication_user = NULL;
1216
1321
g_debug ("Starting authentication for guest account...");
1217
write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE_AS_GUEST, int_length (), &offset);
1218
write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset);
1219
send_message (greeter, message, offset);
1322
return write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE_AS_GUEST, int_length (), &offset, error) &&
1323
write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset, error) &&
1324
send_message (greeter, message, offset, error);
1223
1328
* lightdm_greeter_authenticate_autologin:
1224
1329
* @greeter: A #LightDMGreeter
1330
* @error: return location for a #GError, or %NULL
1226
1332
* Starts the authentication procedure for the automatic login user.
1334
* Return value: #TRUE if authentication request sent.
1229
lightdm_greeter_authenticate_autologin (LightDMGreeter *greeter)
1337
lightdm_greeter_authenticate_autologin (LightDMGreeter *greeter, GError **error)
1231
1339
const gchar *user;
1233
1341
user = lightdm_greeter_get_autologin_user_hint (greeter);
1234
1342
if (lightdm_greeter_get_autologin_guest_hint (greeter))
1235
lightdm_greeter_authenticate_as_guest (greeter);
1343
return lightdm_greeter_authenticate_as_guest (greeter, error);
1237
lightdm_greeter_authenticate (greeter, user);
1345
return lightdm_greeter_authenticate (greeter, user, error);
1348
g_set_error_literal (error, LIGHTDM_GREETER_ERROR, LIGHTDM_GREETER_ERROR_NO_AUTOLOGIN,
1349
"Can't authenticate autologin; autologin not configured");
1242
1356
* @greeter: A #LightDMGreeter
1243
1357
* @session: The name of a remote session
1244
1358
* @username: (allow-none): A username of #NULL to prompt for a username.
1359
* @error: return location for a #GError, or %NULL
1246
1361
* Start authentication for a remote session type.
1363
* Return value: #TRUE if authentication request sent.
1249
lightdm_greeter_authenticate_remote (LightDMGreeter *greeter, const gchar *session, const gchar *username)
1366
lightdm_greeter_authenticate_remote (LightDMGreeter *greeter, const gchar *session, const gchar *username, GError **error)
1251
1368
LightDMGreeterPrivate *priv;
1252
1369
guint8 message[MAX_MESSAGE_LENGTH];
1253
1370
gsize offset = 0;
1255
g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1372
g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
1257
1374
priv = GET_PRIVATE (greeter);
1259
g_return_if_fail (priv->connected);
1376
g_return_val_if_fail (priv->connected, FALSE);
1261
1378
priv->cancelling_authentication = FALSE;
1262
1379
priv->authenticate_sequence_number++;
1269
1386
g_debug ("Starting authentication for remote session %s as user %s...", session, username);
1271
1388
g_debug ("Starting authentication for remote session %s...", session);
1272
write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE_REMOTE, int_length () + string_length (session) + string_length (username), &offset);
1273
write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset);
1274
write_string (message, MAX_MESSAGE_LENGTH, session, &offset);
1275
write_string (message, MAX_MESSAGE_LENGTH, username, &offset);
1276
send_message (greeter, message, offset);
1390
return write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE_REMOTE, int_length () + string_length (session) + string_length (username), &offset, error) &&
1391
write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset, error) &&
1392
write_string (message, MAX_MESSAGE_LENGTH, session, &offset, error) &&
1393
write_string (message, MAX_MESSAGE_LENGTH, username, &offset, error) &&
1394
send_message (greeter, message, offset, error);
1280
1398
* lightdm_greeter_respond:
1281
1399
* @greeter: A #LightDMGreeter
1282
1400
* @response: Response to a prompt
1401
* @error: return location for a #GError, or %NULL
1284
1403
* Provide response to a prompt. May be one in a series.
1405
* Return value: #TRUE if response sent.
1287
lightdm_greeter_respond (LightDMGreeter *greeter, const gchar *response)
1408
lightdm_greeter_respond (LightDMGreeter *greeter, const gchar *response, GError **error)
1289
1410
LightDMGreeterPrivate *priv;
1290
1411
guint8 message[MAX_MESSAGE_LENGTH];
1291
1412
gsize offset = 0;
1293
g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1294
g_return_if_fail (response != NULL);
1414
g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
1415
g_return_val_if_fail (response != NULL, FALSE);
1296
1417
priv = GET_PRIVATE (greeter);
1298
g_return_if_fail (priv->connected);
1299
g_return_if_fail (priv->n_responses_waiting > 0);
1419
g_return_val_if_fail (priv->connected, FALSE);
1420
g_return_val_if_fail (priv->n_responses_waiting > 0, FALSE);
1301
1422
priv->n_responses_waiting--;
1302
1423
priv->responses_received = g_list_append (priv->responses_received, g_strdup (response));
1312
1433
for (iter = priv->responses_received; iter; iter = iter->next)
1313
1434
msg_length += string_length ((gchar *)iter->data);
1315
write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONTINUE_AUTHENTICATION, msg_length, &offset);
1316
write_int (message, MAX_MESSAGE_LENGTH, g_list_length (priv->responses_received), &offset);
1436
if (!write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONTINUE_AUTHENTICATION, msg_length, &offset, error) ||
1437
!write_int (message, MAX_MESSAGE_LENGTH, g_list_length (priv->responses_received), &offset, error))
1317
1439
for (iter = priv->responses_received; iter; iter = iter->next)
1318
write_string (message, MAX_MESSAGE_LENGTH, (gchar *)iter->data, &offset);
1319
send_message (greeter, message, offset);
1441
if (!write_string (message, MAX_MESSAGE_LENGTH, (gchar *)iter->data, &offset, error))
1444
if (!send_message (greeter, message, offset, error))
1321
1447
g_list_free_full (priv->responses_received, g_free);
1322
1448
priv->responses_received = NULL;
1327
1455
* lightdm_greeter_cancel_authentication:
1328
1456
* @greeter: A #LightDMGreeter
1457
* @error: return location for a #GError, or %NULL
1330
1459
* Cancel the current user authentication.
1461
* Return value: #TRUE if cancel request sent.
1333
lightdm_greeter_cancel_authentication (LightDMGreeter *greeter)
1464
lightdm_greeter_cancel_authentication (LightDMGreeter *greeter, GError **error)
1335
1466
LightDMGreeterPrivate *priv;
1336
1467
guint8 message[MAX_MESSAGE_LENGTH];
1337
1468
gsize offset = 0;
1339
g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1470
g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
1341
1472
priv = GET_PRIVATE (greeter);
1343
g_return_if_fail (priv->connected);
1474
g_return_val_if_fail (priv->connected, FALSE);
1345
1476
priv->cancelling_authentication = TRUE;
1346
write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CANCEL_AUTHENTICATION, 0, &offset);
1347
send_message (greeter, message, offset);
1477
return write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CANCEL_AUTHENTICATION, 0, &offset, error) &&
1478
send_message (greeter, message, offset, error);
1396
1527
* lightdm_greeter_set_language:
1397
1528
* @greeter: A #LightDMGreeter
1398
1529
* @language: The language to use for this user in the form of a locale specification (e.g. "de_DE.UTF-8").
1530
* @error: return location for a #GError, or %NULL
1400
1532
* Set the language for the currently authenticated user.
1534
* Return value: #TRUE if set language request sent.
1403
lightdm_greeter_set_language (LightDMGreeter *greeter, const gchar *language)
1537
lightdm_greeter_set_language (LightDMGreeter *greeter, const gchar *language, GError **error)
1405
1539
LightDMGreeterPrivate *priv;
1406
1540
guint8 message[MAX_MESSAGE_LENGTH];
1407
1541
gsize offset = 0;
1409
g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1543
g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
1411
1545
priv = GET_PRIVATE (greeter);
1413
g_return_if_fail (priv->connected);
1547
g_return_val_if_fail (priv->connected, FALSE);
1415
write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_SET_LANGUAGE, string_length (language), &offset);
1416
write_string (message, MAX_MESSAGE_LENGTH, language, &offset);
1417
send_message (greeter, message, offset);
1549
return write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_SET_LANGUAGE, string_length (language), &offset, error) &&
1550
write_string (message, MAX_MESSAGE_LENGTH, language, &offset, error) &&
1551
send_message (greeter, message, offset, error);
1437
1571
LightDMGreeterPrivate *priv;
1438
1572
Request *request;
1573
GError *error = NULL;
1440
1575
g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1442
1577
priv = GET_PRIVATE (greeter);
1444
send_start_session (greeter, session);
1445
request = request_new (cancellable, callback, user_data);
1579
request = request_new (greeter, cancellable, callback, user_data);
1446
1580
priv->start_session_requests = g_list_append (priv->start_session_requests, request);
1581
if (!send_start_session (greeter, session, &error))
1583
request->error = error;
1584
request_complete (request);
1496
1630
g_return_val_if_fail (priv->is_authenticated, FALSE);
1498
1632
/* Read until the session is started */
1499
send_start_session (greeter, session);
1500
request = request_new (NULL, NULL, NULL);
1633
if (!send_start_session (greeter, session, error))
1635
request = request_new (greeter, NULL, NULL, NULL);
1501
1636
priv->start_session_requests = g_list_append (priv->start_session_requests, g_object_ref (request));
1504
1639
guint8 *message;
1505
1640
gsize message_length;
1507
message = recv_message (greeter, &message_length, TRUE);
1642
if (!recv_message (greeter, TRUE, &message, &message_length, error))
1510
1644
handle_message (greeter, message, message_length);
1511
1645
g_free (message);
1512
1646
} while (!request->complete);
1539
1673
LightDMGreeterPrivate *priv;
1540
1674
Request *request;
1675
GError *error = NULL;
1542
1677
g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1544
1679
priv = GET_PRIVATE (greeter);
1546
send_ensure_shared_data_dir (greeter, username);
1547
request = request_new (cancellable, callback, user_data);
1681
request = request_new (greeter, cancellable, callback, user_data);
1548
1682
priv->ensure_shared_data_dir_requests = g_list_append (priv->ensure_shared_data_dir_requests, request);
1683
if (!send_ensure_shared_data_dir (greeter, username, &error))
1685
request->error = error;
1686
request_complete (request);
1552
1691
* lightdm_greeter_ensure_shared_data_dir_finish:
1553
1692
* @result: A #GAsyncResult.
1554
1693
* @greeter: A #LightDMGreeter
1694
* @error: return location for a #GError, or %NULL
1556
1696
* Function to call from lightdm_greeter_ensure_shared_data_dir callback.
1558
1698
* Return value: The path to the shared directory, free with g_free.
1561
lightdm_greeter_ensure_shared_data_dir_finish (LightDMGreeter *greeter, GAsyncResult *result)
1701
lightdm_greeter_ensure_shared_data_dir_finish (LightDMGreeter *greeter, GAsyncResult *result, GError **error)
1703
Request *request = REQUEST (result);
1563
1705
g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
1564
return g_strdup (REQUEST (result)->dir);
1707
g_propagate_error (error, request->error);
1708
return g_strdup (request->dir);
1568
1712
* lightdm_greeter_ensure_shared_data_dir_sync:
1569
1713
* @greeter: A #LightDMGreeter
1570
1714
* @username: A username
1715
* @error: return location for a #GError, or %NULL
1572
1717
* Ensure that a shared data dir for the given user is available. Both the
1573
1718
* greeter user and @username will have write access to that folder. The
1596
1740
g_return_val_if_fail (priv->connected, NULL);
1598
1742
/* Read until a response */
1599
send_ensure_shared_data_dir (greeter, username);
1600
request = request_new (NULL, NULL, NULL);
1743
if (!send_ensure_shared_data_dir (greeter, username, error))
1745
request = request_new (greeter, NULL, NULL, NULL);
1601
1746
priv->ensure_shared_data_dir_requests = g_list_append (priv->ensure_shared_data_dir_requests, g_object_ref (request));
1604
1749
guint8 *message;
1605
1750
gsize message_length;
1607
message = recv_message (greeter, &message_length, TRUE);
1752
if (!recv_message (greeter, TRUE, &message, &message_length, error))
1610
1754
handle_message (greeter, message, message_length);
1611
1755
g_free (message);
1612
1756
} while (!request->complete);
1614
data_dir = g_strdup (request->dir);
1615
g_object_unref (request);
1758
return lightdm_greeter_ensure_shared_data_dir_finish (greeter, G_ASYNC_RESULT (request), error);
1621
1762
lightdm_greeter_init (LightDMGreeter *greeter)
1623
1764
LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
1626
1766
priv->read_buffer = g_malloc (HEADER_SIZE);
1627
1767
priv->hints = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
1629
fd = g_getenv ("LIGHTDM_TO_SERVER_FD");
1632
GError *error = NULL;
1634
priv->to_server_channel = g_io_channel_unix_new (atoi (fd));
1635
g_io_channel_set_encoding (priv->to_server_channel, NULL, &error);
1637
g_warning ("Failed to set encoding on to server channel to binary: %s\n", error->message);
1638
g_clear_error (&error);
1641
g_warning ("No LIGHTDM_TO_SERVER_FD environment variable");
1643
fd = g_getenv ("LIGHTDM_FROM_SERVER_FD");
1646
GError *error = NULL;
1648
priv->from_server_channel = g_io_channel_unix_new (atoi (fd));
1649
g_io_channel_set_encoding (priv->from_server_channel, NULL, &error);
1651
g_warning ("Failed to set encoding on from server channel to binary: %s\n", error->message);
1652
g_clear_error (&error);
1653
g_io_add_watch (priv->from_server_channel, G_IO_IN, from_server_cb, greeter);
1656
g_warning ("No LIGHTDM_FROM_SERVER_FD environment variable");
1660
1771
lightdm_greeter_set_property (GObject *object,
1662
const GValue *value,
1773
const GValue *value,
1665
1776
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1669
1780
lightdm_greeter_get_property (GObject *object,
1674
1785
LightDMGreeter *self;