summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Terry <michael.terry@canonical.com>2014-02-18 16:00:57 -0500
committerMichael Terry <michael.terry@canonical.com>2014-02-18 16:00:57 -0500
commit6b90c538990ac8d8d0d3634dba9c58874f2f3491 (patch)
tree3d209e5a5be68690fc57148d973419aebc6fabdf
parent02c262c40c904a57e2981e90543321dba7094c3c (diff)
downloadlightdm-git-6b90c538990ac8d8d0d3634dba9c58874f2f3491.tar.gz
Add liblightdm function to ensure a shared data directory
-rw-r--r--debian/changelog7
-rw-r--r--debian/liblightdm-gobject-1-0.symbols1
-rw-r--r--doc/lightdm-gobject-1-sections.txt1
-rw-r--r--doc/tmpl/greeter.sgml9
-rw-r--r--liblightdm-gobject/greeter.c37
-rw-r--r--liblightdm-gobject/lightdm/greeter.h2
-rw-r--r--liblightdm-qt/QLightDM/greeter.h1
-rw-r--r--liblightdm-qt/greeter.cpp6
-rw-r--r--src/greeter.c9
-rw-r--r--src/shared-data-manager.c2
-rw-r--r--tests/scripts/shared-data-dirs.conf10
-rw-r--r--tests/src/test-gobject-greeter.c3
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;