[gnome-settings-daemon/rhel/account-and-subman-plugins: 3/14] account: display nag screen periodically




commit 5b0899fbeeef963f8aae694b7883c27a55426577
Author: Ray Strode <rstrode redhat com>
Date:   Mon Nov 6 16:39:55 2017 -0500

    account: display nag screen periodically
    
    This is configurable via a gsettings key.

 data/meson.build                                   |  1 +
 ....settings-daemon.plugins.account.gschema.xml.in |  9 ++++
 plugins/account/gsd-account-manager.c              | 55 ++++++++++++++++++++++
 3 files changed, 65 insertions(+)
---
diff --git a/data/meson.build b/data/meson.build
index e93ba641..5a2cd5a7 100644
--- a/data/meson.build
+++ b/data/meson.build
@@ -4,6 +4,7 @@ schemas = [
   'org.gnome.settings-daemon.peripherals.gschema.xml',
   'org.gnome.settings-daemon.peripherals.wacom.gschema.xml',
   'org.gnome.settings-daemon.plugins.gschema.xml',
+  'org.gnome.settings-daemon.plugins.account.gschema.xml',
   'org.gnome.settings-daemon.plugins.color.gschema.xml',
   'org.gnome.settings-daemon.plugins.housekeeping.gschema.xml',
   'org.gnome.settings-daemon.plugins.media-keys.gschema.xml',
diff --git a/data/org.gnome.settings-daemon.plugins.account.gschema.xml.in 
b/data/org.gnome.settings-daemon.plugins.account.gschema.xml.in
new file mode 100644
index 00000000..f3d59e81
--- /dev/null
+++ b/data/org.gnome.settings-daemon.plugins.account.gschema.xml.in
@@ -0,0 +1,9 @@
+<schemalist>
+  <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.settings-daemon.plugins.account" 
path="/org/gnome/settings-daemon/plugins/account/">
+    <key name="notify-period" type="i">
+      <default>1440</default>
+      <summary>Time before repeated warning about account password expiration</summary>
+      <description>If a user's account is expiring, a notification will get displayed periodically after the 
specified number of minutes</description>
+    </key>
+  </schema>
+</schemalist>
diff --git a/plugins/account/gsd-account-manager.c b/plugins/account/gsd-account-manager.c
index cb37f466..ff054edd 100644
--- a/plugins/account/gsd-account-manager.c
+++ b/plugins/account/gsd-account-manager.c
@@ -47,6 +47,8 @@
 
 struct GsdAccountManagerPrivate
 {
+        GSettings            *settings;
+
         GsdAccounts          *accounts_proxy;
         GsdAccountsUser      *accounts_user_proxy;
         GCancellable         *cancellable;
@@ -61,11 +63,16 @@ struct GsdAccountManagerPrivate
         gint64                days_after_expiration_until_lock;
 
         NotifyNotification   *notification;
+
+        gint64                last_notify_time;
+        int                   notify_period;
+        guint                 notify_period_timeout_id;
 };
 
 static void     gsd_account_manager_class_init  (GsdAccountManagerClass *klass);
 static void     gsd_account_manager_init        (GsdAccountManager      *account_manager);
 static void     gsd_account_manager_finalize    (GObject                *object);
+static void     fetch_password_expiration_policy (GsdAccountManager *manager);
 
 G_DEFINE_TYPE (GsdAccountManager, gsd_account_manager, G_TYPE_OBJECT)
 
@@ -113,6 +120,8 @@ show_notification (GsdAccountManager *manager,
                           manager);
 
         notify_notification_show (manager->priv->notification, NULL);
+
+        manager->priv->last_notify_time = g_get_monotonic_time ();
 }
 
 static void
@@ -208,6 +217,33 @@ set_policy_number (gint64 *destination,
         return TRUE;
 }
 
+static gboolean
+on_notify_period_elapsed (GsdAccountManager *manager)
+{
+        manager->priv->notify_period_timeout_id = 0;
+        fetch_password_expiration_policy (manager);
+        return G_SOURCE_REMOVE;
+}
+
+static void
+queue_periodic_timeout (GsdAccountManager *manager)
+{
+        if (manager->priv->notify_period_timeout_id != 0) {
+                g_source_remove (manager->priv->notify_period_timeout_id);
+                manager->priv->notify_period_timeout_id = 0;
+        }
+
+        if (manager->priv->notify_period > 0) {
+                gint64 already_elapsed_time;
+
+                already_elapsed_time = MAX (0, (g_get_monotonic_time () - manager->priv->last_notify_time) / 
G_USEC_PER_SEC);
+
+                manager->priv->notify_period_timeout_id = g_timeout_add_seconds (MAX (0, 
manager->priv->notify_period * 60 - already_elapsed_time),
+                                                                                 (GSourceFunc) 
on_notify_period_elapsed,
+                                                                                 manager);
+        }
+}
+
 static void
 on_got_password_expiration_policy (GsdAccountsUser *accounts_user_proxy,
                                    GAsyncResult    *res,
@@ -247,6 +283,7 @@ on_got_password_expiration_policy (GsdAccountsUser *accounts_user_proxy,
         set_policy_number (&manager->priv->days_after_expiration_until_lock, 
days_after_expiration_until_lock);
 
         update_password_notification (manager);
+        queue_periodic_timeout (manager);
 out:
         gnome_settings_profile_end (NULL);
 }
@@ -373,6 +410,14 @@ on_got_accounts_proxy (GObject      *source_object,
         gnome_settings_profile_end (NULL);
 }
 
+static void
+on_notify_period_changed (GsdAccountManager *manager)
+{
+        manager->priv->notify_period = g_settings_get_int (manager->priv->settings, "notify-period");
+
+        queue_periodic_timeout (manager);
+}
+
 gboolean
 gsd_account_manager_start (GsdAccountManager  *manager,
                            GError            **error)
@@ -381,6 +426,15 @@ gsd_account_manager_start (GsdAccountManager  *manager,
 
         gnome_settings_profile_start (NULL);
         manager->priv->cancellable = g_cancellable_new ();
+        manager->priv->settings = g_settings_new ("org.gnome.settings-daemon.plugins.account");
+
+        manager->priv->notify_period = g_settings_get_int (manager->priv->settings, "notify-period");
+        g_signal_connect_object (G_OBJECT (manager->priv->settings),
+                          "changed::notify-period",
+                          G_CALLBACK (on_notify_period_changed),
+                          manager,
+                          G_CONNECT_SWAPPED);
+
         gsd_accounts_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
                                         G_DBUS_PROXY_FLAGS_NONE,
                                         "org.freedesktop.Accounts",
@@ -404,6 +458,7 @@ gsd_account_manager_stop (GsdAccountManager *manager)
                 g_clear_object (&manager->priv->cancellable);
         }
 
+        g_clear_object (&manager->priv->settings);
         g_clear_object (&manager->priv->accounts_proxy);
         g_clear_object (&manager->priv->accounts_user_proxy);
         g_clear_object (&manager->priv->notification);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]