diff options
author | Michael Terry <michael.terry@canonical.com> | 2014-02-18 16:00:57 -0500 |
---|---|---|
committer | Michael Terry <michael.terry@canonical.com> | 2014-02-18 16:00:57 -0500 |
commit | 6b90c538990ac8d8d0d3634dba9c58874f2f3491 (patch) | |
tree | 3d209e5a5be68690fc57148d973419aebc6fabdf | |
parent | 02c262c40c904a57e2981e90543321dba7094c3c (diff) | |
download | lightdm-git-6b90c538990ac8d8d0d3634dba9c58874f2f3491.tar.gz |
Add liblightdm function to ensure a shared data directory
-rw-r--r-- | debian/changelog | 7 | ||||
-rw-r--r-- | debian/liblightdm-gobject-1-0.symbols | 1 | ||||
-rw-r--r-- | doc/lightdm-gobject-1-sections.txt | 1 | ||||
-rw-r--r-- | doc/tmpl/greeter.sgml | 9 | ||||
-rw-r--r-- | liblightdm-gobject/greeter.c | 37 | ||||
-rw-r--r-- | liblightdm-gobject/lightdm/greeter.h | 2 | ||||
-rw-r--r-- | liblightdm-qt/QLightDM/greeter.h | 1 | ||||
-rw-r--r-- | liblightdm-qt/greeter.cpp | 6 | ||||
-rw-r--r-- | src/greeter.c | 9 | ||||
-rw-r--r-- | src/shared-data-manager.c | 2 | ||||
-rw-r--r-- | tests/scripts/shared-data-dirs.conf | 10 | ||||
-rw-r--r-- | tests/src/test-gobject-greeter.c | 3 |
12 files changed, 83 insertions, 5 deletions
diff --git a/debian/changelog b/debian/changelog index acb553b1..433c9fe0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +lightdm (1.9.7-0ubuntu1) UNRELEASED; urgency=medium + + * Add support for shared data directories that both the greeter and + user sessions can write to. + + -- Michael Terry <mterry@ubuntu.com> Tue, 18 Feb 2014 15:40:46 -0500 + lightdm (1.9.6-0ubuntu3) trusty; urgency=medium [ Gunnar Hjalmarsson ] diff --git a/debian/liblightdm-gobject-1-0.symbols b/debian/liblightdm-gobject-1-0.symbols index 680d14a0..6793787f 100644 --- a/debian/liblightdm-gobject-1-0.symbols +++ b/debian/liblightdm-gobject-1-0.symbols @@ -17,6 +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_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 89875f49..6496e9dc 100644 --- a/doc/lightdm-gobject-1-sections.txt +++ b/doc/lightdm-gobject-1-sections.txt @@ -131,6 +131,7 @@ LightDMMessageType LightDMPromptType lightdm_greeter_new lightdm_greeter_connect_sync +lightdm_greeter_ensure_shared_data_dir 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 c537d21f..5dee0813 100644 --- a/doc/tmpl/greeter.sgml +++ b/doc/tmpl/greeter.sgml @@ -356,3 +356,12 @@ static void authentication_complete_cb (LightDMGreeter *greeter) @Returns: +<!-- ##### FUNCTION lightdm_greeter_ensure_shared_data_dir ##### --> +<para> + +</para> + +@greeter: +@username: + + diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c index 9387118c..1d52218e 100644 --- a/liblightdm-gobject/greeter.c +++ b/liblightdm-gobject/greeter.c @@ -81,7 +81,8 @@ typedef enum GREETER_MESSAGE_START_SESSION, GREETER_MESSAGE_CANCEL_AUTHENTICATION, GREETER_MESSAGE_SET_LANGUAGE, - GREETER_MESSAGE_AUTHENTICATE_REMOTE + GREETER_MESSAGE_AUTHENTICATE_REMOTE, + GREETER_MESSAGE_ENSURE_SHARED_DIR, } GreeterMessage; /* Messages from the server to the greeter */ @@ -1106,6 +1107,40 @@ lightdm_greeter_start_session_sync (LightDMGreeter *greeter, const gchar *sessio return return_code == 0; } +/** + * lightdm_greeter_ensure_shared_data_dir: + * @greeter: A #LightDMGreeter + * @username: A username + * + * Ensure that a shared data dir for the given user is available. This will + * be created at /var/lib/lightdm-data/@username. Both the greeter user and + * @username will have write access to that folder. The intention is that + * larger pieces of shared data would be stored there (files that the greeter + * creates but wants to give to a user -- like camera photos -- or files that + * the user creates but wants the greeter to see -- like contact avatars). + * + * 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. + **/ +void +lightdm_greeter_ensure_shared_data_dir (LightDMGreeter *greeter, const gchar *username) +{ + LightDMGreeterPrivate *priv; + guint8 message[MAX_MESSAGE_LENGTH]; + gsize offset = 0; + + g_return_if_fail (LIGHTDM_IS_GREETER (greeter)); + + priv = GET_PRIVATE (greeter); + + g_return_if_fail (priv->connected); + + 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); +} + static void lightdm_greeter_init (LightDMGreeter *greeter) { diff --git a/liblightdm-gobject/lightdm/greeter.h b/liblightdm-gobject/lightdm/greeter.h index 7d8988f2..f0b59f83 100644 --- a/liblightdm-gobject/lightdm/greeter.h +++ b/liblightdm-gobject/lightdm/greeter.h @@ -121,6 +121,8 @@ 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); + G_END_DECLS #endif /* LIGHTDM_GREETER_H_ */ diff --git a/liblightdm-qt/QLightDM/greeter.h b/liblightdm-qt/QLightDM/greeter.h index 787485f4..b69105ee 100644 --- a/liblightdm-qt/QLightDM/greeter.h +++ b/liblightdm-qt/QLightDM/greeter.h @@ -80,6 +80,7 @@ public Q_SLOTS: void cancelAuthentication(); void setLanguage (const QString &language); bool startSessionSync(const QString &session=QString()); + void ensureSharedDataDir (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 875cac06..1e2a84fc 100644 --- a/liblightdm-qt/greeter.cpp +++ b/liblightdm-qt/greeter.cpp @@ -172,6 +172,12 @@ bool Greeter::startSessionSync(const QString &session) return lightdm_greeter_start_session_sync(d->ldmGreeter, session.toLocal8Bit().constData(), NULL); } +void Greeter::ensureSharedDataDir(const QString &username) +{ + Q_D(Greeter); + lightdm_greeter_ensure_shared_data_dir(d->ldmGreeter, username.toLocal8Bit().constData()); +} + QString Greeter::getHint(const QString &name) const { diff --git a/src/greeter.c b/src/greeter.c index 4ed18c2f..554b90f4 100644 --- a/src/greeter.c +++ b/src/greeter.c @@ -19,6 +19,7 @@ #include "greeter.h" #include "configuration.h" +#include "shared-data-manager.h" enum { PROP_0, @@ -89,7 +90,8 @@ typedef enum GREETER_MESSAGE_START_SESSION, GREETER_MESSAGE_CANCEL_AUTHENTICATION, GREETER_MESSAGE_SET_LANGUAGE, - GREETER_MESSAGE_AUTHENTICATE_REMOTE + GREETER_MESSAGE_AUTHENTICATE_REMOTE, + GREETER_MESSAGE_ENSURE_SHARED_DIR, } GreeterMessage; /* Messages from the server to the greeter */ @@ -811,6 +813,11 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) handle_set_language (greeter, language); g_free (language); break; + case GREETER_MESSAGE_ENSURE_SHARED_DIR: + username = read_string (greeter, &offset); + shared_data_manager_ensure_user_dir (shared_data_manager_get_instance (), username); + g_free (username); + break; default: l_warning (greeter, "Unknown message from greeter: %d", id); break; diff --git a/src/shared-data-manager.c b/src/shared-data-manager.c index d4b4c188..9f0e44f9 100644 --- a/src/shared-data-manager.c +++ b/src/shared-data-manager.c @@ -250,7 +250,7 @@ static void user_removed_cb (CommonUserList *list, CommonUser *user, SharedDataManager *manager) { - delete_unused_user (common_user_get_name (user), NULL, manager); + delete_unused_user ((gpointer)common_user_get_name (user), NULL, manager); } void diff --git a/tests/scripts/shared-data-dirs.conf b/tests/scripts/shared-data-dirs.conf index e92d1ac1..3432331e 100644 --- a/tests/scripts/shared-data-dirs.conf +++ b/tests/scripts/shared-data-dirs.conf @@ -28,6 +28,12 @@ shared-data-dirs=have-password1:1000:100:0770 have-password2:1000:1000:0777 xxx: #?GREETER-X-0 CONNECT-TO-DAEMON #?GREETER-X-0 CONNECTED-TO-DAEMON +# Make sure we can create/chown a directory from the greeter +#?*GREETER-X-0 ENSURE-SHARED-DATA-DIR USERNAME=have-password2 +#?*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 + # Log into account without a password #?*GREETER-X-0 AUTHENTICATE USERNAME=no-password1 #?GREETER-X-0 AUTHENTICATION-COMPLETE USERNAME=no-password1 AUTHENTICATED=TRUE @@ -42,14 +48,14 @@ shared-data-dirs=have-password1:1000:100:0770 have-password2:1000:1000:0777 xxx: # 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:1000:1000:0777,lightdm:100:100:0770,no-password1:1005:100:0770 +#?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 # Delete one user #?*DELETE-USER USERNAME=have-password1 #?RUNNER DELETE-USER USERNAME=have-password1 #?*WAIT #?*LIST-SHARED-DATA-DIRS -#?RUNNER LIST-SHARED-DATA-DIRS DIRS=have-password2:1000:1000:0777,lightdm:100:100:0770,no-password1:1005:100:0770 +#?RUNNER LIST-SHARED-DATA-DIRS DIRS=have-password2:1001:100:0770,lightdm:100:100:0770,no-password1:1005:100:0770 # Cleanup #?*STOP-DAEMON diff --git a/tests/src/test-gobject-greeter.c b/tests/src/test-gobject-greeter.c index afb14cc6..17126b16 100644 --- a/tests/src/test-gobject-greeter.c +++ b/tests/src/test-gobject-greeter.c @@ -203,6 +203,9 @@ request_cb (const gchar *request) if (strcmp (name, "LOG-USER-LIST-LENGTH") == 0) 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")); + if (strcmp (name, "WATCH-USER") == 0) { LightDMUser *user; |