krb5-auth-dialog r126 - in trunk: . src
- From: guidog svn gnome org
- To: svn-commits-list gnome org
- Subject: krb5-auth-dialog r126 - in trunk: . src
- Date: Sat, 28 Feb 2009 13:42:48 +0000 (UTC)
Author: guidog
Date: Sat Feb 28 13:42:48 2009
New Revision: 126
URL: http://svn.gnome.org/viewvc/krb5-auth-dialog?rev=126&view=rev
Log:
Turn Krb5AuthAppliet into a GObject
called ka_applet.
Removed:
trunk/src/krb5-auth-notify.c
trunk/src/krb5-auth-notify.h
Modified:
trunk/ChangeLog
trunk/src/Makefile.am
trunk/src/krb5-auth-applet.c
trunk/src/krb5-auth-applet.h
trunk/src/krb5-auth-dbus.c
trunk/src/krb5-auth-dialog.c
trunk/src/krb5-auth-dialog.h
trunk/src/krb5-auth-gconf.c
trunk/src/krb5-auth-gconf.h
Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am (original)
+++ trunk/src/Makefile.am Sat Feb 28 13:42:48 2009
@@ -24,8 +24,6 @@
krb5-auth-applet.h \
krb5-auth-gconf.c \
krb5-auth-gconf.h \
- krb5-auth-notify.c \
- krb5-auth-notify.h \
krb5-auth-dbus.c \
krb5-auth-dbus.h \
dummy-strings.c
Modified: trunk/src/krb5-auth-applet.c
==============================================================================
--- trunk/src/krb5-auth-applet.c (original)
+++ trunk/src/krb5-auth-applet.c Sat Feb 28 13:42:48 2009
@@ -1,6 +1,6 @@
/* Krb5 Auth Applet -- Acquire and release kerberos tickets
*
- * (C) 2008 Guido Guenther <agx sigxcpu org>
+ * (C) 2008,2009 Guido Guenther <agx sigxcpu org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -24,7 +24,9 @@
#include "krb5-auth-applet.h"
#include "krb5-auth-dialog.h"
-#include "krb5-auth-notify.h"
+#ifdef HAVE_LIBNOTIFY
+#include <libnotify/notify.h>
+#endif
#define NOTIFY_SECONDS 300
@@ -34,10 +36,222 @@
val_icon,
};
+enum
+{
+ KA_PROP_0 = 0,
+ KA_PROP_PRINCIPAL,
+ KA_PROP_PK_USERID,
+ KA_PROP_TRAYICON,
+ KA_PROP_PW_PROMPT_MINS,
+};
+
+struct _KaApplet {
+ GObject parent;
+
+ KaAppletPrivate *priv;
+};
+
+struct _KaAppletClass {
+ GObjectClass parent;
+};
+
+G_DEFINE_TYPE(KaApplet, ka_applet, G_TYPE_OBJECT);
+
+struct _KaAppletPrivate
+{
+ GtkStatusIcon* tray_icon; /* the tray icon */
+ GtkWidget* context_menu; /* the tray icon's context menu */
+ const char* icons[3]; /* for invalid, expiring and valid tickts */
+ gboolean show_trayicon; /* show the trayicon */
+
+ /* The password dialog */
+ GtkWidget* pw_dialog; /* the password dialog itself */
+ GladeXML* pw_xml; /* the dialog's glade xml */
+ GtkWidget* pw_label; /* the wrong password/timeout label */
+ int pw_prompt_secs; /* when to start prompting for a password */
+ gboolean pw_dialog_persist; /* don't hide the dialog when creds are still valid */
+
+#ifdef HAVE_LIBNOTIFY
+ NotifyNotification* notification;/* notification messages */
+#endif /* HAVE_LIBNOTIFY */
+ char* principal; /* the principal to request */
+ gboolean renewable; /* credentials renewable? */
+ char* pk_userid; /* "userid" for pkint */
+};
+
+static void
+ka_applet_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ KaApplet* self = KA_APPLET (object);
+
+ switch (property_id) {
+ case KA_PROP_PRINCIPAL:
+ g_free (self->priv->principal);
+ self->priv->principal = g_value_dup_string (value);
+ KA_DEBUG ("%s: %s", pspec->name, self->priv->principal);
+ break;
+
+ case KA_PROP_PK_USERID:
+ g_free (self->priv->pk_userid);
+ self->priv->pk_userid = g_value_dup_string (value);
+ KA_DEBUG ("%s: %s", pspec->name, self->priv->pk_userid);
+ break;
+
+ case KA_PROP_TRAYICON:
+ self->priv->show_trayicon = g_value_get_boolean (value);
+ KA_DEBUG ("%s: %s", pspec->name, self->priv->show_trayicon ? "True" : "False");
+ break;
+
+ case KA_PROP_PW_PROMPT_MINS:
+ self->priv->pw_prompt_secs = g_value_get_uint (value) * 60;
+ KA_DEBUG ("%s: %d", pspec->name, self->priv->pw_prompt_secs/60);
+ break;
+
+ default:
+ /* We don't have any other property... */
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+ka_applet_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ KaApplet *self = KA_APPLET (object);
+
+ switch (property_id)
+ {
+ case KA_PROP_PRINCIPAL:
+ g_value_set_string (value, self->priv->principal);
+ break;
+
+ case KA_PROP_PK_USERID:
+ g_value_set_string (value, self->priv->pk_userid);
+ break;
+
+ case KA_PROP_TRAYICON:
+ g_value_set_boolean (value, self->priv->show_trayicon);
+ break;
+
+ case KA_PROP_PW_PROMPT_MINS:
+ g_value_set_uint (value, self->priv->pw_prompt_secs / 60);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+
+static void
+ka_applet_dispose(GObject* object)
+{
+ KaApplet* applet = KA_APPLET(object);
+ GObjectClass *parent_class = G_OBJECT_CLASS (ka_applet_parent_class);
+
+ if (applet->priv->tray_icon) {
+ g_object_unref(applet->priv->tray_icon);
+ applet->priv->tray_icon = NULL;
+ }
+ if (applet->priv->pw_xml) {
+ g_object_unref(applet->priv->pw_xml);
+ applet->priv->pw_xml = NULL;
+ }
+
+ if (parent_class->dispose != NULL)
+ parent_class->dispose (object);
+}
+
+
+static void
+ka_applet_finalize(GObject *object)
+{
+ KaApplet* applet = KA_APPLET(object);
+ GObjectClass *parent_class = G_OBJECT_CLASS (ka_applet_parent_class);
+
+ g_free (applet->priv->principal);
+ g_free (applet->priv->pk_userid);
+ /* no need to free applet->priv */
+
+ if (parent_class->finalize != NULL)
+ parent_class->finalize (object);
+}
+
+static void
+ka_applet_init(KaApplet *applet)
+{
+ applet->priv = G_TYPE_INSTANCE_GET_PRIVATE(applet,
+ KA_TYPE_APPLET,
+ KaAppletPrivate);
+}
+
+static void
+ka_applet_class_init(KaAppletClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS(klass);
+ GParamSpec *pspec;
+
+ object_class->dispose = ka_applet_dispose;
+ object_class->finalize = ka_applet_finalize;
+ g_type_class_add_private(klass, sizeof(KaAppletPrivate));
+
+ object_class->set_property = ka_applet_set_property;
+ object_class->get_property = ka_applet_get_property;
+
+ pspec = g_param_spec_string ("principal",
+ "Principal",
+ "Get/Set Kerberos Principal",
+ "",
+ G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
+ g_object_class_install_property (object_class,
+ KA_PROP_PRINCIPAL,
+ pspec);
+
+ pspec = g_param_spec_string ("pk-userid",
+ "PKinit Identifier",
+ "Get/Set Pkinit identifier",
+ "",
+ G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
+ g_object_class_install_property (object_class,
+ KA_PROP_PK_USERID,
+ pspec);
+
+ pspec = g_param_spec_boolean("show-trayicon",
+ "Show tray icon",
+ "Show/Hide the tray icon",
+ TRUE,
+ G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
+ g_object_class_install_property (object_class,
+ KA_PROP_TRAYICON,
+ pspec);
+
+ pspec = g_param_spec_uint ("pw-prompt-mins",
+ "Password Prompting Interval",
+ "Password Prompting Interval in Minutes",
+ 0, G_MAXUINT, MINUTES_BEFORE_PROMPTING,
+ G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
+ g_object_class_install_property (object_class,
+ KA_PROP_PW_PROMPT_MINS,
+ pspec);
+}
+
+
+KaApplet *ka_applet_new(void)
+{
+ return g_object_new (KA_TYPE_APPLET, NULL);
+}
+
/* determine the new tooltip text */
static char*
-ka_tooltip_text(Krb5AuthApplet* applet, int remaining)
+ka_applet_tooltip_text(KaApplet* applet, int remaining)
{
int hours, minutes;
gchar* tooltip_text;
@@ -62,32 +276,64 @@
/* determine the current icon */
static const char*
-ka_select_icon(Krb5AuthApplet* applet, int remaining)
+ka_applet_select_icon(KaApplet* applet, int remaining)
{
enum ka_icon tray_icon = inv_icon;
if (remaining > 0) {
- if (remaining < applet->pw_prompt_secs &&
- !applet->renewable)
+ if (remaining < applet->priv->pw_prompt_secs &&
+ !applet->priv->renewable)
tray_icon = exp_icon;
else
tray_icon = val_icon;
}
- return applet->icons[tray_icon];
+ return applet->priv->icons[tray_icon];
+}
+
+
+void
+ka_send_event_notification (KaApplet *applet __attribute__((__unused__)),
+ const char *summary __attribute__((__unused__)),
+ const char *message __attribute__((__unused__)),
+ const char *icon __attribute__((__unused__)))
+{
+#ifdef HAVE_LIBNOTIFY
+ const char *notify_icon;
+
+ g_return_if_fail (applet != NULL);
+ g_return_if_fail (summary != NULL);
+ g_return_if_fail (message != NULL);
+
+ if (!notify_is_initted ())
+ notify_init (PACKAGE);
+
+ if (applet->priv->notification != NULL) {
+ notify_notification_close (applet->priv->notification, NULL);
+ g_object_unref (applet->priv->notification);
+ }
+
+ notify_icon = icon ? icon : "gtk-dialog-authentication";
+
+ applet->priv->notification = \
+ notify_notification_new_with_status_icon(summary, message, notify_icon, applet->priv->tray_icon);
+
+ notify_notification_set_urgency (applet->priv->notification, NOTIFY_URGENCY_NORMAL);
+ notify_notification_show (applet->priv->notification, NULL);
+#endif /* HAVE_LIBNOTIFY */
}
/* update the tray icon's tooltip and icon */
int
-ka_update_status(Krb5AuthApplet* applet, krb5_timestamp expiry)
+ka_applet_update_status(KaApplet* applet, krb5_timestamp expiry)
{
int now = time(0);
int remaining = expiry - now;
static int last_warn = 0;
static gboolean expiry_notified = FALSE;
- const char* tray_icon = ka_select_icon (applet, remaining);
- char* tooltip_text = ka_tooltip_text (applet, remaining);
+ const char* tray_icon = ka_applet_select_icon (applet, remaining);
+ char* tooltip_text = ka_applet_tooltip_text (applet, remaining);
if (remaining > 0) {
if (expiry_notified) {
@@ -95,8 +341,8 @@
_("Network credentials valid"),
_("Your Kerberos credentials have been refreshed."), NULL);
expiry_notified = FALSE;
- } else if (remaining < applet->pw_prompt_secs && (now - last_warn) > NOTIFY_SECONDS &&
- !applet->renewable) {
+ } else if (remaining < applet->priv->pw_prompt_secs && (now - last_warn) > NOTIFY_SECONDS &&
+ !applet->priv->renewable) {
ka_send_event_notification (applet,
_("Network credentials expiring"),
tooltip_text, NULL);
@@ -112,54 +358,53 @@
}
}
- gtk_status_icon_set_from_icon_name (applet->tray_icon, tray_icon);
- gtk_status_icon_set_tooltip (applet->tray_icon, tooltip_text);
+ gtk_status_icon_set_from_icon_name (applet->priv->tray_icon, tray_icon);
+ gtk_status_icon_set_tooltip (applet->priv->tray_icon, tooltip_text);
g_free(tooltip_text);
return 0;
}
static void
-ka_menu_add_separator_item (GtkWidget* menu)
+ka_applet_menu_add_separator_item (GtkWidget* menu)
{
- GtkWidget* menu_item;
+ GtkWidget* menu_item;
- menu_item = gtk_separator_menu_item_new ();
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
- gtk_widget_show (menu_item);
+ menu_item = gtk_separator_menu_item_new ();
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+ gtk_widget_show (menu_item);
}
/* Free all resources and quit */
static void
-ka_quit_applet (GtkMenuItem* menuitem, gpointer user_data)
+ka_applet_cb_quit (GtkMenuItem* menuitem, gpointer user_data)
{
- Krb5AuthApplet* applet = (Krb5AuthApplet*) user_data;
+ KaApplet* applet = KA_APPLET(user_data);
- g_free (applet->principal);
- g_free (applet);
+ g_object_unref (applet);
gtk_main_quit ();
}
static void
-ka_about_dialog (GtkMenuItem* menuitem, gpointer user_data)
+ka_applet_cb_about_dialog (GtkMenuItem* menuitem, gpointer user_data)
{
gchar* authors[] = { "Christopher Aillon <caillon redhat com>",
"Colin Walters <walters verbum org>",
- "Guido GÃnther <agx sigxpcu org>",
+ "Guido GÃnther <agx sigxpcu org>",
NULL };
gtk_show_about_dialog (NULL,
- "authors", authors,
- "version", VERSION,
- "copyright", "Copyright (C) 2004,2005,2006 Red Hat, Inc.,\n2008 Guido GÃnther",
- NULL);
+ "authors", authors,
+ "version", VERSION,
+ "copyright", "Copyright (C) 2004,2005,2006 Red Hat, Inc.,\n2008,2009 Guido GÃnther",
+ NULL);
}
/* The tray icon's context menu */
-static GtkWidget*
-ka_create_context_menu (Krb5AuthApplet* applet)
+static gboolean
+ka_applet_create_context_menu (KaApplet* applet)
{
GtkWidget* menu;
GtkWidget* menu_item;
@@ -170,43 +415,44 @@
/* kdestroy */
menu_item = gtk_image_menu_item_new_with_mnemonic (_("Remove Credentials _Cache"));
g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (ka_destroy_cache), applet);
- image = gtk_image_new_from_stock (GTK_STOCK_CANCEL, GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), image);
+ image = gtk_image_new_from_stock (GTK_STOCK_CANCEL, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), image);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
- ka_menu_add_separator_item (menu);
+ ka_applet_menu_add_separator_item (menu);
/* About item */
menu_item = gtk_image_menu_item_new_with_mnemonic (_("_About"));
- g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (ka_about_dialog), applet);
+ g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (ka_applet_cb_about_dialog), applet);
image = gtk_image_new_from_stock (GTK_STOCK_ABOUT, GTK_ICON_SIZE_MENU);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), image);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
- ka_menu_add_separator_item (menu);
+ ka_applet_menu_add_separator_item (menu);
/* Quit */
menu_item = gtk_image_menu_item_new_with_mnemonic (_("_Quit"));
- g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (ka_quit_applet), applet);
- image = gtk_image_new_from_stock (GTK_STOCK_QUIT, GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), image);
+ g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (ka_applet_cb_quit), applet);
+ image = gtk_image_new_from_stock (GTK_STOCK_QUIT, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), image);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
gtk_widget_show_all (menu);
+ applet->priv->context_menu = menu;
- return menu;
+ return TRUE;
}
static void
ka_tray_icon_on_menu (GtkStatusIcon* status_icon, guint button,
- guint activate_time, gpointer user_data)
+ guint activate_time, gpointer user_data)
{
- Krb5AuthApplet* applet = (Krb5AuthApplet*) user_data;
+ KaApplet *applet = KA_APPLET(user_data);
- KA_DEBUG("Trayicon right clicked: %d", applet->pw_prompt_secs);
- gtk_menu_popup (GTK_MENU (applet->context_menu), NULL, NULL,
- gtk_status_icon_position_menu, applet->tray_icon,
+ KA_DEBUG("Trayicon right clicked: %d", applet->priv->pw_prompt_secs);
+ gtk_menu_popup (GTK_MENU (applet->priv->context_menu), NULL, NULL,
+ gtk_status_icon_position_menu, applet->priv->tray_icon,
button, activate_time);
}
@@ -214,70 +460,143 @@
static gboolean
ka_tray_icon_on_click (GtkStatusIcon* status_icon, gpointer data)
{
- Krb5AuthApplet* applet = (Krb5AuthApplet*) data;
- g_return_val_if_fail (applet != NULL, FALSE);
+ KaApplet *applet = KA_APPLET(data);
- KA_DEBUG("Trayicon clicked: %d", applet->pw_prompt_secs);
+ KA_DEBUG("Trayicon clicked: %d", applet->priv->pw_prompt_secs);
ka_grab_credentials (applet);
return TRUE;
}
-gboolean
-ka_show_tray_icon (Krb5AuthApplet* applet)
+static gboolean
+ka_applet_cb_show_trayicon (KaApplet* applet, GParamSpec* property, gpointer data)
{
g_return_val_if_fail (applet != NULL, FALSE);
- g_return_val_if_fail (applet->tray_icon != NULL, FALSE);
+ g_return_val_if_fail (applet->priv->tray_icon != NULL, FALSE);
- gtk_status_icon_set_visible (applet->tray_icon, applet->show_trayicon);
+ gtk_status_icon_set_visible (applet->priv->tray_icon, applet->priv->show_trayicon);
return TRUE;
}
-static GtkStatusIcon*
-ka_create_tray_icon (Krb5AuthApplet* applet)
+static gboolean
+ka_applet_create_tray_icon (KaApplet* applet)
{
GtkStatusIcon* tray_icon;
tray_icon = gtk_status_icon_new ();
+
g_signal_connect (G_OBJECT(tray_icon), "activate",
- G_CALLBACK(ka_tray_icon_on_click), applet);
+ G_CALLBACK(ka_tray_icon_on_click), applet);
g_signal_connect (G_OBJECT(tray_icon),
"popup-menu",
G_CALLBACK(ka_tray_icon_on_menu), applet);
- gtk_status_icon_set_from_icon_name (tray_icon, applet->icons[exp_icon]);
- gtk_status_icon_set_tooltip (tray_icon, PACKAGE);
- return tray_icon;
+ gtk_status_icon_set_from_icon_name (tray_icon, applet->priv->icons[exp_icon]);
+ gtk_status_icon_set_tooltip (tray_icon, PACKAGE);
+ applet->priv->tray_icon = tray_icon;
+ return TRUE;
}
-int
-ka_setup_icons (Krb5AuthApplet* applet)
+static int
+ka_applet_setup_icons (KaApplet* applet)
{
/* Add application specific icons to search path */
gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
KA_DATA_DIR G_DIR_SEPARATOR_S "icons");
- applet->icons[val_icon] = "krb-valid-ticket";
- applet->icons[exp_icon] = "krb-expiring-ticket";
- applet->icons[inv_icon] = "krb-no-valid-ticket";
+ applet->priv->icons[val_icon] = "krb-valid-ticket";
+ applet->priv->icons[exp_icon] = "krb-expiring-ticket";
+ applet->priv->icons[inv_icon] = "krb-no-valid-ticket";
return TRUE;
}
+static gboolean
+ka_applet_glade_init(KaApplet *applet)
+{
+ KaAppletPrivate *priv = applet->priv;
+
+ priv->pw_xml = glade_xml_new (KA_DATA_DIR G_DIR_SEPARATOR_S
+ PACKAGE ".glade", NULL, NULL);
+ priv->pw_label = glade_xml_get_widget (priv->pw_xml, "krb5_wrong_label");
+ priv->pw_dialog = glade_xml_get_widget (priv->pw_xml, "krb5_dialog");
+
+ return TRUE;
+}
+
+
+GladeXML*
+ka_applet_get_pwdialog_xml(const KaApplet* applet)
+{
+ return applet->priv->pw_xml;
+}
+
+guint
+ka_applet_get_pw_prompt_secs(const KaApplet* applet)
+{
+ return applet->priv->pw_prompt_secs;
+}
+
+gboolean
+ka_applet_get_show_trayicon(const KaApplet* applet)
+{
+ return applet->priv->show_trayicon;
+}
+
+void
+ka_applet_set_tgt_renewable(KaApplet* applet, gboolean renewable)
+{
+ applet->priv->renewable = renewable;
+}
+
+gboolean
+ka_applet_get_tgt_renewable(const KaApplet* applet)
+{
+ return applet->priv->renewable;
+}
+
+gint ka_applet_run_pw_dialog(const KaApplet* applet)
+{
+ return gtk_dialog_run (GTK_DIALOG (applet->priv->pw_dialog));
+}
+
+void
+ka_applet_hide_pw_dialog(KaApplet* applet, gboolean force)
+{
+ KA_DEBUG("PW Dialog persist: %d", applet->priv->pw_dialog_persist);
+ if (!applet->priv->pw_dialog_persist || force)
+ gtk_widget_hide(applet->priv->pw_dialog);
+}
+
+void
+ka_applet_set_pw_dialog_persist(KaApplet* applet, gboolean persist)
+{
+ applet->priv->pw_dialog_persist = persist;
+}
+
+GtkWidget*
+ka_applet_get_pw_label(const KaApplet* applet)
+{
+ return applet->priv->pw_label;
+}
+
/* create the tray icon applet */
-Krb5AuthApplet*
-ka_create_applet()
+KaApplet*
+ka_applet_create()
{
- Krb5AuthApplet* applet = g_malloc0 (sizeof(Krb5AuthApplet));
+ KaApplet* applet = ka_applet_new();
+
+ ka_applet_glade_init(applet);
- if (!(ka_setup_icons (applet)))
+ if (!(ka_applet_setup_icons (applet)))
g_error ("Failure to setup icons");
- if (!(applet->tray_icon = ka_create_tray_icon (applet)))
+ if (!ka_applet_create_tray_icon (applet))
g_error ("Failure to create tray icon");
- if (!(applet->context_menu = ka_create_context_menu (applet)))
+ if (!ka_applet_create_context_menu (applet))
g_error ("Failure to create context menu");
- gtk_window_set_default_icon_name (applet->icons[val_icon]);
- ka_show_tray_icon (applet);
+ gtk_window_set_default_icon_name (applet->priv->icons[val_icon]);
+ g_signal_connect (applet, "notify::show-trayicon",
+ G_CALLBACK (ka_applet_cb_show_trayicon), NULL);
return applet;
}
Modified: trunk/src/krb5-auth-applet.h
==============================================================================
--- trunk/src/krb5-auth-applet.h (original)
+++ trunk/src/krb5-auth-applet.h Sat Feb 28 13:42:48 2009
@@ -22,6 +22,7 @@
#define KRB5_AUTH_APPLET_H
#include <glib.h>
+#include <glib-object.h>
#include <glib/gprintf.h>
#include <gtk/gtk.h>
#include <glade/glade.h>
@@ -32,32 +33,46 @@
#include "config.h"
-typedef struct {
- GtkStatusIcon* tray_icon; /* the tray icon */
- GtkWidget* context_menu; /* the tray icon's context menu */
- const char* icons[3]; /* for invalid, expiring and valid tickts */
- gboolean show_trayicon; /* show the trayicon */
-
- /* The password dialog */
- GtkWidget* pw_dialog; /* the password dialog itself */
- GladeXML* pw_xml; /* the dialog's glade xml */
- GtkWidget* pw_wrong_label; /* the wrong password/timeout label */
- int pw_prompt_secs; /* when to start prompting for a password */
- gboolean pw_dialog_persist; /* don't hide the dialog when creds are still valid */
+G_BEGIN_DECLS
-#ifdef HAVE_LIBNOTIFY
- NotifyNotification* notification;/* notification messages */
-#endif /* HAVE_LIBNOTIFY */
- char* principal; /* the principal to request */
- gboolean renewable; /* credentials renewable? */
- char* pk_userid; /* "userid" for pkint */
-} Krb5AuthApplet;
+#define KA_TYPE_APPLET (ka_applet_get_type ())
+#define KA_APPLET(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), KA_TYPE_APPLET, KaApplet))
+#define KA_APPLET_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), KA_TYPE_APPLET, KaAppletClass))
+#define KA_IS_APPLET(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), KA_TYPE_APPLET))
+#define KA_IS_APPLET_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), KA_TYPE_APPLET))
+#define KA_APPLET_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), KA_TYPE_APPLET, KaAppletClass))
+
+typedef struct _KaApplet KaApplet;
+typedef struct _KaAppletClass KaAppletClass;
+typedef struct _KaAppletPrivate KaAppletPrivate;
+
+GType ka_applet_get_type (void);
+KaApplet* ka_applet_new(void) G_GNUC_MALLOC;
+
+/* public functions */
+gboolean ka_applet_get_show_trayicon(const KaApplet* applet);
+void ka_applet_set_tgt_renewable(KaApplet* applet, gboolean renewable);
+gboolean ka_applet_get_tgt_renewable(const KaApplet* applet);
+guint ka_applet_get_pw_prompt_secs(const KaApplet* applet);
+
+/* password dialog */
+gint ka_applet_run_pw_dialog(const KaApplet* applet);
+GladeXML* ka_applet_get_pwdialog_xml(const KaApplet* applet);
+void ka_applet_hide_pw_dialog(KaApplet* applet, gboolean force);
+GtkWidget* ka_applet_get_pw_label(const KaApplet* applet);
+void ka_applet_set_pw_dialog_persist(KaApplet* applet, gboolean persist);
+
+G_END_DECLS
-Krb5AuthApplet* ka_create_applet();
+/* create the applet */
+KaApplet* ka_applet_create();
/* update tooltip and icon */
-int ka_update_status(Krb5AuthApplet* applet, krb5_timestamp expiry);
-/* show or hide the tray icon */
-gboolean ka_show_tray_icon(Krb5AuthApplet* applet);
+int ka_applet_update_status(KaApplet* applet, krb5_timestamp expiry);
#ifdef ENABLE_DEBUG
#define KA_DEBUG(fmt,...) \
Modified: trunk/src/krb5-auth-dbus.c
==============================================================================
--- trunk/src/krb5-auth-dbus.c (original)
+++ trunk/src/krb5-auth-dbus.c Sat Feb 28 13:42:48 2009
@@ -1,6 +1,6 @@
/* Krb5 Auth Applet -- Acquire and release kerberos tickets
*
- * (C) 2008 Guido Guenther <agx sigxcpu org>
+ * (C) 2008,2009 Guido Guenther <agx sigxcpu org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Modified: trunk/src/krb5-auth-dialog.c
==============================================================================
--- trunk/src/krb5-auth-dialog.c (original)
+++ trunk/src/krb5-auth-dialog.c Sat Feb 28 13:42:48 2009
@@ -2,6 +2,8 @@
* Copyright (C) 2004,2005,2006 Red Hat, Inc.
* Authored by Christopher Aillon <caillon redhat com>
*
+ * Copyright (C) 2008,2009 Guido Guenther <agx sigxcup org>
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
@@ -55,8 +57,8 @@
static gboolean invalid_auth;
static gboolean always_run;
-static int grab_credentials (Krb5AuthApplet* applet);
-static int ka_renew_credentials (Krb5AuthApplet* applet);
+static int grab_credentials (KaApplet* applet);
+static int ka_renew_credentials (KaApplet* applet);
static gboolean ka_get_tgt_from_ccache (krb5_context context, krb5_creds *creds);
/* YAY for different Kerberos implementations */
@@ -160,13 +162,13 @@
/* ***************************************************************** */
static gboolean
-credentials_expiring_real (Krb5AuthApplet* applet)
+credentials_expiring_real (KaApplet* applet)
{
krb5_creds my_creds;
krb5_timestamp now;
gboolean retval = FALSE;
- applet->renewable = FALSE;
+ ka_applet_set_tgt_renewable(applet, FALSE);
if (!ka_get_tgt_from_ccache (kcontext, &my_creds)) {
creds_expiry = 0;
retval = TRUE;
@@ -179,18 +181,18 @@
}
creds_expiry = my_creds.times.endtime;
if ((krb5_timeofday(kcontext, &now) == 0) &&
- (now + applet->pw_prompt_secs > my_creds.times.endtime))
+ (now + ka_applet_get_pw_prompt_secs(applet) > my_creds.times.endtime))
retval = TRUE;
/* If our creds are expiring, determine whether they are renewable */
if (retval && get_cred_renewable(&my_creds) && my_creds.times.renew_till > now) {
- applet->renewable = TRUE;
+ ka_applet_set_tgt_renewable(applet, TRUE);
}
krb5_free_cred_contents (kcontext, &my_creds);
out:
- ka_update_status(applet, creds_expiry);
+ ka_applet_update_status(applet, creds_expiry);
return retval;
}
@@ -246,25 +248,21 @@
static gboolean
krb5_auth_dialog_do_updates (gpointer data)
{
- Krb5AuthApplet* applet = (Krb5AuthApplet*)data;
+ KaApplet* applet = KA_APPLET(data);
g_return_val_if_fail (applet != NULL, FALSE);
-
/* Update creds_expiry and close the applet if we got the creds by other means (e.g. kinit) */
- if (!credentials_expiring_real(applet)) {
- KA_DEBUG("PW Dialog persist: %d", applet->pw_dialog_persist);
- if (!applet->pw_dialog_persist)
- gtk_widget_hide(applet->pw_dialog);
- }
+ if (!credentials_expiring_real(applet))
+ ka_applet_hide_pw_dialog(applet, FALSE);
/* Update the expiry information in the dialog */
- krb5_auth_dialog_wrong_label_update_expiry (applet->pw_wrong_label);
+ krb5_auth_dialog_wrong_label_update_expiry (ka_applet_get_pw_label(applet));
return TRUE;
}
static void
-krb5_auth_dialog_setup (Krb5AuthApplet *applet,
+krb5_auth_dialog_setup (KaApplet *applet,
const gchar *krb5prompt,
gboolean hide_password)
{
@@ -275,7 +273,6 @@
gchar *prompt;
int pw4len;
-
if (krb5prompt == NULL) {
prompt = g_strdup (_("Please enter your Kerberos password."));
} else {
@@ -295,17 +292,19 @@
}
/* Clear the password entry field */
- entry = glade_xml_get_widget (applet->pw_xml, "krb5_entry");
+ entry = glade_xml_get_widget (ka_applet_get_pwdialog_xml(applet),
+ "krb5_entry");
gtk_secure_entry_set_text (GTK_SECURE_ENTRY (entry), "");
/* Use the prompt label that krb5 provides us */
- label = glade_xml_get_widget (applet->pw_xml, "krb5_message_label");
+ label = glade_xml_get_widget (ka_applet_get_pwdialog_xml(applet),
+ "krb5_message_label");
gtk_label_set_text (GTK_LABEL (label), prompt);
/* Add our extra message hints, if any */
wrong_text = NULL;
- if (applet->pw_wrong_label) {
+ if (ka_applet_get_pw_label(applet)) {
if (invalid_auth) {
wrong_text = g_strdup (_("The password you entered is invalid"));
} else {
@@ -322,11 +321,11 @@
if (wrong_text) {
wrong_markup = g_strdup_printf ("<span size=\"smaller\" style=\"italic\">%s</span>", wrong_text);
- gtk_label_set_markup (GTK_LABEL (applet->pw_wrong_label), wrong_markup);
+ gtk_label_set_markup (GTK_LABEL (ka_applet_get_pw_label(applet)), wrong_markup);
g_free(wrong_text);
g_free(wrong_markup);
} else {
- gtk_label_set_text (GTK_LABEL (applet->pw_wrong_label), "");
+ gtk_label_set_text (GTK_LABEL (ka_applet_get_pw_label(applet)), "");
}
g_free (prompt);
}
@@ -340,7 +339,7 @@
int num_prompts,
krb5_prompt prompts[])
{
- Krb5AuthApplet* applet = (Krb5AuthApplet*)data;
+ KaApplet* applet = KA_APPLET(data);
krb5_error_code errcode;
int i;
@@ -359,11 +358,11 @@
errcode = KRB5_LIBOS_CANTREADPWD;
krb5_auth_dialog_setup (applet, (gchar *) prompts[i].prompt, prompts[i].hidden);
- entry = glade_xml_get_widget (applet->pw_xml, "krb5_entry");
+ entry = glade_xml_get_widget (ka_applet_get_pwdialog_xml(applet), "krb5_entry");
gtk_widget_grab_focus (entry);
source_id = g_timeout_add_seconds (5, (GSourceFunc)krb5_auth_dialog_do_updates, applet);
- response = gtk_dialog_run (GTK_DIALOG (applet->pw_dialog));
+ response = ka_applet_run_pw_dialog (applet);
switch (response)
{
case GTK_RESPONSE_OK:
@@ -394,8 +393,8 @@
errcode = 0;
}
cleanup:
+ ka_applet_hide_pw_dialog (applet, TRUE);
/* Reset this, so we know the next time we get a TRUE value, it is accurate. */
- gtk_widget_hide (applet->pw_dialog);
invalid_auth = FALSE;
return errcode;
@@ -436,9 +435,9 @@
{
int retval;
gboolean give_up;
- Krb5AuthApplet* applet = (Krb5AuthApplet*) data;
+ KaApplet* applet = KA_APPLET(data);
- KA_DEBUG("Checking expiry <%ds", applet->pw_prompt_secs);
+ KA_DEBUG("Checking expiry <%ds", ka_applet_get_pw_prompt_secs(applet));
if (credentials_expiring_real (applet) && is_online) {
KA_DEBUG("Expiry @ %ld", creds_expiry);
@@ -448,7 +447,7 @@
}
/* no popup when using a trayicon */
- if (applet->show_trayicon)
+ if (ka_applet_get_show_trayicon(applet))
goto out;
give_up = canceled && (creds_expiry == canceled_creds_expiry);
@@ -465,13 +464,13 @@
}
}
out:
- ka_update_status(applet, creds_expiry);
+ ka_applet_update_status(applet, creds_expiry);
return TRUE;
}
static void
-set_options_from_creds(const Krb5AuthApplet* applet,
+set_options_from_creds(const KaApplet* applet,
krb5_context context,
krb5_creds *in,
krb5_get_init_creds_opt *out)
@@ -496,7 +495,7 @@
renew_lifetime);
}
if (in->times.endtime >
- in->times.starttime + applet->pw_prompt_secs) {
+ in->times.starttime + ka_applet_get_pw_prompt_secs(applet)) {
krb5_get_init_creds_opt_set_tkt_life(out,
in->times.endtime -
in->times.starttime);
@@ -507,16 +506,13 @@
static krb5_error_code
-ka_auth_pkinit(Krb5AuthApplet* applet, krb5_creds* creds)
+ka_auth_pkinit(KaApplet* applet, krb5_creds* creds, const char* pk_userid)
{
#ifdef ENABLE_PKINIT
krb5_get_init_creds_opt *opts = NULL;
krb5_error_code retval;
- KA_DEBUG("pkinit with '%s'", applet->pk_userid);
-
- if (!applet->pk_userid)
- return 0;
+ KA_DEBUG("pkinit with '%s'", pk_userid);
retval = krb5_get_init_creds_opt_alloc (kcontext, &opts);
if (retval)
@@ -525,7 +521,7 @@
retval = krb5_get_init_creds_opt_set_pkinit(kcontext, opts,
kprincipal,
- applet->pk_userid,
+ pk_userid,
NULL, /* x509 anchors */
NULL,
NULL,
@@ -549,35 +545,54 @@
}
+krb5_error_code
+ka_parse_name(KaApplet* applet, krb5_context kcontext, krb5_principal* kprinc)
+{
+ krb5_error_code ret;
+ gchar *principal = NULL;
+
+ g_object_get(applet, "principal", &principal,
+ NULL);
+
+ ret = krb5_parse_name(kcontext, principal,
+ kprinc);
+
+ g_free(principal);
+ return ret;
+}
+
+
/* grab credentials interactively */
static int
-grab_credentials (Krb5AuthApplet* applet)
+grab_credentials (KaApplet* applet)
{
krb5_error_code retval;
krb5_creds my_creds;
krb5_ccache ccache;
krb5_get_init_creds_opt *opt = NULL;
+ gchar *pk_userid = NULL;
+
+ g_object_get(applet, "pk-userid", &pk_userid,
+ NULL);
memset(&my_creds, 0, sizeof(my_creds));
if (kprincipal == NULL) {
- retval = krb5_parse_name(kcontext, applet->principal,
- &kprincipal);
- if (retval) {
- return retval;
- }
+ retval = ka_parse_name(applet, kcontext, &kprincipal);
+ if (retval)
+ goto out2;
}
retval = krb5_cc_default (kcontext, &ccache);
if (retval)
- return retval;
+ goto out2;
#if ENABLE_PKINIT
- if (applet->pk_userid && strlen(applet->pk_userid)) { /* try pkinit */
+ if (pk_userid && strlen(pk_userid)) { /* try pkinit */
#else
if (0) {
#endif
- retval = ka_auth_pkinit(applet, &my_creds);
+ retval = ka_auth_pkinit(applet, &my_creds, pk_userid);
} else {
retval = krb5_get_init_creds_opt_alloc (kcontext, &opt);
if (retval)
@@ -620,13 +635,15 @@
krb5_get_init_creds_opt_free(kcontext, opt);
krb5_free_cred_contents (kcontext, &my_creds);
krb5_cc_close (kcontext, ccache);
+out2:
+ g_free(pk_userid);
return retval;
}
/* try to renew the credentials noninteractively */
static int
-ka_renew_credentials (Krb5AuthApplet* applet)
+ka_renew_credentials (KaApplet* applet)
{
krb5_error_code retval;
krb5_creds my_creds;
@@ -634,8 +651,7 @@
krb5_get_init_creds_opt opts;
if (kprincipal == NULL) {
- retval = krb5_parse_name(kcontext, applet->principal,
- &kprincipal);
+ retval = ka_parse_name(applet, kcontext, &kprincipal);
if (retval)
return retval;
}
@@ -653,7 +669,7 @@
krb5_get_init_creds_opt_init (&opts);
set_options_from_creds (applet, kcontext, &my_creds, &opts);
- if (applet->renewable) {
+ if (ka_applet_get_tgt_renewable(applet)) {
retval = get_renewed_creds (kcontext, &my_creds, kprincipal, ccache, NULL);
if (retval)
goto out;
@@ -741,7 +757,7 @@
void
ka_destroy_cache (GtkMenuItem *menuitem, gpointer data)
{
- Krb5AuthApplet* applet = (Krb5AuthApplet*) data;
+ KaApplet *applet = KA_APPLET(data);
krb5_ccache ccache;
const char* cache;
krb5_error_code ret;
@@ -770,12 +786,12 @@
/* this is done on leftclick, update the tooltip immediately */
void
-ka_grab_credentials (Krb5AuthApplet* applet)
+ka_grab_credentials (KaApplet* applet)
{
int retval;
gboolean retry;
- applet->pw_dialog_persist = TRUE;
+ ka_applet_set_pw_dialog_persist(applet, TRUE);
do {
retry = TRUE;
retval = grab_credentials (applet);
@@ -795,7 +811,7 @@
}
} while(retry);
- applet->pw_dialog_persist = FALSE;
+ ka_applet_set_pw_dialog_persist(applet, FALSE);
credentials_expiring_real(applet);
}
@@ -835,7 +851,7 @@
int
main (int argc, char *argv[])
{
- Krb5AuthApplet *applet;
+ KaApplet *applet;
GOptionContext *context;
GError *error = NULL;
@@ -878,21 +894,15 @@
always_run = TRUE;
}
if (using_krb5 () || always_run) {
- applet = ka_create_applet ();
+ g_set_application_name (_("Network Authentication"));
+ glade_set_custom_handler (&ka_create_gtk_secure_entry, NULL);
+
+ applet = ka_applet_create ();
if (!applet)
return 1;
if (!ka_gconf_init (applet, argc, argv))
return 1;
- /* setup the pw dialog */
- glade_set_custom_handler (&ka_create_gtk_secure_entry, NULL);
- applet->pw_xml = glade_xml_new (KA_DATA_DIR G_DIR_SEPARATOR_S
- "krb5-auth-dialog.glade", NULL, NULL);
- applet->pw_wrong_label = glade_xml_get_widget (applet->pw_xml, "krb5_wrong_label");
- applet->pw_dialog = glade_xml_get_widget (applet->pw_xml, "krb5_dialog");
-
- g_set_application_name (_("Network Authentication"));
-
#ifdef ENABLE_NETWORK_MANAGER
nm_context = libnm_glib_init ();
if (!nm_context) {
Modified: trunk/src/krb5-auth-dialog.h
==============================================================================
--- trunk/src/krb5-auth-dialog.h (original)
+++ trunk/src/krb5-auth-dialog.h Sat Feb 28 13:42:48 2009
@@ -24,7 +24,7 @@
#include "krb5-auth-applet.h"
void ka_destroy_cache (GtkMenuItem *menuitem, gpointer user_data);
-void ka_grab_credentials(Krb5AuthApplet* applet);
+void ka_grab_credentials(KaApplet* applet);
#endif
Modified: trunk/src/krb5-auth-gconf.c
==============================================================================
--- trunk/src/krb5-auth-gconf.c (original)
+++ trunk/src/krb5-auth-gconf.c Sat Feb 28 13:42:48 2009
@@ -1,6 +1,6 @@
/* Krb5 Auth Applet -- Acquire and release kerberos tickets
*
- * (C) 2008 Guido Guenther <agx sigxcpu org>
+ * (C) 2008,2009 Guido Guenther <agx sigxcpu org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -111,52 +111,55 @@
static gboolean
-ka_gconf_set_principal (GConfClient* client, Krb5AuthApplet* applet)
+ka_gconf_set_principal (GConfClient* client, KaApplet* applet)
{
- g_free (applet->principal);
- applet->principal = NULL;
- if(!ka_gconf_get_string (client, KA_GCONF_KEY_PRINCIPAL, &applet->principal)) {
- applet->principal = g_strdup (g_get_user_name());
+ gchar* principal = NULL;
+
+ if(!ka_gconf_get_string (client, KA_GCONF_KEY_PRINCIPAL, &principal)) {
+ principal = g_strdup (g_get_user_name());
}
- KA_DEBUG("Setting principal to '%s'", applet->principal);
- // FIXME: need to send set-principal signal
+ g_object_set(applet, "principal", principal, NULL);
+ g_free (principal);
return TRUE;
}
static gboolean
-ka_gconf_set_pk_userid (GConfClient* client, Krb5AuthApplet* applet)
+ka_gconf_set_pk_userid (GConfClient* client, KaApplet* applet)
{
- g_free (applet->pk_userid);
- if(!ka_gconf_get_string (client, KA_GCONF_KEY_PK_USERID, &applet->pk_userid)) {
- applet->pk_userid = NULL;
+ gchar* pk_userid = NULL;
+
+ if(!ka_gconf_get_string (client, KA_GCONF_KEY_PK_USERID, &pk_userid)) {
+ pk_userid = g_strdup ("");
}
- KA_DEBUG("Setting pk_userid to '%s'", applet->pk_userid ? applet->pk_userid : "<disabled>");
+ g_object_set(applet, "pk_userid", pk_userid, NULL);
+ g_free (pk_userid);
return TRUE;
}
static gboolean
-ka_gconf_set_prompt_mins (GConfClient* client, Krb5AuthApplet* applet)
+ka_gconf_set_prompt_mins (GConfClient* client, KaApplet* applet)
{
- if(!ka_gconf_get_int (client, KA_GCONF_KEY_PROMPT_MINS, &applet->pw_prompt_secs)) {
- applet->pw_prompt_secs = MINUTES_BEFORE_PROMPTING;
+ gint prompt_mins = 0;
+
+ if(!ka_gconf_get_int (client, KA_GCONF_KEY_PROMPT_MINS, &prompt_mins)) {
+ prompt_mins = MINUTES_BEFORE_PROMPTING;
}
- applet->pw_prompt_secs *= 60;
- KA_DEBUG("Setting prompting timer to %d seconds", applet->pw_prompt_secs);
+ g_object_set(applet, "pw-prompt-mins", prompt_mins, NULL);
return TRUE;
}
static gboolean
-ka_gconf_set_show_trayicon (GConfClient* client, Krb5AuthApplet* applet)
+ka_gconf_set_show_trayicon (GConfClient* client, KaApplet* applet)
{
- if(!ka_gconf_get_bool(client, KA_GCONF_KEY_SHOW_TRAYICON, &applet->show_trayicon)) {
- applet->show_trayicon = TRUE;
+ gboolean show_trayicon = FALSE;
+
+ if(!ka_gconf_get_bool(client, KA_GCONF_KEY_SHOW_TRAYICON, &show_trayicon)) {
+ show_trayicon = TRUE;
}
- KA_DEBUG("Show trayicon: %s", (applet->show_trayicon ? "yes" : "no" ));
- // FIXME: send show trayicon signal
- ka_show_tray_icon(applet);
+ g_object_set(applet, "show-trayicon", show_trayicon, NULL);
return TRUE;
}
@@ -169,7 +172,7 @@
{
const char* key;
- Krb5AuthApplet* applet = (Krb5AuthApplet*)user_data;
+ KaApplet* applet = KA_APPLET(user_data);
key = gconf_entry_get_key (entry);
if (!key)
return;
@@ -190,7 +193,7 @@
gboolean
-ka_gconf_init (Krb5AuthApplet* applet, int argc, char* argv[])
+ka_gconf_init (KaApplet* applet, int argc, char* argv[])
{
GError *error = NULL;
GConfClient* client;
Modified: trunk/src/krb5-auth-gconf.h
==============================================================================
--- trunk/src/krb5-auth-gconf.h (original)
+++ trunk/src/krb5-auth-gconf.h Sat Feb 28 13:42:48 2009
@@ -23,6 +23,6 @@
#include "krb5-auth-applet.h"
-gboolean ka_gconf_init (Krb5AuthApplet* applet, int argc, char* argv[]);
+gboolean ka_gconf_init (KaApplet* applet, int argc, char* argv[]);
#endif
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]