91
90
GHashTable *open_reauthentication_requests;
92
GDBusProxy *accountsservice_proxy;
93
guint have_existing_user_accounts : 1;
94
guint accountsservice_ready : 1;
95
guint waiting_to_connect_to_display : 1;
93
97
guint start_session_when_ready : 1;
94
98
guint waiting_to_start_session : 1;
95
99
guint session_is_running : 1;
779
781
g_object_get (slave,
780
"display-id", &display_id,
781
782
"display-name", &display_name,
782
783
"display-hostname", &display_hostname,
783
784
"display-is-local", &display_is_local,
993
990
/* Put cursor out of the way on first head */
994
991
gdm_slave_set_initial_cursor_position (GDM_SLAVE (slave));
996
/* Set the busy cursor */
997
gdm_slave_set_busy_cursor (GDM_SLAVE (slave));
999
/* The root window has a background that may be useful
1000
* to cross fade or transition from when setting the
1001
* login screen background. We read it here, and stuff
1002
* it into the standard _XROOTPMAP_ID root window property,
1003
* so gnome-settings-daemon can get at it.
1005
gdm_slave_save_root_windows (GDM_SLAVE (slave));
1007
993
#ifdef WITH_PLYMOUTH
1008
994
/* Plymouth is waiting for the go-ahead to exit */
1009
995
if (slave->priv->plymouth_is_running) {
1090
1074
display_hostname = NULL;
1092
1076
g_object_get (slave,
1093
"display-id", &display_id,
1094
1077
"display-is-local", &display_is_local,
1095
1078
"display-name", &display_name,
1096
1079
"display-seat-id", &seat_id,
1166
1148
start_launch_environment (slave, GDM_USERNAME, NULL);
1169
#define RULES_DIR DATADIR "/polkit-1/rules.d/"
1170
#define RULES_FILE "20-gnome-initial-setup.rules"
1172
static const gboolean
1173
create_initial_setup_user (GdmSimpleSlave *slave)
1175
gboolean ret = TRUE;
1176
ActUserManager *act;
1178
GFile *src_file, *dest_file;
1179
GError *error = NULL;
1180
const char *e = NULL;
1182
/* First, create the user */
1183
act = act_user_manager_get_default ();
1185
user = act_user_manager_create_user (act, INITIAL_SETUP_USERNAME, "", 0, &error);
1187
if (g_dbus_error_is_remote_error (error)) {
1188
e = g_dbus_error_get_remote_error (error);
1191
g_warning ("Creating user '%s' failed: %s / %s",
1192
INITIAL_SETUP_USERNAME, e, error->message);
1194
if (g_strcmp0 (e, "org.freedesktop.Accounts.Error.UserExists") != 0) {
1199
g_clear_error (&error);
1201
g_object_unref (user);
1204
/* Now, make sure the PolicyKit policy is in place */
1205
src_file = g_file_new_for_path (DATADIR "/gnome-initial-setup/" RULES_FILE);
1206
dest_file = g_file_new_for_path (RULES_DIR RULES_FILE);
1208
if (!g_file_copy (src_file,
1210
G_FILE_COPY_OVERWRITE,
1211
NULL, NULL, NULL, &error)) {
1212
g_warning ("Failed to copy '%s' to '%s': %s",
1213
g_file_get_path (src_file),
1214
g_file_get_path (dest_file),
1217
goto out_clear_files;
1221
g_object_unref (src_file);
1222
g_object_unref (dest_file);
1225
g_clear_pointer (&e, g_free);
1226
g_clear_error (&error);
1231
destroy_initial_setup_user (GdmSimpleSlave *slave)
1233
ActUserManager *act;
1235
const char *filename;
1238
filename = RULES_DIR RULES_FILE;
1240
if (g_remove (filename) < 0) {
1241
g_warning ("Failed to remove '%s': %s", filename, g_strerror (errno));
1244
act = act_user_manager_get_default ();
1247
user = act_user_manager_get_user (act, INITIAL_SETUP_USERNAME);
1249
if (!act_user_manager_delete_user (act, user, TRUE, &error)) {
1250
g_warning ("Failed to delete user '%s': %s", INITIAL_SETUP_USERNAME, error->message);
1251
g_error_free (error);
1253
g_object_unref (user);
1256
if (g_remove (INITIAL_SETUP_TRIGGER_FILE) < 0) {
1257
g_warning ("Failed to remove '%s': %s", INITIAL_SETUP_TRIGGER_FILE, g_strerror (errno));
1262
1152
start_initial_setup (GdmSimpleSlave *slave)
1264
create_initial_setup_user (slave);
1265
1154
start_launch_environment (slave, INITIAL_SETUP_USERNAME, "gnome-initial-setup");
1190
setup_session (GdmSimpleSlave *slave)
1192
if (wants_initial_setup (slave)) {
1193
start_initial_setup (slave);
1194
} else if (wants_autologin (slave)) {
1195
/* Run the init script. gdmslave suspends until script has terminated */
1196
gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/Init", GDM_USERNAME);
1198
start_greeter (slave);
1200
create_new_session (slave);
1303
1203
static gboolean
1310
1210
res = gdm_slave_connect_to_x11_display (GDM_SLAVE (slave));
1312
1212
setup_server (slave);
1314
if (wants_initial_setup (slave)) {
1315
start_initial_setup (slave);
1316
} else if (wants_autologin (slave)) {
1317
/* Run the init script. gdmslave suspends until script has terminated */
1318
gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/Init", GDM_USERNAME);
1320
start_greeter (slave);
1322
create_new_session (slave);
1213
setup_session (slave);
1324
1215
if (slave->priv->connection_attempts >= MAX_CONNECT_ATTEMPTS) {
1325
1216
g_warning ("Unable to connect to display after %d tries - bailing out", slave->priv->connection_attempts);
1226
connect_to_display_when_accountsservice_ready (GdmSimpleSlave *slave)
1228
if (slave->priv->accountsservice_ready) {
1229
slave->priv->waiting_to_connect_to_display = FALSE;
1230
g_idle_add ((GSourceFunc)idle_connect_to_display, slave);
1232
slave->priv->waiting_to_connect_to_display = TRUE;
1335
1237
on_server_ready (GdmServer *server,
1336
1238
GdmSimpleSlave *slave)
1338
g_idle_add ((GSourceFunc)idle_connect_to_display, slave);
1240
connect_to_display_when_accountsservice_ready (slave);
1278
on_list_cached_users_complete (GObject *proxy,
1279
GAsyncResult *result,
1282
GdmSimpleSlave *slave = GDM_SIMPLE_SLAVE (user_data);
1283
GVariant *call_result = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), result, NULL);
1284
GVariant *user_list;
1287
slave->priv->have_existing_user_accounts = FALSE;
1289
g_variant_get (call_result, "(@ao)", &user_list);
1290
slave->priv->have_existing_user_accounts = g_variant_n_children (user_list) > 0;
1291
g_variant_unref (user_list);
1292
g_variant_unref (call_result);
1295
slave->priv->accountsservice_ready = TRUE;
1297
if (slave->priv->waiting_to_connect_to_display) {
1298
connect_to_display_when_accountsservice_ready (slave);
1303
on_accountsservice_ready (GObject *object,
1304
GAsyncResult *result,
1307
GdmSimpleSlave *slave = GDM_SIMPLE_SLAVE (user_data);
1308
GError *local_error = NULL;
1310
slave->priv->accountsservice_proxy = g_dbus_proxy_new_for_bus_finish (result, &local_error);
1311
if (!slave->priv->accountsservice_proxy) {
1312
g_error ("Failed to contact accountsservice: %s", local_error->message);
1315
g_dbus_proxy_call (slave->priv->accountsservice_proxy, "ListCachedUsers", NULL, 0, -1, NULL,
1316
on_list_cached_users_complete, slave);
1375
1320
static gboolean
1376
1321
gdm_simple_slave_run (GdmSimpleSlave *slave)
1418
1363
G_CALLBACK (on_server_ready),
1366
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
1368
"org.freedesktop.Accounts",
1369
"/org/freedesktop/Accounts",
1370
"org.freedesktop.Accounts",
1372
on_accountsservice_ready, slave);
1421
1374
#ifdef WITH_PLYMOUTH
1422
1375
slave->priv->plymouth_is_running = plymouth_is_running ();
1571
1524
self->priv->greeter_environment = NULL;
1527
if (self->priv->start_session_id > 0) {
1528
g_source_remove (self->priv->start_session_id);
1529
self->priv->start_session_id = 0;
1532
g_clear_pointer (&self->priv->start_session_service_name,
1533
(GDestroyNotify) g_free);
1574
1535
if (self->priv->session_is_running) {
1575
1536
char *username;