]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Add liblightdm function to ensure a shared data directory
authorMichael Terry <michael.terry@canonical.com>
Tue, 18 Feb 2014 21:00:57 +0000 (16:00 -0500)
committerMichael Terry <michael.terry@canonical.com>
Tue, 18 Feb 2014 21:00:57 +0000 (16:00 -0500)
12 files changed:
debian/changelog
debian/liblightdm-gobject-1-0.symbols
doc/lightdm-gobject-1-sections.txt
doc/tmpl/greeter.sgml
liblightdm-gobject/greeter.c
liblightdm-gobject/lightdm/greeter.h
liblightdm-qt/QLightDM/greeter.h
liblightdm-qt/greeter.cpp
src/greeter.c
src/shared-data-manager.c
tests/scripts/shared-data-dirs.conf
tests/src/test-gobject-greeter.c

index acb553b13c5d26a3eaca2c43ea4dce02358b63b1..433c9fe043aec2478378bf1c2318ae7f7a7e021f 100644 (file)
@@ -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 ]
index 680d14a071e1349e6a025341430c9ee3477193d3..6793787f8b3546c01a288acbf39b75a5bd3369ad 100644 (file)
@@ -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
index 89875f49fcbf029df8f5d0613c1526724db58c14..6496e9dcfa4f0933137e540e27a70a0c95e88f22 100644 (file)
@@ -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
index c537d21f0d71860bb5a5f96be0e1ad2d830dbcdf..5dee0813b6cbbd2cc59b12da212557e821975e6a 100644 (file)
@@ -356,3 +356,12 @@ static void authentication_complete_cb (LightDMGreeter *greeter)
 @Returns: 
 
 
+<!-- ##### FUNCTION lightdm_greeter_ensure_shared_data_dir ##### -->
+<para>
+
+</para>
+
+@greeter:
+@username:
+
+
index 9387118ca1c9889aa9d2a716a0a313112908f8a9..1d52218e44954b276584e6b65a7270d0d34ee746 100644 (file)
@@ -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)
 {
index 7d8988f24b447494acd73c66ac6aa1b050f9278f..f0b59f8394d47d702dd21eadcfa83ad798cfc125 100644 (file)
@@ -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_ */
index 787485f49776e10fa636005d6af5ec9b6ac88f4f..b69105ee6b423ddf6764b09f75fa9754fcbcd325 100644 (file)
@@ -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);
index 875cac06c738cfa02c34622b0e4442d5e364ebe0..1e2a84fc6deab4af58a434e62a8da2e5f87e1518 100644 (file)
@@ -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
 {
index 4ed18c2fe17f71b7fbf87c4800c3487ce8007d26..554b90f481d2c594aeec70fd623a10b9736d2e58 100644 (file)
@@ -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;
index d4b4c1886ce18f3b6ee437dedc2b87a2ed0db36b..9f0e44f9e412954b8482e1b6c34f68be23c7a917 100644 (file)
@@ -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
index e92d1ac15a9ffe33b6e818b63ae9074606c379d0..3432331e13086f75ff89f0a4fad1b14a1eccbfd4 100644 (file)
@@ -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
index afb14cc6995a4bba1b4b17b778b499373beb24d6..17126b163612fefdd276ebd91c0e919181accbdd 100644 (file)
@@ -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;