summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <halfline@gmail.com>2023-03-01 23:18:49 +0000
committerRay Strode <halfline@gmail.com>2023-03-01 23:18:49 +0000
commitc34e7f9ee409ee4cdb86c7214e9d48ae0e96b9a1 (patch)
treed576ffb98e29d2226d5905d3d7242b6cd81050b7
parent4757a75922196981bb699192685e99073c25c4eb (diff)
parent3590d8cb14cd1d34d73878948055de59a8c371b1 (diff)
downloadgnome-online-accounts-c34e7f9ee409ee4cdb86c7214e9d48ae0e96b9a1.tar.gz
Merge branch 'wip/rishi/kcm-notification' into 'master'
kerberos-identity-manager: Use notifications for KCM credential caches See merge request GNOME/gnome-online-accounts!61
-rw-r--r--src/goaidentity/goakerberosidentitymanager.c88
1 files changed, 57 insertions, 31 deletions
diff --git a/src/goaidentity/goakerberosidentitymanager.c b/src/goaidentity/goakerberosidentitymanager.c
index e6bcd29..3e48441 100644
--- a/src/goaidentity/goakerberosidentitymanager.c
+++ b/src/goaidentity/goakerberosidentitymanager.c
@@ -1,6 +1,6 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
- * Copyright © 2012 – 2017 Red Hat, Inc.
+ * Copyright © 2012 – 2023 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -875,7 +875,8 @@ get_new_credentials_cache (GoaKerberosIdentityManager *self,
|| g_strcmp0 (self->credentials_cache_type, "KCM") == 0
|| g_strcmp0 (self->credentials_cache_type, "KEYRING") == 0)
{
- g_debug ("GoaKerberosIdentityManager: credential cache type %s supports cache collections", self->credentials_cache_type);
+ g_debug ("GoaKerberosIdentityManager: credential cache type %s supports cache collections",
+ self->credentials_cache_type);
supports_multiple_identities = TRUE;
}
else
@@ -1378,7 +1379,6 @@ monitor_credentials_cache (GoaKerberosIdentityManager *self,
GFileMonitor *monitor = NULL;
krb5_error_code error_code;
GError *monitoring_error = NULL;
- gboolean can_monitor = TRUE;
error_code = krb5_cc_default (self->kerberos_context, &default_cache);
@@ -1399,13 +1399,6 @@ monitor_credentials_cache (GoaKerberosIdentityManager *self,
cache_type = krb5_cc_get_type (self->kerberos_context, default_cache);
g_assert (cache_type != NULL);
- if (strcmp (cache_type, "FILE") != 0 && strcmp (cache_type, "DIR") != 0)
- {
- g_warning ("GoaKerberosIdentityManager: Using polling for change notification for credential cache type '%s'",
- cache_type);
- can_monitor = FALSE;
- }
-
g_free (self->credentials_cache_type);
self->credentials_cache_type = g_strdup (cache_type);
@@ -1427,38 +1420,71 @@ monitor_credentials_cache (GoaKerberosIdentityManager *self,
if (cache_path[0] == ':')
cache_path++;
- if (can_monitor)
+ if (strcmp (cache_type, "FILE") == 0)
+ {
+ GFile *file;
+
+ file = g_file_new_for_path (cache_path);
+
+ monitoring_error = NULL;
+ monitor = g_file_monitor_file (file, G_FILE_MONITOR_NONE, NULL, &monitoring_error);
+
+ g_object_unref (file);
+ }
+ else if (strcmp (cache_type, "DIR") == 0)
{
+ GFile *directory;
GFile *file;
file = g_file_new_for_path (cache_path);
+ directory = g_file_get_parent (file);
monitoring_error = NULL;
- if (strcmp (cache_type, "FILE") == 0)
+ monitor = g_file_monitor_directory (directory, G_FILE_MONITOR_NONE, NULL, &monitoring_error);
+
+ g_object_unref (directory);
+ g_object_unref (file);
+ }
+ else if (strcmp (cache_type, "KCM") == 0)
+ {
+ GError *create_error = NULL;
+ GFile *directory = NULL;
+ GFile *file = NULL;
+ GFileOutputStream *stream = NULL;
+ const gchar *runtime_dir;
+
+ runtime_dir = g_get_user_runtime_dir ();
+ directory = g_file_new_for_path (runtime_dir);
+ file = g_file_get_child (directory, ".kcm-notifications");
+
+ monitoring_error = NULL;
+
+ stream = g_file_create (file, G_FILE_CREATE_NONE, NULL, &create_error);
+ if (create_error != NULL)
{
- monitor = g_file_monitor_file (file,
- G_FILE_MONITOR_NONE,
- NULL,
- &monitoring_error);
+ if (g_error_matches (create_error, G_IO_ERROR, G_IO_ERROR_EXISTS))
+ g_error_free (create_error);
+ else
+ g_propagate_error (&monitoring_error, create_error);
}
- else if (strcmp (cache_type, "DIR") == 0)
- {
- GFile *directory;
- directory = g_file_get_parent (file);
- monitor = g_file_monitor_directory (directory,
- G_FILE_MONITOR_NONE,
- NULL,
- &monitoring_error);
- g_object_unref (directory);
+ if (monitoring_error == NULL)
+ monitor = g_file_monitor_file (file, G_FILE_MONITOR_NONE, NULL, &monitoring_error);
- }
+ g_clear_object (&stream);
+ g_object_unref (directory);
g_object_unref (file);
}
if (monitor == NULL)
{
- if (monitoring_error != NULL)
+ if (monitoring_error == NULL)
+ {
+ g_warning ("GoaKerberosIdentityManager: Using polling for change notification for credential "
+ "cache type '%s'",
+ cache_type);
+ }
+ else
{
g_warning ("GoaKerberosIdentityManager: Could not monitor credentials for %s (type %s), reverting to "
"polling: %s",
@@ -1467,7 +1493,10 @@ monitor_credentials_cache (GoaKerberosIdentityManager *self,
monitoring_error != NULL? monitoring_error->message : "");
g_clear_error (&monitoring_error);
}
- can_monitor = FALSE;
+
+ self->polling_timeout_id = g_timeout_add_seconds (FALLBACK_POLLING_INTERVAL,
+ (GSourceFunc) on_polling_timeout,
+ self);
}
else
{
@@ -1475,9 +1504,6 @@ monitor_credentials_cache (GoaKerberosIdentityManager *self,
self->credentials_cache_monitor = monitor;
}
- if (!can_monitor)
- self->polling_timeout_id = g_timeout_add_seconds (FALLBACK_POLLING_INTERVAL, (GSourceFunc) on_polling_timeout, self);
-
krb5_cc_close (self->kerberos_context, default_cache);
return TRUE;