summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2018-12-03 11:03:54 +0100
committerMilan Crha <mcrha@redhat.com>2018-12-03 11:03:54 +0100
commit50a15363b1aa816619f4d6cca74e653279fa33e9 (patch)
tree262cf13ba0b39f5fdf23316ec38e54c1880fb37f
parent2aad02605913fc6c8e4ba7d0bf58497a57a9044c (diff)
downloadevolution-data-server-50a15363b1aa816619f4d6cca74e653279fa33e9.tar.gz
[Flatpak] Save passwords in libsecret with the same prefix as used by D-Bus services
As the passwords are saved in the host system, the eds-origin key cannot use the same value as the host system, because otherwise the secret-monitor module of evolution-source-registry would delete the password, because the ESource is unknown to it. Similarly the other way around, the inner (in Flatpak) source registry would delete system passwords, because those ESource-s are unknown to it.
-rw-r--r--CMakeLists.txt2
-rw-r--r--config.h.in3
-rw-r--r--src/libedataserver/e-secret-store.c8
-rw-r--r--src/modules/secret-monitor/module-secret-monitor.c10
4 files changed, 20 insertions, 3 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6e38fde6e..cd1161158 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -177,6 +177,8 @@ if(NOT ("${DBUS_SERVICES_PREFIX}" STREQUAL ""))
set(CALENDAR_DBUS_SERVICE_NAME "${DBUS_SERVICES_PREFIX}.${CALENDAR_DBUS_SERVICE_NAME}")
set(SOURCES_DBUS_SERVICE_NAME "${DBUS_SERVICES_PREFIX}.${SOURCES_DBUS_SERVICE_NAME}")
set(USER_PROMPTER_DBUS_SERVICE_NAME "${DBUS_SERVICES_PREFIX}.${USER_PROMPTER_DBUS_SERVICE_NAME}")
+else(NOT ("${DBUS_SERVICES_PREFIX}" STREQUAL ""))
+ unset(DBUS_SERVICES_PREFIX)
endif(NOT ("${DBUS_SERVICES_PREFIX}" STREQUAL ""))
# ******************************
diff --git a/config.h.in b/config.h.in
index fe3b5cb5c..4f5d97e1c 100644
--- a/config.h.in
+++ b/config.h.in
@@ -18,6 +18,9 @@
/* Package name for gettext */
#define GETTEXT_PACKAGE "@GETTEXT_PACKAGE@"
+/* Defined to prefix used by the D-Bus services (usually when run in Flatpak) */
+#cmakedefine DBUS_SERVICES_PREFIX "@DBUS_SERVICES_PREFIX@"
+
/* D-Bus service name for the address book factory */
#define ADDRESS_BOOK_DBUS_SERVICE_NAME "@ADDRESS_BOOK_DBUS_SERVICE_NAME@"
diff --git a/src/libedataserver/e-secret-store.c b/src/libedataserver/e-secret-store.c
index 96c8dbf24..e15148227 100644
--- a/src/libedataserver/e-secret-store.c
+++ b/src/libedataserver/e-secret-store.c
@@ -254,6 +254,12 @@ e_win32_secret_delete_secret_sync (const gchar *uid,
#define KEYRING_ITEM_ATTRIBUTE_UID "e-source-uid"
#define KEYRING_ITEM_ATTRIBUTE_ORIGIN "eds-origin"
+#ifdef DBUS_SERVICES_PREFIX
+#define ORIGIN_KEY DBUS_SERVICES_PREFIX "." PACKAGE
+#else
+#define ORIGIN_KEY PACKAGE
+#endif
+
static SecretSchema password_schema = {
"org.gnome.Evolution.Data.Source",
SECRET_SCHEMA_DONT_MATCH_NAME,
@@ -316,7 +322,7 @@ e_secret_store_store_sync (const gchar *uid,
collection, label, secret,
cancellable, error,
KEYRING_ITEM_ATTRIBUTE_UID, uid,
- KEYRING_ITEM_ATTRIBUTE_ORIGIN, PACKAGE,
+ KEYRING_ITEM_ATTRIBUTE_ORIGIN, ORIGIN_KEY,
NULL);
#endif
diff --git a/src/modules/secret-monitor/module-secret-monitor.c b/src/modules/secret-monitor/module-secret-monitor.c
index 7987962ab..287a6290a 100644
--- a/src/modules/secret-monitor/module-secret-monitor.c
+++ b/src/modules/secret-monitor/module-secret-monitor.c
@@ -57,6 +57,12 @@ struct _ESecretMonitorClass {
#define KEYRING_ITEM_ATTRIBUTE_ORIGIN "eds-origin"
#define KEYRING_ITEM_DISPLAY_FORMAT "Evolution Data Source '%s'"
+#ifdef DBUS_SERVICES_PREFIX
+#define ORIGIN_KEY DBUS_SERVICES_PREFIX "." PACKAGE
+#else
+#define ORIGIN_KEY PACKAGE
+#endif
+
static SecretSchema password_schema = {
"org.gnome.Evolution.Data.Source",
SECRET_SCHEMA_DONT_MATCH_NAME,
@@ -104,7 +110,7 @@ secret_monitor_scan_secrets_thread (gpointer user_data)
server = E_SOURCE_REGISTRY_SERVER (user_data);
attributes = g_hash_table_new (g_str_hash, g_str_equal);
- g_hash_table_insert (attributes, (gpointer) KEYRING_ITEM_ATTRIBUTE_ORIGIN, (gpointer) PACKAGE);
+ g_hash_table_insert (attributes, (gpointer) KEYRING_ITEM_ATTRIBUTE_ORIGIN, (gpointer) ORIGIN_KEY);
/* List all items under our custom SecretSchema. */
list = secret_service_search_sync (
@@ -187,7 +193,7 @@ secret_monitor_scan_secrets_timeout_cb (gpointer user_data)
extension = E_SECRET_MONITOR (user_data);
server = secret_monitor_get_server (extension);
- g_debug ("Scanning and pruning saved passwords");
+ e_source_registry_debug_print ("Scanning and pruning saved passwords\n");
/* Do the real work in a thread, so we can use synchronous
* libsecret calls and keep the logic flow easy to follow. */