diff options
author | Guido Günther <agx@sigxcpu.org> | 2009-03-01 15:00:15 +0100 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2009-03-01 15:00:15 +0100 |
commit | d0f7048e94abe3371aeeba6f5cd115959e332b09 (patch) | |
tree | c4bca2f9d8c6e2646cee38f6ababc8ac1634887b /src | |
parent | Imported Upstream version 0.8 (diff) | |
download | krb5-auth-dialog-d0f7048e94abe3371aeeba6f5cd115959e332b09.tar.gz krb5-auth-dialog-d0f7048e94abe3371aeeba6f5cd115959e332b09.tar.bz2 krb5-auth-dialog-d0f7048e94abe3371aeeba6f5cd115959e332b09.zip |
Imported Upstream version 0.8+svn128
Diffstat (limited to 'src')
-rw-r--r-- | src/.cvsignore | 5 | ||||
-rw-r--r-- | src/Makefile.am | 23 | ||||
-rw-r--r-- | src/Makefile.in | 710 | ||||
-rw-r--r-- | src/dummy-strings.c | 4 | ||||
-rw-r--r-- | src/krb5-auth-applet-dbus.xml | 14 | ||||
-rw-r--r-- | src/krb5-auth-applet.c | 464 | ||||
-rw-r--r-- | src/krb5-auth-applet.h | 59 | ||||
-rw-r--r-- | src/krb5-auth-dbus.c | 32 | ||||
-rw-r--r-- | src/krb5-auth-dbus.h | 7 | ||||
-rw-r--r-- | src/krb5-auth-dialog.c | 202 | ||||
-rw-r--r-- | src/krb5-auth-dialog.h | 4 | ||||
-rw-r--r-- | src/krb5-auth-gconf.c | 55 | ||||
-rw-r--r-- | src/krb5-auth-gconf.h | 2 | ||||
-rw-r--r-- | src/krb5-auth-notify.c | 66 | ||||
-rw-r--r-- | src/krb5-auth-notify.h | 28 |
15 files changed, 671 insertions, 1004 deletions
diff --git a/src/.cvsignore b/src/.cvsignore new file mode 100644 index 0000000..b18d7e7 --- /dev/null +++ b/src/.cvsignore @@ -0,0 +1,5 @@ +Makefile +Makefile.in +krb5-auth-dialog +krb5-auth-dialog.1 +krb5-auth-dialog.desktop diff --git a/src/Makefile.am b/src/Makefile.am index 18ab709..1ff6ac0 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,5 +1,5 @@ INCLUDES = \ - -DGLADEDIR=\""$(gladedir)/"\" \ + -DKA_DATA_DIR=\""$(pkgdatadir)"\" \ -DLOCALE_DIR=\""$(localedir)/"\" bin_PROGRAMS = krb5-auth-dialog @@ -24,8 +24,6 @@ krb5_auth_dialog_SOURCES = \ 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 @@ -41,17 +39,28 @@ krb5_auth_dialog_LDADD = \ @GLADE_LIBS@ \ @GTK_LIBS@ +BUILT_SOURCES = \ + krb5-auth-applet-dbus-glue.h + +krb5-auth-applet-dbus-glue.h: $(srcdir)/krb5-auth-applet-dbus.xml + dbus-binding-tool \ + --mode=glib-server \ + --prefix=krb5_auth_dialog \ + $< > $@ + AM_CPPFLAGS = -I $(top_srcdir)/gtksecentry/ -I $(top_srcdir)/secmem/ -gladedir = $(datadir)/krb5-auth-dialog -glade_DATA = \ +pkgdatadir = $(datadir)/krb5-auth-dialog +pkgdata_DATA = \ krb5-auth-dialog.glade EXTRA_DIST = \ - $(glade_DATA) \ + $(pkgdata_DATA) \ $(schema_in_files) \ $(autostart_in_files) \ krb5-auth-dialog.1.in CLEANFILES = $(schema_DATA) -DISTCLEANFILES = krb5-auth-dialog.desktop +DISTCLEANFILES = \ + krb5-auth-dialog.desktop \ + krb5-auth-applet-dbus-glue.h diff --git a/src/Makefile.in b/src/Makefile.in deleted file mode 100644 index d7ca9ac..0000000 --- a/src/Makefile.in +++ /dev/null @@ -1,710 +0,0 @@ -# Makefile.in generated by automake 1.10.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -bin_PROGRAMS = krb5-auth-dialog$(EXEEXT) -subdir = src -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/krb5-auth-dialog.1.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = krb5-auth-dialog.1 -am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ - "$(DESTDIR)$(autostartdir)" "$(DESTDIR)$(gladedir)" \ - "$(DESTDIR)$(schemadir)" -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) -PROGRAMS = $(bin_PROGRAMS) -am_krb5_auth_dialog_OBJECTS = krb5-auth-dialog.$(OBJEXT) \ - krb5-auth-applet.$(OBJEXT) krb5-auth-gconf.$(OBJEXT) \ - krb5-auth-notify.$(OBJEXT) krb5-auth-dbus.$(OBJEXT) \ - dummy-strings.$(OBJEXT) -krb5_auth_dialog_OBJECTS = $(am_krb5_auth_dialog_OBJECTS) -krb5_auth_dialog_DEPENDENCIES = ../gtksecentry/libgtksecentry.a \ - ../secmem/libsecmem.a -DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -SOURCES = $(krb5_auth_dialog_SOURCES) -DIST_SOURCES = $(krb5_auth_dialog_SOURCES) -man1dir = $(mandir)/man1 -NROFF = nroff -MANS = $(man_MANS) -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; -autostartDATA_INSTALL = $(INSTALL_DATA) -gladeDATA_INSTALL = $(INSTALL_DATA) -schemaDATA_INSTALL = $(INSTALL_DATA) -DATA = $(autostart_DATA) $(glade_DATA) $(schema_DATA) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALL_LINGUAS = @ALL_LINGUAS@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CATALOGS = @CATALOGS@ -CATOBJEXT = @CATOBJEXT@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DATADIRNAME = @DATADIRNAME@ -DBUS_CFLAGS = @DBUS_CFLAGS@ -DBUS_LIBS = @DBUS_LIBS@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -GCONF_CFLAGS = @GCONF_CFLAGS@ -GCONF_LIBS = @GCONF_LIBS@ -GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ -GLADE_CFLAGS = @GLADE_CFLAGS@ -GLADE_LIBS = @GLADE_LIBS@ -GMOFILES = @GMOFILES@ -GMSGFMT = @GMSGFMT@ -GREP = @GREP@ -GTK_CFLAGS = @GTK_CFLAGS@ -GTK_LIBS = @GTK_LIBS@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -INSTOBJEXT = @INSTOBJEXT@ -INTLLIBS = @INTLLIBS@ -INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ -INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ -INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ -INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ -INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ -INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ -INTLTOOL_MERGE = @INTLTOOL_MERGE@ -INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ -INTLTOOL_PERL = @INTLTOOL_PERL@ -INTLTOOL_POLICY_RULE = @INTLTOOL_POLICY_RULE@ -INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ -INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ -INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ -INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ -INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ -INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ -INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ -INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ -INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ -INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ -INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ -INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ -INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ -KRB5_CFLAGS = @KRB5_CFLAGS@ -KRB5_CONFIG = @KRB5_CONFIG@ -KRB5_LIBS = @KRB5_LIBS@ -LDFLAGS = @LDFLAGS@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LIBCAP = @LIBCAP@ -LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@ -LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -MKINSTALLDIRS = @MKINSTALLDIRS@ -MSGFMT = @MSGFMT@ -MSGFMT_OPTS = @MSGFMT_OPTS@ -MSGMERGE = @MSGMERGE@ -NETWORK_MANAGER_CFLAGS = @NETWORK_MANAGER_CFLAGS@ -NETWORK_MANAGER_LIBS = @NETWORK_MANAGER_LIBS@ -NMEDIT = @NMEDIT@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PKG_CONFIG = @PKG_CONFIG@ -POFILES = @POFILES@ -POSUB = @POSUB@ -PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ -PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ -RANLIB = @RANLIB@ -SED = @SED@ -SETCAP = @SETCAP@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -USE_NLS = @USE_NLS@ -VERSION = @VERSION@ -XGETTEXT = @XGETTEXT@ -YACC = @YACC@ -YFLAGS = @YFLAGS@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -check_interval = @check_interval@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -minimum_lifetime = @minimum_lifetime@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -INCLUDES = \ - -DGLADEDIR=\""$(gladedir)/"\" \ - -DLOCALE_DIR=\""$(localedir)/"\" - -man_MANS = krb5-auth-dialog.1 -autostartdir = $(sysconfdir)/xdg/autostart -autostart_in_files = krb5-auth-dialog.desktop.in -autostart_DATA = $(autostart_in_files:.desktop.in=.desktop) -schemadir = $(sysconfdir)/gconf/schemas -schema_in_files = $(PACKAGE).schemas.in -schema_DATA = $(PACKAGE).schemas -krb5_auth_dialog_SOURCES = \ - krb5-auth-dialog.c \ - krb5-auth-dialog.h \ - krb5-auth-applet.c \ - 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 - -krb5_auth_dialog_LDADD = \ - ../gtksecentry/libgtksecentry.a \ - ../secmem/libsecmem.a \ - @NETWORK_MANAGER_LIBS@ \ - @KRB5_LIBS@ \ - @LIBNOTIFY_LIBS@ \ - @DBUS_LIBS@ \ - @GCONF_LIBS@ \ - @GLADE_LIBS@ \ - @GTK_LIBS@ - -AM_CPPFLAGS = -I $(top_srcdir)/gtksecentry/ -I $(top_srcdir)/secmem/ -gladedir = $(datadir)/krb5-auth-dialog -glade_DATA = \ - krb5-auth-dialog.glade - -EXTRA_DIST = \ - $(glade_DATA) \ - $(schema_in_files) \ - $(autostart_in_files) \ - krb5-auth-dialog.1.in - -CLEANFILES = $(schema_DATA) -DISTCLEANFILES = krb5-auth-dialog.desktop -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -krb5-auth-dialog.1: $(top_builddir)/config.status $(srcdir)/krb5-auth-dialog.1.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ - else :; fi; \ - done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done - -clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -krb5-auth-dialog$(EXEEXT): $(krb5_auth_dialog_OBJECTS) $(krb5_auth_dialog_DEPENDENCIES) - @rm -f krb5-auth-dialog$(EXEEXT) - $(LINK) $(krb5_auth_dialog_OBJECTS) $(krb5_auth_dialog_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy-strings.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/krb5-auth-applet.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/krb5-auth-dbus.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/krb5-auth-dialog.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/krb5-auth-gconf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/krb5-auth-notify.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-man1: $(man1_MANS) $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ - else file=$$i; fi; \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ - done -uninstall-man1: - @$(NORMAL_UNINSTALL) - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ - rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ - done -install-autostartDATA: $(autostart_DATA) - @$(NORMAL_INSTALL) - test -z "$(autostartdir)" || $(MKDIR_P) "$(DESTDIR)$(autostartdir)" - @list='$(autostart_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f=$(am__strip_dir) \ - echo " $(autostartDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(autostartdir)/$$f'"; \ - $(autostartDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(autostartdir)/$$f"; \ - done - -uninstall-autostartDATA: - @$(NORMAL_UNINSTALL) - @list='$(autostart_DATA)'; for p in $$list; do \ - f=$(am__strip_dir) \ - echo " rm -f '$(DESTDIR)$(autostartdir)/$$f'"; \ - rm -f "$(DESTDIR)$(autostartdir)/$$f"; \ - done -install-gladeDATA: $(glade_DATA) - @$(NORMAL_INSTALL) - test -z "$(gladedir)" || $(MKDIR_P) "$(DESTDIR)$(gladedir)" - @list='$(glade_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f=$(am__strip_dir) \ - echo " $(gladeDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(gladedir)/$$f'"; \ - $(gladeDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(gladedir)/$$f"; \ - done - -uninstall-gladeDATA: - @$(NORMAL_UNINSTALL) - @list='$(glade_DATA)'; for p in $$list; do \ - f=$(am__strip_dir) \ - echo " rm -f '$(DESTDIR)$(gladedir)/$$f'"; \ - rm -f "$(DESTDIR)$(gladedir)/$$f"; \ - done -install-schemaDATA: $(schema_DATA) - @$(NORMAL_INSTALL) - test -z "$(schemadir)" || $(MKDIR_P) "$(DESTDIR)$(schemadir)" - @list='$(schema_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f=$(am__strip_dir) \ - echo " $(schemaDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(schemadir)/$$f'"; \ - $(schemaDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(schemadir)/$$f"; \ - done - -uninstall-schemaDATA: - @$(NORMAL_UNINSTALL) - @list='$(schema_DATA)'; for p in $$list; do \ - f=$(am__strip_dir) \ - echo " rm -f '$(DESTDIR)$(schemadir)/$$f'"; \ - rm -f "$(DESTDIR)$(schemadir)/$$f"; \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) -installdirs: - for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(autostartdir)" "$(DESTDIR)$(gladedir)" "$(DESTDIR)$(schemadir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: install-autostartDATA install-gladeDATA install-man \ - install-schemaDATA - -install-dvi: install-dvi-am - -install-exec-am: install-binPROGRAMS - -install-html: install-html-am - -install-info: install-info-am - -install-man: install-man1 - -install-pdf: install-pdf-am - -install-ps: install-ps-am - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-autostartDATA uninstall-binPROGRAMS \ - uninstall-gladeDATA uninstall-man uninstall-schemaDATA - -uninstall-man: uninstall-man1 - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ - clean-generic clean-libtool ctags distclean distclean-compile \ - distclean-generic distclean-libtool distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-autostartDATA install-binPROGRAMS install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-gladeDATA install-html install-html-am \ - install-info install-info-am install-man install-man1 \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-schemaDATA install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-autostartDATA uninstall-binPROGRAMS \ - uninstall-gladeDATA uninstall-man uninstall-man1 \ - uninstall-schemaDATA - -@INTLTOOL_DESKTOP_RULE@ - -%.schemas: $(srcdir)/%.schemas.in - sed -e "s,::PACKAGE::,$(PACKAGE)," < $< > $@ -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/src/dummy-strings.c b/src/dummy-strings.c index e107293..6f29d54 100644 --- a/src/dummy-strings.c +++ b/src/dummy-strings.c @@ -132,7 +132,7 @@ realm %s. %s."), /* kpasswd_strings.et:kpws:KPW_STR_CANT_OPEN_ADMIN_SERVER */ N_("while releasing permanent lock"), /* import_err.et:imp:IMPORT_RENAME_UNLOCK */ N_("while closing databases"), /* import_err.et:imp:IMPORT_RENAME_CLOSE */ N_("while retrieving configuration parameters"), /* import_err.et:imp:IMPORT_GET_PARAMS */ - N_("$Id$"), /* kdc5_err.et:kdc5:KDC5_RCSID */ + N_("$Id: dummy-strings.c 35 2005-10-31 21:55:46Z caillon $"), /* kdc5_err.et:kdc5:KDC5_RCSID */ N_("No server port found"), /* kdc5_err.et:kdc5:KDC5_NOPORT */ N_("Network not initialized"), /* kdc5_err.et:kdc5:KDC5_NONET */ N_("Short write while sending response"), /* kdc5_err.et:kdc5:KDC5_IO_RESPONSE */ @@ -385,7 +385,7 @@ realm %s. %s."), /* kpasswd_strings.et:kpws:KPW_STR_CANT_OPEN_ADMIN_SERVER */ N_("Bad magic number for passwd_phrase_element"), /* kv5m_err.et:kv5m:KV5M_PASSWD_PHRASE_ELEMENT */ N_("Bad magic number for GSSAPI OID"), /* kv5m_err.et:kv5m:KV5M_GSS_OID */ N_("Bad magic number for GSSAPI QUEUE"), /* kv5m_err.et:kv5m:KV5M_GSS_QUEUE */ - N_("$Id$"), /* kdb5_err.et:kdb5:KRB5_KDB_RCSID */ + N_("$Id: dummy-strings.c 35 2005-10-31 21:55:46Z caillon $"), /* kdb5_err.et:kdb5:KRB5_KDB_RCSID */ N_("Entry already exists in database"), /* kdb5_err.et:kdb5:KRB5_KDB_INUSE */ N_("Database store error"), /* kdb5_err.et:kdb5:KRB5_KDB_UK_SERROR */ N_("Database read error"), /* kdb5_err.et:kdb5:KRB5_KDB_UK_RERROR */ diff --git a/src/krb5-auth-applet-dbus.xml b/src/krb5-auth-applet-dbus.xml new file mode 100644 index 0000000..eeb151d --- /dev/null +++ b/src/krb5-auth-applet-dbus.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<node name="/org/gnome/KrbAuthDialog"> + <interface name="org.gnome.KrbAuthDialog"> + <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="KaApplet"/> + <method name="acquireTgt"> + <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="ka_dbus_acquire_tgt"/> + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> + <arg type="s" name="principal" direction="in" /> + <arg type="b" name="success" direction="out"/> + </method> + </interface> +</node> + diff --git a/src/krb5-auth-applet.c b/src/krb5-auth-applet.c index c915240..996d862 100644 --- a/src/krb5-auth-applet.c +++ b/src/krb5-auth-applet.c @@ -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 @@ enum ka_icon { 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 @@ ka_tooltip_text(Krb5AuthApplet* applet, int remaining) /* 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 @@ ka_update_status(Krb5AuthApplet* applet, krb5_timestamp expiry) _("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 @@ ka_update_status(Krb5AuthApplet* applet, krb5_timestamp expiry) } } - 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 @@ ka_create_context_menu (Krb5AuthApplet* applet) /* 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,67 +460,143 @@ ka_tray_icon_on_menu (GtkStatusIcon* status_icon, guint button, 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->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) { - applet->icons[val_icon] = "krb-valid-ticket"; - applet->icons[exp_icon] = "krb-expiring-ticket"; - applet->icons[inv_icon] = "krb-no-valid-ticket"; + 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; } diff --git a/src/krb5-auth-applet.h b/src/krb5-auth-applet.h index e137794..a33be55 100644 --- a/src/krb5-auth-applet.h +++ b/src/krb5-auth-applet.h @@ -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 */ +G_BEGIN_DECLS - /* 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 */ +#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)) -#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; +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,...) \ diff --git a/src/krb5-auth-dbus.c b/src/krb5-auth-dbus.c index f658c8d..b4c8742 100644 --- a/src/krb5-auth-dbus.c +++ b/src/krb5-auth-dbus.c @@ -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 @@ -23,13 +23,38 @@ #include <dbus/dbus-glib.h> #include "krb5-auth-applet.h" #include "krb5-auth-dbus.h" +#include "krb5-auth-applet-dbus-glue.h" + +static DBusGConnection *session; + +gboolean +ka_dbus_acquire_tgt (KaApplet *applet, + const gchar *principal, DBusGMethodInvocation *context) +{ + gboolean success; + + KA_DEBUG("Getting TGT for '%s'", principal); + success = ka_check_credentials(applet, principal); + dbus_g_method_return(context, success); + return TRUE; +} + + +gboolean +ka_dbus_service(KaApplet* applet) +{ + dbus_g_connection_register_g_object (session, + "/org/gnome/KrbAuthDialog", + G_OBJECT(applet)); + return TRUE; +} + gboolean ka_dbus_connect(unsigned int* status) { guint request_name_reply; unsigned int flags; - DBusGConnection *session; DBusGProxy *bus_proxy; GError* error = NULL; @@ -46,6 +71,9 @@ ka_dbus_connect(unsigned int* status) "/org/freedesktop/DBus", "org.freedesktop.DBus"); + dbus_g_object_type_install_info(KA_TYPE_APPLET, + &dbus_glib_krb5_auth_dialog_object_info); + if (!dbus_g_proxy_call (bus_proxy, "RequestName", &error, diff --git a/src/krb5-auth-dbus.h b/src/krb5-auth-dbus.h index 6ef0bf0..2f0af61 100644 --- a/src/krb5-auth-dbus.h +++ b/src/krb5-auth-dbus.h @@ -22,7 +22,14 @@ #define KRB5_AUTH_DBUS_H #include <glib.h> +#include <dbus/dbus-glib.h> +#include <dbus/dbus-glib-lowlevel.h> +#include "krb5-auth-applet.h" gboolean ka_dbus_connect(unsigned int* status); +gboolean ka_dbus_service(KaApplet* applet); +gboolean ka_dbus_acquire_tgt (KaApplet *applet, + const gchar *principal, + DBusGMethodInvocation *context); #endif /* KRB5_AUTH_DBUS_H */ diff --git a/src/krb5-auth-dialog.c b/src/krb5-auth-dialog.c index 3beaa8b..dfd5ef5 100644 --- a/src/krb5-auth-dialog.c +++ b/src/krb5-auth-dialog.c @@ -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 canceled; 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 @@ ka_krb5_cc_clear_mcred(krb5_creds* mcred) /* ***************************************************************** */ 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 @@ credentials_expiring_real (Krb5AuthApplet* applet) } 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 @@ krb5_auth_dialog_wrong_label_update_expiry (GtkWidget* label) 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 @@ krb5_auth_dialog_setup (Krb5AuthApplet *applet, gchar *prompt; int pw4len; - if (krb5prompt == NULL) { prompt = g_strdup (_("Please enter your Kerberos password.")); } else { @@ -295,17 +292,19 @@ krb5_auth_dialog_setup (Krb5AuthApplet *applet, } /* 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 @@ krb5_auth_dialog_setup (Krb5AuthApplet *applet, 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 @@ auth_dialog_prompter (krb5_context ctx, 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 @@ auth_dialog_prompter (krb5_context ctx, 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 @@ auth_dialog_prompter (krb5_context ctx, 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; @@ -431,14 +430,15 @@ network_state_cb (libnm_glib_ctx *context, } #endif +/* credentials expiring timer */ static gboolean credentials_expiring (gpointer *data) { 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 +448,7 @@ credentials_expiring (gpointer *data) } /* 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 +465,13 @@ credentials_expiring (gpointer *data) } } 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 +496,7 @@ set_options_from_creds(const Krb5AuthApplet* applet, 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 +507,13 @@ set_options_from_creds(const Krb5AuthApplet* applet, 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 +522,7 @@ ka_auth_pkinit(Krb5AuthApplet* applet, krb5_creds* creds) retval = krb5_get_init_creds_opt_set_pkinit(kcontext, opts, kprincipal, - applet->pk_userid, + pk_userid, NULL, /* x509 anchors */ NULL, NULL, @@ -549,35 +546,54 @@ out: } +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) { /* 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 +636,15 @@ out: 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 +652,7 @@ ka_renew_credentials (Krb5AuthApplet* applet) 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 +670,7 @@ ka_renew_credentials (Krb5AuthApplet* applet) 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 +758,7 @@ using_krb5() 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; @@ -768,14 +785,66 @@ ka_error_dialog(int err) } -/* this is done on leftclick, update the tooltip immediately */ -void -ka_grab_credentials (Krb5AuthApplet* applet) +/* + * check if we have valid credentials for the requested principal - if not, grab them + * principal: requested principal - if empty use default + */ +gboolean +ka_check_credentials (KaApplet *applet, const char* newprincipal) +{ + gboolean renewable; + gboolean success = FALSE; + int retval; + char* principal; + + g_object_get(applet, "principal", &principal, + NULL); + + if (strlen(newprincipal)) { + krb5_principal knewprinc; + + /* no ticket cache: is requested princ the one from our config? */ + if (!kprincipal && g_strcmp0(principal, newprincipal)) { + KA_DEBUG("Requested principal %s not %s", principal, newprincipal); + goto out; + } + + /* ticket cache: check if the requested principal is the one we have */ + retval = krb5_parse_name(kcontext, newprincipal, &knewprinc); + if (retval) { + g_warning ("Cannot parse principal '%s'", newprincipal); + goto out; + } + if (kprincipal && !krb5_principal_compare (kcontext, kprincipal, knewprinc)) { + KA_DEBUG("Current Principal '%s' not '%s'", principal, newprincipal); + krb5_free_principal(kcontext, knewprinc); + goto out; + } + krb5_free_principal(kcontext, knewprinc); + } + + if (credentials_expiring_real (applet)) { + if (!is_online) + success = FALSE; + else + success = ka_grab_credentials (applet); + } else + success = TRUE; +out: + g_free (principal); + return success; +} + + +/* initiate grabbing of credentials (e.g. on leftclick of tray icon) */ +gboolean +ka_grab_credentials (KaApplet* applet) { int retval; gboolean retry; + int success = FALSE; - applet->pw_dialog_persist = TRUE; + ka_applet_set_pw_dialog_persist(applet, TRUE); do { retry = TRUE; retval = grab_credentials (applet); @@ -783,6 +852,7 @@ ka_grab_credentials (Krb5AuthApplet* applet) continue; switch (retval) { case 0: /* success */ + success = TRUE; case KRB5_LIBOS_PWDINTR: /* canceled (heimdal) */ case KRB5_LIBOS_CANTREADPWD: /* canceled (mit) */ retry = FALSE; @@ -795,8 +865,10 @@ ka_grab_credentials (Krb5AuthApplet* applet) } } while(retry); - applet->pw_dialog_persist = FALSE; + ka_applet_set_pw_dialog_persist(applet, FALSE); credentials_expiring_real(applet); + + return success; } @@ -835,7 +907,7 @@ ka_secmem_init () int main (int argc, char *argv[]) { - Krb5AuthApplet *applet; + KaApplet *applet; GOptionContext *context; GError *error = NULL; @@ -878,20 +950,15 @@ main (int argc, char *argv[]) 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 (GLADEDIR "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) { @@ -910,6 +977,7 @@ main (int argc, char *argv[]) if (credentials_expiring ((gpointer)applet)) { g_timeout_add_seconds (CREDENTIAL_CHECK_INTERVAL, (GSourceFunc)credentials_expiring, applet); } + ka_dbus_service(applet); gtk_main (); } diff --git a/src/krb5-auth-dialog.h b/src/krb5-auth-dialog.h index 77a9891..1ecc93d 100644 --- a/src/krb5-auth-dialog.h +++ b/src/krb5-auth-dialog.h @@ -24,7 +24,7 @@ #include "krb5-auth-applet.h" void ka_destroy_cache (GtkMenuItem *menuitem, gpointer user_data); -void ka_grab_credentials(Krb5AuthApplet* applet); - +gboolean ka_grab_credentials(KaApplet* applet); +gboolean ka_check_credentials (KaApplet *applet, const char* principal); #endif diff --git a/src/krb5-auth-gconf.c b/src/krb5-auth-gconf.c index a11370c..fd573c1 100644 --- a/src/krb5-auth-gconf.c +++ b/src/krb5-auth-gconf.c @@ -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 @@ ka_gconf_get_bool (GConfClient* client, 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 @@ ka_gconf_key_changed_callback (GConfClient* client, { 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 @@ ka_gconf_key_changed_callback (GConfClient* client, gboolean -ka_gconf_init (Krb5AuthApplet* applet, int argc, char* argv[]) +ka_gconf_init (KaApplet* applet, int argc, char* argv[]) { GError *error = NULL; GConfClient* client; diff --git a/src/krb5-auth-gconf.h b/src/krb5-auth-gconf.h index ec85704..3d2baae 100644 --- a/src/krb5-auth-gconf.h +++ b/src/krb5-auth-gconf.h @@ -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 diff --git a/src/krb5-auth-notify.c b/src/krb5-auth-notify.c deleted file mode 100644 index 019662e..0000000 --- a/src/krb5-auth-notify.c +++ /dev/null @@ -1,66 +0,0 @@ -/* Krb5 Auth Applet -- Acquire and release kerberos tickets - * - * (C) 2008 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 "krb5-auth-applet.h" -#include "krb5-auth-notify.h" - -#ifdef HAVE_LIBNOTIFY -#include <libnotify/notify.h> - -void -ka_send_event_notification (Krb5AuthApplet *applet, - const char *summary, - const char *message, - const char *icon) -{ - 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->notification != NULL) { - notify_notification_close (applet->notification, NULL); - g_object_unref (applet->notification); - } - - notify_icon = icon ? icon : "gtk-dialog-authentication"; - - applet->notification = \ - notify_notification_new_with_status_icon(summary, message, notify_icon, applet->tray_icon); - - notify_notification_set_urgency (applet->notification, NOTIFY_URGENCY_NORMAL); - notify_notification_show (applet->notification, NULL); -} - -#else /* HAVE_LIBNOTIFY */ - -void -ka_send_event_notification (Krb5AuthApplet *applet __attribute__((__unused__)), - const char *summary __attribute__((__unused__)), - const char *message __attribute__((__unused__)), - const char *icon __attribute__((__unused__))) -{ -} - -#endif /* HAVE_LIBNOTIFY */ diff --git a/src/krb5-auth-notify.h b/src/krb5-auth-notify.h deleted file mode 100644 index 9c0ce55..0000000 --- a/src/krb5-auth-notify.h +++ /dev/null @@ -1,28 +0,0 @@ -/* Krb5 Auth Applet -- Acquire and release kerberos tickets - * - * (C) 2008 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_NOTIFY_H -#define KRB5_AUTH_NOTIFY_H - -void ka_send_event_notification (Krb5AuthApplet *applet, - const char *summary, - const char *message, - const char *icon); -#endif |