diff options
-rw-r--r-- | debian/changelog | 112 | ||||
-rw-r--r-- | debian/compat | 1 | ||||
-rw-r--r-- | debian/control | 22 | ||||
-rw-r--r-- | debian/copyright | 25 | ||||
-rw-r--r-- | debian/patches/0001-set-a-more-gnomeisch-invisible-char.patch | 21 | ||||
-rw-r--r-- | debian/patches/0002-add-dbus-service-file.patch | 56 | ||||
-rw-r--r-- | debian/patches/0003-add-preferences-dialog.patch | 1973 | ||||
-rw-r--r-- | debian/patches/series | 3 | ||||
-rwxr-xr-x | debian/rules | 14 | ||||
-rw-r--r-- | debian/watch | 4 |
10 files changed, 2231 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..d842a03 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,112 @@ +krb5-auth-dialog (0.8+svn136-2) unstable; urgency=low + + * [cf0e693] allow to set ticket flags via preferences dialog (Closes: + #521251) + + -- Guido Günther <agx@sigxcpu.org> Thu, 02 Apr 2009 16:54:35 +0200 + +krb5-auth-dialog (0.8+svn136-1) unstable; urgency=low + + * [89329f6] Imported Upstream snapshot 0.8+svn136 + * Patches: + - [6e6af1c] 0001-set-a-more-gnomeisch-invisible-char: rediff + - [f162ecd] 0002-add-dbus-service-file: add dbus service file to fire up + krb5-auth-dialog when an application requests a ticket but + krb5-auth-dialog isn't running + + -- Guido Günther <agx@sigxcpu.org> Sat, 28 Mar 2009 13:41:12 +0100 + +krb5-auth-dialog (0.8+svn128-1) unstable; urgency=low + + * [d0f7048] Imported Upstream version 0.8+svn128 + * dbus interface + * [7d35a63] reenable autogen.sh for SVN snapshot + * [0a0e716] drop patches applied upstream: + * 0002-don-t-try-pkinit-if-pk_userid-is-non-null-but-empty.patch + * 0003-move- icons-to-datadir-krb5-auth-dialog.patch + + -- Guido Günther <agx@sigxcpu.org> Sun, 01 Mar 2009 15:27:18 +0100 + +krb5-auth-dialog (0.8-3) unstable; urgency=low + + * upload to unstable + * [8600023] add ${misc:depends} + * [858f4d8] move icons to $(datadir)/krb5-auth-dialog + + -- Guido Günther <agx@sigxcpu.org> Fri, 20 Feb 2009 16:51:12 +0100 + +krb5-auth-dialog (0.8-2) experimental; urgency=low + + * [30f663e] add Vcs-{Git,Browser} fields + * [dc19dd3] don't try pkinit if pk_userid is non-null but empty + + -- Guido Günther <agx@sigxcpu.org> Mon, 19 Jan 2009 22:19:49 +0100 + +krb5-auth-dialog (0.8-1) experimental; urgency=low + + * [88b8041] Imported Upstream version 0.8 + * [453e157] set more gnomeish invisible char + * [a81f793] released version doesn't need to run autogen.sh + * [ce03b8f] build-dep on quilt + + -- Guido Günther <agx@sigxcpu.org> Sat, 10 Jan 2009 16:28:24 +0100 + +krb5-auth-dialog (0.7.jit26357da-1) experimental; urgency=low + + * [6a45cdd] Imported Upstream version 0.7.jit26357da + * Based on upstream version 0.7 plus our changes at: + http://honk.sigxcpu.org/git/krb5-auth-dialog.git + * support pkinit + * add extra icon for "ticket is about to expire" + * add gconf schema + * [08f4d3e] build against heimdal for pkinit support + * [dc90dff] update description + * [168739c] new standards version + * [37e6092] depend on gconf2 + * [fa542d6] drop quilt dependeny + + -- Guido Günther <agx@sigxcpu.org> Sat, 18 Oct 2008 18:46:37 +0200 + +krb5-auth-dialog (0.7.hit7cc1d84-1) unstable; urgency=low + + * New "Upstream" Version + * Based on upstream version 0.7 plus our changes at: + http://honk.sigxcpu.org/git/krb5-auth-dialog.git + * don't popup the dialog if we have a tray icon + * set a more gnomeish invisible-char + * remove width_request from krb5_auth_message_label so the realm name + doesn't get cut off + * drop desktop-file.diff & man-section.diff since we have that in our + "upstream" git now + + -- Guido Guenther <agx@sigxcpu.org> Mon, 21 Jul 2008 01:16:40 -0230 + +krb5-auth-dialog (0.7.git30891fc-1) unstable; urgency=low + + * New "Upstream" Version: + * Based on upstream version 0.7 plus our changes at: + http://honk.sigxcpu.org/git/krb5-auth-dialog.git + * use GtkSecureEntry to fetch password + * adds trayicon + * fix localization + * close dialog when credentials were acquired by other means + * use libnotify and gconf + * session handling via dbus + * use g_timeout_add_seconds to save battery power + * set a proper icon + + -- Guido Guenther <agx@sigxcpu.org> Sun, 08 Jun 2008 17:29:06 +0200 + +krb5-auth-dialog (0.6-1) unstable; urgency=low + + * Initial version based on the ubuntu package by Andrew Mitchell + (Closes: #461203) + * Changes: + * fix manpage section + * fix desktop file + * update FSF address + * use autotools-dev to update config.{sub,guess} + * use -Wl,--as-needed + * added watch file + + -- Guido Guenther <agx@sigxcpu.org> Thu, 17 Jan 2008 10:13:38 +0100 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..1e8b314 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +6 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..a15a410 --- /dev/null +++ b/debian/control @@ -0,0 +1,22 @@ +Source: krb5-auth-dialog +Section: gnome +Priority: optional +Maintainer: Guido Günther <agx@sigxcpu.org> +Build-Depends: debhelper (>= 6), cdbs, heimdal-dev, libgtk2.0-dev, + libglade2-dev, intltool, libgnomeui-dev, autotools-dev, libnm-glib-dev, gnome-common, + autoconf, automake, pkg-config, intltool, bison, flex, libnotify-dev, libgconf2-dev, + libdbus-glib-1-dev, quilt +Standards-Version: 3.8.0 +Vcs-Git: git://git.debian.org/git/users/agx/krb5-auth-dialog.git +Vcs-Browser: http://git.debian.org/git/users/agx/krb5-auth-dialog.git + +Package: krb5-auth-dialog +Architecture: any +Depends: ${shlibs:Depends}, ${misc:depends}, gconf2 +Description: tray applet for reauthenticating kerberos tickets + krb5-auth-dialog is a simple tray applet that monitors kerberos tickets. It + pops up reminders when the ticket is about to expire. Tickets can be refreshed + at any time by clicking on the tray icon. It can also operate in "classic + mode" as a simple dialog without any trayicon. + . + It features ticket autorenewal and supports pkinit. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..8c02a94 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,25 @@ +This package was debianized by Andrew Mitchell <ajmitch@ubuntu.com> on +Fri Sep 30 00:52:30 NZST 2005 from sources obtained from: + + http://ftp.gnome.org/pub/GNOME/sources/krb5-auth-dialog/ + + Copyright (C) 2004,2005 Red Hat, Inc. + Authored by Christopher Aillon <caillon@redhat.com> + + 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) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + +On Debian systems, the complete text of the GNU General Public License +can be found in ‘/usr/share/common-licenses/GPL’. + diff --git a/debian/patches/0001-set-a-more-gnomeisch-invisible-char.patch b/debian/patches/0001-set-a-more-gnomeisch-invisible-char.patch new file mode 100644 index 0000000..04a79c8 --- /dev/null +++ b/debian/patches/0001-set-a-more-gnomeisch-invisible-char.patch @@ -0,0 +1,21 @@ +From: Guido Guenther <agx@sigxcpu.org> +Date: Sat, 14 Jun 2008 18:53:15 +0200 +Subject: [PATCH] set a more gnomeisch invisible-char + +--- + src/krb5-auth-dialog.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +diff --git a/src/krb5-auth-dialog.c b/src/krb5-auth-dialog.c +index a45c480..be6c29f 100644 +--- a/src/krb5-auth-dialog.c ++++ b/src/krb5-auth-dialog.c +@@ -897,6 +897,7 @@ ka_create_gtk_secure_entry (GladeXML *xml G_GNUC_UNUSED, + if (!strcmp(name, "krb5_entry")) { + entry = gtk_secure_entry_new (); + gtk_secure_entry_set_activates_default(GTK_SECURE_ENTRY(entry), TRUE); ++ gtk_widget_set(entry, "invisible-char", 0x25cf, NULL); + gtk_widget_show (entry); + } else { + g_warning("Don't know anything about widget %s", name); +-- diff --git a/debian/patches/0002-add-dbus-service-file.patch b/debian/patches/0002-add-dbus-service-file.patch new file mode 100644 index 0000000..c61a763 --- /dev/null +++ b/debian/patches/0002-add-dbus-service-file.patch @@ -0,0 +1,56 @@ +From: =?utf-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org> +Date: Tue, 24 Mar 2009 00:47:10 +0100 +Subject: [PATCH] add dbus service file + +--- + src/Makefile.am | 12 ++++++++++-- + src/org.gnome.KrbAuthDialog.service.in | 3 +++ + 2 files changed, 13 insertions(+), 2 deletions(-) + create mode 100644 src/org.gnome.KrbAuthDialog.service.in + +diff --git a/src/Makefile.am b/src/Makefile.am +index a0db9ec..1c74c84 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -12,11 +12,18 @@ autostart_DATA = $(autostart_in_files:.desktop.in=.desktop) + + schemadir = $(sysconfdir)/gconf/schemas + schema_in_files = $(PACKAGE).schemas.in +-schema_DATA = $(PACKAGE).schemas ++schema_DATA = $(schema_in_files:.schemas.in=.schemas) + + %.schemas: $(srcdir)/%.schemas.in + sed -e "s,::PACKAGE::,$(PACKAGE)," < $< > $@ + ++servicedir = $(datadir)/dbus-1/services ++service_in_files = org.gnome.KrbAuthDialog.service.in ++service_DATA = $(service_in_files:.service.in=.service) ++ ++$(service_DATA): $(service_in_files) Makefile ++ sed -e "s|\@BINDIR\@|$(bindir)|" $< > $@ ++ + krb5_auth_dialog_SOURCES = \ + krb5-auth-dialog.c \ + krb5-auth-dialog.h \ +@@ -60,9 +67,10 @@ EXTRA_DIST = \ + $(pkgdata_DATA) \ + $(schema_in_files) \ + $(autostart_in_files) \ ++ $(service_in_files) \ + krb5-auth-dialog.1.in + +-CLEANFILES = $(schema_DATA) ++CLEANFILES = $(schema_DATA) $(service_DATA) + DISTCLEANFILES = \ + krb5-auth-dialog.desktop \ + krb5-auth-applet-dbus-glue.h +diff --git a/src/org.gnome.KrbAuthDialog.service.in b/src/org.gnome.KrbAuthDialog.service.in +new file mode 100644 +index 0000000..f49546a +--- /dev/null ++++ b/src/org.gnome.KrbAuthDialog.service.in +@@ -0,0 +1,3 @@ ++[D-BUS Service] ++Name=org.gnome.KrbAuthDialog ++Exec=@BINDIR@/krb5-auth-dialog -A +-- diff --git a/debian/patches/0003-add-preferences-dialog.patch b/debian/patches/0003-add-preferences-dialog.patch new file mode 100644 index 0000000..bd43749 --- /dev/null +++ b/debian/patches/0003-add-preferences-dialog.patch @@ -0,0 +1,1973 @@ +From: =?utf-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org> +Date: Thu, 2 Apr 2009 16:48:38 +0200 +Subject: [PATCH] add preferences dialog + +Closes: #521251 +--- + Makefile.am | 2 +- + configure.ac | 1 + + po/POTFILES.in | 5 +- + preferences/Makefile.am | 42 ++ + preferences/krb5-auth-dialog-preferences.c | 618 ++++++++++++++++++++ + .../krb5-auth-dialog-preferences.desktop.in | 12 + + preferences/krb5-auth-dialog-preferences.glade | 565 ++++++++++++++++++ + src/Makefile.am | 2 + + src/krb5-auth-applet.c | 83 +++- + src/krb5-auth-dialog.c | 49 ++- + src/krb5-auth-dialog.schemas.in | 39 ++ + src/krb5-auth-gconf-tools.c | 103 ++++ + src/krb5-auth-gconf-tools.h | 41 ++ + src/krb5-auth-gconf.c | 135 ++--- + 14 files changed, 1594 insertions(+), 103 deletions(-) + create mode 100644 preferences/Makefile.am + create mode 100644 preferences/krb5-auth-dialog-preferences.c + create mode 100644 preferences/krb5-auth-dialog-preferences.desktop.in + create mode 100644 preferences/krb5-auth-dialog-preferences.glade + create mode 100644 src/krb5-auth-gconf-tools.c + create mode 100644 src/krb5-auth-gconf-tools.h + +diff --git a/Makefile.am b/Makefile.am +index 51c4e5b..2be06e7 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -1,4 +1,4 @@ +-SUBDIRS = secmem gtksecentry src po etpo icons ++SUBDIRS = secmem gtksecentry src po etpo icons preferences + + EXTRA_DIST = \ + krb5-auth-dialog.spec +diff --git a/configure.ac b/configure.ac +index 89fb2fa..be95999 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -218,6 +218,7 @@ gtksecentry/Makefile + icons/Makefile + etpo/Makefile + po/Makefile.in ++preferences/Makefile + ]) + + AC_MSG_NOTICE([]) +diff --git a/po/POTFILES.in b/po/POTFILES.in +index 8ee65fd..70977d4 100644 +--- a/po/POTFILES.in ++++ b/po/POTFILES.in +@@ -4,6 +4,9 @@ src/krb5-auth-pwdialog.c + src/dummy-strings.c + src/krb5-auth-applet.c + src/krb5-auth-dialog.desktop.in ++src/krb5-auth-dialog.schemas.in + gtksecentry/gtksecentry.c + secmem/util.c +-src/krb5-auth-dialog.schemas.in ++preferences/krb5-auth-dialog-preferences.c ++preferences/krb5-auth-dialog-preferences.desktop.in ++preferences/krb5-auth-dialog-preferences.glade +diff --git a/preferences/Makefile.am b/preferences/Makefile.am +new file mode 100644 +index 0000000..83541ea +--- /dev/null ++++ b/preferences/Makefile.am +@@ -0,0 +1,42 @@ ++NULL = ++ ++INCLUDES = \ ++ -I $(top_srcdir)/src/ \ ++ -DKA_DATA_DIR=\""$(pkgdatadir)"\" \ ++ -DLOCALE_DIR=\""$(localedir)/"\" \ ++ $(NULL) ++ ++bin_PROGRAMS = krb5-auth-dialog-preferences ++ ++schemadir = $(sysconfdir)/gconf/schemas ++ ++krb5_auth_dialog_preferences_SOURCES = \ ++ krb5-auth-dialog-preferences.c \ ++ ../src/krb5-auth-gconf-tools.c \ ++ ../src/krb5-auth-gconf-tools.h \ ++ $(NULL) ++ ++krb5_auth_dialog_preferences_LDADD = \ ++ @GCONF_LIBS@ \ ++ @GLADE_LIBS@ \ ++ @GTK_LIBS@ \ ++ $(NULL) ++ ++desktopdir = $(datadir)/applications ++desktop_in_files = krb5-auth-dialog-preferences.desktop.in ++desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) ++ ++@INTLTOOL_DESKTOP_RULE@ ++ ++pkgdatadir = $(datadir)/krb5-auth-dialog ++pkgdata_DATA = \ ++ krb5-auth-dialog-preferences.glade ++ ++CLEANFILES = \ ++ $(desktop_DATA) \ ++ $(NULL) ++ ++EXTRA_DIST = \ ++ $(desktop_in_files) \ ++ $(pkgdata_DATA) \ ++ $(NULL) +diff --git a/preferences/krb5-auth-dialog-preferences.c b/preferences/krb5-auth-dialog-preferences.c +new file mode 100644 +index 0000000..e4d8a48 +--- /dev/null ++++ b/preferences/krb5-auth-dialog-preferences.c +@@ -0,0 +1,618 @@ ++/* ++ * Copyright (C) 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) ++ * any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ * ++ */ ++ ++#include "config.h" ++ ++#include <gtk/gtk.h> ++#include <glib/gi18n.h> ++#include <glade/glade.h> ++ ++#include "krb5-auth-gconf-tools.h" ++ ++#define N_LISTENERS 7 ++ ++typedef struct { ++ GladeXML *xml; ++ GConfClient *client; ++ ++ GtkWidget *dialog; ++ GtkWidget *principal_entry; ++ GtkWidget *pkuserid_entry; ++ GtkWidget *forwardable_toggle; ++ GtkWidget *proxiable_toggle; ++ GtkWidget *renewable_toggle; ++ GtkWidget *trayicon_toggle; ++ GtkWidget *prompt_mins_entry; ++ ++ guint listeners [N_LISTENERS]; ++ int n_listeners; ++} KaPreferencesDialog; ++ ++ ++static void ++ka_preferences_principal_notify (GConfClient *client G_GNUC_UNUSED, ++ guint cnx_id G_GNUC_UNUSED, ++ GConfEntry *entry, ++ KaPreferencesDialog *dialog) ++{ ++ const char *principal; ++ ++ if (!entry->value || entry->value->type != GCONF_VALUE_STRING) ++ return; ++ ++ principal = gconf_value_get_string (entry->value); ++ ++ if (!principal || !strlen(principal)) ++ gtk_entry_set_text (GTK_ENTRY (dialog->principal_entry), ""); ++ else { ++ const char *old_principal; ++ ++ old_principal = gtk_entry_get_text (GTK_ENTRY (dialog->principal_entry)); ++ if (!old_principal || (old_principal && strcmp (old_principal, principal))) ++ gtk_entry_set_text (GTK_ENTRY (dialog->principal_entry), principal); ++ } ++} ++ ++ ++static void ++ka_preferences_dialog_principal_changed (GtkEntry *entry, ++ KaPreferencesDialog *dialog) ++{ ++ const char *principal; ++ ++ principal = gtk_entry_get_text (entry); ++ ++ if (!principal || !strlen(principal)) ++ gconf_client_unset (dialog->client, KA_GCONF_KEY_PRINCIPAL, NULL); ++ else ++ gconf_client_set_string (dialog->client, KA_GCONF_KEY_PRINCIPAL, principal, NULL); ++} ++ ++ ++static void ++ka_preferences_dialog_setup_principal_entry (KaPreferencesDialog *dialog) ++{ ++ char *principal = NULL; ++ ++ dialog->principal_entry = glade_xml_get_widget (dialog->xml, "principal_entry"); ++ g_assert (dialog->principal_entry != NULL); ++ ++ if (!ka_gconf_get_string (dialog->client, KA_GCONF_KEY_PRINCIPAL, &principal)) ++ g_warning ("Getting principal failed"); ++ ++ if (principal && strlen(principal)) ++ gtk_entry_set_text (GTK_ENTRY (dialog->principal_entry), principal); ++ if (principal) ++ g_free (principal); ++ ++ g_signal_connect (dialog->principal_entry, "changed", ++ G_CALLBACK (ka_preferences_dialog_principal_changed), dialog); ++ ++ if (!gconf_client_key_is_writable (dialog->client, KA_GCONF_KEY_PRINCIPAL, NULL)) { ++ gtk_widget_set_sensitive (dialog->principal_entry, FALSE); ++ } ++ ++ dialog->listeners [dialog->n_listeners] = gconf_client_notify_add (dialog->client, ++ KA_GCONF_KEY_PRINCIPAL, ++ (GConfClientNotifyFunc) ka_preferences_principal_notify, ++ dialog, NULL, NULL); ++ dialog->n_listeners++; ++} ++ ++ ++static void ++ka_preferences_pkuserid_notify (GConfClient *client G_GNUC_UNUSED, ++ guint cnx_id G_GNUC_UNUSED, ++ GConfEntry *entry, ++ KaPreferencesDialog *dialog) ++{ ++ const char *pkuserid; ++ ++ if (!entry->value || entry->value->type != GCONF_VALUE_STRING) ++ return; ++ ++ pkuserid = gconf_value_get_string (entry->value); ++ ++ if (!pkuserid || !strlen(pkuserid)) ++ gtk_entry_set_text (GTK_ENTRY (dialog->pkuserid_entry), ""); ++ else { ++ const char *old_pkuserid; ++ ++ old_pkuserid = gtk_entry_get_text (GTK_ENTRY (dialog->pkuserid_entry)); ++ if (!old_pkuserid || (old_pkuserid && strcmp (old_pkuserid, pkuserid))) ++ gtk_entry_set_text (GTK_ENTRY (dialog->pkuserid_entry), pkuserid); ++ } ++} ++ ++ ++static void ++ka_preferences_dialog_pkuserid_changed (GtkEntry *entry, ++ KaPreferencesDialog *dialog) ++{ ++ const char *pkuserid; ++ ++ pkuserid = gtk_entry_get_text (entry); ++ ++ if (!pkuserid || !strlen(pkuserid)) ++ gconf_client_unset (dialog->client, KA_GCONF_KEY_PK_USERID, NULL); ++ else ++ gconf_client_set_string (dialog->client, KA_GCONF_KEY_PK_USERID, pkuserid, NULL); ++} ++ ++ ++static void ++ka_preferences_dialog_setup_pkuserid_entry (KaPreferencesDialog *dialog) ++{ ++ char *pkuserid = NULL; ++ ++ dialog->pkuserid_entry = glade_xml_get_widget (dialog->xml, "pkuserid_entry"); ++ g_assert (dialog->pkuserid_entry != NULL); ++ ++ if (!ka_gconf_get_string (dialog->client, KA_GCONF_KEY_PK_USERID, &pkuserid)) ++ g_warning ("Getting pkuserid failed"); ++ ++ if (pkuserid && strlen(pkuserid)) ++ gtk_entry_set_text (GTK_ENTRY (dialog->pkuserid_entry), pkuserid); ++ if (pkuserid) ++ g_free (pkuserid); ++ ++ g_signal_connect (dialog->pkuserid_entry, "changed", ++ G_CALLBACK (ka_preferences_dialog_pkuserid_changed), dialog); ++ if (!gconf_client_key_is_writable (dialog->client, KA_GCONF_KEY_PK_USERID, NULL)) { ++ gtk_widget_set_sensitive (dialog->pkuserid_entry, FALSE); ++ } ++ ++ dialog->listeners [dialog->n_listeners] = gconf_client_notify_add (dialog->client, ++ KA_GCONF_KEY_PK_USERID, ++ (GConfClientNotifyFunc) ka_preferences_pkuserid_notify, ++ dialog, NULL, NULL); ++ dialog->n_listeners++; ++} ++ ++ ++static void ++ka_preferences_dialog_forwardable_toggled (GtkToggleButton *toggle, ++ KaPreferencesDialog *dialog) ++{ ++ gboolean forwardable; ++ ++ forwardable = gtk_toggle_button_get_active (toggle); ++ ++ gconf_client_set_bool (dialog->client, KA_GCONF_KEY_FORWARDABLE, forwardable, NULL); ++} ++ ++ ++static void ++ka_preferences_dialog_forwardable_notify (GConfClient *client G_GNUC_UNUSED, ++ guint cnx_id G_GNUC_UNUSED, ++ GConfEntry *entry, ++ KaPreferencesDialog *dialog) ++{ ++ gboolean forwardable; ++ ++ if (!entry->value || entry->value->type != GCONF_VALUE_BOOL) ++ return; ++ ++ forwardable = gconf_value_get_bool (entry->value) != FALSE; ++ ++ if (forwardable != gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->forwardable_toggle))) ++ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->forwardable_toggle), forwardable); ++} ++ ++ ++static gboolean ++ka_preferences_dialog_setup_forwardable_toggle (KaPreferencesDialog *dialog) ++{ ++ gboolean forwardable; ++ ++ dialog->forwardable_toggle = glade_xml_get_widget (dialog->xml, "forwardable_toggle"); ++ g_assert (dialog->forwardable_toggle != NULL); ++ ++ forwardable = gconf_client_get_bool (dialog->client, KA_GCONF_KEY_FORWARDABLE, NULL); ++ ++ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->forwardable_toggle), forwardable); ++ ++ g_signal_connect (dialog->forwardable_toggle, "toggled", ++ G_CALLBACK (ka_preferences_dialog_forwardable_toggled), dialog); ++ ++ if (!gconf_client_key_is_writable (dialog->client, KA_GCONF_KEY_FORWARDABLE, NULL)) { ++ gtk_widget_set_sensitive (dialog->forwardable_toggle, FALSE); ++ } ++ ++ dialog->listeners [dialog->n_listeners] = gconf_client_notify_add (dialog->client, ++ KA_GCONF_KEY_FORWARDABLE, ++ (GConfClientNotifyFunc) ka_preferences_dialog_forwardable_notify, ++ dialog, NULL, NULL); ++ dialog->n_listeners++; ++ return forwardable; ++} ++ ++ ++static void ++ka_preferences_dialog_proxiable_toggled (GtkToggleButton *toggle, ++ KaPreferencesDialog *dialog) ++{ ++ gboolean proxiable; ++ ++ proxiable = gtk_toggle_button_get_active (toggle); ++ ++ gconf_client_set_bool (dialog->client, KA_GCONF_KEY_PROXIABLE, proxiable, NULL); ++} ++ ++ ++static void ++ka_preferences_dialog_proxiable_notify (GConfClient *client G_GNUC_UNUSED, ++ guint cnx_id G_GNUC_UNUSED, ++ GConfEntry *entry, ++ KaPreferencesDialog *dialog) ++{ ++ gboolean proxiable; ++ ++ if (!entry->value || entry->value->type != GCONF_VALUE_BOOL) ++ return; ++ ++ proxiable = gconf_value_get_bool (entry->value) != FALSE; ++ ++ if (proxiable != gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->proxiable_toggle))) ++ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->proxiable_toggle), proxiable); ++} ++ ++ ++static gboolean ++ka_preferences_dialog_setup_proxiable_toggle (KaPreferencesDialog *dialog) ++{ ++ gboolean proxiable; ++ ++ dialog->proxiable_toggle = glade_xml_get_widget (dialog->xml, "proxiable_toggle"); ++ g_assert (dialog->proxiable_toggle != NULL); ++ ++ proxiable = gconf_client_get_bool (dialog->client, KA_GCONF_KEY_PROXIABLE, NULL); ++ ++ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->proxiable_toggle), proxiable); ++ ++ g_signal_connect (dialog->proxiable_toggle, "toggled", ++ G_CALLBACK (ka_preferences_dialog_proxiable_toggled), dialog); ++ ++ if (!gconf_client_key_is_writable (dialog->client, KA_GCONF_KEY_PROXIABLE, NULL)) { ++ gtk_widget_set_sensitive (dialog->proxiable_toggle, FALSE); ++ } ++ ++ dialog->listeners [dialog->n_listeners] = gconf_client_notify_add (dialog->client, ++ KA_GCONF_KEY_PROXIABLE, ++ (GConfClientNotifyFunc) ka_preferences_dialog_proxiable_notify, ++ dialog, NULL, NULL); ++ dialog->n_listeners++; ++ return proxiable; ++} ++ ++ ++static void ++ka_preferences_dialog_renewable_toggled (GtkToggleButton *toggle, ++ KaPreferencesDialog *dialog) ++{ ++ gboolean renewable; ++ ++ renewable = gtk_toggle_button_get_active (toggle); ++ ++ gconf_client_set_bool (dialog->client, KA_GCONF_KEY_RENEWABLE, renewable, NULL); ++} ++ ++ ++static void ++ka_preferences_dialog_renewable_notify (GConfClient *client G_GNUC_UNUSED, ++ guint cnx_id G_GNUC_UNUSED, ++ GConfEntry *entry, ++ KaPreferencesDialog *dialog) ++{ ++ gboolean renewable; ++ ++ if (!entry->value || entry->value->type != GCONF_VALUE_BOOL) ++ return; ++ ++ renewable = gconf_value_get_bool (entry->value) != FALSE; ++ ++ if (renewable != gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->renewable_toggle))) ++ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->renewable_toggle), renewable); ++} ++ ++ ++static gboolean ++ka_preferences_dialog_setup_renewable_toggle (KaPreferencesDialog *dialog) ++{ ++ gboolean renewable; ++ ++ dialog->renewable_toggle = glade_xml_get_widget (dialog->xml, "renewable_toggle"); ++ g_assert (dialog->renewable_toggle != NULL); ++ ++ renewable = gconf_client_get_bool (dialog->client, KA_GCONF_KEY_RENEWABLE, NULL); ++ ++ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->renewable_toggle), renewable); ++ ++ g_signal_connect (dialog->renewable_toggle, "toggled", ++ G_CALLBACK (ka_preferences_dialog_renewable_toggled), dialog); ++ ++ if (!gconf_client_key_is_writable (dialog->client, KA_GCONF_KEY_RENEWABLE, NULL)) { ++ gtk_widget_set_sensitive (dialog->renewable_toggle, FALSE); ++ } ++ ++ dialog->listeners [dialog->n_listeners] = gconf_client_notify_add (dialog->client, ++ KA_GCONF_KEY_RENEWABLE, ++ (GConfClientNotifyFunc) ka_preferences_dialog_renewable_notify, ++ dialog, NULL, NULL); ++ dialog->n_listeners++; ++ return renewable; ++} ++ ++static void ++ka_preferences_dialog_trayicon_toggled (GtkToggleButton *toggle, ++ KaPreferencesDialog *dialog) ++{ ++ gboolean trayicon; ++ ++ trayicon = gtk_toggle_button_get_active (toggle); ++ gconf_client_set_bool (dialog->client, KA_GCONF_KEY_SHOW_TRAYICON, trayicon, NULL); ++} ++ ++ ++static void ++ka_preferences_dialog_trayicon_notify (GConfClient *client G_GNUC_UNUSED, ++ guint cnx_id G_GNUC_UNUSED, ++ GConfEntry *entry, ++ KaPreferencesDialog *dialog) ++{ ++ gboolean trayicon; ++ ++ if (!entry->value || entry->value->type != GCONF_VALUE_BOOL) ++ return; ++ ++ trayicon = gconf_value_get_bool (entry->value) != FALSE; ++ ++ if (trayicon != gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->trayicon_toggle))) ++ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->trayicon_toggle), trayicon); ++} ++ ++ ++static gboolean ++ka_preferences_dialog_setup_trayicon_toggle (KaPreferencesDialog *dialog) ++{ ++ gboolean trayicon; ++ ++ dialog->trayicon_toggle = glade_xml_get_widget (dialog->xml, "trayicon_toggle"); ++ g_assert (dialog->trayicon_toggle != NULL); ++ ++ trayicon = gconf_client_get_bool (dialog->client, KA_GCONF_KEY_SHOW_TRAYICON, NULL); ++ ++ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->trayicon_toggle), trayicon); ++ ++ g_signal_connect (dialog->trayicon_toggle, "toggled", ++ G_CALLBACK (ka_preferences_dialog_trayicon_toggled), dialog); ++ ++ if (!gconf_client_key_is_writable (dialog->client, KA_GCONF_KEY_SHOW_TRAYICON, NULL)) { ++ gtk_widget_set_sensitive (dialog->trayicon_toggle, FALSE); ++ } ++ ++ dialog->listeners [dialog->n_listeners] = gconf_client_notify_add (dialog->client, ++ KA_GCONF_KEY_SHOW_TRAYICON, ++ (GConfClientNotifyFunc) ka_preferences_dialog_trayicon_notify, ++ dialog, NULL, NULL); ++ dialog->n_listeners++; ++ return trayicon; ++} ++ ++ ++static void ++ka_preferences_dialog_prompt_mins_changed (GtkSpinButton *button, ++ KaPreferencesDialog *dialog) ++{ ++ gint prompt_mins; ++ ++ prompt_mins = gtk_spin_button_get_value_as_int (button); ++ gconf_client_set_int (dialog->client, KA_GCONF_KEY_PROMPT_MINS, prompt_mins, NULL); ++} ++ ++ ++static void ++ka_preferences_dialog_prompt_mins_notify (GConfClient *client G_GNUC_UNUSED, ++ guint cnx_id G_GNUC_UNUSED, ++ GConfEntry *entry, ++ KaPreferencesDialog *dialog) ++{ ++ gint prompt_mins; ++ ++ if (!entry->value || entry->value->type != GCONF_VALUE_INT) ++ return; ++ ++ prompt_mins = gconf_value_get_int (entry->value); ++ ++ if (prompt_mins != gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (dialog->prompt_mins_entry))) ++ gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->prompt_mins_entry), prompt_mins); ++} ++ ++ ++static gint ++ka_preferences_dialog_setup_prompt_mins_entry (KaPreferencesDialog *dialog) ++{ ++ gint prompt_mins; ++ ++ dialog->prompt_mins_entry = glade_xml_get_widget (dialog->xml, "prompt_mins_entry"); ++ g_assert (dialog->prompt_mins_entry != NULL); ++ ++ prompt_mins = gconf_client_get_int (dialog->client, KA_GCONF_KEY_PROMPT_MINS, NULL); ++ ++ gtk_spin_button_set_value (GTK_SPIN_BUTTON (dialog->prompt_mins_entry), prompt_mins); ++ ++ g_signal_connect (dialog->prompt_mins_entry, "value-changed", ++ G_CALLBACK (ka_preferences_dialog_prompt_mins_changed), dialog); ++ ++ if (!gconf_client_key_is_writable (dialog->client, KA_GCONF_KEY_PROMPT_MINS, NULL)) { ++ gtk_widget_set_sensitive (dialog->prompt_mins_entry, FALSE); ++ } ++ ++ dialog->listeners [dialog->n_listeners] = gconf_client_notify_add (dialog->client, ++ KA_GCONF_KEY_PROMPT_MINS, ++ (GConfClientNotifyFunc) ka_preferences_dialog_prompt_mins_notify, ++ dialog, NULL, NULL); ++ dialog->n_listeners++; ++ return prompt_mins; ++} ++ ++ ++ ++static void ++ka_preferences_dialog_response (GtkWidget *widget, ++ int response, ++ KaPreferencesDialog *dialog) ++{ ++ GError *error = NULL; ++ ++ if (response != GTK_RESPONSE_HELP) { ++ gtk_widget_destroy (widget); ++ return; ++ } ++ ++ gtk_show_uri (gtk_window_get_screen (GTK_WINDOW (dialog->dialog)), ++ "ghelp:krb5-auth-dialog#preferences", ++ gtk_get_current_event_time (), &error); ++ ++ if (error) { ++ GtkWidget *message_dialog; ++ ++ ++ message_dialog = gtk_message_dialog_new (GTK_WINDOW (dialog->dialog), ++ GTK_DIALOG_DESTROY_WITH_PARENT, ++ GTK_MESSAGE_ERROR, ++ GTK_BUTTONS_CLOSE, ++ _("There was an error displaying help:\n%s"), ++ error->message); ++ gtk_window_set_resizable (GTK_WINDOW (message_dialog), FALSE); ++ ++ g_signal_connect (message_dialog, "response", ++ G_CALLBACK (gtk_widget_destroy), ++ NULL); ++ ++ gtk_widget_show (message_dialog); ++ g_error_free (error); ++ } ++} ++ ++ ++static void ++ka_preferences_dialog_destroyed (GtkWidget *widget G_GNUC_UNUSED, ++ KaPreferencesDialog *dialog) ++{ ++ dialog->dialog = NULL; ++ ++ gtk_main_quit (); ++} ++ ++ ++static gboolean ++ka_preferences_dialog_init(KaPreferencesDialog* dialog) ++{ ++ dialog->xml = glade_xml_new (KA_DATA_DIR G_DIR_SEPARATOR_S ++ PACKAGE "-preferences.glade", NULL, NULL); ++ ++ dialog->dialog = glade_xml_get_widget (dialog->xml, "krb5_auth_dialog_prefs"); ++ g_assert (dialog->dialog); ++ ++ g_signal_connect (dialog->dialog, "response", ++ G_CALLBACK (ka_preferences_dialog_response), dialog); ++ g_signal_connect (dialog->dialog, "destroy", ++ G_CALLBACK (ka_preferences_dialog_destroyed), dialog); ++ ++ dialog->client = gconf_client_get_default (); ++ gconf_client_add_dir (dialog->client, KA_GCONF_PATH, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); ++ ++ ka_preferences_dialog_setup_principal_entry (dialog); ++ ka_preferences_dialog_setup_pkuserid_entry (dialog); ++ ka_preferences_dialog_setup_forwardable_toggle (dialog); ++ ka_preferences_dialog_setup_proxiable_toggle (dialog); ++ ka_preferences_dialog_setup_renewable_toggle (dialog); ++ ka_preferences_dialog_setup_trayicon_toggle (dialog); ++ ka_preferences_dialog_setup_prompt_mins_entry (dialog); ++ ++ g_assert (dialog->n_listeners == N_LISTENERS); ++ ++ gtk_widget_show (dialog->dialog); ++ return TRUE; ++} ++ ++ ++static void ++ka_preferences_dialog_finalize (KaPreferencesDialog *dialog) ++{ ++ if (dialog->dialog) ++ gtk_widget_destroy (dialog->dialog); ++ dialog->dialog = NULL; ++ ++ if (dialog->client) { ++ int i; ++ ++ for (i = 0; i < dialog->n_listeners; i++) { ++ if (dialog->listeners [i]) ++ gconf_client_notify_remove (dialog->client, dialog->listeners [i]); ++ dialog->listeners [i] = 0; ++ } ++ dialog->n_listeners = 0; ++ ++ gconf_client_remove_dir (dialog->client, KA_GCONF_PATH, NULL); ++ ++ g_object_unref (dialog->client); ++ dialog->client = NULL; ++ } ++ ++ if (dialog->xml) ++ g_object_unref (dialog->xml); ++ dialog->xml = NULL; ++} ++ ++int ++main (int argc, char *argv[]) ++{ ++ GOptionContext *context; ++ GError *error = NULL; ++ KaPreferencesDialog dialog = { NULL, }; ++ ++ const char *help_msg = "Run '" PACKAGE " --help' to see a full list of available command line options"; ++ const GOptionEntry options [] = { ++ { NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL } ++ }; ++ ++ context = g_option_context_new ("- Kerberos Authentication Configuration"); ++ g_option_context_add_main_entries (context, options, NULL); ++ g_option_context_add_group (context, gtk_get_option_group (TRUE)); ++ g_option_context_parse (context, &argc, &argv, &error); ++ if (error) { ++ g_print ("%s\n%s\n", ++ error->message, ++ help_msg); ++ g_error_free (error); ++ return 1; ++ } ++ textdomain (PACKAGE); ++ bind_textdomain_codeset (PACKAGE, "UTF-8"); ++ bindtextdomain (PACKAGE, LOCALE_DIR); ++ ++ g_set_application_name (_("Kerberos Authentication Configuration")); ++ ++ ka_preferences_dialog_init(&dialog); ++ gtk_main (); ++ ka_preferences_dialog_finalize(&dialog); ++ return 0; ++} +diff --git a/preferences/krb5-auth-dialog-preferences.desktop.in b/preferences/krb5-auth-dialog-preferences.desktop.in +new file mode 100644 +index 0000000..d87e1e7 +--- /dev/null ++++ b/preferences/krb5-auth-dialog-preferences.desktop.in +@@ -0,0 +1,12 @@ ++[Desktop Entry] ++_Name=Network Authentication ++_Comment=Set your Kerberos network authenticaion preferences ++Exec=krb5-auth-dialog-preferences ++Icon=gtk-dialog-authentication ++Terminal=false ++Type=Application ++StartupNotify=true ++Categories=GNOME;GTK;Settings;X-GNOME-NetworkSettings; ++OnlyShowIn=GNOME; ++X-GNOME-Bugzilla-Bugzilla=GNOME ++X-GNOME-Bugzilla-Product=krb5-auth-dialog +diff --git a/preferences/krb5-auth-dialog-preferences.glade b/preferences/krb5-auth-dialog-preferences.glade +new file mode 100644 +index 0000000..128229d +--- /dev/null ++++ b/preferences/krb5-auth-dialog-preferences.glade +@@ -0,0 +1,565 @@ ++<?xml version="1.0" encoding="UTF-8" standalone="no"?> ++<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> ++<!--Generated with glade3 3.4.5 on Thu Apr 2 16:29:44 2009 --> ++<glade-interface> ++ <widget class="GtkDialog" id="krb5_auth_dialog_prefs"> ++ <property name="border_width">5</property> ++ <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property> ++ <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> ++ <property name="has_separator">False</property> ++ <child internal-child="vbox"> ++ <widget class="GtkVBox" id="dialog-vbox1"> ++ <property name="visible">True</property> ++ <property name="spacing">2</property> ++ <child> ++ <widget class="GtkNotebook" id="notebook1"> ++ <property name="visible">True</property> ++ <property name="can_focus">True</property> ++ <child> ++ <widget class="GtkVBox" id="vbox1"> ++ <property name="visible">True</property> ++ <property name="border_width">12</property> ++ <property name="spacing">18</property> ++ <child> ++ <widget class="GtkVBox" id="vbox2"> ++ <property name="visible">True</property> ++ <property name="spacing">12</property> ++ <child> ++ <widget class="GtkLabel" id="label4"> ++ <property name="visible">True</property> ++ <property name="xalign">0</property> ++ <property name="label" translatable="yes"><b>Kerberos User</b></property> ++ <property name="use_markup">True</property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkHBox" id="hbox1"> ++ <property name="visible">True</property> ++ <property name="spacing">12</property> ++ <child> ++ <widget class="GtkImage" id="access"> ++ <property name="visible">True</property> ++ <property name="yalign">0</property> ++ <property name="icon_size">6</property> ++ <property name="icon_name">gtk-dialog-authentication</property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkVBox" id="vbox5"> ++ <property name="visible">True</property> ++ <property name="spacing">6</property> ++ <child> ++ <widget class="GtkLabel" id="label6"> ++ <property name="visible">True</property> ++ <property name="xalign">0</property> ++ <property name="label" translatable="yes">Kerberos principal:</property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkHBox" id="hbox5"> ++ <property name="visible">True</property> ++ <property name="spacing">6</property> ++ <child> ++ <widget class="GtkLabel" id="label8"> ++ <property name="visible">True</property> ++ <property name="label" translatable="yes"> </property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkEntry" id="principal_entry"> ++ <property name="visible">True</property> ++ <property name="can_focus">True</property> ++ </widget> ++ <packing> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkLabel" id="label7"> ++ <property name="visible">True</property> ++ <property name="xalign">0</property> ++ <property name="label" translatable="yes">Pkinit userid: </property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ <property name="position">2</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkHBox" id="hbox6"> ++ <property name="visible">True</property> ++ <property name="spacing">6</property> ++ <child> ++ <widget class="GtkLabel" id="label9"> ++ <property name="visible">True</property> ++ <property name="label" translatable="yes"> </property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkEntry" id="pkuserid_entry"> ++ <property name="visible">True</property> ++ <property name="can_focus">True</property> ++ </widget> ++ <packing> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="position">3</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkVBox" id="vbox3"> ++ <property name="visible">True</property> ++ <property name="spacing">12</property> ++ <child> ++ <widget class="GtkLabel" id="label5"> ++ <property name="visible">True</property> ++ <property name="xalign">0</property> ++ <property name="label" translatable="yes"><b>Ticket Options</b></property> ++ <property name="use_markup">True</property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkHBox" id="hbox2"> ++ <property name="visible">True</property> ++ <property name="spacing">12</property> ++ <child> ++ <widget class="GtkImage" id="image1"> ++ <property name="visible">True</property> ++ <property name="yalign">0</property> ++ <property name="icon_size">6</property> ++ <property name="icon_name">system-lock-screen</property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkVBox" id="vbox4"> ++ <property name="visible">True</property> ++ <property name="spacing">6</property> ++ <child> ++ <widget class="GtkLabel" id="label10"> ++ <property name="visible">True</property> ++ <property name="label" translatable="yes">Requested Kerberos tickets should be:</property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkHBox" id="hbox3"> ++ <property name="visible">True</property> ++ <child> ++ <widget class="GtkLabel" id="label11"> ++ <property name="visible">True</property> ++ <property name="label" translatable="yes"> </property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkCheckButton" id="forwardable_toggle"> ++ <property name="visible">True</property> ++ <property name="can_focus">True</property> ++ <property name="label" translatable="yes">forwardable</property> ++ <property name="response_id">0</property> ++ <property name="draw_indicator">True</property> ++ </widget> ++ <packing> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkHBox" id="hbox4"> ++ <property name="visible">True</property> ++ <child> ++ <widget class="GtkLabel" id="label12"> ++ <property name="visible">True</property> ++ <property name="label" translatable="yes"> </property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkCheckButton" id="renewable_toggle"> ++ <property name="visible">True</property> ++ <property name="can_focus">True</property> ++ <property name="label" translatable="yes">renewable</property> ++ <property name="response_id">0</property> ++ <property name="draw_indicator">True</property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="position">2</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkHBox" id="hbox11"> ++ <property name="visible">True</property> ++ <child> ++ <widget class="GtkLabel" id="label19"> ++ <property name="visible">True</property> ++ <property name="label" translatable="yes"> </property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkCheckButton" id="proxiable_toggle"> ++ <property name="visible">True</property> ++ <property name="can_focus">True</property> ++ <property name="label" translatable="yes">proxiable</property> ++ <property name="response_id">0</property> ++ <property name="draw_indicator">True</property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="position">3</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ </child> ++ <child> ++ <widget class="GtkLabel" id="label1"> ++ <property name="visible">True</property> ++ <property name="label" translatable="yes">Kerberos</property> ++ </widget> ++ <packing> ++ <property name="type">tab</property> ++ <property name="tab_fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkVBox" id="vbox9"> ++ <property name="visible">True</property> ++ <property name="border_width">12</property> ++ <property name="spacing">18</property> ++ <child> ++ <widget class="GtkVBox" id="vbox8"> ++ <property name="visible">True</property> ++ <property name="spacing">12</property> ++ <child> ++ <widget class="GtkLabel" id="label17"> ++ <property name="visible">True</property> ++ <property name="xalign">0</property> ++ <property name="label" translatable="yes"><b>Notifications</b></property> ++ <property name="use_markup">True</property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkHBox" id="hbox9"> ++ <property name="visible">True</property> ++ <property name="spacing">12</property> ++ <child> ++ <widget class="GtkImage" id="image3"> ++ <property name="visible">True</property> ++ <property name="yalign">0</property> ++ <property name="stock">gtk-dialog-warning</property> ++ <property name="icon_size">6</property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkHBox" id="hbox8"> ++ <property name="visible">True</property> ++ <property name="spacing">6</property> ++ <child> ++ <widget class="GtkLabel" id="label14"> ++ <property name="visible">True</property> ++ <property name="label" translatable="yes"> </property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkLabel" id="label15"> ++ <property name="visible">True</property> ++ <property name="label" translatable="yes">Warn every</property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkSpinButton" id="prompt_mins_entry"> ++ <property name="visible">True</property> ++ <property name="can_focus">True</property> ++ <property name="adjustment">0 0 100 1 10 10</property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ <property name="position">2</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkLabel" id="label16"> ++ <property name="visible">True</property> ++ <property name="label" translatable="yes">minutes</property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ <property name="position">3</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkVBox" id="vbox10"> ++ <property name="visible">True</property> ++ <property name="spacing">12</property> ++ <child> ++ <widget class="GtkLabel" id="label18"> ++ <property name="visible">True</property> ++ <property name="xalign">0</property> ++ <property name="label" translatable="yes"><b>Appearance</b></property> ++ <property name="use_markup">True</property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkHBox" id="hbox10"> ++ <property name="visible">True</property> ++ <property name="spacing">12</property> ++ <child> ++ <widget class="GtkImage" id="image2"> ++ <property name="visible">True</property> ++ <property name="xalign">0</property> ++ <property name="yalign">0</property> ++ <property name="stock">gtk-zoom-in</property> ++ <property name="icon_size">6</property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkVBox" id="vbox7"> ++ <property name="visible">True</property> ++ <child> ++ <widget class="GtkHBox" id="hbox7"> ++ <property name="visible">True</property> ++ <property name="spacing">6</property> ++ <child> ++ <widget class="GtkLabel" id="label13"> ++ <property name="visible">True</property> ++ <property name="label" translatable="yes"> </property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkCheckButton" id="trayicon_toggle"> ++ <property name="visible">True</property> ++ <property name="can_focus">True</property> ++ <property name="label" translatable="yes">Show tray icon</property> ++ <property name="response_id">0</property> ++ <property name="draw_indicator">True</property> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ </child> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="fill">False</property> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ <child> ++ <widget class="GtkLabel" id="label2"> ++ <property name="visible">True</property> ++ <property name="label" translatable="yes">Applet</property> ++ </widget> ++ <packing> ++ <property name="type">tab</property> ++ <property name="position">1</property> ++ <property name="tab_fill">False</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ <child internal-child="action_area"> ++ <widget class="GtkHButtonBox" id="dialog-action_area1"> ++ <property name="visible">True</property> ++ <property name="layout_style">GTK_BUTTONBOX_END</property> ++ <child> ++ <widget class="GtkButton" id="button2"> ++ <property name="can_focus">True</property> ++ <property name="receives_default">True</property> ++ <property name="label" translatable="yes">gtk-help</property> ++ <property name="use_stock">True</property> ++ <property name="response_id">-11</property> ++ </widget> ++ </child> ++ <child> ++ <widget class="GtkButton" id="button1"> ++ <property name="visible">True</property> ++ <property name="can_focus">True</property> ++ <property name="receives_default">True</property> ++ <property name="label" translatable="yes">gtk-close</property> ++ <property name="use_stock">True</property> ++ <property name="response_id">0</property> ++ </widget> ++ <packing> ++ <property name="position">1</property> ++ </packing> ++ </child> ++ </widget> ++ <packing> ++ <property name="expand">False</property> ++ <property name="pack_type">GTK_PACK_END</property> ++ </packing> ++ </child> ++ </widget> ++ </child> ++ </widget> ++</glade-interface> +diff --git a/src/Makefile.am b/src/Makefile.am +index 1c74c84..4c16102 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -33,6 +33,8 @@ krb5_auth_dialog_SOURCES = \ + krb5-auth-pwdialog.h \ + krb5-auth-gconf.c \ + krb5-auth-gconf.h \ ++ krb5-auth-gconf-tools.c \ ++ krb5-auth-gconf-tools.h \ + krb5-auth-dbus.c \ + krb5-auth-dbus.h \ + dummy-strings.c +diff --git a/src/krb5-auth-applet.c b/src/krb5-auth-applet.c +index 34524df..daaef2e 100644 +--- a/src/krb5-auth-applet.c ++++ b/src/krb5-auth-applet.c +@@ -43,6 +43,9 @@ enum + KA_PROP_PK_USERID, + KA_PROP_TRAYICON, + KA_PROP_PW_PROMPT_MINS, ++ KA_PROP_TGT_FORWARDABLE, ++ KA_PROP_TGT_PROXIABLE, ++ KA_PROP_TGT_RENEWABLE, + }; + + struct _KaApplet { +@@ -73,6 +76,9 @@ struct _KaAppletPrivate + char* principal; /* the principal to request */ + gboolean renewable; /* credentials renewable? */ + char* pk_userid; /* "userid" for pkint */ ++ gboolean tgt_forwardable; /* request a forwardable ticket */ ++ gboolean tgt_renewable; /* request a renewable ticket */ ++ gboolean tgt_proxiable; /* request a proxiable ticket */ + }; + + static void +@@ -106,6 +112,21 @@ ka_applet_set_property (GObject *object, + KA_DEBUG ("%s: %d", pspec->name, self->priv->pw_prompt_secs/60); + break; + ++ case KA_PROP_TGT_FORWARDABLE: ++ self->priv->tgt_forwardable = g_value_get_boolean (value); ++ KA_DEBUG ("%s: %s", pspec->name, self->priv->tgt_forwardable ? "True" : "False"); ++ break; ++ ++ case KA_PROP_TGT_PROXIABLE: ++ self->priv->tgt_proxiable = g_value_get_boolean (value); ++ KA_DEBUG ("%s: %s", pspec->name, self->priv->tgt_proxiable ? "True" : "False"); ++ break; ++ ++ case KA_PROP_TGT_RENEWABLE: ++ self->priv->tgt_renewable = g_value_get_boolean (value); ++ KA_DEBUG ("%s: %s", pspec->name, self->priv->tgt_renewable ? "True" : "False"); ++ break; ++ + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +@@ -139,6 +160,18 @@ ka_applet_get_property (GObject *object, + g_value_set_uint (value, self->priv->pw_prompt_secs / 60); + break; + ++ case KA_PROP_TGT_FORWARDABLE: ++ g_value_set_boolean (value, self->priv->tgt_forwardable); ++ break; ++ ++ case KA_PROP_TGT_PROXIABLE: ++ g_value_set_boolean (value, self->priv->tgt_proxiable); ++ break; ++ ++ case KA_PROP_TGT_RENEWABLE: ++ g_value_set_boolean (value, self->priv->tgt_renewable); ++ break; ++ + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; +@@ -203,7 +236,7 @@ ka_applet_class_init(KaAppletClass *klass) + + pspec = g_param_spec_string ("principal", + "Principal", +- "Get/Set Kerberos Principal", ++ "Get/Set Kerberos principal", + "", + G_PARAM_CONSTRUCT | G_PARAM_READWRITE); + g_object_class_install_property (object_class, +@@ -211,7 +244,7 @@ ka_applet_class_init(KaAppletClass *klass) + pspec); + + pspec = g_param_spec_string ("pk-userid", +- "PKinit Identifier", ++ "PKinit identifier", + "Get/Set Pkinit identifier", + "", + G_PARAM_CONSTRUCT | G_PARAM_READWRITE); +@@ -229,13 +262,40 @@ ka_applet_class_init(KaAppletClass *klass) + pspec); + + pspec = g_param_spec_uint ("pw-prompt-mins", +- "Password Prompting Interval", +- "Password Prompting Interval in Minutes", ++ "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); ++ ++ pspec = g_param_spec_boolean("tgt-forwardable", ++ "Forwardable ticket", ++ "wether to request forwardable tickets", ++ FALSE, ++ G_PARAM_CONSTRUCT | G_PARAM_READWRITE); ++ g_object_class_install_property (object_class, ++ KA_PROP_TGT_FORWARDABLE, ++ pspec); ++ ++ pspec = g_param_spec_boolean("tgt-proxiable", ++ "Proxiable ticket", ++ "wether to request proxiable tickets", ++ FALSE, ++ G_PARAM_CONSTRUCT | G_PARAM_READWRITE); ++ g_object_class_install_property (object_class, ++ KA_PROP_TGT_PROXIABLE, ++ pspec); ++ ++ pspec = g_param_spec_boolean("tgt-renewable", ++ "Renewable ticket", ++ "wether to request renewable tickets", ++ FALSE, ++ G_PARAM_CONSTRUCT | G_PARAM_READWRITE); ++ g_object_class_install_property (object_class, ++ KA_PROP_TGT_RENEWABLE, ++ pspec); + } + + +@@ -372,6 +432,13 @@ ka_applet_menu_add_separator_item (GtkWidget* menu) + gtk_widget_show (menu_item); + } + ++static void ++ka_applet_cb_preferences (GtkWidget* menuitem G_GNUC_UNUSED, ++ gpointer user_data G_GNUC_UNUSED) ++{ ++ g_spawn_command_line_async ("krb5-auth-dialog-preferences", NULL); ++} ++ + + /* Free all resources and quit */ + static void +@@ -421,6 +488,14 @@ ka_applet_create_context_menu (KaApplet* applet) + + ka_applet_menu_add_separator_item (menu); + ++ /* Preferences */ ++ menu_item = gtk_image_menu_item_new_with_mnemonic (_("_Preferences")); ++ g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (ka_applet_cb_preferences), applet); ++ image = gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, 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); ++ ++ + /* About item */ + menu_item = gtk_image_menu_item_new_with_mnemonic (_("_About")); + g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (ka_applet_cb_about_dialog), applet); +diff --git a/src/krb5-auth-dialog.c b/src/krb5-auth-dialog.c +index be6c29f..6b48d2b 100644 +--- a/src/krb5-auth-dialog.c ++++ b/src/krb5-auth-dialog.c +@@ -378,9 +378,40 @@ out: + } + + ++/* ++ * set ticket options by looking at krb5.conf and gconf ++ */ ++static void ++ka_set_ticket_options(KaApplet* applet, ++ krb5_get_init_creds_opt *out) ++{ ++ gboolean flag; ++ ++#ifdef HAVE_KRB5_GET_INIT_CREDS_OPT_SET_DEFAULT_FLAGS ++ krb5_get_init_creds_opt_set_default_flags(kcontext, PACKAGE, ++ krb5_principal_get_realm(kcontext, kprincipal), out); ++#endif ++ g_object_get(applet, "tgt-forwardable", &flag, NULL); ++ if (flag) ++ krb5_get_init_creds_opt_set_forwardable(out, flag); ++ g_object_get(applet, "tgt-proxiable", &flag, NULL); ++ if (flag) ++ krb5_get_init_creds_opt_set_proxiable(out, flag); ++ g_object_get(applet, "tgt-renewable", &flag, NULL); ++ if (flag) { ++ krb5_deltat r = 3600*24*30; /* 1 month */ ++ krb5_get_init_creds_opt_set_renew_life (out, r); ++ } ++} ++ ++ ++/* ++ * set ticket options ++ * by looking at krb5.conf, the passed in creds and gconf ++ */ + static void + set_options_from_creds(const KaApplet* applet, +- krb5_context context G_GNUC_UNUSED, ++ krb5_context context, + krb5_creds *in, + krb5_get_init_creds_opt *out) + { +@@ -388,8 +419,8 @@ set_options_from_creds(const KaApplet* applet, + int flag; + + #ifdef HAVE_KRB5_GET_INIT_CREDS_OPT_SET_DEFAULT_FLAGS +- krb5_get_init_creds_opt_set_default_flags(kcontext, PACKAGE, +- krb5_principal_get_realm(kcontext, kprincipal), out); ++ krb5_get_init_creds_opt_set_default_flags(context, PACKAGE, ++ krb5_principal_get_realm(context, kprincipal), out); + #endif + + flag = get_cred_forwardable(in) != 0; +@@ -426,7 +457,7 @@ ka_auth_pkinit(KaApplet* applet, krb5_creds* creds, const char* pk_userid) + retval = krb5_get_init_creds_opt_alloc (kcontext, &opts); + if (retval) + goto out; +- set_options_from_creds (applet, kcontext, creds, opts); ++ ka_set_ticket_options (applet, opts); + + retval = krb5_get_init_creds_opt_set_pkinit(kcontext, opts, + kprincipal, +@@ -461,7 +492,7 @@ ka_auth_password(KaApplet* applet, krb5_creds* creds) + retval = krb5_get_init_creds_opt_alloc (kcontext, &opts); + if (retval) + goto out; +- set_options_from_creds (applet, kcontext, creds, opts); ++ ka_set_ticket_options (applet, opts); + retval = krb5_get_init_creds_password(kcontext, creds, kprincipal, + NULL, auth_dialog_prompter, applet, + 0, NULL, opts); +@@ -477,9 +508,7 @@ ka_parse_name(KaApplet* applet, krb5_context krbcontext, krb5_principal* kprinc) + krb5_error_code ret; + gchar *principal = NULL; + +- g_object_get(applet, "principal", &principal, +- NULL); +- ++ g_object_get(applet, "principal", &principal, NULL); + ret = krb5_parse_name(krbcontext, principal, + kprinc); + +@@ -773,8 +802,7 @@ ka_check_credentials (KaApplet *applet, const char* newprincipal) + int retval; + char* principal; + +- g_object_get(applet, "principal", &principal, +- NULL); ++ g_object_get(applet, "principal", &principal, NULL); + + if (strlen(newprincipal)) { + krb5_principal knewprinc; +@@ -817,7 +845,6 @@ gboolean + ka_grab_credentials (KaApplet* applet) + { + int retval; +- gboolean retry; + int success = FALSE; + KaPwDialog *pwdialog = ka_applet_get_pwdialog(applet); + +diff --git a/src/krb5-auth-dialog.schemas.in b/src/krb5-auth-dialog.schemas.in +index 2a3a707..13b05b2 100644 +--- a/src/krb5-auth-dialog.schemas.in ++++ b/src/krb5-auth-dialog.schemas.in +@@ -51,5 +51,44 @@ + <long>Start prompting/displaying notifications that many minutes before expiry</long> + </locale> + </schema> ++ ++ <schema> ++ <key>/schemas/apps/::PACKAGE::/forwardable</key> ++ <applyto>/apps/::PACKAGE::/forwardable</applyto> ++ <owner>::PACKAGE::</owner> ++ <type>bool</type> ++ <default>0</default> ++ ++ <locale name="C"> ++ <short>Forwardable ticket</short> ++ <long>Requested tickets should be forwardable</long> ++ </locale> ++ </schema> ++ ++ <schema> ++ <key>/schemas/apps/::PACKAGE::/renewable</key> ++ <applyto>/apps/::PACKAGE::/renewable</applyto> ++ <owner>::PACKAGE::</owner> ++ <type>bool</type> ++ <default>0</default> ++ ++ <locale name="C"> ++ <short>Renewable ticket</short> ++ <long>Requested tickets should be renewable</long> ++ </locale> ++ </schema> ++ ++ <schema> ++ <key>/schemas/apps/::PACKAGE::/proxiable</key> ++ <applyto>/apps/::PACKAGE::/proxiable</applyto> ++ <owner>::PACKAGE::</owner> ++ <type>bool</type> ++ <default>0</default> ++ ++ <locale name="C"> ++ <short>Proxiable ticket</short> ++ <long>Requested tickets should be proxiable</long> ++ </locale> ++ </schema> + </schemalist> + </gconfschemafile> +diff --git a/src/krb5-auth-gconf-tools.c b/src/krb5-auth-gconf-tools.c +new file mode 100644 +index 0000000..e6541c1 +--- /dev/null ++++ b/src/krb5-auth-gconf-tools.c +@@ -0,0 +1,103 @@ ++/* Krb5 Auth Applet -- Acquire and release kerberos tickets ++ * ++ * (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 ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ * ++ */ ++#include "config.h" ++ ++#include <gconf/gconf-client.h> ++#include <krb5-auth-gconf-tools.h> ++ ++gboolean ++ka_gconf_get_string (GConfClient* client, ++ const char* key, ++ char** value) ++{ ++ GError* error = NULL; ++ gboolean success = FALSE; ++ GConfValue* gc_value; ++ ++ g_return_val_if_fail (key != NULL, FALSE); ++ g_return_val_if_fail (*value == NULL, FALSE); ++ ++ if ((gc_value = gconf_client_get (client, key, &error))) { ++ if (gc_value->type == GCONF_VALUE_STRING) { ++ *value = g_strdup (gconf_value_get_string (gc_value)); ++ success = TRUE; ++ } else if (error) { ++ g_print (error->message); ++ g_error_free (error); ++ } ++ gconf_value_free (gc_value); ++ } ++ return success; ++} ++ ++ ++gboolean ++ka_gconf_get_int (GConfClient* client, ++ const char* key, ++ int* value) ++{ ++ GError* error = NULL; ++ gboolean success = FALSE; ++ GConfValue* gc_value; ++ ++ g_return_val_if_fail (key != NULL, FALSE); ++ g_return_val_if_fail (value != NULL, FALSE); ++ ++ if ((gc_value = gconf_client_get (client, key, &error))) ++ { ++ if (gc_value->type == GCONF_VALUE_INT) { ++ *value = gconf_value_get_int (gc_value); ++ success = TRUE; ++ } else if (error) { ++ g_print (error->message); ++ g_error_free (error); ++ } ++ gconf_value_free (gc_value); ++ } ++ return success; ++} ++ ++ ++gboolean ++ka_gconf_get_bool (GConfClient* client, ++ const char* key, ++ gboolean* value) ++{ ++ GError* error = NULL; ++ gboolean success = FALSE; ++ GConfValue* gc_value; ++ ++ g_return_val_if_fail (key != NULL, FALSE); ++ g_return_val_if_fail (value != NULL, FALSE); ++ ++ if ((gc_value = gconf_client_get (client, key, &error))) ++ { ++ if (gc_value->type == GCONF_VALUE_BOOL) { ++ *value = gconf_value_get_bool (gc_value); ++ success = TRUE; ++ } else if (error) { ++ g_print (error->message); ++ g_error_free (error); ++ } ++ gconf_value_free (gc_value); ++ } ++ return success; ++} ++ +diff --git a/src/krb5-auth-gconf-tools.h b/src/krb5-auth-gconf-tools.h +new file mode 100644 +index 0000000..9786b2f +--- /dev/null ++++ b/src/krb5-auth-gconf-tools.h +@@ -0,0 +1,41 @@ ++/* Krb5 Auth Applet -- Acquire and release kerberos tickets ++ * ++ * (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 ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ * ++ */ ++ ++#ifndef KRB5_AUTH_GCONF_TOOLS_H ++#define KRB5_AUTH_GCONF_TOOLS_H ++ ++#include "config.h" ++ ++#include <gconf/gconf-client.h> ++ ++#define KA_GCONF_PATH "/apps/" PACKAGE ++#define KA_GCONF_KEY_PRINCIPAL KA_GCONF_PATH "/principal" ++#define KA_GCONF_KEY_PK_USERID KA_GCONF_PATH "/pk_userid" ++#define KA_GCONF_KEY_PROMPT_MINS KA_GCONF_PATH "/prompt_minutes" ++#define KA_GCONF_KEY_SHOW_TRAYICON KA_GCONF_PATH "/show_trayicon" ++#define KA_GCONF_KEY_FORWARDABLE KA_GCONF_PATH "/forwardable" ++#define KA_GCONF_KEY_RENEWABLE KA_GCONF_PATH "/renewable" ++#define KA_GCONF_KEY_PROXIABLE KA_GCONF_PATH "/proxiable" ++ ++gboolean ka_gconf_get_string (GConfClient* client, const char* key, char** value); ++gboolean ka_gconf_get_int (GConfClient* client, const char* key, int* value); ++gboolean ka_gconf_get_bool (GConfClient* client, const char* key, gboolean* value); ++ ++#endif +diff --git a/src/krb5-auth-gconf.c b/src/krb5-auth-gconf.c +index 1481591..25eb555 100644 +--- a/src/krb5-auth-gconf.c ++++ b/src/krb5-auth-gconf.c +@@ -22,94 +22,9 @@ + #include <gconf/gconf-client.h> + + #include "krb5-auth-applet.h" ++#include "krb5-auth-gconf-tools.h" + #include "krb5-auth-gconf.h" + +-#define KA_GCONF_PATH "/apps/" PACKAGE +-#define KA_GCONF_KEY_PRINCIPAL KA_GCONF_PATH "/principal" +-#define KA_GCONF_KEY_PK_USERID KA_GCONF_PATH "/pk_userid" +-#define KA_GCONF_KEY_PROMPT_MINS KA_GCONF_PATH "/prompt_minutes" +-#define KA_GCONF_KEY_SHOW_TRAYICON KA_GCONF_PATH "/show_trayicon" +- +-static gboolean +-ka_gconf_get_string (GConfClient* client, +- const char* key, +- char** value) +-{ +- GError* error = NULL; +- gboolean success = FALSE; +- GConfValue* gc_value; +- +- g_return_val_if_fail (key != NULL, FALSE); +- g_return_val_if_fail (*value == NULL, FALSE); +- +- if ((gc_value = gconf_client_get (client, key, &error))) { +- if (gc_value->type == GCONF_VALUE_STRING) { +- *value = g_strdup (gconf_value_get_string (gc_value)); +- success = TRUE; +- } else if (error) { +- g_print (error->message); +- g_error_free (error); +- } +- gconf_value_free (gc_value); +- } +- return success; +-} +- +- +-static gboolean +-ka_gconf_get_int (GConfClient* client, +- const char* key, +- int* value) +-{ +- GError* error = NULL; +- gboolean success = FALSE; +- GConfValue* gc_value; +- +- g_return_val_if_fail (key != NULL, FALSE); +- g_return_val_if_fail (value != NULL, FALSE); +- +- if ((gc_value = gconf_client_get (client, key, &error))) +- { +- if (gc_value->type == GCONF_VALUE_INT) { +- *value = gconf_value_get_int (gc_value); +- success = TRUE; +- } else if (error) { +- g_print (error->message); +- g_error_free (error); +- } +- gconf_value_free (gc_value); +- } +- return success; +-} +- +- +-static gboolean +-ka_gconf_get_bool (GConfClient* client, +- const char* key, +- gboolean* value) +-{ +- GError* error = NULL; +- gboolean success = FALSE; +- GConfValue* gc_value; +- +- g_return_val_if_fail (key != NULL, FALSE); +- g_return_val_if_fail (value != NULL, FALSE); +- +- if ((gc_value = gconf_client_get (client, key, &error))) +- { +- if (gc_value->type == GCONF_VALUE_BOOL) { +- *value = gconf_value_get_bool (gc_value); +- success = TRUE; +- } else if (error) { +- g_print (error->message); +- g_error_free (error); +- } +- gconf_value_free (gc_value); +- } +- return success; +-} +- +- + static gboolean + ka_gconf_set_principal (GConfClient* client, KaApplet* applet) + { +@@ -164,6 +79,45 @@ ka_gconf_set_show_trayicon (GConfClient* client, KaApplet* applet) + } + + ++static gboolean ++ka_gconf_set_tgt_forwardable (GConfClient* client, KaApplet* applet) ++{ ++ gboolean forwardable = FALSE; ++ ++ if(!ka_gconf_get_bool(client, KA_GCONF_KEY_FORWARDABLE, &forwardable)) { ++ forwardable = TRUE; ++ } ++ g_object_set(applet, "tgt-forwardable", forwardable, NULL); ++ return TRUE; ++} ++ ++ ++static gboolean ++ka_gconf_set_tgt_renewable (GConfClient* client, KaApplet* applet) ++{ ++ gboolean renewable = FALSE; ++ ++ if(!ka_gconf_get_bool(client, KA_GCONF_KEY_RENEWABLE, &renewable)) { ++ renewable = TRUE; ++ } ++ g_object_set(applet, "tgt-renewable", renewable, NULL); ++ return TRUE; ++} ++ ++ ++static gboolean ++ka_gconf_set_tgt_proxiable (GConfClient* client, KaApplet* applet) ++{ ++ gboolean proxiable = FALSE; ++ ++ if(!ka_gconf_get_bool(client, KA_GCONF_KEY_PROXIABLE, &proxiable)) { ++ proxiable = TRUE; ++ } ++ g_object_set(applet, "tgt-proxiable", proxiable, NULL); ++ return TRUE; ++} ++ ++ + static void + ka_gconf_key_changed_callback (GConfClient* client, + guint cnxn_id G_GNUC_UNUSED, +@@ -186,6 +140,12 @@ ka_gconf_key_changed_callback (GConfClient* client, + ka_gconf_set_show_trayicon (client, applet); + } else if (g_strcmp0 (key, KA_GCONF_KEY_PK_USERID) == 0) { + ka_gconf_set_pk_userid (client, applet); ++ } else if (g_strcmp0 (key, KA_GCONF_KEY_FORWARDABLE) == 0) { ++ ka_gconf_set_tgt_forwardable (client, applet); ++ } else if (g_strcmp0 (key, KA_GCONF_KEY_RENEWABLE) == 0) { ++ ka_gconf_set_tgt_renewable (client, applet); ++ } else if (g_strcmp0 (key, KA_GCONF_KEY_PROXIABLE) == 0) { ++ ka_gconf_set_tgt_proxiable (client, applet); + } else + g_warning("Received notification for unknown gconf key %s", key); + return; +@@ -216,6 +176,9 @@ ka_gconf_init (KaApplet* applet, + ka_gconf_set_prompt_mins (client, applet); + ka_gconf_set_show_trayicon (client, applet); + ka_gconf_set_pk_userid(client, applet); ++ ka_gconf_set_tgt_forwardable(client, applet); ++ ka_gconf_set_tgt_renewable(client, applet); ++ ka_gconf_set_tgt_proxiable(client, applet); + + success = TRUE; + out: +-- diff --git a/debian/patches/series b/debian/patches/series new file mode 100644 index 0000000..2036199 --- /dev/null +++ b/debian/patches/series @@ -0,0 +1,3 @@ +0001-set-a-more-gnomeisch-invisible-char.patch +0002-add-dbus-service-file.patch +0003-add-preferences-dialog.patch diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..cf04d70 --- /dev/null +++ b/debian/rules @@ -0,0 +1,14 @@ +#! /usr/bin/make -f + +LDFLAGS += -Wl,--as-needed + +include /usr/share/cdbs/1/rules/debhelper.mk +include /usr/share/cdbs/1/class/gnome.mk +include /usr/share/cdbs/1/class/autotools.mk +include /usr/share/cdbs/1/rules/patchsys-quilt.mk + +DEB_BUILDDIR := build +DEB_CONFIGURE_EXTRA_FLAGS := --prefix=/usr --enable-network-manager --with-libnotify + +post-patches:: + cd build && ../autogen.sh diff --git a/debian/watch b/debian/watch new file mode 100644 index 0000000..df67516 --- /dev/null +++ b/debian/watch @@ -0,0 +1,4 @@ +# format version number, currently 3; this line is compulsory! +version=3 +http://ftp.gnome.org/pub/GNOME/sources/krb5-auth-dialog/([\d\.]+)[02468]/ \ + krb5-auth-dialog-([\d\.]*)\.tar\.gz |