diff options
-rw-r--r-- | debian/liblightdm-gobject-1-0.symbols | 2 | ||||
-rw-r--r-- | doc/lightdm-gobject-1-sections.txt | 2 | ||||
-rw-r--r-- | doc/tmpl/greeter.sgml | 2 | ||||
-rw-r--r-- | liblightdm-gobject/greeter.c | 31 | ||||
-rw-r--r-- | liblightdm-gobject/lightdm/greeter.h | 2 | ||||
-rw-r--r-- | liblightdm-qt/QLightDM/greeter.h | 2 | ||||
-rw-r--r-- | liblightdm-qt/greeter.cpp | 4 | ||||
-rw-r--r-- | src/greeter.c | 19 | ||||
-rw-r--r-- | src/shared-data-manager.c | 88 | ||||
-rw-r--r-- | src/shared-data-manager.h | 2 | ||||
-rw-r--r-- | tests/scripts/shared-data-dirs.conf | 3 | ||||
-rw-r--r-- | tests/src/test-gobject-greeter.c | 2 |
12 files changed, 83 insertions, 76 deletions
diff --git a/debian/liblightdm-gobject-1-0.symbols b/debian/liblightdm-gobject-1-0.symbols index 6793787f..f5a789d4 100644 --- a/debian/liblightdm-gobject-1-0.symbols +++ b/debian/liblightdm-gobject-1-0.symbols @@ -17,7 +17,7 @@ liblightdm-gobject-1.so.0 liblightdm-gobject-1-0 #MINVER# lightdm_greeter_cancel_authentication@Base 0.9.2 lightdm_greeter_cancel_autologin@Base 0.9.2 lightdm_greeter_connect_sync@Base 0.9.2 - lightdm_greeter_ensure_shared_data_dir@Base 1.9.7 + lightdm_greeter_ensure_shared_data_dir_sync@Base 1.9.7 lightdm_greeter_get_authentication_user@Base 0.9.2 lightdm_greeter_get_autologin_guest_hint@Base 0.9.2 lightdm_greeter_get_autologin_timeout_hint@Base 0.9.2 diff --git a/doc/lightdm-gobject-1-sections.txt b/doc/lightdm-gobject-1-sections.txt index 6496e9dc..e7c3d004 100644 --- a/doc/lightdm-gobject-1-sections.txt +++ b/doc/lightdm-gobject-1-sections.txt @@ -131,7 +131,7 @@ LightDMMessageType LightDMPromptType lightdm_greeter_new lightdm_greeter_connect_sync -lightdm_greeter_ensure_shared_data_dir +lightdm_greeter_ensure_shared_data_dir_sync lightdm_greeter_get_default_session_hint lightdm_greeter_get_hint lightdm_greeter_get_lock_hint diff --git a/doc/tmpl/greeter.sgml b/doc/tmpl/greeter.sgml index 5dee0813..5ea3e02f 100644 --- a/doc/tmpl/greeter.sgml +++ b/doc/tmpl/greeter.sgml @@ -356,7 +356,7 @@ static void authentication_complete_cb (LightDMGreeter *greeter) @Returns: -<!-- ##### FUNCTION lightdm_greeter_ensure_shared_data_dir ##### --> +<!-- ##### FUNCTION lightdm_greeter_ensure_shared_data_dir_sync ##### --> <para> </para> diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c index 1d52218e..2fedb5c0 100644 --- a/liblightdm-gobject/greeter.c +++ b/liblightdm-gobject/greeter.c @@ -91,7 +91,8 @@ typedef enum SERVER_MESSAGE_CONNECTED = 0, SERVER_MESSAGE_PROMPT_AUTHENTICATION, SERVER_MESSAGE_END_AUTHENTICATION, - SERVER_MESSAGE_SESSION_RESULT + SERVER_MESSAGE_SESSION_RESULT, + SERVER_MESSAGE_SHARED_DIR_RESULT, } ServerMessage; /** @@ -1108,7 +1109,7 @@ lightdm_greeter_start_session_sync (LightDMGreeter *greeter, const gchar *sessio } /** - * lightdm_greeter_ensure_shared_data_dir: + * lightdm_greeter_ensure_shared_data_dir_sync: * @greeter: A #LightDMGreeter * @username: A username * @@ -1122,13 +1123,17 @@ lightdm_greeter_start_session_sync (LightDMGreeter *greeter, const gchar *sessio * LightDM will automatically create these if the user actually logs in, so * greeters only need to call this method if they want to store something in * the directory themselves. + * + * Return value: TRUE if the directory is ready for use. **/ -void -lightdm_greeter_ensure_shared_data_dir (LightDMGreeter *greeter, const gchar *username) +gboolean +lightdm_greeter_ensure_shared_data_dir_sync (LightDMGreeter *greeter, const gchar *username) { LightDMGreeterPrivate *priv; guint8 message[MAX_MESSAGE_LENGTH]; - gsize offset = 0; + guint8 *response; + gsize response_length, offset = 0; + guint32 id, return_code = 1; g_return_if_fail (LIGHTDM_IS_GREETER (greeter)); @@ -1139,6 +1144,22 @@ lightdm_greeter_ensure_shared_data_dir (LightDMGreeter *greeter, const gchar *us write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_ENSURE_SHARED_DIR, string_length (username), &offset); write_string (message, MAX_MESSAGE_LENGTH, username, &offset); write_message (greeter, message, offset); + + response = read_message (greeter, &response_length, TRUE); + if (!response) + return FALSE; + + offset = 0; + id = read_int (response, response_length, &offset); + read_int (response, response_length, &offset); + if (id == SERVER_MESSAGE_SHARED_DIR_RESULT) + return_code = read_int (response, response_length, &offset); + else + g_warning ("Expected SHARED_DIR_RESULT message, got %d", id); + + g_free (response); + + return return_code == 0; } static void diff --git a/liblightdm-gobject/lightdm/greeter.h b/liblightdm-gobject/lightdm/greeter.h index f0b59f83..d5277514 100644 --- a/liblightdm-gobject/lightdm/greeter.h +++ b/liblightdm-gobject/lightdm/greeter.h @@ -121,7 +121,7 @@ void lightdm_greeter_set_language (LightDMGreeter *greeter, const gchar *languag gboolean lightdm_greeter_start_session_sync (LightDMGreeter *greeter, const gchar *session, GError **error); -void lightdm_greeter_ensure_shared_data_dir (LightDMGreeter *greeter, const gchar *username); +gboolean lightdm_greeter_ensure_shared_data_dir_sync (LightDMGreeter *greeter, const gchar *username); G_END_DECLS diff --git a/liblightdm-qt/QLightDM/greeter.h b/liblightdm-qt/QLightDM/greeter.h index b69105ee..775740df 100644 --- a/liblightdm-qt/QLightDM/greeter.h +++ b/liblightdm-qt/QLightDM/greeter.h @@ -80,7 +80,7 @@ public Q_SLOTS: void cancelAuthentication(); void setLanguage (const QString &language); bool startSessionSync(const QString &session=QString()); - void ensureSharedDataDir (const QString &username); + bool ensureSharedDataDirSync(const QString &username); Q_SIGNALS: void showMessage(QString text, QLightDM::Greeter::MessageType type); diff --git a/liblightdm-qt/greeter.cpp b/liblightdm-qt/greeter.cpp index 1e2a84fc..8187ac96 100644 --- a/liblightdm-qt/greeter.cpp +++ b/liblightdm-qt/greeter.cpp @@ -172,10 +172,10 @@ bool Greeter::startSessionSync(const QString &session) return lightdm_greeter_start_session_sync(d->ldmGreeter, session.toLocal8Bit().constData(), NULL); } -void Greeter::ensureSharedDataDir(const QString &username) +bool Greeter::ensureSharedDataDirSync(const QString &username) { Q_D(Greeter); - lightdm_greeter_ensure_shared_data_dir(d->ldmGreeter, username.toLocal8Bit().constData()); + return lightdm_greeter_ensure_shared_data_dir_sync(d->ldmGreeter, username.toLocal8Bit().constData()); } diff --git a/src/greeter.c b/src/greeter.c index 554b90f4..b000ac3e 100644 --- a/src/greeter.c +++ b/src/greeter.c @@ -100,7 +100,8 @@ typedef enum SERVER_MESSAGE_CONNECTED = 0, SERVER_MESSAGE_PROMPT_AUTHENTICATION, SERVER_MESSAGE_END_AUTHENTICATION, - SERVER_MESSAGE_SESSION_RESULT + SERVER_MESSAGE_SESSION_RESULT, + SERVER_MESSAGE_SHARED_DIR_RESULT, } ServerMessage; static gboolean read_cb (GIOChannel *source, GIOCondition condition, gpointer data); @@ -629,6 +630,20 @@ handle_set_language (Greeter *greeter, const gchar *language) user_set_language (user, language); } +static void +handle_ensure_shared_dir (Greeter *greeter, const gchar *username) +{ + gboolean result; + guint8 message[MAX_MESSAGE_LENGTH]; + gsize offset = 0; + + result = shared_data_manager_ensure_user_dir (shared_data_manager_get_instance (), username); + + write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_SHARED_DIR_RESULT, int_length (), &offset); + write_int (message, MAX_MESSAGE_LENGTH, result ? 0 : 1, &offset); + write_message (greeter, message, offset); +} + static guint32 read_int (Greeter *greeter, gsize *offset) { @@ -815,7 +830,7 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) break; case GREETER_MESSAGE_ENSURE_SHARED_DIR: username = read_string (greeter, &offset); - shared_data_manager_ensure_user_dir (shared_data_manager_get_instance (), username); + handle_ensure_shared_dir (greeter, username); g_free (username); break; default: diff --git a/src/shared-data-manager.c b/src/shared-data-manager.c index 9f0e44f9..eb39a3d9 100644 --- a/src/shared-data-manager.c +++ b/src/shared-data-manager.c @@ -62,8 +62,7 @@ delete_unused_user (gpointer key, gpointer value, gpointer user_data) const gchar *user = (const gchar *)key; GError *error = NULL; - /* Listen, the rest of this file is nice async glib code and all, but - for this operation, we just need a fire and forget rm -rf. Since + /* For this operation, we just need a fire and forget rm -rf. Since recursively deleting in GIO is a huge pain in the butt, we'll just drop to shell for this. */ @@ -82,47 +81,31 @@ delete_unused_user (gpointer key, gpointer value, gpointer user_data) g_free (path); } -static void -chown_user_dir_cb (GObject *object, GAsyncResult *res, gpointer user_data) +gboolean +shared_data_manager_ensure_user_dir (SharedDataManager *manager, const gchar *user) { - GFile *file = G_FILE (object); - GFileInfo *info = NULL; - GError *error = NULL; - - if (!g_file_set_attributes_finish (file, res, &info, &error)) - { - gchar *path = g_file_get_path (file); - g_warning ("Could not chown user data directory %s: %s", - path, error->message); - g_free (path); - g_error_free (error); - } - - if (info) - g_object_unref (info); -} + struct passwd *entry = getpwnam (user); + if (!entry) + return FALSE; -static void -make_user_dir_cb (GObject *object, GAsyncResult *res, gpointer user_data) -{ - GFile *file = G_FILE (object); - struct OwnerInfo *owner = (struct OwnerInfo *)user_data; GError *error = NULL; - if (!g_file_make_directory_finish (file, res, &error)) + gchar *path = g_build_filename (USERS_DIR, user, NULL); + GFile *file = g_file_new_for_path (path); + + if (!g_file_make_directory (file, NULL, &error)) { if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS)) { - gchar *path = g_file_get_path (file); g_warning ("Could not create user data directory %s: %s", path, error->message); - g_free (path); g_error_free (error); - g_object_unref (owner->manager); - g_free (owner); - return; + g_object_unref (file); + g_free (path); + return FALSE; } g_error_free (error); + error = NULL; } /* Even if the directory already exists, we want to re-affirm the owners @@ -130,37 +113,26 @@ make_user_dir_cb (GObject *object, GAsyncResult *res, gpointer user_data) runs. */ GFileInfo *info = g_file_info_new (); g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_UID, - owner->uid); + entry->pw_uid); g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_GID, - owner->manager->priv->greeter_gid); + manager->priv->greeter_gid); g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_MODE, 0770); - g_file_set_attributes_async (file, info, G_FILE_QUERY_INFO_NONE, - G_PRIORITY_DEFAULT, NULL, - chown_user_dir_cb, NULL); - - g_object_unref (owner->manager); - g_free (owner); -} - -void -shared_data_manager_ensure_user_dir (SharedDataManager *manager, const gchar *user) -{ - struct passwd *entry = getpwnam (user); - if (!entry) - return; - - struct OwnerInfo *owner = g_malloc (sizeof (struct OwnerInfo)); - owner->manager = g_object_ref (manager); - owner->uid = entry->pw_uid; - - gchar *path = g_build_filename (USERS_DIR, user, NULL); - GFile *file = g_file_new_for_path (path); - g_free (path); - - g_file_make_directory_async (file, G_PRIORITY_DEFAULT, NULL, - make_user_dir_cb, owner); + if (!g_file_set_attributes_from_info (file, info, G_FILE_QUERY_INFO_NONE, + NULL, &error)) + { + g_warning ("Could not chown user data directory %s: %s", + path, error->message); + g_error_free (error); + g_object_unref (info); + g_object_unref (file); + g_free (path); + return FALSE; + } + g_object_unref (info); g_object_unref (file); + g_free (path); + return TRUE; } static void diff --git a/src/shared-data-manager.h b/src/shared-data-manager.h index 737337af..dfaaa562 100644 --- a/src/shared-data-manager.h +++ b/src/shared-data-manager.h @@ -44,7 +44,7 @@ void shared_data_manager_start (SharedDataManager *manager); void shared_data_manager_cleanup (void); -void shared_data_manager_ensure_user_dir (SharedDataManager *manager, const gchar *user); +gboolean shared_data_manager_ensure_user_dir (SharedDataManager *manager, const gchar *user); G_END_DECLS diff --git a/tests/scripts/shared-data-dirs.conf b/tests/scripts/shared-data-dirs.conf index 3432331e..bd58f6f8 100644 --- a/tests/scripts/shared-data-dirs.conf +++ b/tests/scripts/shared-data-dirs.conf @@ -30,7 +30,7 @@ shared-data-dirs=have-password1:1000:100:0770 have-password2:1000:1000:0777 xxx: # Make sure we can create/chown a directory from the greeter #?*GREETER-X-0 ENSURE-SHARED-DATA-DIR USERNAME=have-password2 -#?*WAIT +#?GREETER-X-0 ENSURE-SHARED-DATA-DIR RESULT=TRUE #?*LIST-SHARED-DATA-DIRS #?RUNNER LIST-SHARED-DATA-DIRS DIRS=have-password1:1000:100:0770,have-password2:1001:100:0770,lightdm:100:100:0770 @@ -46,7 +46,6 @@ shared-data-dirs=have-password1:1000:100:0770 have-password2:1000:1000:0777 xxx: #?SESSION-X-0 CONNECT-XSERVER # Make sure we created the directory as we started session -#?*WAIT #?*LIST-SHARED-DATA-DIRS #?RUNNER LIST-SHARED-DATA-DIRS DIRS=have-password1:1000:100:0770,have-password2:1001:100:0770,lightdm:100:100:0770,no-password1:1005:100:0770 diff --git a/tests/src/test-gobject-greeter.c b/tests/src/test-gobject-greeter.c index 17126b16..972f2ba9 100644 --- a/tests/src/test-gobject-greeter.c +++ b/tests/src/test-gobject-greeter.c @@ -204,7 +204,7 @@ request_cb (const gchar *request) status_notify ("%s LOG-USER-LIST-LENGTH N=%d", greeter_id, lightdm_user_list_get_length (lightdm_user_list_get_instance ())); if (strcmp (name, "ENSURE-SHARED-DATA-DIR") == 0) - lightdm_greeter_ensure_shared_data_dir (greeter, g_hash_table_lookup (params, "USERNAME")); + status_notify ("%s ENSURE-SHARED-DATA-DIR RESULT=%s", greeter_id, lightdm_greeter_ensure_shared_data_dir_sync (greeter, g_hash_table_lookup (params, "USERNAME")) ? "TRUE" : "FALSE"); if (strcmp (name, "WATCH-USER") == 0) { |