From 1fd618eee96db111f3eea0806eccb8cf2ad91106 Mon Sep 17 00:00:00 2001 From: Amarnath Valluri Date: Thu, 22 Aug 2013 15:27:24 +0300 Subject: [PATCH] Release 0.0.3 --- Makefile.am | 29 +- Makefile.in | 141 ++- aclocal.m4 | 79 +- build-aux/ar-lib | 13 +- build-aux/config.sub | 11 +- build-aux/depcomp | 124 ++- build-aux/ltmain.sh | 4 +- config.h.in | 6 + configure | 454 ++++---- configure.ac | 26 +- dists/debian/README.Debian | 6 + dists/debian/changelog | 5 + dists/debian/compat | 1 + dists/debian/control | 27 + dists/debian/copyright | 31 + dists/debian/docs | 2 + dists/debian/gsignond-dev.install | 5 + dists/debian/gsignond-doc.docs | 1 + dists/debian/gsignond-doc.install | 1 + dists/debian/install | 7 + dists/debian/postinst | 41 + dists/debian/postrm | 38 + dists/debian/preinst | 38 + dists/debian/prerm | 38 + dists/debian/rules | 19 + dists/debian/source/format | 1 + dists/rpm/gsignond-0.0.2-10/gsignond-0.0.2.tar.gz | Bin 0 -> 185701 bytes dists/rpm/gsignond-0.0.2-10/gsignond-suse.spec | 131 +++ dists/rpm/gsignond-0.0.2-10/gsignond-tizen.changes | 8 + dists/rpm/gsignond-0.0.2-10/gsignond-tizen.spec | 113 ++ dists/rpm/gsignond-suse.spec | 23 +- dists/rpm/gsignond-tizen.changes | 5 + dists/rpm/gsignond-tizen.spec | 23 +- docs/Makefile.am | 121 ++ docs/Makefile.in | 908 +++++++++++++++ docs/building.xml | 180 +++ docs/gsignond-docs.sgml | 77 ++ docs/gsignond-overrides.txt | 0 docs/gsignond-sections.txt | 391 +++++++ docs/gsignond.types | 10 + docs/html/GSignondAccessControlManager.html | 366 ++++++ docs/html/GSignondConfig.html | 275 +++++ docs/html/GSignondCredentials.html | 328 ++++++ docs/html/GSignondDigestPlugin.html | 128 +++ docs/html/GSignondExtension.html | 298 +++++ docs/html/GSignondPasswordPlugin.html | 113 ++ docs/html/GSignondSecretStorage.html | 598 ++++++++++ docs/html/GSignondSsoTestPlugin.html | 101 ++ docs/html/GSignondStorageManager.html | 305 +++++ docs/html/annotation-glossary.html | 36 + docs/html/api-index-full.html | 891 +++++++++++++++ docs/html/ch01.html | 33 + docs/html/ch02.html | 44 + docs/html/ch03.html | 44 + docs/html/ch04.html | 41 + docs/html/ch05.html | 50 + docs/html/ch06.html | 41 + docs/html/deprecated-api-index.html | 31 + docs/html/gsignond-DBus-configuration.html | 107 ++ docs/html/gsignond-Database-configuration.html | 89 ++ docs/html/gsignond-Errors.html | 433 ++++++++ docs/html/gsignond-GSignondDictionary.html | 771 +++++++++++++ docs/html/gsignond-GSignondPlugin.html | 694 ++++++++++++ docs/html/gsignond-GSignondSecurityContext.html | 550 ++++++++++ docs/html/gsignond-GSignondSessionData.html | 582 ++++++++++ docs/html/gsignond-GSignondSignonuiData.html | 1160 ++++++++++++++++++++ docs/html/gsignond-General-configuration.html | 161 +++ docs/html/gsignond-Logging.html | 177 +++ docs/html/gsignond-Utility-functions.html | 119 ++ docs/html/gsignond-building.html | 161 +++ docs/html/gsignond.devhelp2 | 320 ++++++ docs/html/home.png | Bin 0 -> 256 bytes docs/html/index.html | 116 ++ docs/html/index.sgml | 381 +++++++ docs/html/left-insensitive.png | Bin 0 -> 395 bytes docs/html/left.png | Bin 0 -> 262 bytes docs/html/object-tree.html | 42 + docs/html/right-insensitive.png | Bin 0 -> 373 bytes docs/html/right.png | Bin 0 -> 261 bytes docs/html/style.css | 321 ++++++ docs/html/up-insensitive.png | Bin 0 -> 374 bytes docs/html/up.png | Bin 0 -> 260 bytes docs/tmpl/gsignond-access-control-manager.sgml | 102 ++ docs/tmpl/gsignond-config-db.sgml | 45 + docs/tmpl/gsignond-config-dbus.sgml | 52 + docs/tmpl/gsignond-config-general.sgml | 80 ++ docs/tmpl/gsignond-config.sgml | 84 ++ docs/tmpl/gsignond-credentials.sgml | 123 +++ docs/tmpl/gsignond-dictionary.sgml | 245 +++++ docs/tmpl/gsignond-digest-plugin.sgml | 37 + docs/tmpl/gsignond-error.sgml | 114 ++ docs/tmpl/gsignond-extension-interface.sgml | 90 ++ docs/tmpl/gsignond-log.sgml | 67 ++ docs/tmpl/gsignond-password-plugin.sgml | 37 + docs/tmpl/gsignond-plugin-interface.sgml | 164 +++ docs/tmpl/gsignond-secret-storage.sgml | 173 +++ docs/tmpl/gsignond-security-context.sgml | 192 ++++ docs/tmpl/gsignond-session-data.sgml | 206 ++++ docs/tmpl/gsignond-signonui-data.sgml | 395 +++++++ docs/tmpl/gsignond-ssotest-plugin.sgml | 37 + docs/tmpl/gsignond-storage-manager.sgml | 102 ++ docs/tmpl/gsignond-unused.sgml | 0 docs/tmpl/gsignond-utils.sgml | 50 + gsignond.conf | 55 + gtk-doc.make | 302 +++++ include/gsignond/gsignond-access-control-manager.h | 25 - include/gsignond/gsignond-config-db.h | 28 + include/gsignond/gsignond-config-dbus.h | 42 +- include/gsignond/gsignond-config-general.h | 75 ++ include/gsignond/gsignond-config.h | 9 +- include/gsignond/gsignond-credentials.h | 1 + include/gsignond/gsignond-dictionary.h | 7 +- include/gsignond/gsignond-error.h | 106 +- include/gsignond/gsignond-extension-interface.h | 50 +- include/gsignond/gsignond-log.h | 52 + include/gsignond/gsignond-plugin-interface.h | 25 +- include/gsignond/gsignond-secret-storage.h | 71 +- include/gsignond/gsignond-security-context.h | 16 +- include/gsignond/gsignond-session-data.h | 4 +- include/gsignond/gsignond-signonui-data.h | 33 +- include/gsignond/gsignond-storage-manager.h | 30 - include/gsignond/gsignond-utils.h | 7 +- m4/gtk-doc.m4 | 71 ++ packaging/gsignond.changes | 5 + packaging/gsignond.spec | 23 +- src/Makefile.in | 42 +- src/common/Makefile.am | 18 +- src/common/Makefile.in | 63 +- src/common/db/Makefile.in | 31 +- src/common/db/gsignond-db-error.h | 4 - src/common/db/gsignond-db-secret-database.c | 38 +- src/common/db/gsignond-db-sql-database.c | 18 +- src/common/db/gsignond-secret-storage.c | 454 ++++---- src/common/gsignond-access-control-manager.c | 62 +- src/common/gsignond-config.c | 108 +- src/common/gsignond-credentials.c | 66 +- src/common/gsignond-dictionary.c | 180 ++- src/common/gsignond-enum.c.template | 2 +- src/common/gsignond-error.c | 115 +- src/common/gsignond-extension-interface.c | 90 +- src/common/gsignond-identity-info-internal.h | 2 +- src/common/gsignond-identity-info.c | 49 +- src/common/gsignond-identity-info.h | 187 ++++ src/common/gsignond-plugin-enum-types.h | 2 +- src/common/gsignond-plugin-interface.c | 326 +++++- src/common/gsignond-security-context.c | 107 +- src/common/gsignond-session-data.c | 197 +++- src/common/gsignond-signonui-data.c | 408 ++++++- src/common/gsignond-storage-manager.c | 97 +- src/common/gsignond-utils.c | 107 +- src/daemon/Makefile.am | 24 +- src/daemon/Makefile.in | 150 ++- src/daemon/db/Makefile.am | 2 +- src/daemon/db/Makefile.in | 117 +- src/daemon/db/gsignond-db-credentials-database.c | 13 +- src/daemon/db/gsignond-db-credentials-database.h | 2 +- src/daemon/db/gsignond-db-metadata-database.c | 29 +- src/daemon/db/gsignond-db-metadata-database.h | 2 +- src/daemon/dbus/Makefile.am | 4 +- src/daemon/dbus/Makefile.in | 170 +-- .../dbus/gsignond-dbus-auth-service-adapter.c | 13 +- src/daemon/dbus/gsignond-dbus-auth-service-gen.c | 112 +- src/daemon/dbus/gsignond-dbus-auth-service-gen.h | 2 +- .../dbus/gsignond-dbus-auth-session-adapter.c | 65 +- .../dbus/gsignond-dbus-auth-session-adapter.h | 8 + src/daemon/dbus/gsignond-dbus-auth-session-gen.c | 66 +- src/daemon/dbus/gsignond-dbus-auth-session-gen.h | 2 +- src/daemon/dbus/gsignond-dbus-identity-adapter.c | 34 +- src/daemon/dbus/gsignond-dbus-identity-gen.c | 116 +- src/daemon/dbus/gsignond-dbus-identity-gen.h | 2 +- src/daemon/dbus/gsignond-dbus-remote-plugin-gen.c | 137 ++- src/daemon/dbus/gsignond-dbus-remote-plugin-gen.h | 5 +- src/daemon/dbus/gsignond-dbus-signonui-adapter.c | 10 +- ...code.AccountsSSO.gSingleSignOn.RemotePlugin.xml | 1 + src/daemon/gsignond-auth-session.c | 56 +- src/daemon/gsignond-auth-session.h | 2 +- src/daemon/gsignond-daemon.c | 32 +- src/daemon/gsignond-daemon.h | 2 +- src/daemon/gsignond-identity-enum-types.c | 4 +- src/daemon/gsignond-identity-enum-types.h | 2 +- src/daemon/gsignond-identity.c | 195 ++-- src/daemon/gsignond-identity.h | 5 +- src/daemon/gsignond-signonui-proxy.c | 121 +- src/daemon/main.c | 20 +- src/daemon/plugins/Makefile.am | 2 +- src/daemon/plugins/Makefile.in | 140 +-- src/daemon/plugins/gsignond-plugin-proxy.c | 28 +- src/daemon/plugins/gsignond-plugin-proxy.h | 1 + src/daemon/plugins/gsignond-plugin-remote.c | 23 +- src/daemon/plugins/plugind/Makefile.am | 2 +- src/daemon/plugins/plugind/Makefile.in | 139 +-- .../plugins/plugind/gsignond-plugin-daemon.c | 18 +- src/extensions/Makefile.in | 42 +- src/extensions/test/Makefile.am | 6 +- src/extensions/test/Makefile.in | 45 +- src/extensions/tizen/Makefile.am | 1 + src/extensions/tizen/Makefile.in | 41 +- src/extensions/tizen/tizen-storage-manager.c | 80 +- src/plugins/Makefile.in | 42 +- src/plugins/digest/Makefile.in | 34 +- src/plugins/digest/gsignond-digest-plugin.c | 248 ++--- src/plugins/password/Makefile.in | 34 +- src/plugins/password/gsignond-password-plugin.c | 39 +- src/plugins/ssotest/Makefile.in | 34 +- src/plugins/ssotest/gsignond-ssotest-plugin.c | 25 +- test/Makefile.am | 10 +- test/Makefile.in | 83 +- test/common/Makefile.am | 1 - test/common/Makefile.in | 37 +- test/daemon/Makefile.in | 36 +- test/daemon/daemon-test.c | 35 +- test/db/Makefile.am | 3 +- test/db/Makefile.in | 40 +- test/db/dbtest.c | 33 +- test/plugins/Makefile.am | 1 - test/plugins/Makefile.in | 37 +- test/plugins/digestplugintest.c | 10 +- test/plugins/passwordplugintest.c | 8 +- test/plugins/pluginproxytest.c | 17 +- test/plugins/pluginremotetest.c | 8 +- test/valgrind.supp | 20 +- test/valgrind_common.mk | 5 +- tools/archive.sh | 6 +- tools/prepare-tizen.sh | 11 +- tools/run-tests.sh | 1 - tools/setup-and-start-daemon.sh | 1 - 226 files changed, 19883 insertions(+), 2319 deletions(-) create mode 100644 dists/debian/README.Debian create mode 100644 dists/debian/changelog create mode 100644 dists/debian/compat create mode 100644 dists/debian/control create mode 100644 dists/debian/copyright create mode 100644 dists/debian/docs create mode 100644 dists/debian/gsignond-dev.install create mode 100644 dists/debian/gsignond-doc.docs create mode 100644 dists/debian/gsignond-doc.install create mode 100644 dists/debian/install create mode 100644 dists/debian/postinst create mode 100644 dists/debian/postrm create mode 100644 dists/debian/preinst create mode 100644 dists/debian/prerm create mode 100755 dists/debian/rules create mode 100644 dists/debian/source/format create mode 100644 dists/rpm/gsignond-0.0.2-10/gsignond-0.0.2.tar.gz create mode 100644 dists/rpm/gsignond-0.0.2-10/gsignond-suse.spec create mode 100644 dists/rpm/gsignond-0.0.2-10/gsignond-tizen.changes create mode 100644 dists/rpm/gsignond-0.0.2-10/gsignond-tizen.spec create mode 100644 docs/Makefile.am create mode 100644 docs/Makefile.in create mode 100644 docs/building.xml create mode 100644 docs/gsignond-docs.sgml create mode 100644 docs/gsignond-overrides.txt create mode 100644 docs/gsignond-sections.txt create mode 100644 docs/gsignond.types create mode 100644 docs/html/GSignondAccessControlManager.html create mode 100644 docs/html/GSignondConfig.html create mode 100644 docs/html/GSignondCredentials.html create mode 100644 docs/html/GSignondDigestPlugin.html create mode 100644 docs/html/GSignondExtension.html create mode 100644 docs/html/GSignondPasswordPlugin.html create mode 100644 docs/html/GSignondSecretStorage.html create mode 100644 docs/html/GSignondSsoTestPlugin.html create mode 100644 docs/html/GSignondStorageManager.html create mode 100644 docs/html/annotation-glossary.html create mode 100644 docs/html/api-index-full.html create mode 100644 docs/html/ch01.html create mode 100644 docs/html/ch02.html create mode 100644 docs/html/ch03.html create mode 100644 docs/html/ch04.html create mode 100644 docs/html/ch05.html create mode 100644 docs/html/ch06.html create mode 100644 docs/html/deprecated-api-index.html create mode 100644 docs/html/gsignond-DBus-configuration.html create mode 100644 docs/html/gsignond-Database-configuration.html create mode 100644 docs/html/gsignond-Errors.html create mode 100644 docs/html/gsignond-GSignondDictionary.html create mode 100644 docs/html/gsignond-GSignondPlugin.html create mode 100644 docs/html/gsignond-GSignondSecurityContext.html create mode 100644 docs/html/gsignond-GSignondSessionData.html create mode 100644 docs/html/gsignond-GSignondSignonuiData.html create mode 100644 docs/html/gsignond-General-configuration.html create mode 100644 docs/html/gsignond-Logging.html create mode 100644 docs/html/gsignond-Utility-functions.html create mode 100644 docs/html/gsignond-building.html create mode 100644 docs/html/gsignond.devhelp2 create mode 100644 docs/html/home.png create mode 100644 docs/html/index.html create mode 100644 docs/html/index.sgml create mode 100644 docs/html/left-insensitive.png create mode 100644 docs/html/left.png create mode 100644 docs/html/object-tree.html create mode 100644 docs/html/right-insensitive.png create mode 100644 docs/html/right.png create mode 100644 docs/html/style.css create mode 100644 docs/html/up-insensitive.png create mode 100644 docs/html/up.png create mode 100644 docs/tmpl/gsignond-access-control-manager.sgml create mode 100644 docs/tmpl/gsignond-config-db.sgml create mode 100644 docs/tmpl/gsignond-config-dbus.sgml create mode 100644 docs/tmpl/gsignond-config-general.sgml create mode 100644 docs/tmpl/gsignond-config.sgml create mode 100644 docs/tmpl/gsignond-credentials.sgml create mode 100644 docs/tmpl/gsignond-dictionary.sgml create mode 100644 docs/tmpl/gsignond-digest-plugin.sgml create mode 100644 docs/tmpl/gsignond-error.sgml create mode 100644 docs/tmpl/gsignond-extension-interface.sgml create mode 100644 docs/tmpl/gsignond-log.sgml create mode 100644 docs/tmpl/gsignond-password-plugin.sgml create mode 100644 docs/tmpl/gsignond-plugin-interface.sgml create mode 100644 docs/tmpl/gsignond-secret-storage.sgml create mode 100644 docs/tmpl/gsignond-security-context.sgml create mode 100644 docs/tmpl/gsignond-session-data.sgml create mode 100644 docs/tmpl/gsignond-signonui-data.sgml create mode 100644 docs/tmpl/gsignond-ssotest-plugin.sgml create mode 100644 docs/tmpl/gsignond-storage-manager.sgml create mode 100644 docs/tmpl/gsignond-unused.sgml create mode 100644 docs/tmpl/gsignond-utils.sgml create mode 100644 gsignond.conf create mode 100644 gtk-doc.make create mode 100644 m4/gtk-doc.m4 create mode 100644 src/common/gsignond-identity-info.h diff --git a/Makefile.am b/Makefile.am index 22f236b..31cb70d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -4,14 +4,41 @@ ACLOCAL_AMFLAGS = -I m4 # also --enable-dbus-type=session here AM_DISTCHECK_CONFIGURE_FLAGS = \ --enable-debug \ + --enable-gtk-doc \ --enable-distcheck pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = gsignond.pc -SUBDIRS = src test +dist_sysconf_DATA = gsignond.conf + +SUBDIRS = src test docs EXTRA_DIST = dists tools valgrind: cd test; make valgrind + +dist-hook: + @echo + @echo "==== Run 'make update-online-doc' to update online documentation ====" + @echo + +update-online-doc: + @tar zxf $(PACKAGE)-$(VERSION).tar.gz && \ + pushd . > /dev/null && \ + cd .. && \ + git clone https://code.google.com/p/accounts-sso.gsignon-docs/ ; \ + cd accounts-sso.gsignon-docs && \ + git pull ; \ + mkdir -p $(PACKAGE) && \ + rm -rf $(PACKAGE)/* && \ + popd > /dev/null && \ + cp -rf $(PACKAGE)-$(VERSION)/docs/html/* ../accounts-sso.gsignon-docs/$(PACKAGE)/ && \ + pushd . > /dev/null && \ + cd ../accounts-sso.gsignon-docs && \ + git add $(PACKAGE)/* && \ + git commit -m "Updated documentation for $(PACKAGE) to version $(VERSION)" && \ + git push ; \ + popd > /dev/null && \ + rm -rf $(PACKAGE)-$(VERSION) diff --git a/Makefile.in b/Makefile.in index 4475fd5..6b2796b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -16,6 +16,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -35,7 +52,7 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . -DIST_COMMON = README $(am__configure_deps) \ +DIST_COMMON = README $(am__configure_deps) $(dist_sysconf_DATA) \ $(srcdir)/${PACKAGE_NAME}-uninstalled.pc.in \ $(srcdir)/${PACKAGE_NAME}.pc.in $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ @@ -47,9 +64,10 @@ DIST_COMMON = README $(am__configure_deps) \ build-aux/install-sh build-aux/ltmain.sh build-aux/missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ @@ -75,6 +93,11 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -102,8 +125,9 @@ am__uninstall_files_from_dir = { \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } -am__installdirs = "$(DESTDIR)$(pkgconfigdir)" -DATA = $(pkgconfig_DATA) +am__installdirs = "$(DESTDIR)$(sysconfdir)" \ + "$(DESTDIR)$(pkgconfigdir)" +DATA = $(dist_sysconf_DATA) $(pkgconfig_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ @@ -296,11 +320,13 @@ ACLOCAL_AMFLAGS = -I m4 # also --enable-dbus-type=session here AM_DISTCHECK_CONFIGURE_FLAGS = \ --enable-debug \ + --enable-gtk-doc \ --enable-distcheck pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = gsignond.pc -SUBDIRS = src test +dist_sysconf_DATA = gsignond.conf +SUBDIRS = src test docs EXTRA_DIST = dists tools all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive @@ -372,10 +398,34 @@ clean-libtool: distclean-libtool: -rm -f libtool config.lt +install-dist_sysconfDATA: $(dist_sysconf_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(sysconfdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(sysconfdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(sysconfdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(sysconfdir)" || exit $$?; \ + done + +uninstall-dist_sysconfDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(sysconfdir)'; $(am__uninstall_files_from_dir) install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) - test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -560,13 +610,10 @@ distdir: $(DISTFILES) done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ @@ -586,6 +633,9 @@ distdir: $(DISTFILES) || exit 1; \ fi; \ done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ @@ -652,7 +702,7 @@ distcheck: dist *.zip*) \ unzip $(distdir).zip ;;\ esac - chmod -R a-w $(distdir); chmod a+w $(distdir) + chmod -R a-w $(distdir); chmod u+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) @@ -721,7 +771,7 @@ check: check-recursive all-am: Makefile $(DATA) config.h installdirs: installdirs-recursive installdirs-am: - for dir in "$(DESTDIR)$(pkgconfigdir)"; do \ + for dir in "$(DESTDIR)$(sysconfdir)" "$(DESTDIR)$(pkgconfigdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive @@ -782,7 +832,7 @@ install-dvi: install-dvi-recursive install-dvi-am: -install-exec-am: +install-exec-am: install-dist_sysconfDATA install-html: install-html-recursive @@ -822,7 +872,7 @@ ps: ps-recursive ps-am: -uninstall-am: uninstall-pkgconfigDATA +uninstall-am: uninstall-dist_sysconfDATA uninstall-pkgconfigDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ ctags-recursive install-am install-strip tags-recursive @@ -830,24 +880,49 @@ uninstall-am: uninstall-pkgconfigDATA .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ - dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \ - dist-zip distcheck distclean distclean-generic distclean-hdr \ - distclean-libtool distclean-tags distcleancheck distdir \ - distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-pkgconfigDATA install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am uninstall-pkgconfigDATA + dist-gzip dist-hook dist-lzip dist-lzma dist-shar dist-tarZ \ + dist-xz dist-zip distcheck distclean distclean-generic \ + distclean-hdr distclean-libtool distclean-tags distcleancheck \ + distdir distuninstallcheck dvi dvi-am html html-am info \ + info-am install install-am install-data install-data-am \ + install-dist_sysconfDATA install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-pkgconfigDATA install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-recursive uninstall uninstall-am \ + uninstall-dist_sysconfDATA uninstall-pkgconfigDATA valgrind: cd test; make valgrind +dist-hook: + @echo + @echo "==== Run 'make update-online-doc' to update online documentation ====" + @echo + +update-online-doc: + @tar zxf $(PACKAGE)-$(VERSION).tar.gz && \ + pushd . > /dev/null && \ + cd .. && \ + git clone https://code.google.com/p/accounts-sso.gsignon-docs/ ; \ + cd accounts-sso.gsignon-docs && \ + git pull ; \ + mkdir -p $(PACKAGE) && \ + rm -rf $(PACKAGE)/* && \ + popd > /dev/null && \ + cp -rf $(PACKAGE)-$(VERSION)/docs/html/* ../accounts-sso.gsignon-docs/$(PACKAGE)/ && \ + pushd . > /dev/null && \ + cd ../accounts-sso.gsignon-docs && \ + git add $(PACKAGE)/* && \ + git commit -m "Updated documentation for $(PACKAGE) to version $(VERSION)" && \ + git push ; \ + popd > /dev/null && \ + rm -rf $(PACKAGE)-$(VERSION) + # 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/aclocal.m4 b/aclocal.m4 index 5a28b91..6a7deef 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,4 +1,4 @@ -# generated automatically by aclocal 1.11.3 -*- Autoconf -*- +# generated automatically by aclocal 1.11.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, @@ -14,80 +14,12 @@ m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, -[m4_warning([this file was generated for autoconf 2.68. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) -dnl -*- mode: autoconf -*- - -# serial 1 - -dnl Usage: -dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) -AC_DEFUN([GTK_DOC_CHECK], -[ - AC_REQUIRE([PKG_PROG_PKG_CONFIG]) - AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first - AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first - - dnl check for tools we added during development - AC_PATH_PROG([GTKDOC_CHECK],[gtkdoc-check]) - AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true]) - AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf]) - - dnl for overriding the documentation installation directory - AC_ARG_WITH([html-dir], - AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),, - [with_html_dir='${datadir}/gtk-doc/html']) - HTML_DIR="$with_html_dir" - AC_SUBST([HTML_DIR]) - - dnl enable/disable documentation building - AC_ARG_ENABLE([gtk-doc], - AS_HELP_STRING([--enable-gtk-doc], - [use gtk-doc to build documentation [[default=no]]]),, - [enable_gtk_doc=no]) - - if test x$enable_gtk_doc = xyes; then - ifelse([$1],[], - [PKG_CHECK_EXISTS([gtk-doc],, - AC_MSG_ERROR([gtk-doc not installed and --enable-gtk-doc requested]))], - [PKG_CHECK_EXISTS([gtk-doc >= $1],, - AC_MSG_ERROR([You need to have gtk-doc >= $1 installed to build $PACKAGE_NAME]))]) - dnl don't check for glib if we build glib - if test "x$PACKAGE_NAME" != "xglib"; then - dnl don't fail if someone does not have glib - PKG_CHECK_MODULES(GTKDOC_DEPS, glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0,,) - fi - fi - - AC_MSG_CHECKING([whether to build gtk-doc documentation]) - AC_MSG_RESULT($enable_gtk_doc) - - dnl enable/disable output formats - AC_ARG_ENABLE([gtk-doc-html], - AS_HELP_STRING([--enable-gtk-doc-html], - [build documentation in html format [[default=yes]]]),, - [enable_gtk_doc_html=yes]) - AC_ARG_ENABLE([gtk-doc-pdf], - AS_HELP_STRING([--enable-gtk-doc-pdf], - [build documentation in pdf format [[default=no]]]),, - [enable_gtk_doc_pdf=no]) - - if test -z "$GTKDOC_MKPDF"; then - enable_gtk_doc_pdf=no - fi - - - AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes]) - AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes]) - AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes]) - AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"]) - AM_CONDITIONAL([GTK_DOC_USE_REBASE], [test -n "$GTKDOC_REBASE"]) -]) - # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # @@ -266,7 +198,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.11.3], [], +m4_if([$1], [1.11.6], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -282,7 +214,7 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.11.3])dnl +[AM_AUTOMAKE_VERSION([1.11.6])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) @@ -1335,6 +1267,7 @@ AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/ax_check_gnu_make.m4]) +m4_include([m4/gtk-doc.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) diff --git a/build-aux/ar-lib b/build-aux/ar-lib index c0286a4..0f62c6f 100755 --- a/build-aux/ar-lib +++ b/build-aux/ar-lib @@ -2,7 +2,7 @@ # Wrapper for Microsoft lib.exe me=ar-lib -scriptversion=2012-01-30.22; # UTC +scriptversion=2012-03-01.08; # UTC # Copyright (C) 2010, 2012 Free Software Foundation, Inc. # Written by Peter Rosin . @@ -153,7 +153,9 @@ action=${action#-} delete= extract= list= +quick= replace= +index= create= while test -n "$action" @@ -162,7 +164,10 @@ do d*) delete=yes ;; x*) extract=yes ;; t*) list=yes ;; + q*) quick=yes ;; r*) replace=yes ;; + s*) index=yes ;; + S*) ;; # the index is always updated implicitly c*) create=yes ;; u*) ;; # TODO: don't ignore the update modifier v*) ;; # TODO: don't ignore the verbose modifier @@ -173,8 +178,8 @@ do action=${action#?} done -case $delete$extract$list$replace in - yes) +case $delete$extract$list$quick$replace,$index in + yes,* | ,yes) ;; yesyes*) func_error "more than one action specified" @@ -225,7 +230,7 @@ elif test -n "$extract"; then done fi -elif test -n "$replace"; then +elif test -n "$quick$replace"; then if test ! -f "$orig_archive"; then if test -z "$create"; then echo "$me: creating $orig_archive" diff --git a/build-aux/config.sub b/build-aux/config.sub index c894da4..6205f84 100755 --- a/build-aux/config.sub +++ b/build-aux/config.sub @@ -4,7 +4,7 @@ # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. -timestamp='2012-02-10' +timestamp='2012-04-18' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software @@ -225,6 +225,12 @@ case $os in -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; -lynx*) os=-lynxos ;; @@ -1537,6 +1543,9 @@ case $basic_machine in c4x-* | tic4x-*) os=-coff ;; + hexagon-*) + os=-elf + ;; tic54x-*) os=-coff ;; diff --git a/build-aux/depcomp b/build-aux/depcomp index bd0ac08..25a39e6 100755 --- a/build-aux/depcomp +++ b/build-aux/depcomp @@ -1,10 +1,10 @@ #! /bin/sh # depcomp - compile a program generating dependencies as side-effects -scriptversion=2011-12-04.11; # UTC +scriptversion=2012-03-27.16; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, -# 2011 Free Software Foundation, Inc. +# 2011, 2012 Free Software Foundation, Inc. # 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 @@ -28,7 +28,7 @@ scriptversion=2011-12-04.11; # UTC case $1 in '') - echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) @@ -40,8 +40,8 @@ as side-effects. Environment variables: depmode Dependency tracking mode. - source Source file read by `PROGRAMS ARGS'. - object Object file output by `PROGRAMS ARGS'. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. @@ -57,6 +57,12 @@ EOF ;; esac +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' + if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 @@ -102,6 +108,12 @@ if test "$depmode" = msvc7msys; then depmode=msvc7 fi +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what @@ -156,15 +168,14 @@ gcc) ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" -## This next piece of magic avoids the `deleted header file' problem. +## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. - tr ' ' ' -' < "$tmpdepfile" | -## Some versions of gcc put a space before the `:'. On the theory + tr ' ' "$nl" < "$tmpdepfile" | +## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. @@ -203,18 +214,15 @@ sgi) # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; - # the IRIX cc adds comments like `#:fec' to the end of the + # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. - tr ' ' ' -' < "$tmpdepfile" \ + tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ - tr ' -' ' ' >> "$depfile" + tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. - tr ' ' ' -' < "$tmpdepfile" \ + tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else @@ -226,10 +234,17 @@ sgi) rm -f "$tmpdepfile" ;; +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the - # current directory. Also, the AIX compiler puts `$object:' at the + # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` @@ -259,12 +274,11 @@ aix) test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then - # Each line is of the form `foo.o: dependent.h'. + # Each line is of the form 'foo.o: dependent.h'. # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. + # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - # That's a tab and a space in the []. - sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile @@ -275,23 +289,26 @@ aix) ;; icc) - # Intel's C compiler understands `-MD -MF file'. However on - # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. + # However on + # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h - # which is wrong. We want: + # which is wrong. We want # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h - # and will wrap long lines using \ : + # and will wrap long lines using '\': # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... - + # tcc 0.9.26 (FIXME still under development at the moment of writing) + # will emit a similar output, but also prepend the continuation lines + # with horizontal tabulation characters. "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : @@ -300,15 +317,21 @@ icc) exit $stat fi rm -f "$depfile" - # Each line is of the form `foo.o: dependent.h', - # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Each line is of the form 'foo.o: dependent.h', + # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" - # Some versions of the HPUX 10.20 sed can't process this invocation - # correctly. Breaking it into two sed invocations is a workaround. - sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | - sed -e 's/$/ :/' >> "$depfile" + # '$object: dependent.h' and one to simply 'dependent.h:'. + sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ + < "$tmpdepfile" > "$depfile" + sed ' + s/[ '"$tab"'][ '"$tab"']*/ /g + s/^ *// + s/ *\\*$// + s/^[^:]*: *// + /^$/d + /:$/d + s/$/ :/ + ' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; @@ -344,7 +367,7 @@ hp2) done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" - # Add `dependent.h:' lines. + # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// @@ -359,9 +382,9 @@ hp2) tru64) # The Tru64 compiler uses -MD to generate dependencies as a side - # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put - # dependencies in `foo.d' instead, so we check for that too. + # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= @@ -407,8 +430,7 @@ tru64) done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - # That's a tab and a space in the []. - sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi @@ -443,11 +465,11 @@ msvc7) p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g -s/\(.*\)/ \1 \\/p +s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { - s/.*/ / + s/.*/'"$tab"'/ G p }' >> "$depfile" @@ -478,7 +500,7 @@ dashmstdout) shift fi - # Remove `-o $object'. + # Remove '-o $object'. IFS=" " for arg do @@ -498,15 +520,14 @@ dashmstdout) done test -z "$dashmflag" && dashmflag=-M - # Require at least two characters before searching for `:' + # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: - # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | - sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" - tr ' ' ' -' < "$tmpdepfile" | \ + tr ' ' "$nl" < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" @@ -562,8 +583,7 @@ makedepend) # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" - sed '1,2d' "$tmpdepfile" | tr ' ' ' -' | \ + sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" @@ -583,7 +603,7 @@ cpp) shift fi - # Remove `-o $object'. + # Remove '-o $object'. IFS=" " for arg do @@ -652,8 +672,8 @@ msvisualcpp) sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" - sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" - echo " " >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; diff --git a/build-aux/ltmain.sh b/build-aux/ltmain.sh index c2852d8..0096fe6 100644 --- a/build-aux/ltmain.sh +++ b/build-aux/ltmain.sh @@ -70,7 +70,7 @@ # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu1 +# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu2 # automake: $automake_version # autoconf: $autoconf_version # @@ -80,7 +80,7 @@ PROGRAM=libtool PACKAGE=libtool -VERSION="2.4.2 Debian-2.4.2-1ubuntu1" +VERSION="2.4.2 Debian-2.4.2-1ubuntu2" TIMESTAMP="" package_revision=1.3337 diff --git a/config.h.in b/config.h.in index 34fd3d3..a13a050 100644 --- a/config.h.in +++ b/config.h.in @@ -1,5 +1,8 @@ /* config.h.in. Generated from configure.ac by autoheader. */ +/* Enable ACL triggers */ +#undef ENABLE_DB_ACL_TRIGGERS + /* Enable debug features */ #undef ENABLE_DEBUG @@ -48,6 +51,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H +/* Keychain system context */ +#undef KEYCHAIN_SYSCTX + /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR diff --git a/configure b/configure index 134f172..8c6f951 100755 --- a/configure +++ b/configure @@ -1,11 +1,9 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for gsignond 0.0.2. +# Generated by GNU Autoconf 2.69 for gsignond 0.0.3. # # -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software -# Foundation, Inc. +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation @@ -134,6 +132,31 @@ export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh @@ -167,7 +190,8 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi -test x\$exitcode = x0 || exit 1" +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && @@ -220,21 +244,25 @@ IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : - # We cannot yet assume a decent shell, so we have to provide a - # neutralization value for shells without unset; and this also - # works around shells that cannot unset nonexistent variables. - # Preserve -v and -x to the replacement shell. - BASH_ENV=/dev/null - ENV=/dev/null - (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV - export CONFIG_SHELL - case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; - esac - exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 fi if test x$as_have_required = xno; then : @@ -336,6 +364,14 @@ $as_echo X"$as_dir" | } # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take @@ -457,6 +493,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). @@ -491,16 +531,16 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @@ -512,28 +552,8 @@ else as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x +as_test_x='test -x' +as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -567,10 +587,10 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gsignond' PACKAGE_TARNAME='gsignond' -PACKAGE_VERSION='0.0.2' -PACKAGE_STRING='gsignond 0.0.2' +PACKAGE_VERSION='0.0.3' +PACKAGE_STRING='gsignond 0.0.3' PACKAGE_BUGREPORT='' -PACKAGE_URL='http://code.google.com/p/accounts-sso/' +PACKAGE_URL='http://01.org/gsso' ac_unique_file="src/daemon/main.c" # Factoring default headers for most tests. @@ -631,6 +651,10 @@ GTKDOC_REBASE GTKDOC_CHECK DBUS_INTERFACES_DIR DBUS_SERVICES_DIR +SET_PERMISSIONS_FALSE +SET_PERMISSIONS_TRUE +HAVE_DEBUG_FALSE +HAVE_DEBUG_TRUE MESSAGE_BUS_TYPE USE_GTESTDBUS_FALSE USE_GTESTDBUS_TRUE @@ -779,8 +803,10 @@ with_sysroot enable_libtool_lock enable_distcheck enable_dbus_type +enable_keychain enable_debug enable_sql_log +enable_acltriggers with_html_dir enable_gtk_doc enable_gtk_doc_html @@ -1265,8 +1291,6 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1352,7 +1376,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures gsignond 0.0.2 to adapt to many kinds of systems. +\`configure' configures gsignond 0.0.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1422,7 +1446,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of gsignond 0.0.2:";; + short | recursive ) echo "Configuration of gsignond 0.0.3:";; esac cat <<\_ACEOF @@ -1444,8 +1468,12 @@ Optional Features: p2p(default): uses peer to peer dbus session: uses session message bus system: uses system message bus + --enable-keychain=sysctx + enable keychain access with + system context "sysctx" --enable-debug enable debug features - --enable-sql-log enable sql log feature + --enable-sql-log enable sql log feature + --enable-acltriggers enable ACL before delete triggers --enable-gtk-doc use gtk-doc to build documentation [[default=no]] --enable-gtk-doc-html build documentation in html format [[default=yes]] --enable-gtk-doc-pdf build documentation in pdf format [[default=no]] @@ -1502,7 +1530,7 @@ Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. -gsignond home page: . +gsignond home page: . _ACEOF ac_status=$? fi @@ -1565,10 +1593,10 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -gsignond configure 0.0.2 -generated by GNU Autoconf 2.68 +gsignond configure 0.0.3 +generated by GNU Autoconf 2.69 -Copyright (C) 2010 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1644,7 +1672,7 @@ $as_echo "$ac_try_echo"; } >&5 test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext + test -x conftest$ac_exeext }; then : ac_retval=0 else @@ -1930,8 +1958,8 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by gsignond $as_me 0.0.2, which was -generated by GNU Autoconf 2.68. Invocation command line was +It was created by gsignond $as_me 0.0.3, which was +generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2351,7 +2379,7 @@ case $as_dir/ in #(( # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -2520,7 +2548,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -2560,7 +2588,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -2611,7 +2639,7 @@ do test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do - { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ @@ -2664,7 +2692,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -2789,7 +2817,7 @@ fi # Define the identity of the package. PACKAGE='gsignond' - VERSION='0.0.2' + VERSION='0.0.3' cat >>confdefs.h <<_ACEOF @@ -2934,7 +2962,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -2974,7 +3002,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3027,7 +3055,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3068,7 +3096,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue @@ -3126,7 +3154,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3170,7 +3198,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3616,8 +3644,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include -#include -#include +struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); @@ -3913,7 +3940,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3957,7 +3984,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4273,7 +4300,7 @@ do for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue + as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in @@ -4349,7 +4376,7 @@ do for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue + as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in @@ -4415,7 +4442,7 @@ do for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue + as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in @@ -4482,7 +4509,7 @@ do for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue + as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in @@ -4738,7 +4765,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4782,7 +4809,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5206,7 +5233,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5246,7 +5273,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5552,7 +5579,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5592,7 +5619,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5695,7 +5722,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5739,7 +5766,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5864,7 +5891,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5904,7 +5931,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5963,7 +5990,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6003,7 +6030,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6652,7 +6679,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6692,7 +6719,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6772,7 +6799,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6812,7 +6839,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6864,7 +6891,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6904,7 +6931,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6956,7 +6983,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6996,7 +7023,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7048,7 +7075,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7088,7 +7115,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7140,7 +7167,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7180,7 +7207,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -11711,7 +11738,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -11754,7 +11781,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -12198,7 +12225,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GLIB_MKENUMS="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -12350,6 +12377,19 @@ if test "x$enable_dbus_type" != "xp2p" ; then fi fi +# Check whether --enable-keychain was given. +if test "${enable_keychain+set}" = set; then : + enableval=$enable_keychain; enable_keychain=$enableval +fi + +if test "x$enable_keychain" != "x" ; then + +cat >>confdefs.h <<_ACEOF +#define KEYCHAIN_SYSCTX "$enable_keychain" +_ACEOF + +fi + # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; enable_debug=yes @@ -12379,6 +12419,19 @@ $as_echo "#define ENABLE_SQL_LOG 1" >>confdefs.h fi fi +# Check whether --enable-acltriggers was given. +if test "${enable_acltriggers+set}" = set; then : + enableval=$enable_acltriggers; enable_acl_triggers=yes +else + enable_acl_triggers=no +fi + +if test "x$enable_acl_triggers" = "xyes" ; then + +$as_echo "#define ENABLE_DB_ACL_TRIGGERS 1" >>confdefs.h + +fi + if test x$gtestdbus = xyes; then USE_GTESTDBUS_TRUE= USE_GTESTDBUS_FALSE='#' @@ -12390,6 +12443,23 @@ fi MESSAGE_BUS_TYPE=$enable_dbus_type + if test x$enable_debug = xyes; then + HAVE_DEBUG_TRUE= + HAVE_DEBUG_FALSE='#' +else + HAVE_DEBUG_TRUE='#' + HAVE_DEBUG_FALSE= +fi + + if test x$enable_distcheck != xyes; then + SET_PERMISSIONS_TRUE= + SET_PERMISSIONS_FALSE='#' +else + SET_PERMISSIONS_TRUE='#' + SET_PERMISSIONS_FALSE= +fi + + @@ -12415,7 +12485,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GTKDOC_CHECK="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -12457,7 +12527,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GTKDOC_REBASE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -12501,7 +12571,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GTKDOC_MKPDF="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -12545,14 +12615,14 @@ fi if test x$enable_gtk_doc = xyes; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-doc\""; } >&5 - ($PKG_CONFIG --exists --print-errors "gtk-doc") 2>&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-doc >= 1.18\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk-doc >= 1.18") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : else - as_fn_error $? "gtk-doc not installed and --enable-gtk-doc requested" "$LINENO" 5 + as_fn_error $? "You need to have gtk-doc >= 1.18 installed to build $PACKAGE_NAME" "$LINENO" 5 fi if test "x$PACKAGE_NAME" != "xglib"; then @@ -12614,31 +12684,11 @@ fi # Put the nasty error message in config.log where it belongs echo "$GTKDOC_DEPS_PKG_ERRORS" >&5 - as_fn_error $? "Package requirements (glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0) were not met: - -$GTKDOC_DEPS_PKG_ERRORS - -Consider adjusting the PKG_CONFIG_PATH environment variable if you -installed software in a non-standard prefix. - -Alternatively, you may set the environment variables GTKDOC_DEPS_CFLAGS -and GTKDOC_DEPS_LIBS to avoid the need to call pkg-config. -See the pkg-config man page for more details." "$LINENO" 5 + : elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it -is in your PATH or set the PKG_CONFIG environment variable to the full -path to pkg-config. - -Alternatively, you may set the environment variables GTKDOC_DEPS_CFLAGS -and GTKDOC_DEPS_LIBS to avoid the need to call pkg-config. -See the pkg-config man page for more details. - -To get pkg-config, see . -See \`config.log' for more details" "$LINENO" 5; } + : else GTKDOC_DEPS_CFLAGS=$pkg_cv_GTKDOC_DEPS_CFLAGS GTKDOC_DEPS_LIBS=$pkg_cv_GTKDOC_DEPS_LIBS @@ -12673,6 +12723,10 @@ fi enable_gtk_doc_pdf=no fi + if test -z "$AM_DEFAULT_VERBOSITY"; then + AM_DEFAULT_VERBOSITY=1 + fi + if test x$enable_gtk_doc = xyes; then ENABLE_GTK_DOC_TRUE= @@ -12739,7 +12793,7 @@ GSIGNOND_CFLAGS="$GSIGNOND_CFLAGS -Wall -Werror -DG_LOG_DOMAIN=\\\"gsignond\\\"" # Checks for library functions. -ac_config_files="$ac_config_files Makefile ${PACKAGE_NAME}.pc ${PACKAGE_NAME}-uninstalled.pc src/Makefile src/common/Makefile src/common/db/Makefile src/daemon/Makefile src/daemon/db/Makefile src/daemon/dbus/Makefile src/daemon/dbus/services/com.google.code.AccountsSSO.gSingleSignOn.service src/daemon/plugins/Makefile src/daemon/plugins/plugind/Makefile src/extensions/Makefile src/extensions/test/Makefile src/extensions/tizen/Makefile src/plugins/Makefile src/plugins/password/Makefile src/plugins/ssotest/Makefile src/plugins/digest/Makefile test/Makefile test/common/Makefile test/db/Makefile test/daemon/Makefile test/daemon/gsignond-dbus.conf test/plugins/Makefile" +ac_config_files="$ac_config_files Makefile ${PACKAGE_NAME}.pc ${PACKAGE_NAME}-uninstalled.pc docs/Makefile src/Makefile src/common/Makefile src/common/db/Makefile src/daemon/Makefile src/daemon/db/Makefile src/daemon/dbus/Makefile src/daemon/dbus/services/com.google.code.AccountsSSO.gSingleSignOn.service src/daemon/plugins/Makefile src/daemon/plugins/plugind/Makefile src/extensions/Makefile src/extensions/test/Makefile src/extensions/tizen/Makefile src/plugins/Makefile src/plugins/password/Makefile src/plugins/ssotest/Makefile src/plugins/digest/Makefile test/Makefile test/common/Makefile test/db/Makefile test/daemon/Makefile test/daemon/gsignond-dbus.conf test/plugins/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -12878,6 +12932,14 @@ if test -z "${USE_GTESTDBUS_TRUE}" && test -z "${USE_GTESTDBUS_FALSE}"; then as_fn_error $? "conditional \"USE_GTESTDBUS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${HAVE_DEBUG_TRUE}" && test -z "${HAVE_DEBUG_FALSE}"; then + as_fn_error $? "conditional \"HAVE_DEBUG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SET_PERMISSIONS_TRUE}" && test -z "${SET_PERMISSIONS_FALSE}"; then + as_fn_error $? "conditional \"SET_PERMISSIONS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 @@ -13196,16 +13258,16 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @@ -13265,28 +13327,16 @@ else as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -13307,8 +13357,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by gsignond $as_me 0.0.2, which was -generated by GNU Autoconf 2.68. Invocation command line was +This file was extended by gsignond $as_me 0.0.3, which was +generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -13368,17 +13418,17 @@ Configuration commands: $config_commands Report bugs to the package provider. -gsignond home page: ." +gsignond home page: ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -gsignond config.status 0.0.2 -configured by $0, generated by GNU Autoconf 2.68, +gsignond config.status 0.0.3 +configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" -Copyright (C) 2010 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -13469,7 +13519,7 @@ fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' @@ -13786,6 +13836,7 @@ do "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "${PACKAGE_NAME}.pc") CONFIG_FILES="$CONFIG_FILES ${PACKAGE_NAME}.pc" ;; "${PACKAGE_NAME}-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES ${PACKAGE_NAME}-uninstalled.pc" ;; + "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/common/Makefile") CONFIG_FILES="$CONFIG_FILES src/common/Makefile" ;; "src/common/db/Makefile") CONFIG_FILES="$CONFIG_FILES src/common/db/Makefile" ;; @@ -15307,6 +15358,14 @@ if test -z "${USE_GTESTDBUS_TRUE}" && test -z "${USE_GTESTDBUS_FALSE}"; then as_fn_error $? "conditional \"USE_GTESTDBUS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${HAVE_DEBUG_TRUE}" && test -z "${HAVE_DEBUG_FALSE}"; then + as_fn_error $? "conditional \"HAVE_DEBUG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SET_PERMISSIONS_TRUE}" && test -z "${SET_PERMISSIONS_FALSE}"; then + as_fn_error $? "conditional \"SET_PERMISSIONS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 @@ -15629,16 +15688,16 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @@ -15698,28 +15757,16 @@ else as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -15740,8 +15787,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by gsignond $as_me 0.0.2, which was -generated by GNU Autoconf 2.68. Invocation command line was +This file was extended by gsignond $as_me 0.0.3, which was +generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -15801,17 +15848,17 @@ Configuration commands: $config_commands Report bugs to the package provider. -gsignond home page: ." +gsignond home page: ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -gsignond config.status 0.0.2 -configured by $0, generated by GNU Autoconf 2.68, +gsignond config.status 0.0.3 +configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" -Copyright (C) 2010 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -15902,7 +15949,7 @@ fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' @@ -16220,6 +16267,7 @@ do "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "${PACKAGE_NAME}.pc") CONFIG_FILES="$CONFIG_FILES ${PACKAGE_NAME}.pc" ;; "${PACKAGE_NAME}-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES ${PACKAGE_NAME}-uninstalled.pc" ;; + "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/common/Makefile") CONFIG_FILES="$CONFIG_FILES src/common/Makefile" ;; "src/common/db/Makefile") CONFIG_FILES="$CONFIG_FILES src/common/db/Makefile" ;; diff --git a/configure.ac b/configure.ac index 7c78167..3281447 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ([2.60]) -AC_INIT([gsignond], [0.0.2],[],[],[http://code.google.com/p/accounts-sso/]) +AC_INIT([gsignond], [0.0.3],[],[],[http://01.org/gsso]) AC_CONFIG_SRCDIR([src/daemon/main.c]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_AUX_DIR([build-aux]) @@ -98,6 +98,15 @@ if test "x$enable_dbus_type" != "xp2p" ; then fi fi +AC_ARG_ENABLE(keychain, + [ --enable-keychain=sysctx + enable keychain access with + system context "sysctx"], + [enable_keychain=$enableval]) +if test "x$enable_keychain" != "x" ; then + AC_DEFINE_UNQUOTED(KEYCHAIN_SYSCTX, ["$enable_keychain"], [Keychain system context]) +fi + AC_ARG_ENABLE(debug, [ --enable-debug enable debug features], [enable_debug=yes], [enable_debug=no]) @@ -106,7 +115,7 @@ echo $enable_debug if test "x$enable_debug" = "xyes" ; then AC_DEFINE(ENABLE_DEBUG, [1], [Enable debug features]) AC_ARG_ENABLE(sql-log, - [ --enable-sql-log enable sql log feature], + [ --enable-sql-log enable sql log feature], [enable_sql_log=yes], [enable_sql_log=no]) echo -n "enable sql log feature... " echo $enable_sql_log @@ -115,14 +124,24 @@ if test "x$enable_debug" = "xyes" ; then fi fi +AC_ARG_ENABLE(acltriggers, + [ --enable-acltriggers enable ACL before delete triggers], + [enable_acl_triggers=yes], [enable_acl_triggers=no]) +if test "x$enable_acl_triggers" = "xyes" ; then + AC_DEFINE(ENABLE_DB_ACL_TRIGGERS, [1], [Enable ACL triggers]) +fi + AM_CONDITIONAL(USE_GTESTDBUS, [test x$gtestdbus = xyes]) AC_SUBST(MESSAGE_BUS_TYPE, [$enable_dbus_type]) +AM_CONDITIONAL(HAVE_DEBUG, [test x$enable_debug = xyes]) +AM_CONDITIONAL(SET_PERMISSIONS, [test x$enable_distcheck != xyes]) + AC_SUBST(DBUS_SERVICES_DIR) AC_SUBST(DBUS_INTERFACES_DIR) # gtk-doc -GTK_DOC_CHECK +GTK_DOC_CHECK([1.18],[--flavour no-tmpl]) # Checks for header files. AC_CHECK_HEADERS([string.h]) @@ -140,6 +159,7 @@ AC_OUTPUT([ Makefile ${PACKAGE_NAME}.pc ${PACKAGE_NAME}-uninstalled.pc +docs/Makefile src/Makefile src/common/Makefile src/common/db/Makefile diff --git a/dists/debian/README.Debian b/dists/debian/README.Debian new file mode 100644 index 0000000..1849f59 --- /dev/null +++ b/dists/debian/README.Debian @@ -0,0 +1,6 @@ +The Debian Package gsignond +---------------------------- + +This is default Debian packaging for gsignond. + + -- Jussi Laako Wed, 03 Jul 2013 17:24:53 +0300 diff --git a/dists/debian/changelog b/dists/debian/changelog new file mode 100644 index 0000000..8fedc96 --- /dev/null +++ b/dists/debian/changelog @@ -0,0 +1,5 @@ +gsignond (0.0.2-1) unstable; urgency=low + + * Initial Release. + + -- Jussi Laako Wed, 03 Jul 2013 17:24:53 +0300 diff --git a/dists/debian/compat b/dists/debian/compat new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/dists/debian/compat @@ -0,0 +1 @@ +8 diff --git a/dists/debian/control b/dists/debian/control new file mode 100644 index 0000000..19fd59d --- /dev/null +++ b/dists/debian/control @@ -0,0 +1,27 @@ +Source: gsignond +Section: net +Priority: extra +Maintainer: Jussi Laako +Build-Depends: debhelper (>= 8.0.0), autotools-dev, pkg-config, libdbus-1-dev, gtk-doc-tools, libsqlite3-dev, libglib2.0-dev +Standards-Version: 3.9.2 +Homepage: https://01.org/gsso +Vcs-Git: http://code.google.com/p/accounts-sso.gsignond/ +Vcs-Browser: http://code.google.com/p/accounts-sso/source/browse/?repo=gsignond + +Package: gsignond +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: gSSO daemon and default plugins + gSSO is a single sign-on framework, providing secure storage and single sign-on service. + +Package: gsignond-dev +Architecture: any +Depends: ${shlibs:Depens}, ${misc:Depends} +Description: development files for gsignond + Headers and libraries necessary for developing plugins and extensions. + +Package: gsignond-doc +Architecture: all +Description: documentation for gsignond + Developer documentation for developing plugins and extensions. + diff --git a/dists/debian/copyright b/dists/debian/copyright new file mode 100644 index 0000000..af37ea7 --- /dev/null +++ b/dists/debian/copyright @@ -0,0 +1,31 @@ +Format: http://dep.debian.net/deps/dep5 +Upstream-Name: gsignond +Source: http://code.google.com/p/accounts-sso/source/checkout?repo=gsignond + +Files: * +Copyright: 2012 - 2013 Intel Corporation +License: LGPL-2.1+ + +Files: debian/* +Copyright: 2013 Jussi Laako +License: LGPL-2.1+ + +License: LGPL-2.1+ + This package is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + . + This package 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 + Lesser General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see . + . + On Debian systems, the complete text of the GNU Lesser General + Public License can be found in "/usr/share/common-licenses/LGPL-2.1". + +# Please also look if there are files or directories which have a +# different copyright/license attached and list them here. diff --git a/dists/debian/docs b/dists/debian/docs new file mode 100644 index 0000000..50bd824 --- /dev/null +++ b/dists/debian/docs @@ -0,0 +1,2 @@ +NEWS +README diff --git a/dists/debian/gsignond-dev.install b/dists/debian/gsignond-dev.install new file mode 100644 index 0000000..e6a08cc --- /dev/null +++ b/dists/debian/gsignond-dev.install @@ -0,0 +1,5 @@ +/usr/include/gsignond/* +/usr/lib/libgsignond-*.so +/usr/lib/libgsignond-*.la +/usr/lib/pkgconfig/gsignond.pc +/usr/share/dbus-1/interfaces/*SSO*.xml diff --git a/dists/debian/gsignond-doc.docs b/dists/debian/gsignond-doc.docs new file mode 100644 index 0000000..d4f4542 --- /dev/null +++ b/dists/debian/gsignond-doc.docs @@ -0,0 +1 @@ +#DOCS# diff --git a/dists/debian/gsignond-doc.install b/dists/debian/gsignond-doc.install new file mode 100644 index 0000000..c357621 --- /dev/null +++ b/dists/debian/gsignond-doc.install @@ -0,0 +1 @@ +/usr/share/gtk-doc/html/gsignond/* diff --git a/dists/debian/install b/dists/debian/install new file mode 100644 index 0000000..173ee00 --- /dev/null +++ b/dists/debian/install @@ -0,0 +1,7 @@ +/usr/bin/gsignond +/usr/bin/gsignond-plugind +/usr/lib/libgsignond-*.so.* +/usr/lib/gsignond/extensions/*.so* +/usr/lib/gsignond/plugins/*.so* +/usr/share/dbus-1/services/*SingleSignOn*.service +/etc/gsignond.conf diff --git a/dists/debian/postinst b/dists/debian/postinst new file mode 100644 index 0000000..301a61b --- /dev/null +++ b/dists/debian/postinst @@ -0,0 +1,41 @@ +#!/bin/sh +# postinst script for gsignond +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-remove' +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + configure) + ldconfig + groupadd -f -r gsignond + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/dists/debian/postrm b/dists/debian/postrm new file mode 100644 index 0000000..7723d3c --- /dev/null +++ b/dists/debian/postrm @@ -0,0 +1,38 @@ +#!/bin/sh +# postrm script for gsignond +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `purge' +# * `upgrade' +# * `failed-upgrade' +# * `abort-install' +# * `abort-install' +# * `abort-upgrade' +# * `disappear' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + ldconfig + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/dists/debian/preinst b/dists/debian/preinst new file mode 100644 index 0000000..808b6f4 --- /dev/null +++ b/dists/debian/preinst @@ -0,0 +1,38 @@ +#!/bin/sh +# preinst script for gsignond +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `install' +# * `install' +# * `upgrade' +# * `abort-upgrade' +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + install) + ;; + upgrade) + cp -a /etc/gsignond.conf /etc/gsignond.conf.orig + ;; + + abort-upgrade) + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/dists/debian/prerm b/dists/debian/prerm new file mode 100644 index 0000000..d111903 --- /dev/null +++ b/dists/debian/prerm @@ -0,0 +1,38 @@ +#!/bin/sh +# prerm script for gsignond +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `upgrade' +# * `failed-upgrade' +# * `remove' `in-favour' +# * `deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + remove|upgrade|deconfigure) + ;; + + failed-upgrade) + ;; + + *) + echo "prerm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/dists/debian/rules b/dists/debian/rules new file mode 100755 index 0000000..4658a60 --- /dev/null +++ b/dists/debian/rules @@ -0,0 +1,19 @@ +#!/usr/bin/make -f +# -*- makefile -*- + +DEB_CONFIGURE_EXTRA_FLAGS += --enable-dbus-type=session + +# Uncomment this to turn on verbose mode. +export DH_VERBOSE=1 + +# This has to be exported to make some magic below work. +export DH_OPTIONS + +%: + dh $@ --parallel + +override_dh_auto_configure: + dh_auto_configure -- --enable-dbus-type=session --enable-gtk-doc + +override_dh_auto_test: + true diff --git a/dists/debian/source/format b/dists/debian/source/format new file mode 100644 index 0000000..89ae9db --- /dev/null +++ b/dists/debian/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/dists/rpm/gsignond-0.0.2-10/gsignond-0.0.2.tar.gz b/dists/rpm/gsignond-0.0.2-10/gsignond-0.0.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..e134af9a5128255c14745a1a336a070365799637 GIT binary patch literal 185701 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

sXYN1SIiz;)BF2LT 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 2.30 +BuildRequires: pkgconfig(gobject-2.0) +BuildRequires: pkgconfig(gio-2.0) +BuildRequires: pkgconfig(gio-unix-2.0) +BuildRequires: pkgconfig(gmodule-2.0) +BuildRequires: pkgconfig(sqlite3) + + +%description +%{summary}. + + +%package devel +Summary: Development files for %{name} +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description devel +%{summary}. + + +%package doc +Summary: Documentation files for %{name} +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description doc +%{summary}. + + +%prep +%setup -q -n %{name}-%{version} +#gtkdocize +# for repository snapshot packages +#aclocal +#autoheader +#libtoolize --copy --force +#autoconf +#automake --add-missing --copy +#autoreconf --install --force +# fore release source packages +autoreconf -f -i + + +%build +%if %{debug_build} == 1 +%configure --enable-dbus-type=%{dbus_type} --enable-debug +%else +%configure --enable-dbus-type=%{dbus_type} +%endif + +make %{?_smp_mflags} + + +%install +rm -rf %{buildroot} +%make_install + + +%post +/sbin/ldconfig +chmod u+s %{_bindir}/%{name} +groupadd -f -r gsignond + + +%postun -p /sbin/ldconfig + + +%files +%defattr(-,root,root,-) +%doc AUTHORS COPYING.LIB INSTALL NEWS README +%{_bindir}/%{name} +%{_bindir}/%{name}-plugind +%{_libdir}/lib%{name}-*.so.* +%{_libdir}/%{name}/extensions/*.so* +%{_libdir}/%{name}/plugins/*.so* +%if %{dbus_type} != "p2p" +%{_datadir}/dbus-1/services/*SingleSignOn*.service +%endif +%exclude %{_libdir}/gsignond/extensions/*.la +%exclude %{_libdir}/gsignond/plugins/*.la +%config(noreplace) %{_sysconfdir}/gsignond.conf + + +%files devel +%defattr(-,root,root,-) +%{_includedir}/%{name}/*.h +%{_libdir}/lib%{name}-*.so +%{_libdir}/lib%{name}-*.la +%{_libdir}/pkgconfig/%{name}.pc +%if %{dbus_type} != "p2p" +%{_datadir}/dbus-1/interfaces/*SSO*.xml +%endif + + +%files doc +%defattr(-,root,root,-) +%{_datadir}/gtk-doc/html/gsignond/* + + +%changelog +* Mon Jun 24 2013 Imran Zaman +- Release 0.0.2 that comprises of bug fixes + +* Wed Jun 12 2013 Jussi Laako +- Prepare for first release + +* Thu Feb 08 2013 Jussi Laako +- Initial RPM packaging + diff --git a/dists/rpm/gsignond-0.0.2-10/gsignond-tizen.changes b/dists/rpm/gsignond-0.0.2-10/gsignond-tizen.changes new file mode 100644 index 0000000..422e3d1 --- /dev/null +++ b/dists/rpm/gsignond-0.0.2-10/gsignond-tizen.changes @@ -0,0 +1,8 @@ +* Mon Jun 24 2013 Imran Zaman +- Release 0.0.2 that comprises of bug fixes + +* Wed Jun 12 2013 Jussi Laako +- Prepare for first release + +* Thu Feb 08 2013 Jussi Laako +- Initial RPM packaging diff --git a/dists/rpm/gsignond-0.0.2-10/gsignond-tizen.spec b/dists/rpm/gsignond-0.0.2-10/gsignond-tizen.spec new file mode 100644 index 0000000..8c69349 --- /dev/null +++ b/dists/rpm/gsignond-0.0.2-10/gsignond-tizen.spec @@ -0,0 +1,113 @@ +# define used dbus type [p2p, session, system] +%define dbus_type p2p +# enable debug features such as control environment variables +# WARNING! do not use for production builds as it will break security +%define debug_build 0 + +Name: gsignond +Summary: GLib based Single Sign-On daemon +Version: 0.0.2 +Release: 10 +VCS: p/accounts-sso.gsignond/#b31ed6e880b0dcd7635147a57b870c0c137cfce0 +Group: System/Daemons +License: LGPL-2.1+ +Source: %{name}-%{version}.tar.gz +Provides: gsignon +%if %{dbus_type} != "p2p" +Requires: dbus-1 +%endif +Requires(post): /sbin/ldconfig +Requires(postun): /sbin/ldconfig +BuildRequires: pkgconfig(dbus-1) +BuildRequires: pkgconfig(glib-2.0) >= 2.30 +BuildRequires: pkgconfig(gobject-2.0) +BuildRequires: pkgconfig(gio-2.0) +BuildRequires: pkgconfig(gio-unix-2.0) +BuildRequires: pkgconfig(gmodule-2.0) +BuildRequires: pkgconfig(sqlite3) + + +%description +%{summary}. + + +%package devel +Summary: Development files for %{name} +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description devel +%{summary}. + + +%package doc +Summary: Documentation files for %{name} +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description doc +%{summary}. + + +%prep +%setup -q -n %{name}-%{version} +if [ -f = "gtk-doc.make" ] +then +rm gtk-doc.make +fi +touch gtk-doc.make +autoreconf -f -i + + +%build +%if %{debug_build} == 1 +%configure --enable-dbus-type=%{dbus_type} --enable-debug +%else +%configure --enable-dbus-type=%{dbus_type} +%endif + +make %{?_smp_mflags} + + +%install +rm -rf %{buildroot} +%make_install + + +%post +/sbin/ldconfig +chmod u+s %{_bindir}/%{name} +groupadd -f -r gsignond + + +%postun -p /sbin/ldconfig + + +%files +%defattr(-,root,root,-) +%doc AUTHORS COPYING.LIB INSTALL NEWS README +%{_bindir}/%{name} +%{_bindir}/%{name}-plugind +%{_libdir}/lib%{name}-*.so.* +%{_libdir}/%{name}/extensions/*.so* +%{_libdir}/%{name}/plugins/*.so* +%if %{dbus_type} != "p2p" +%{_datadir}/dbus-1/services/*SingleSignOn*.service +%endif +%config(noreplace) %{_sysconfdir}/gsignond.conf + + +%files devel +%defattr(-,root,root,-) +%{_includedir}/%{name}/*.h +%{_libdir}/lib%{name}-*.so +%{_libdir}/pkgconfig/%{name}.pc +%if %{dbus_type} != "p2p" +%{_datadir}/dbus-1/interfaces/*SSO*.xml +%endif + + +%files doc +%defattr(-,root,root,-) +%{_datadir}/gtk-doc/html/gsignond/* + diff --git a/dists/rpm/gsignond-suse.spec b/dists/rpm/gsignond-suse.spec index 1776ee4..15babec 100644 --- a/dists/rpm/gsignond-suse.spec +++ b/dists/rpm/gsignond-suse.spec @@ -6,11 +6,12 @@ Name: gsignond Summary: GLib based Single Sign-On daemon -Version: 0.0.2 -Release: 9 +Version: 0.0.3 +Release: 1 Group: System/Daemons -License: LGPL +License: LGPL-2.1+ Source: %{name}-%{version}.tar.gz +Provides: gsignon %if %{dbus_type} != "p2p" Requires: dbus-1 %endif @@ -39,6 +40,15 @@ Requires: %{name} = %{version}-%{release} %{summary}. +%package doc +Summary: Documentation files for %{name} +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description doc +%{summary}. + + %prep %setup -q -n %{name}-%{version} #gtkdocize @@ -71,6 +81,7 @@ rm -rf %{buildroot} %post /sbin/ldconfig chmod u+s %{_bindir}/%{name} +groupadd -f -r gsignond %postun -p /sbin/ldconfig @@ -89,6 +100,7 @@ chmod u+s %{_bindir}/%{name} %endif %exclude %{_libdir}/gsignond/extensions/*.la %exclude %{_libdir}/gsignond/plugins/*.la +%config(noreplace) %{_sysconfdir}/gsignond.conf %files devel @@ -102,6 +114,11 @@ chmod u+s %{_bindir}/%{name} %endif +%files doc +%defattr(-,root,root,-) +%{_datadir}/gtk-doc/html/gsignond/* + + %changelog * Mon Jun 24 2013 Imran Zaman - Release 0.0.2 that comprises of bug fixes diff --git a/dists/rpm/gsignond-tizen.changes b/dists/rpm/gsignond-tizen.changes index 422e3d1..0fc9fd8 100644 --- a/dists/rpm/gsignond-tizen.changes +++ b/dists/rpm/gsignond-tizen.changes @@ -1,3 +1,8 @@ +* Thu Aug 22 2013 Amarnath Valluri +- Release 0.0.3 +- Bug fixes in UI interaction +- Documentation support + * Mon Jun 24 2013 Imran Zaman - Release 0.0.2 that comprises of bug fixes diff --git a/dists/rpm/gsignond-tizen.spec b/dists/rpm/gsignond-tizen.spec index f5fa51d..8ee6300 100644 --- a/dists/rpm/gsignond-tizen.spec +++ b/dists/rpm/gsignond-tizen.spec @@ -6,11 +6,12 @@ Name: gsignond Summary: GLib based Single Sign-On daemon -Version: 0.0.2 -Release: 9 +Version: 0.0.3 +Release: 1 Group: System/Daemons -License: LGPL +License: LGPL-2.1+ Source: %{name}-%{version}.tar.gz +Provides: gsignon %if %{dbus_type} != "p2p" Requires: dbus-1 %endif @@ -38,6 +39,15 @@ Requires: %{name} = %{version}-%{release} %{summary}. +%package doc +Summary: Documentation files for %{name} +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description doc +%{summary}. + + %prep %setup -q -n %{name}-%{version} if [ -f = "gtk-doc.make" ] @@ -66,6 +76,7 @@ rm -rf %{buildroot} %post /sbin/ldconfig chmod u+s %{_bindir}/%{name} +groupadd -f -r gsignond %postun -p /sbin/ldconfig @@ -82,6 +93,7 @@ chmod u+s %{_bindir}/%{name} %if %{dbus_type} != "p2p" %{_datadir}/dbus-1/services/*SingleSignOn*.service %endif +%config(noreplace) %{_sysconfdir}/gsignond.conf %files devel @@ -93,3 +105,8 @@ chmod u+s %{_bindir}/%{name} %{_datadir}/dbus-1/interfaces/*SSO*.xml %endif + +%files doc +%defattr(-,root,root,-) +%{_datadir}/gtk-doc/html/gsignond/* + diff --git a/docs/Makefile.am b/docs/Makefile.am new file mode 100644 index 0000000..dd8b8a5 --- /dev/null +++ b/docs/Makefile.am @@ -0,0 +1,121 @@ +## Process this file with automake to produce Makefile.in + +# We require automake 1.6 at least. +AUTOMAKE_OPTIONS = 1.6 + +# This is a blank Makefile.am for using gtk-doc. +# Copy this to your project's API docs directory and modify the variables to +# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples +# of using the various options. + +# The name of the module, e.g. 'glib'. +DOC_MODULE=gsignond + +# Uncomment for versioned docs and specify the version of the module, e.g. '2'. +#DOC_MODULE_VERSION=2 + + +# The top-level SGML file. You can change this if you want to. +DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml + +# Directories containing the source code. +# gtk-doc will search all .c and .h files beneath these paths +# for inline comments documenting functions and macros. +# e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk +DOC_SOURCE_DIR=$(top_srcdir)/include\ +$(top_srcdir)/src/common\ +$(top_srcdir)/src/plugins + +# Extra options to pass to gtkdoc-scangobj. Not normally needed. +SCANGOBJ_OPTIONS= + +# Extra options to supply to gtkdoc-scan. +# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" +SCAN_OPTIONS= + +# Extra options to supply to gtkdoc-mkdb. +# e.g. MKDB_OPTIONS=--xml-mode --output-format=xml +MKDB_OPTIONS=--xml-mode --output-format=xml + +# Extra options to supply to gtkdoc-mktmpl +# e.g. MKTMPL_OPTIONS=--only-section-tmpl +MKTMPL_OPTIONS= + +# Extra options to supply to gtkdoc-mkhtml +MKHTML_OPTIONS= + +# Extra options to supply to gtkdoc-fixref. Not normally needed. +# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html +FIXXREF_OPTIONS= + +# Used for dependencies. The docs will be rebuilt if any of these change. +# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h +# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c +HFILE_GLOB= +CFILE_GLOB= + +# Extra header to include when scanning, which are not under DOC_SOURCE_DIR +# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h +EXTRA_HFILES= + +# Header files or dirs to ignore when scanning. Use base file/dir names +# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code +IGNORE_HFILES=\ +gsignond-disposable.h\ +gsignond-identity-info.h\ +gsignond-identity-info-internal.h\ +gsignond-pipe-stream.h\ +gsignond-plugin-enum-types.h\ +gsignond-plugin-loader.h\ +gsignond-db-defines.h\ +gsignond-db-error.h\ +gsignond-db-secret-database.h\ +gsignond-db-sql-database.h\ +gsignond-db-sql-database-private.h + +# Images to copy into HTML directory. +# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png +HTML_IMAGES= + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +# e.g. content_files=running.sgml building.sgml changes-2.0.sgml +content_files=building.xml + +# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded +# These files must be listed here *and* in content_files +# e.g. expand_content_files=running.sgml +expand_content_files= + +# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. +# Only needed if you are using gtkdoc-scangobj to dynamically query widget +# signals and properties. +# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) +# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) +GTKDOC_CFLAGS= + +GTKDOC_LIBS=\ + $(top_builddir)/src/common/libgsignond-common.la\ + $(top_builddir)/src/plugins/digest/libdigest.la\ + $(top_builddir)/src/plugins/password/libpassword.la\ + $(top_builddir)/src/plugins/ssotest/libssotest.la + +# This includes the standard gtk-doc make rules, copied by gtkdocize. +include $(top_srcdir)/gtk-doc.make + +# Other files to distribute +# e.g. EXTRA_DIST += version.xml.in +EXTRA_DIST += + +# Files not to distribute +# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types +# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt +#DISTCLEANFILES += + +# Comment this out if you want 'make check' to test you doc status +# and run some sanity checks +if ENABLE_GTK_DOC +TESTS_ENVIRONMENT = cd $(srcdir) && \ + DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ + SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) +TESTS = $(GTKDOC_CHECK) +endif diff --git a/docs/Makefile.in b/docs/Makefile.in new file mode 100644 index 0000000..0bb399e --- /dev/null +++ b/docs/Makefile.in @@ -0,0 +1,908 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ + +# -*- mode: makefile -*- + +#################################### +# Everything below here is generic # +#################################### +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/gtk-doc.make +subdir = docs +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tty_colors = \ +red=; grn=; lgn=; blu=; std= +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_CFLAGS = @CHECK_CFLAGS@ +CHECK_LIBS = @CHECK_LIBS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DBUS_INTERFACES_DIR = @DBUS_INTERFACES_DIR@ +DBUS_SERVICES_DIR = @DBUS_SERVICES_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GREP = @GREP@ +GSIGNOND_CFLAGS = @GSIGNOND_CFLAGS@ +GSIGNOND_LIBS = @GSIGNOND_LIBS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +GTestDBus_CFLAGS = @GTestDBus_CFLAGS@ +GTestDBus_LIBS = @GTestDBus_LIBS@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBECRYPTFS_CFLAGS = @LIBECRYPTFS_CFLAGS@ +LIBECRYPTFS_LIBS = @LIBECRYPTFS_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBSMACK_CFLAGS = @LIBSMACK_CFLAGS@ +LIBSMACK_LIBS = @LIBSMACK_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MESSAGE_BUS_TYPE = @MESSAGE_BUS_TYPE@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +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@ +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@ +ifGNUmake = @ifGNUmake@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +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_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# We require automake 1.6 at least. +AUTOMAKE_OPTIONS = 1.6 + +# This is a blank Makefile.am for using gtk-doc. +# Copy this to your project's API docs directory and modify the variables to +# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples +# of using the various options. + +# The name of the module, e.g. 'glib'. +DOC_MODULE = gsignond + +# Uncomment for versioned docs and specify the version of the module, e.g. '2'. +#DOC_MODULE_VERSION=2 + +# The top-level SGML file. You can change this if you want to. +DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml + +# Directories containing the source code. +# gtk-doc will search all .c and .h files beneath these paths +# for inline comments documenting functions and macros. +# e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk +DOC_SOURCE_DIR = $(top_srcdir)/include\ +$(top_srcdir)/src/common\ +$(top_srcdir)/src/plugins + + +# Extra options to pass to gtkdoc-scangobj. Not normally needed. +SCANGOBJ_OPTIONS = + +# Extra options to supply to gtkdoc-scan. +# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" +SCAN_OPTIONS = + +# Extra options to supply to gtkdoc-mkdb. +# e.g. MKDB_OPTIONS=--xml-mode --output-format=xml +MKDB_OPTIONS = --xml-mode --output-format=xml + +# Extra options to supply to gtkdoc-mktmpl +# e.g. MKTMPL_OPTIONS=--only-section-tmpl +MKTMPL_OPTIONS = + +# Extra options to supply to gtkdoc-mkhtml +MKHTML_OPTIONS = + +# Extra options to supply to gtkdoc-fixref. Not normally needed. +# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html +FIXXREF_OPTIONS = + +# Used for dependencies. The docs will be rebuilt if any of these change. +# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h +# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c +HFILE_GLOB = +CFILE_GLOB = + +# Extra header to include when scanning, which are not under DOC_SOURCE_DIR +# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h +EXTRA_HFILES = + +# Header files or dirs to ignore when scanning. Use base file/dir names +# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code +IGNORE_HFILES = \ +gsignond-disposable.h\ +gsignond-identity-info.h\ +gsignond-identity-info-internal.h\ +gsignond-pipe-stream.h\ +gsignond-plugin-enum-types.h\ +gsignond-plugin-loader.h\ +gsignond-db-defines.h\ +gsignond-db-error.h\ +gsignond-db-secret-database.h\ +gsignond-db-sql-database.h\ +gsignond-db-sql-database-private.h + + +# Images to copy into HTML directory. +# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png +HTML_IMAGES = + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +# e.g. content_files=running.sgml building.sgml changes-2.0.sgml +content_files = building.xml + +# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded +# These files must be listed here *and* in content_files +# e.g. expand_content_files=running.sgml +expand_content_files = + +# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. +# Only needed if you are using gtkdoc-scangobj to dynamically query widget +# signals and properties. +# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) +# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) +GTKDOC_CFLAGS = +GTKDOC_LIBS = \ + $(top_builddir)/src/common/libgsignond-common.la\ + $(top_builddir)/src/plugins/digest/libdigest.la\ + $(top_builddir)/src/plugins/password/libpassword.la\ + $(top_builddir)/src/plugins/ssotest/libssotest.la + +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) +TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE) +SETUP_FILES = \ + $(content_files) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt + + +# This includes the standard gtk-doc make rules, copied by gtkdocize. + +# Other files to distribute +# e.g. EXTRA_DIST += version.xml.in +EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) +DOC_STAMPS = setup-build.stamp scan-build.stamp tmpl-build.stamp sgml-build.stamp \ + html-build.stamp pdf-build.stamp \ + tmpl.stamp sgml.stamp html.stamp pdf.stamp + +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp + +#### setup #### +GTK_DOC_V_SETUP = $(GTK_DOC_V_SETUP_$(V)) +GTK_DOC_V_SETUP_ = $(GTK_DOC_V_SETUP_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_SETUP_0 = @echo " DOC Preparing build"; + +#### scan #### +GTK_DOC_V_SCAN = $(GTK_DOC_V_SCAN_$(V)) +GTK_DOC_V_SCAN_ = $(GTK_DOC_V_SCAN_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_SCAN_0 = @echo " DOC Scanning header files"; +GTK_DOC_V_INTROSPECT = $(GTK_DOC_V_INTROSPECT_$(V)) +GTK_DOC_V_INTROSPECT_ = $(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_INTROSPECT_0 = @echo " DOC Introspecting gobjects"; + +#### templates #### +GTK_DOC_V_TMPL = $(GTK_DOC_V_TMPL_$(V)) +GTK_DOC_V_TMPL_ = $(GTK_DOC_V_TMPL_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_TMPL_0 = @echo " DOC Rebuilding template files"; + +#### xml #### +GTK_DOC_V_XML = $(GTK_DOC_V_XML_$(V)) +GTK_DOC_V_XML_ = $(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_XML_0 = @echo " DOC Building XML"; + +#### html #### +GTK_DOC_V_HTML = $(GTK_DOC_V_HTML_$(V)) +GTK_DOC_V_HTML_ = $(GTK_DOC_V_HTML_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_HTML_0 = @echo " DOC Building HTML"; +GTK_DOC_V_XREF = $(GTK_DOC_V_XREF_$(V)) +GTK_DOC_V_XREF_ = $(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_XREF_0 = @echo " DOC Fixing cross-references"; + +#### pdf #### +GTK_DOC_V_PDF = $(GTK_DOC_V_PDF_$(V)) +GTK_DOC_V_PDF_ = $(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_PDF_0 = @echo " DOC Building PDF"; + +# Files not to distribute +# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types +# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt +#DISTCLEANFILES += + +# Comment this out if you want 'make check' to test you doc status +# and run some sanity checks +@ENABLE_GTK_DOC_TRUE@TESTS_ENVIRONMENT = cd $(srcdir) && \ +@ENABLE_GTK_DOC_TRUE@ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ +@ENABLE_GTK_DOC_TRUE@ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) + +@ENABLE_GTK_DOC_TRUE@TESTS = $(GTKDOC_CHECK) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/gtk-doc.make $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/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_srcdir)/gtk-doc.make: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + fi; \ + echo "$${col}$$dashes$${std}"; \ + echo "$${col}$$banner$${std}"; \ + test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ + test -z "$$report" || echo "$${col}$$report$${std}"; \ + echo "$${col}$$dashes$${std}"; \ + test "$$failed" -eq 0; \ + else :; fi + +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 "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile all-local +installdirs: +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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +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-generic clean-libtool clean-local mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-local + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-local + +.MAKE: check-am install-am install-strip + +.PHONY: all all-am all-local check check-TESTS check-am clean \ + clean-generic clean-libtool clean-local dist-hook distclean \ + distclean-generic distclean-libtool distclean-local distdir \ + dvi dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-data-local install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-local mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-local + + +@ENABLE_GTK_DOC_TRUE@all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) +@ENABLE_GTK_DOC_FALSE@all-local: + +docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) + +$(REPORT_FILES): sgml-build.stamp + +setup-build.stamp: + -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ + if test "x$$files" != "x" ; then \ + for file in $$files ; do \ + test -f $(abs_srcdir)/$$file && \ + cp -pu $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ + done; \ + fi; \ + test -d $(abs_srcdir)/tmpl && \ + { cp -rp $(abs_srcdir)/tmpl $(abs_builddir)/; \ + chmod -R u+w $(abs_builddir)/tmpl; } \ + fi + $(AM_V_at)touch setup-build.stamp + +scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) + $(GTK_DOC_V_SCAN)_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) + $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ + scanobj_options=""; \ + gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + scanobj_options="--verbose"; \ + fi; \ + fi; \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ + gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ + else \ + for i in $(SCANOBJ_FILES) ; do \ + test -f $$i || touch $$i ; \ + done \ + fi + $(AM_V_at)touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp + @true + +tmpl-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt + $(GTK_DOC_V_TMPL)gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS) + $(AM_V_at)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + if test -w $(abs_srcdir) ; then \ + cp -rp $(abs_builddir)/tmpl $(abs_srcdir)/; \ + fi \ + fi + $(AM_V_at)touch tmpl-build.stamp + +tmpl.stamp: tmpl-build.stamp + @true + +$(srcdir)/tmpl/*.sgml: + @true + +sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files) + -$(GTK_DOC_V_XML)chmod -R u+w $(srcdir) && _source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) + $(AM_V_at)touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + $(GTK_DOC_V_HTML)rm -rf html && mkdir html && \ + mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkhtml_options="$$mkhtml_options --verbose"; \ + fi; \ + fi; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ + if test "$(?)" = "0"; then \ + mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ + fi; \ + cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + -@test "x$(HTML_IMAGES)" = "x" || \ + for file in $(HTML_IMAGES) ; do \ + if test -f $(abs_srcdir)/$$file ; then \ + cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ + fi; \ + if test -f $(abs_builddir)/$$file ; then \ + cp $(abs_builddir)/$$file $(abs_builddir)/html; \ + fi; \ + done; + $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + $(AM_V_at)touch html-build.stamp + +pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ + mkpdf_options=""; \ + gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkpdf_options="$$mkpdf_options --verbose"; \ + fi; \ + fi; \ + if test "x$(HTML_IMAGES)" != "x"; then \ + for img in $(HTML_IMAGES); do \ + part=`dirname $$img`; \ + echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ + if test $$? != 0; then \ + mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ + fi; \ + done; \ + fi; \ + gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) + $(AM_V_at)touch pdf-build.stamp + +############## + +clean-local: + @rm -f *~ *.bak + @rm -rf .libs + +distclean-local: + @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \ + rm -rf tmpl; \ + fi + +maintainer-clean-local: + @rm -rf xml html + +install-data-local: + @installfiles=`echo $(builddir)/html/*`; \ + if test "$$installfiles" = '$(builddir)/html/*'; \ + then echo 1>&2 'Nothing to install' ; \ + else \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + $(mkinstalldirs) $${installdir} ; \ + for i in $$installfiles; do \ + echo ' $(INSTALL_DATA) '$$i ; \ + $(INSTALL_DATA) $$i $${installdir}; \ + done; \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ + $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ + fi; \ + $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ + fi + +uninstall-local: + @if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + rm -rf $${installdir} + +# +# Require gtk-doc when making dist +# +@ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc: docs +@ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc: +@ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed and enabled in order to make dist" +@ENABLE_GTK_DOC_FALSE@ @false + +dist-hook: dist-check-gtkdoc dist-hook-local + @mkdir $(distdir)/tmpl + @mkdir $(distdir)/html + @-cp ./tmpl/*.sgml $(distdir)/tmpl + @cp ./html/* $(distdir)/html + @-cp ./$(DOC_MODULE).pdf $(distdir)/ + @-cp ./$(DOC_MODULE).types $(distdir)/ + @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ + @cd $(distdir) && rm -f $(DISTCLEANFILES) + @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs + +# 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/docs/building.xml b/docs/building.xml new file mode 100644 index 0000000..66ea61e --- /dev/null +++ b/docs/building.xml @@ -0,0 +1,180 @@ + + + + + Building and installing the gsignond daemon + 3 + GSignond + + + + Building gsignond + + GSignond uses the standard GNU build system, + using autoconf for package + configuration and resolving portability issues, + automake for building makefiles + that comply with the GNU Coding Standards, and + libtool for building shared + libraries on multiple platforms. The normal sequence for + compiling and installing gsignond from distribution tarballs is thus: + + + ./configure + make + make install + + + If you have obtained the source code directly from git repository, + execute the ./autogen.sh script + before the steps above. + + + + The standard options provided by GNU + autoconf may be passed to the + configure script. Please see the + autoconf documentation or run + ./configure --help for information about + the standard options. + + + + + Dependencies + + Before you can compile GSignond, you need to have + various other tools and libraries installed on your + system. The two tools needed during the build process + are pkg-config and + GNU make. + + + + + pkg-config + is a tool for tracking the compilation flags needed for + libraries that are used by the GSignond. (For each + library, a small .pc text file is + installed in a standard location that contains the compilation + flags needed for that library along with version number + information.) + + + + + GSignond depends on a number of other libraries. + + + + + The GLib + library is the development framework that GSignond is built on. + + + + + The SQLite library + provides a database implementation that GSignond is using for + storing data. + + + + + The check library + provides a unit testing framework. It is needed only if you would + like to run unit tests with make check. + + + + + For building Tizen extension module that integrates gsignond into + the Tizen platform, the + libsmack and + ecryptfs are required. + They are not needed otherwise. + + + + + + + Extra Configuration Options + + + In addition to the normal options, the + configure script supports these additional arguments: + + + + <systemitem>--enable-debug</systemitem> + + + Turns on debugging support. This enables unit tests and allows setting + environment variables to influence the runtime behaviour of GSignond + (see GSignondConfig and + GSignondAccessControlManager). + Also, the daemon will exit in case of critical errors. + + + + + <systemitem>--enable-sql-log</systemitem> + + + Turns on SQL statement logging. For this, also + --enable-debug must be used. + + + + + <systemitem>--enable-dbus-type=dbus-type</systemitem> + + + Sets the way in which GSignond is using DBus to communicate with + the client library. dbus-type can be one of + + + + 'p2p' which is the default and recommended + value. GSignond will use direct connection over a UNIX domain socket + with the client library without involving the DBus daemon. + + + + + 'session' which will use the session bus. + This is not recommended to use because session bus isn't secure + against eavesdropping, but it can be used for debugging purposes, + as it allows the use of standard tools such as + dbus-monitor, d-feet and + so on. + + + + + 'system' which will use the system bus. + Can be used on a single-user systems, but 'p2p' is preferred. + + + + + + + + + Building distribution packages + + + Instead of running make install to install gsignond + into a system location it is possible to build distribution-specific + packages. dists/ directory in the source tree + contains a number of package confuguration files, and to use them also + a distribution tarball is needed. If you are building from a git tree, + use make dist to create such a tarball. + + + + diff --git a/docs/gsignond-docs.sgml b/docs/gsignond-docs.sgml new file mode 100644 index 0000000..abd68c2 --- /dev/null +++ b/docs/gsignond-docs.sgml @@ -0,0 +1,77 @@ + + +]> + + + gsignond API Reference Manual + + for gsignond daemon. + The latest version of this documentation can be found on-line at + + http://gsignon-docs.accounts-sso.googlecode.com/git/gsignond/index.html. + + + + + GSignond building and installation + + + + + GSignond configuration + + + + + + + + GSignond API for writing authentication plugins + + + + + + + + Standard in-tree authentication plugins + + + + + + + + GSignond API for writing platform adaptation extensions + + + + + + + + + Miscellaneous + + + + + + + Object Hierarchy + + + + API Index + + + + Index of deprecated API + + + + + diff --git a/docs/gsignond-overrides.txt b/docs/gsignond-overrides.txt new file mode 100644 index 0000000..e69de29 diff --git a/docs/gsignond-sections.txt b/docs/gsignond-sections.txt new file mode 100644 index 0000000..d97978a --- /dev/null +++ b/docs/gsignond-sections.txt @@ -0,0 +1,391 @@ +

+gsignond-access-control-manager +GSignondAccessControlManager +GSignondAccessControlManager +GSignondAccessControlManagerClass +gsignond_access_control_manager_acl_is_valid +gsignond_access_control_manager_peer_is_allowed_to_use_identity +gsignond_access_control_manager_peer_is_owner_of_identity +gsignond_access_control_manager_security_context_of_keychain +gsignond_access_control_manager_security_context_of_peer + +GSIGNOND_ACCESS_CONTROL_MANAGER +GSIGNOND_ACCESS_CONTROL_MANAGER_CLASS +GSIGNOND_ACCESS_CONTROL_MANAGER_GET_CLASS +GSIGNOND_IS_ACCESS_CONTROL_MANAGER +GSIGNOND_IS_ACCESS_CONTROL_MANAGER_CLASS +GSIGNOND_TYPE_ACCESS_CONTROL_MANAGER +gsignond_access_control_manager_get_type +
+ +
+gsignond-config +GSignondConfig +GSignondConfig +GSignondConfigClass +gsignond_config_get_integer +gsignond_config_get_string +gsignond_config_new +gsignond_config_set_integer +gsignond_config_set_string + +GSIGNOND_CONFIG +GSIGNOND_CONFIG_CLASS +GSIGNOND_CONFIG_GET_CLASS +GSIGNOND_IS_CONFIG +GSIGNOND_IS_CONFIG_CLASS +GSIGNOND_TYPE_CONFIG +GSignondConfigPrivate +gsignond_config_get_type +
+ +
+gsignond-config-db +GSIGNOND_CONFIG_DB_METADATA_DB_FILENAME +GSIGNOND_CONFIG_DB_SECRET_DB_FILENAME +GSIGNOND_CONFIG_DB_SSO +
+ +
+gsignond-config-dbus +GSIGNOND_CONFIG_DBUS_AUTH_SESSION_TIMEOUT +GSIGNOND_CONFIG_DBUS_DAEMON_TIMEOUT +GSIGNOND_CONFIG_DBUS_IDENTITY_TIMEOUT +GSIGNOND_CONFIG_DBUS_TIMEOUTS +
+ +
+gsignond-config-general +GSIGNOND_CONFIG_GENERAL +GSIGNOND_CONFIG_GENERAL_BIN_DIR +GSIGNOND_CONFIG_GENERAL_EXTENSION +GSIGNOND_CONFIG_GENERAL_EXTENSIONS_DIR +GSIGNOND_CONFIG_GENERAL_PLUGINS_DIR +GSIGNOND_CONFIG_GENERAL_SECURE_DIR +GSIGNOND_CONFIG_GENERAL_STORAGE_PATH +GSIGNOND_CONFIG_PLUGIN_TIMEOUT +
+ +
+gsignond-credentials +GSignondCredentials +GSignondCredentials +GSignondCredentialsClass +gsignond_credentials_equal +gsignond_credentials_get_id +gsignond_credentials_get_password +gsignond_credentials_get_username +gsignond_credentials_new +gsignond_credentials_set_data +gsignond_credentials_set_id +gsignond_credentials_set_password +gsignond_credentials_set_username + +GSIGNOND_CREDENTIALS +GSIGNOND_CREDENTIALS_CLASS +GSIGNOND_CREDENTIALS_GET_CLASS +GSIGNOND_IS_CREDENTIALS +GSIGNOND_IS_CREDENTIALS_CLASS +GSIGNOND_TYPE_CREDENTIALS +GSignondCredentialsPrivate +gsignond_credentials_get_type +
+ +
+gsignond-dictionary +GSignondDictionary +gsignond_dictionary_copy +gsignond_dictionary_get +gsignond_dictionary_get_boolean +gsignond_dictionary_get_int32 +gsignond_dictionary_get_int64 +gsignond_dictionary_get_string +gsignond_dictionary_get_uint32 +gsignond_dictionary_get_uint64 +gsignond_dictionary_new +gsignond_dictionary_new_from_variant +gsignond_dictionary_ref +gsignond_dictionary_remove +gsignond_dictionary_set +gsignond_dictionary_set_boolean +gsignond_dictionary_set_int32 +gsignond_dictionary_set_int64 +gsignond_dictionary_set_string +gsignond_dictionary_set_uint32 +gsignond_dictionary_set_uint64 +gsignond_dictionary_to_variant +gsignond_dictionary_unref + +GSIGNOND_DICTIONARY +GSIGNOND_IS_DICTIONARY +GSIGNOND_TYPE_DICTIONARY +
+ +
+gsignond-digest-plugin +GSignondDigestPlugin +GSignondDigestPlugin +GSignondDigestPluginClass + +GSIGNOND_DIGEST_PLUGIN +GSIGNOND_DIGEST_PLUGIN_CLASS +GSIGNOND_DIGEST_PLUGIN_GET_CLASS +GSIGNOND_IS_DIGEST_PLUGIN +GSIGNOND_IS_DIGEST_PLUGIN_CLASS +GSIGNOND_TYPE_DIGEST_PLUGIN +GSignondDigestPluginPrivate +gsignond_digest_plugin_get_type +
+ +
+gsignond-error +GSIGNOND_ERROR +GSignondError +gsignond_error_new_from_variant +gsignond_error_quark +gsignond_error_to_variant +gsignond_get_gerror_for_id +
+ +
+gsignond-extension-interface +GSignondExtension +GSignondExtension +GSignondExtensionClass +gsignond_extension_get_access_control_manager +gsignond_extension_get_name +gsignond_extension_get_secret_storage +gsignond_extension_get_storage_manager +gsignond_extension_get_version + +GSIGNOND_EXTENSION +GSIGNOND_EXTENSION_CLASS +GSIGNOND_EXTENSION_GET_CLASS +GSIGNOND_IS_EXTENSION +GSIGNOND_IS_EXTENSION_CLASS +GSIGNOND_TYPE_EXTENSION +GSignondExtensionPrivate +gsignond_extension_get_type +
+ +
+gsignond-log +DBG +ERR +INFO +TRACEBACK +WARN +
+ +
+gsignond-password-plugin +GSignondPasswordPlugin +GSignondPasswordPlugin +GSignondPasswordPluginClass + +GSIGNOND_IS_PASSWORD_PLUGIN +GSIGNOND_IS_PASSWORD_PLUGIN_CLASS +GSIGNOND_PASSWORD_PLUGIN +GSIGNOND_PASSWORD_PLUGIN_CLASS +GSIGNOND_PASSWORD_PLUGIN_GET_CLASS +GSIGNOND_TYPE_PASSWORD_PLUGIN +gsignond_password_plugin_get_type +
+ +
+gsignond-plugin-interface +GSignondPlugin +GSignondPluginInterface +GSignondPluginState +gsignond_plugin_cancel +gsignond_plugin_error +gsignond_plugin_refresh +gsignond_plugin_refreshed +gsignond_plugin_request +gsignond_plugin_request_initial +gsignond_plugin_response +gsignond_plugin_response_final +gsignond_plugin_status_changed +gsignond_plugin_store +gsignond_plugin_user_action_finished +gsignond_plugin_user_action_required + +GSIGNOND_IS_PLUGIN +GSIGNOND_PLUGIN +GSIGNOND_PLUGIN_GET_INTERFACE +GSIGNOND_TYPE_PLUGIN +gsignond_plugin_get_type +
+ +
+gsignond-secret-storage +GSignondSecretStorage +GSignondSecretStorage +GSignondSecretStorageClass +gsignond_secret_storage_check_credentials +gsignond_secret_storage_clear_db +gsignond_secret_storage_close_db +gsignond_secret_storage_get_last_error +gsignond_secret_storage_is_open_db +gsignond_secret_storage_load_credentials +gsignond_secret_storage_load_data +gsignond_secret_storage_open_db +gsignond_secret_storage_remove_credentials +gsignond_secret_storage_remove_data +gsignond_secret_storage_update_credentials +gsignond_secret_storage_update_data + +GSIGNOND_IS_SECRET_STORAGE +GSIGNOND_IS_SECRET_STORAGE_CLASS +GSIGNOND_SECRET_STORAGE +GSIGNOND_SECRET_STORAGE_CLASS +GSIGNOND_SECRET_STORAGE_GET_CLASS +GSIGNOND_TYPE_SECRET_STORAGE +GSignondSecretStoragePrivate +gsignond_secret_storage_get_type +
+ +
+gsignond-security-context +GSignondSecurityContext +GSignondSecurityContextList +gsignond_security_context_check +gsignond_security_context_compare +gsignond_security_context_copy +gsignond_security_context_free +gsignond_security_context_from_variant +gsignond_security_context_get_application_context +gsignond_security_context_get_system_context +gsignond_security_context_list_copy +gsignond_security_context_list_free +gsignond_security_context_list_from_variant +gsignond_security_context_list_to_variant +gsignond_security_context_match +gsignond_security_context_new +gsignond_security_context_new_from_values +gsignond_security_context_set_application_context +gsignond_security_context_set_system_context +gsignond_security_context_to_variant +
+ +
+gsignond-session-data +GSignondSessionData +GSignondUiPolicy +gsignond_session_data_get_caption +gsignond_session_data_get_network_proxy +gsignond_session_data_get_network_timeout +gsignond_session_data_get_realm +gsignond_session_data_get_renew_token +gsignond_session_data_get_secret +gsignond_session_data_get_ui_policy +gsignond_session_data_get_username +gsignond_session_data_get_window_id +gsignond_session_data_set_caption +gsignond_session_data_set_network_proxy +gsignond_session_data_set_network_timeout +gsignond_session_data_set_realm +gsignond_session_data_set_renew_token +gsignond_session_data_set_secret +gsignond_session_data_set_ui_policy +gsignond_session_data_set_username +gsignond_session_data_set_window_id + +GSIGNOND_IS_SESSION_DATA +GSIGNOND_SESSION_DATA +GSIGNOND_TYPE_SESSION_DATA +
+ +
+gsignond-signonui-data +GSignondSignonuiData +GSignondSignonuiError +gsignond_signonui_data_get_captcha_response +gsignond_signonui_data_get_captcha_url +gsignond_signonui_data_get_caption +gsignond_signonui_data_get_confirm +gsignond_signonui_data_get_final_url +gsignond_signonui_data_get_forgot_password +gsignond_signonui_data_get_forgot_password_url +gsignond_signonui_data_get_message +gsignond_signonui_data_get_open_url +gsignond_signonui_data_get_password +gsignond_signonui_data_get_query_error +gsignond_signonui_data_get_query_password +gsignond_signonui_data_get_query_username +gsignond_signonui_data_get_remember_password +gsignond_signonui_data_get_request_id +gsignond_signonui_data_get_test_reply +gsignond_signonui_data_get_title +gsignond_signonui_data_get_url_response +gsignond_signonui_data_get_username +gsignond_signonui_data_set_captcha_response +gsignond_signonui_data_set_captcha_url +gsignond_signonui_data_set_caption +gsignond_signonui_data_set_confirm +gsignond_signonui_data_set_final_url +gsignond_signonui_data_set_forgot_password +gsignond_signonui_data_set_forgot_password_url +gsignond_signonui_data_set_message +gsignond_signonui_data_set_open_url +gsignond_signonui_data_set_password +gsignond_signonui_data_set_query_error +gsignond_signonui_data_set_query_password +gsignond_signonui_data_set_query_username +gsignond_signonui_data_set_remember_password +gsignond_signonui_data_set_request_id +gsignond_signonui_data_set_test_reply +gsignond_signonui_data_set_title +gsignond_signonui_data_set_url_response +gsignond_signonui_data_set_username + +GSIGNOND_IS_SIGNONUI_DATA +GSIGNOND_SIGNONUI_DATA +GSIGNOND_TYPE_SIGNONUI_DATA +
+ +
+gsignond-ssotest-plugin +GSignondSsoTestPlugin +GSignondSsoTestPlugin +GSignondSsoTestPluginClass + +GSIGNOND_IS_SSOTEST_PLUGIN +GSIGNOND_IS_SSOTEST_PLUGIN_CLASS +GSIGNOND_SSOTEST_PLUGIN +GSIGNOND_SSOTEST_PLUGIN_CLASS +GSIGNOND_SSOTEST_PLUGIN_GET_CLASS +GSIGNOND_TYPE_SSOTEST_PLUGIN +GSignondSsoTestPluginPrivate +gsignond_ssotest_plugin_get_type +
+ +
+gsignond-storage-manager +GSignondStorageManager +GSignondStorageManager +GSignondStorageManagerClass +gsignond_storage_manager_delete_storage +gsignond_storage_manager_filesystem_is_mounted +gsignond_storage_manager_initialize_storage +gsignond_storage_manager_mount_filesystem +gsignond_storage_manager_storage_is_initialized +gsignond_storage_manager_unmount_filesystem + +GSIGNOND_IS_STORAGE_MANAGER +GSIGNOND_IS_STORAGE_MANAGER_CLASS +GSIGNOND_STORAGE_MANAGER +GSIGNOND_STORAGE_MANAGER_CLASS +GSIGNOND_STORAGE_MANAGER_GET_CLASS +GSIGNOND_TYPE_STORAGE_MANAGER +GSignondStorageManagerPrivate +gsignond_storage_manager_get_type +
+ +
+gsignond-utils +gsignond_generate_nonce +gsignond_wipe_directory +gsignond_wipe_file +
+ diff --git a/docs/gsignond.types b/docs/gsignond.types new file mode 100644 index 0000000..fa429f9 --- /dev/null +++ b/docs/gsignond.types @@ -0,0 +1,10 @@ +gsignond_access_control_manager_get_type +gsignond_config_get_type +gsignond_credentials_get_type +gsignond_digest_plugin_get_type +gsignond_extension_get_type +gsignond_password_plugin_get_type +gsignond_plugin_get_type +gsignond_secret_storage_get_type +gsignond_ssotest_plugin_get_type +gsignond_storage_manager_get_type diff --git a/docs/html/GSignondAccessControlManager.html b/docs/html/GSignondAccessControlManager.html new file mode 100644 index 0000000..13c0117 --- /dev/null +++ b/docs/html/GSignondAccessControlManager.html @@ -0,0 +1,366 @@ + + + + +GSignondAccessControlManager + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSignondAccessControlManager

+

GSignondAccessControlManager — an object that performs access control checks

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GSignondAccessControlManager
+
+
+
+

Properties

+
+  "config"                   GSignondConfig*       : Read / Write / Construct Only
+
+
+
+

Description

+

+GSignondAccessControlManager performs access control checks using +available system services. gSSO can be configured to use a custom extension +that provides a subclassed implementation of GSignondAccessControlManager +(see GSignondExtension), otherwise a default implementation is used. +

+
+
+

Details

+
+

struct GSignondAccessControlManager

+
struct GSignondAccessControlManager;
+

+Opaque GSignondAccessControlManager data structure. +

+
+
+
+

struct GSignondAccessControlManagerClass

+
struct GSignondAccessControlManagerClass {
+    GObjectClass parent_class;
+
+    void (*security_context_of_peer) (
+                            GSignondAccessControlManager *self,
+                            GSignondSecurityContext *peer_ctx,
+                            int peer_fd, const gchar *peer_service,
+                            const gchar *peer_app_ctx);
+    gboolean (*peer_is_allowed_to_use_identity) (
+                            GSignondAccessControlManager *self,
+                            const GSignondSecurityContext *peer_ctx,
+                            const GSignondSecurityContext *owner_ctx,
+                            const GSignondSecurityContextList *identity_acl);
+    gboolean (*peer_is_owner_of_identity) (
+                            GSignondAccessControlManager *self,
+                            const GSignondSecurityContext *peer_ctx,
+                            const GSignondSecurityContext *owner_ctx);
+    gboolean (*acl_is_valid) (
+                            GSignondAccessControlManager *self,
+                            const GSignondSecurityContext *peer_ctx,
+                            const GSignondSecurityContextList *identity_acl);
+    GSignondSecurityContext * (*security_context_of_keychain) (
+                            GSignondAccessControlManager *self);
+};
+
+

+GSignondAccessControlManagerClass class containing pointers to class methods. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

GObjectClass parent_class;

parent class.

security_context_of_peer ()

an implementation of gsignond_access_control_manager_security_context_of_peer() +

peer_is_allowed_to_use_identity ()

an implementation of gsignond_access_control_manager_peer_is_allowed_to_use_identity() +

peer_is_owner_of_identity ()

an implementation of gsignond_access_control_manager_peer_is_owner_of_identity() +

acl_is_valid ()

an implementation of gsignond_access_control_manager_acl_is_valid() +

security_context_of_keychain ()

an implementation of gsignond_access_control_manager_security_context_of_keychain() +
+
+
+
+

gsignond_access_control_manager_acl_is_valid ()

+
gboolean            gsignond_access_control_manager_acl_is_valid
+                                                        (GSignondAccessControlManager *self,
+                                                         const GSignondSecurityContext *peer_ctx,
+                                                         const GSignondSecurityContextList *identity_acl);
+

+Checks if the specified peer is allowed to set the specified access +control list. gsignond_access_control_manager_peer_is_owner_of_identity() +is used before calling this method to verify identity ownership. +

+

+The default implementation always returns TRUE. +

+
++ + + + + + + + + + + + + + + + + + +

self :

object instance.

peer_ctx :

security context of the peer connection.

identity_acl :

access control list for the identity.

Returns :

access control list is OK?
+
+
+
+

gsignond_access_control_manager_peer_is_allowed_to_use_identity ()

+
gboolean            gsignond_access_control_manager_peer_is_allowed_to_use_identity
+                                                        (GSignondAccessControlManager *self,
+                                                         const GSignondSecurityContext *peer_ctx,
+                                                         const GSignondSecurityContext *owner_ctx,
+                                                         const GSignondSecurityContextList *identity_acl);
+

+Checks if specified peer is allowed to access the specified identity. +

+

+The default implementation goes over items in identity_acl, using +gsignond_security_context_check() to check them against peer_ctx. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

self :

object instance.

peer_ctx :

security context of the peer connection.

owner_ctx :

security context of the identity owner.

identity_acl :

access control list for the identity in question. Includes the owner_ctx as well.

Returns :

access is allowed?
+
+
+
+

gsignond_access_control_manager_peer_is_owner_of_identity ()

+
gboolean            gsignond_access_control_manager_peer_is_owner_of_identity
+                                                        (GSignondAccessControlManager *self,
+                                                         const GSignondSecurityContext *peer_ctx,
+                                                         const GSignondSecurityContext *owner_ctx);
+

+Checks if the peer specified in peer_ctx is the owner of the identity. +

+

+The default implementation is using gsignond_security_context_check() +to check peer_ctx against owner_ctx directly. +

+
++ + + + + + + + + + + + + + + + + + +

self :

object instance.

peer_ctx :

security context of the peer connection.

owner_ctx :

security context of the identity owner.

Returns :

is owner?
+
+
+
+

gsignond_access_control_manager_security_context_of_keychain ()

+
GSignondSecurityContext * gsignond_access_control_manager_security_context_of_keychain
+                                                        (GSignondAccessControlManager *self);
+

+Retrieves security context of the keychain application. Keychain application +has a special management access to all stored identities and is able to +perform deletion of all identities from storage. +

+

+The default implementation returns an empty context. If gSSO was compiled +with --enable-debug and SSO_KEYCHAIN_SYSCTX environment variable is set, then +the value of that variable is used to set the returned system context instead. +

+
++ + + + + + + + + + +

self :

object instance.

Returns :

security context of the keychain application.
+
+
+
+

gsignond_access_control_manager_security_context_of_peer ()

+
void                gsignond_access_control_manager_security_context_of_peer
+                                                        (GSignondAccessControlManager *self,
+                                                         GSignondSecurityContext *peer_ctx,
+                                                         int peer_fd,
+                                                         const gchar *peer_service,
+                                                         const gchar *peer_app_ctx);
+

+Retrieves and sets GSignondSecurityContext of the specified peer. +

+

+The default implementation sets the app context as it was passed, and sets +the system context to the binary path of the process that is determined from +peer_fd and peer_service parameters. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

self :

object instance.

peer_ctx :

instance of security context to be set.

peer_fd :

file descriptor of the peer connection if using peer-to-peer dbus, -1 otherwise.

peer_service :

g_dbus_method_invocation_get_sender() of the peer connection, if not using peer-to-peer dbus, NULL otherwise

peer_app_ctx :

application context of the peer connection.
+
+
+
+

Property Details

+
+

The "config" property

+
  "config"                   GSignondConfig*       : Read / Write / Construct Only
+

Configuration object.

+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/GSignondConfig.html b/docs/html/GSignondConfig.html new file mode 100644 index 0000000..dfe0222 --- /dev/null +++ b/docs/html/GSignondConfig.html @@ -0,0 +1,275 @@ + + + + +GSignondConfig + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSignondConfig

+

GSignondConfig — gSSO configuration information

+
+
+

Synopsis

+
+#include <gsignond/gsignond-config.h>
+
+struct              GSignondConfig;
+struct              GSignondConfigClass;
+gint                gsignond_config_get_integer         (GSignondConfig *self,
+                                                         const gchar *key);
+const gchar *       gsignond_config_get_string          (GSignondConfig *self,
+                                                         const gchar *key);
+GSignondConfig *    gsignond_config_new                 ();
+void                gsignond_config_set_integer         (GSignondConfig *self,
+                                                         const gchar *key,
+                                                         gint value);
+void                gsignond_config_set_string          (GSignondConfig *self,
+                                                         const gchar *key,
+                                                         const gchar *value);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GSignondConfig
+
+
+
+

Description

+

+GSignondConfig holds configuration information as a set of keys and values +(integer or strings). The key names are defined in +general config keys, +database config keys, and +DBus config keys. +

+

+The configuration is discovered from these sources, in decreasing order of +priority: +

+
    +
  • environment variables, if gSSO has been compiled with --enable-debug switch. +See the specific keys documentation for the variable names.

  • +
  • gSSO configuration file. See below for where the file is searched for.

  • +
  • default values. See the documentation for specific keys for those.

  • +
+

+

+

+

+
+

Where the configuration file is searched for

+
+

+

+

+If gSSO has been compiled with --enable-debug, then these locations are used, +in decreasing order of priority: +

+
+

+

+

+Otherwise, the config file location is determined at compilation time as +$(sysconfdir) + "gsignond/gsignond.conf" +

+

+

+
+

Example configuration file

+
+

+

+

+See example configuration file here: + +http://code.google.com/p/accounts-sso/source/browse/gsignond.conf?repo=gsignond +

+
+
+

Details

+
+

struct GSignondConfig

+
struct GSignondConfig;
+

+Opaque structure for the object. +

+
+
+
+

struct GSignondConfigClass

+
struct GSignondConfigClass {
+};
+
+

+Opaque structure for the class. +

+
+
+
+

gsignond_config_get_integer ()

+
gint                gsignond_config_get_integer         (GSignondConfig *self,
+                                                         const gchar *key);
+

+Get an integer configuration value. +

+
++ + + + + + + + + + + + + + +

self :

an instance of GSignondConfig +

key :

the key name

Returns :

the value corresponding to the key as an integer. If the key does not +exist or cannot be converted to the integer, 0 is returned.
+
+
+
+

gsignond_config_get_string ()

+
const gchar *       gsignond_config_get_string          (GSignondConfig *self,
+                                                         const gchar *key);
+

+Get a string configuration value. +

+
++ + + + + + + + + + + + + + +

self :

an instance of GSignondConfig +

key :

the key name

Returns :

the value corresponding to the key as string. If the key does not +exist, NULL is returned. [transfer none] +
+
+
+
+

gsignond_config_new ()

+
GSignondConfig *    gsignond_config_new                 ();
+

+Create a GSignondConfig object. +

+
++ + + + +

Returns :

an instance of GSignondConfig. gSSO extensions should not use this +as they're already provided with a config object when they're created.
+
+
+
+

gsignond_config_set_integer ()

+
void                gsignond_config_set_integer         (GSignondConfig *self,
+                                                         const gchar *key,
+                                                         gint value);
+

+Sets the configuration value to the provided integer. +

+
++ + + + + + + + + + + + + + +

self :

an instance of GSignondConfig +

key :

the key name

value :

the value
+
+
+
+

gsignond_config_set_string ()

+
void                gsignond_config_set_string          (GSignondConfig *self,
+                                                         const gchar *key,
+                                                         const gchar *value);
+

+Sets the configuration value to the provided string. +

+
++ + + + + + + + + + + + + + +

self :

an instance of GSignondConfig +

key :

the key name

value :

the value. [transfer none] +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/GSignondCredentials.html b/docs/html/GSignondCredentials.html new file mode 100644 index 0000000..b986198 --- /dev/null +++ b/docs/html/GSignondCredentials.html @@ -0,0 +1,328 @@ + + + + +GSignondCredentials + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSignondCredentials

+

GSignondCredentials — credentials (username, password) associated with an identity

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GSignondCredentials
+
+
+
+

Description

+

+GSignondCredentials hold a username, password, and identity id, associated +with an identity. This information in stored in secret storage using +GSignondSecretStorage. +

+
+
+

Details

+
+

GSignondCredentials

+
typedef struct _GSignondCredentials GSignondCredentials;
+

+Opaque GSignondCredentials data structure. +

+
+
+
+

GSignondCredentialsClass

+
typedef struct {
+} GSignondCredentialsClass;
+
+

+Opaque GSignondCredentialsClass data structure. +

+
+
+
+

gsignond_credentials_equal ()

+
gboolean            gsignond_credentials_equal          (GSignondCredentials *one,
+                                                         GSignondCredentials *two);
+

+Compares elements of two GSignondCredentials object for equality. +

+
++ + + + + + + + + + + + + + +

one :

the first credential to be compared.

two :

the second credential to be compared.

Returns :

TRUE if id, username and password are same for both credential +objects, FALSE otherwise.
+
+
+
+

gsignond_credentials_get_id ()

+
guint32             gsignond_credentials_get_id         (GSignondCredentials *self);
+

+Gets the identity id +

+
++ + + + + + + + + + +

self :

the object whose id is to be set.

Returns :

the id
+
+
+
+

gsignond_credentials_get_password ()

+
const gchar *       gsignond_credentials_get_password   (GSignondCredentials *self);
+

+Gets the password from the GSignondCredentials object +

+
++ + + + + + + + + + +

self :

the object whose password is to be set.

Returns :

the password if the object is valid, NULL otherwise. [transfer none] +
+
+
+
+

gsignond_credentials_get_username ()

+
const gchar *       gsignond_credentials_get_username   (GSignondCredentials *self);
+

+Gets the username of the GSignondCredentials object +

+
++ + + + + + + + + + +

self :

the object whose username is to be set.

Returns :

the username if the object is valid, NULL otherwise. [transfer none] +
+
+
+
+

gsignond_credentials_new ()

+
GSignondCredentials * gsignond_credentials_new          ();
+

+Creates a new empty GSignondCredentials object +

+
++ + + + +

Returns :

the GSignondCredentials object. [transfer full] +
+
+
+
+

gsignond_credentials_set_data ()

+
gboolean            gsignond_credentials_set_data       (GSignondCredentials *self,
+                                                         const guint32 id,
+                                                         const gchar *username,
+                                                         const gchar *password);
+

+Sets the data of the GSignondCredentials. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

self :

the object whose data is to be set.

id :

the identity id associated with the credentials.

username :

the username. [transfer none] +

password :

the password. [transfer none] +

Returns :

TRUE if successful, FALSE otherwise.
+
+
+
+

gsignond_credentials_set_id ()

+
gboolean            gsignond_credentials_set_id         (GSignondCredentials *self,
+                                                         const guint32 id);
+

+Sets the identity id of the GSignondCredentials object +

+
++ + + + + + + + + + + + + + +

self :

the object whose id is to be set.

id :

the id.

Returns :

TRUE if successful, FALSE otherwise.
+
+
+
+

gsignond_credentials_set_password ()

+
gboolean            gsignond_credentials_set_password   (GSignondCredentials *self,
+                                                         const gchar *password);
+

+Sets the password of the GSignondCredentials object +

+
++ + + + + + + + + + + + + + +

self :

the object whose password is to be set.

password :

the password. [transfer none] +

Returns :

TRUE if successful, FALSE otherwise.
+
+
+
+

gsignond_credentials_set_username ()

+
gboolean            gsignond_credentials_set_username   (GSignondCredentials *self,
+                                                         const gchar *username);
+

+Sets the username of the GSignondCredentials object +

+
++ + + + + + + + + + + + + + +

self :

the object whose username is to be set.

username :

the username. [transfer none] +

Returns :

TRUE if successful, FALSE otherwise.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/GSignondDigestPlugin.html b/docs/html/GSignondDigestPlugin.html new file mode 100644 index 0000000..a7b8b1c --- /dev/null +++ b/docs/html/GSignondDigestPlugin.html @@ -0,0 +1,128 @@ + + + + +GSignondDigestPlugin + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSignondDigestPlugin

+

GSignondDigestPlugin — a plugin that performs HTTP Digest authentication

+
+
+

Synopsis

+
+#include <gsignond/gsignond-digest-plugin.h>
+
+struct              GSignondDigestPlugin;
+struct              GSignondDigestPluginClass;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GSignondDigestPlugin
+
+
+
+

Implemented Interfaces

+

+GSignondDigestPlugin implements + GSignondPlugin.

+
+
+

Description

+

+GSignondDigestPlugin performs HTTP Digest authentication without exposing +the password to the application. Digest authentication is described in +RFC 2617. +

+

+gsignond_plugin_request_initial() session_data parameter should include +the following string items, whose meaning is described in the RFC: +

+
    +
  • username and secret. If they are absent, they are requested from the user +via gSSO UI.

  • +
  • realm, "Algo", "Nonce", "Method", "DigestUri" - mandatory items.

  • +
  • "NonceCount", "Qop", "HEntity". "NonceCount" must be present if "Qop" is +present, "HEntity" must be present if "Qop" is present and set to "auth-int".

  • +
+

+

+

+If the plugin has all the data to calculate the digest, it issues +"response-final" signal. session_data in that signal contains +the username, "CNonce" item and the digest value under the "Response" key. +

+

+If some of the data is incorrect or not available, "error" +signal is issued instead. +

+

+"type" property is set to "digest", and "mechanisms" +property contains a single entry "digest". +

+
+
+

Details

+
+

struct GSignondDigestPlugin

+
struct GSignondDigestPlugin;
+

+Opaque GSignondDigestPlugin data structure. +

+
+
+
+

struct GSignondDigestPluginClass

+
struct GSignondDigestPluginClass {
+    GObjectClass parent_class;
+};
+
+

+Opaque GSignondDigestPluginClass data structure. +

+
++ + + + +

GObjectClass parent_class;

the parent class structure
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/GSignondExtension.html b/docs/html/GSignondExtension.html new file mode 100644 index 0000000..55b6e8a --- /dev/null +++ b/docs/html/GSignondExtension.html @@ -0,0 +1,298 @@ + + + + +GSignondExtension + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSignondExtension

+

GSignondExtension — provides platform adaptation functionality

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GSignondExtension
+
+
+
+

Description

+

+GSignondExtension provides access to platform adaptation functionality. It +contains getter methods for default implementations of GSignondAccessControlManager, +GSignondSecretStorage and GSignondStorageManager. +

+

+gSSO can be adapted to a specific platform environment by implementing a +custom extension module. The following steps need to be taken: +

+

+a) subclass and re-implement some (or all) of the functionality of the above +three classes. +

+

+b) subclass GSignondExtension and provide implementations of its getter methods for those +of the adaptation classes that have been changed. +

+

+d) provide a function GSignondExtension * extensionname_extension_init(void) +that returns an instance of the GSignondExtension subclass. +

+

+c) build and install these implementations as a gSSO extension module and +configure gSSO to use it. +

+

+Examples of custom extensions can be seen here: + +https://code.google.com/p/accounts-sso/source/browse/?repo=gsignond#git%2Fsrc%2Fextensions +and gSSO configuration is described in GSignondConfig. +

+
+
+

Details

+
+

struct GSignondExtension

+
struct GSignondExtension;
+

+Opaque GSignondExtension data structure. +

+
+
+
+

struct GSignondExtensionClass

+
struct GSignondExtensionClass {
+    GObjectClass parent_class;
+
+    const gchar * (*get_extension_name) (GSignondExtension *self);
+
+    guint32 (*get_extension_version) (GSignondExtension *self);
+
+    GSignondStorageManager * (*get_storage_manager) (GSignondExtension *self,
+                                                     GSignondConfig *config);
+
+    GSignondSecretStorage * (*get_secret_storage) (GSignondExtension *self,
+                                                   GSignondConfig *config);
+
+    GSignondAccessControlManager * (*get_access_control_manager) (
+                                                    GSignondExtension *self,
+                                                    GSignondConfig *config);
+};
+
+

+GSignondExtensionClass class containing pointers to class methods. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

GObjectClass parent_class;

the parent class

get_extension_name ()

implementation of gsignond_extension_get_name() +

get_extension_version ()

implementation of gsignond_extension_get_version() +

get_storage_manager ()

implementation of gsignond_extension_get_storage_manager() +

get_secret_storage ()

implementation of gsignond_extension_get_secret_storage() +

get_access_control_manager ()

implementation of gsignond_extension_get_access_control_manager() +
+
+
+
+

gsignond_extension_get_access_control_manager ()

+
GSignondAccessControlManager * gsignond_extension_get_access_control_manager
+                                                        (GSignondExtension *self,
+                                                         GSignondConfig *config);
+

+Factory method to get a singleton access control manager object. See +GSignondAccessControlManager for the description of the default implementation. +

+
++ + + + + + + + + + + + + + +

self :

object instance.

config :

configuration object instance.

Returns :

access control manager object instance. [transfer none] +
+
+
+
+

gsignond_extension_get_name ()

+
const gchar *       gsignond_extension_get_name         (GSignondExtension *self);
+

+Get a human readable name of the extension. Default implementation +returns "default". +

+
++ + + + + + + + + + +

self :

object instance.

Returns :

name of the extension. [transfer none] +
+
+
+
+

gsignond_extension_get_secret_storage ()

+
GSignondSecretStorage * gsignond_extension_get_secret_storage
+                                                        (GSignondExtension *self,
+                                                         GSignondConfig *config);
+

+Factory method to get a singleton secret storage object. See +GSignondSecretStorage for the description of the default implementation. +

+
++ + + + + + + + + + + + + + +

self :

object instance.

config :

configuration object instance.

Returns :

secret storage object instance. [transfer none] +
+
+
+
+

gsignond_extension_get_storage_manager ()

+
GSignondStorageManager * gsignond_extension_get_storage_manager
+                                                        (GSignondExtension *self,
+                                                         GSignondConfig *config);
+

+Factory method to get a singleton storage manager object. See +GSignondStorageManager for the description of the default implementation. +

+
++ + + + + + + + + + + + + + +

self :

object instance.

config :

configuration object instance.

Returns :

storage manager object instance. [transfer none] +
+
+
+
+

gsignond_extension_get_version ()

+
guint32             gsignond_extension_get_version      (GSignondExtension *self);
+

+Get version of the extension, split into four bytes in order from MSB to LSB; +major, minor, patchlevel, build. Default implementation returns 0. +

+
++ + + + +

self :

object instance.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/GSignondPasswordPlugin.html b/docs/html/GSignondPasswordPlugin.html new file mode 100644 index 0000000..cd135a5 --- /dev/null +++ b/docs/html/GSignondPasswordPlugin.html @@ -0,0 +1,113 @@ + + + + +GSignondPasswordPlugin + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSignondPasswordPlugin

+

GSignondPasswordPlugin — a plugin for retrieving the username/password

+
+
+

Synopsis

+
+#include <gsignond/gsignond-password-plugin.h>
+
+struct              GSignondPasswordPlugin;
+struct              GSignondPasswordPluginClass;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GSignondPasswordPlugin
+
+
+
+

Implemented Interfaces

+

+GSignondPasswordPlugin implements + GSignondPlugin.

+
+
+

Description

+

+GSignondPasswordPlugin is used in login/password based authentication protocols. +It returns to the applications the username and password associated with an +identity. The plugin first checks if the daemon has placed them in +gsignond_plugin_request_initial() session_data parameter +(that means they're already stored in gSSO secure database), and if not, +the user is asked for the username and password via gSSO UI. +

+

+The plugin returns the username and password via "response-final" +if it was able to obtain them, and issues "error" otherwise. +

+

+"type" property is set to "password", and "mechanisms" +property contains a single entry "password". +

+
+
+

Details

+
+

struct GSignondPasswordPlugin

+
struct GSignondPasswordPlugin;
+

+Opaque GSignondPasswordPlugin data structure. +

+
+
+
+

struct GSignondPasswordPluginClass

+
struct GSignondPasswordPluginClass {
+    GObjectClass parent_class;
+};
+
+

+Opaque GSignondPasswordPluginClass data structure. +

+
++ + + + +

GObjectClass parent_class;

the parent class structure
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/GSignondSecretStorage.html b/docs/html/GSignondSecretStorage.html new file mode 100644 index 0000000..4b26461 --- /dev/null +++ b/docs/html/GSignondSecretStorage.html @@ -0,0 +1,598 @@ + + + + +GSignondSecretStorage + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSignondSecretStorage

+

GSignondSecretStorage — provides access to the database that stores user credentials and identity/method cache

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GSignondSecretStorage
+
+
+
+

Properties

+
+  "config"                   GSignondConfig*       : Read / Write / Construct Only
+
+
+
+

Description

+

+GSignondSecretStorage provides access to the database where sensitive identity +data (GSignondCredentials) and identity/method cache are stored. It's preferred +that this database is protected against access by processes other than gSSO. +

+

+gSSO can be configured to use a custom extension +that provides a subclassed implementation of GSignondSecretStorage +(see GSignondExtension), otherwise a default implementation is used. +

+
+
+

Details

+
+

GSignondSecretStorage

+
typedef struct _GSignondSecretStorage GSignondSecretStorage;
+

+Opaque GSignondSecretStorage data structure. +

+
+
+
+

GSignondSecretStorageClass

+
typedef struct {
+    GObjectClass parent_class;
+
+    gboolean
+    (*open_db) (GSignondSecretStorage *self);
+
+    gboolean
+    (*close_db) (GSignondSecretStorage *self);
+
+    gboolean
+    (*clear_db) (GSignondSecretStorage *self);
+
+    gboolean
+    (*is_open_db) (GSignondSecretStorage *self);
+
+    GSignondCredentials*
+    (*load_credentials) (
+            GSignondSecretStorage *self,
+            const guint32 id);
+
+    gboolean
+    (*update_credentials) (
+            GSignondSecretStorage *self,
+            GSignondCredentials* creds);
+
+    gboolean
+    (*remove_credentials) (
+            GSignondSecretStorage *self,
+            const guint32 id);
+
+    gboolean
+    (*check_credentials) (
+            GSignondSecretStorage *self,
+            GSignondCredentials* creds);
+
+    GSignondDictionary*
+    (*load_data) (
+            GSignondSecretStorage *self,
+            const guint32 id,
+            const guint32 method);
+
+    gboolean
+    (*update_data) (
+            GSignondSecretStorage *self,
+            const guint32 id,
+            const guint32 method,
+            GSignondDictionary *data);
+
+    gboolean
+    (*remove_data) (
+            GSignondSecretStorage *self,
+            const guint32 id,
+            const guint32 method);
+
+    const GError*
+    (*get_last_error) (GSignondSecretStorage *self);
+} GSignondSecretStorageClass;
+
+

+GSignondSecretStorageClass class containing pointers to class methods. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GObjectClass parent_class;

parent class.

open_db ()

an implementation of gsignond_secret_storage_open_db() +

close_db ()

an implementation of gsignond_secret_storage_close_db() +

clear_db ()

an implementation of gsignond_secret_storage_clear_db() +

is_open_db ()

an implementation of gsignond_secret_storage_is_open_db() +

load_credentials ()

an implementation of gsignond_secret_storage_load_credentials() +

update_credentials ()

an implementation of gsignond_secret_storage_update_credentials() +

remove_credentials ()

an implementation of gsignond_secret_storage_remove_credentials() +

check_credentials ()

an implementation of gsignond_secret_storage_check_credentials() +

load_data ()

an implementation of gsignond_secret_storage_load_data() +

update_data ()

an implementation of gsignond_secret_storage_update_data() +

remove_data ()

an implementation of gsignond_secret_storage_remove_data() +

get_last_error ()

an implementation of gsignond_secret_storage_get_last_error() +
+
+
+
+

gsignond_secret_storage_check_credentials ()

+
gboolean            gsignond_secret_storage_check_credentials
+                                                        (GSignondSecretStorage *self,
+                                                         GSignondCredentials *creds);
+

+Checks whether the given credentials match what is stored in the database. +

+
++ + + + + + + + + + + + + + +

self :

instance of GSignondSecretStorage +

creds :

the credentials that are being checked. [transfer none] +

Returns :

TRUE if successful, FALSE otherwise.
+
+
+
+

gsignond_secret_storage_clear_db ()

+
gboolean            gsignond_secret_storage_clear_db    (GSignondSecretStorage *self);
+

+Removes all stored secrets from the database. +

+
++ + + + + + + + + + +

self :

instance of GSignondSecretStorage +

Returns :

TRUE if successful, FALSE otherwise.
+
+
+
+

gsignond_secret_storage_close_db ()

+
gboolean            gsignond_secret_storage_close_db    (GSignondSecretStorage *self);
+

+Closes the database. To reopen it, call gsignond_secret_storage_open_db(). +

+
++ + + + + + + + + + +

self :

instance of GSignondSecretStorage +

Returns :

TRUE if successful, FALSE otherwise.
+
+
+
+

gsignond_secret_storage_get_last_error ()

+
const GError *      gsignond_secret_storage_get_last_error
+                                                        (GSignondSecretStorage *self);
+

+Retrieves the last occurred error that has occured +

+
++ + + + + + + + + + +

self :

instance of GSignondSecretStorage +

Returns :

last occurred GError. [transfer none] +
+
+
+
+

gsignond_secret_storage_is_open_db ()

+
gboolean            gsignond_secret_storage_is_open_db  (GSignondSecretStorage *self);
+

+Checks if the database is open or not. +

+
++ + + + + + + + + + +

self :

instance of GSignondSecretStorage +

Returns :

TRUE if successful, FALSE otherwise.
+
+
+
+

gsignond_secret_storage_load_credentials ()

+
GSignondCredentials * gsignond_secret_storage_load_credentials
+                                                        (GSignondSecretStorage *self,
+                                                         const guint32 id);
+

+Loads the credentials from the database. +

+
++ + + + + + + + + + + + + + +

self :

instance of GSignondSecretStorage +

id :

the identity id whose credentials are being loaded.

Returns :

+GSignondCredentials if successful, +NULL otherwise. [transfer full] +
+
+
+
+

gsignond_secret_storage_load_data ()

+
GHashTable *        gsignond_secret_storage_load_data   (GSignondSecretStorage *self,
+                                                         const guint32 id,
+                                                         const guint32 method);
+

+Loads the secret data associated with a given identity and method. +

+
++ + + + + + + + + + + + + + + + + + +

self :

instance of GSignondSecretStorage +

id :

the identity id whose data are fetched

method :

the authentication method the data is used for.

Returns :

the secret data. [transfer full] +
+
+
+
+

gsignond_secret_storage_open_db ()

+
gboolean            gsignond_secret_storage_open_db     (GSignondSecretStorage *self);
+

+Opens (and initializes) the database. The implementation should take +care of creating the DB, if it doesn't exist, and it should use +GSIGNOND_CONFIG_GENERAL_SECURE_DIR and GSIGNOND_CONFIG_DB_SECRET_DB_FILENAME +to determine database location in the filesystem. +

+

+The default implementation is using SQLite for the storage. +

+
++ + + + + + + + + + +

self :

instance of GSignondSecretStorage +

Returns :

TRUE if successful, FALSE otherwise.
+
+
+
+

gsignond_secret_storage_remove_credentials ()

+
gboolean            gsignond_secret_storage_remove_credentials
+                                                        (GSignondSecretStorage *self,
+                                                         const guint32 id);
+

+Remove the credentials for the given identity. +

+
++ + + + + + + + + + + + + + +

self :

instance of GSignondSecretStorage +

id :

the identity whose credentials are being updated.

Returns :

TRUE if successful, FALSE otherwise.
+
+
+
+

gsignond_secret_storage_remove_data ()

+
gboolean            gsignond_secret_storage_remove_data (GSignondSecretStorage *self,
+                                                         const guint32 id,
+                                                         const guint32 method);
+

+Removes secret data associated with a given id/method. +

+
++ + + + + + + + + + + + + + + + + + +

self :

instance of GSignondSecretStorage +

id :

the identity whose data are fetched.

method :

the authentication method the data is used for.

Returns :

TRUE if successful, FALSE otherwise.
+
+
+
+

gsignond_secret_storage_update_credentials ()

+
gboolean            gsignond_secret_storage_update_credentials
+                                                        (GSignondSecretStorage *self,
+                                                         GSignondCredentials *creds);
+

+Stores/updates the credentials for the given identity. +

+
++ + + + + + + + + + + + + + +

self :

instance of GSignondSecretStorage +

creds :

the credentials that are being updated. [transfer none] +

Returns :

TRUE if successful, FALSE otherwise.
+
+
+
+

gsignond_secret_storage_update_data ()

+
gboolean            gsignond_secret_storage_update_data (GSignondSecretStorage *self,
+                                                         const guint32 id,
+                                                         const guint32 method,
+                                                         GHashTable *data);
+

+Calling this method updates the secret data +associated with the given id/method. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

self :

instance of GSignondSecretStorage +

id :

the identity whose data are fetched.

method :

the authentication method the data is used for.

data :

the data to update. [transfer none] +

Returns :

TRUE if successful, FALSE otherwise.
+
+
+
+

Property Details

+
+

The "config" property

+
  "config"                   GSignondConfig*       : Read / Write / Construct Only
+

Configuration object.

+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/GSignondSsoTestPlugin.html b/docs/html/GSignondSsoTestPlugin.html new file mode 100644 index 0000000..ba18da5 --- /dev/null +++ b/docs/html/GSignondSsoTestPlugin.html @@ -0,0 +1,101 @@ + + + + +GSignondSsoTestPlugin + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSignondSsoTestPlugin

+

GSignondSsoTestPlugin — a plugin that is used internally in gsignond unit test

+
+
+

Synopsis

+
+#include <gsignond/gsignond-ssotest-plugin.h>
+
+struct              GSignondSsoTestPlugin;
+struct              GSignondSsoTestPluginClass;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GSignondSsoTestPlugin
+
+
+
+

Implemented Interfaces

+

+GSignondSsoTestPlugin implements + GSignondPlugin.

+
+
+

Description

+

+GSignondSsoTestPlugin is used by gsignond unit tests. It should not be used +by applications. +

+
+
+

Details

+
+

struct GSignondSsoTestPlugin

+
struct GSignondSsoTestPlugin;
+

+Opaque GSignondSsoTestPlugin data structure. +

+
+
+
+

struct GSignondSsoTestPluginClass

+
struct GSignondSsoTestPluginClass {
+    GObjectClass parent_class;
+};
+
+

+Opaque GSignondSsoTestPluginClass data structure. +

+
++ + + + +

GObjectClass parent_class;

the parent class structure
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/GSignondStorageManager.html b/docs/html/GSignondStorageManager.html new file mode 100644 index 0000000..09eb1fb --- /dev/null +++ b/docs/html/GSignondStorageManager.html @@ -0,0 +1,305 @@ + + + + +GSignondStorageManager + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSignondStorageManager

+

GSignondStorageManager — manages encrypted disk storage for storing the secret database

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GSignondStorageManager
+
+
+
+

Properties

+
+  "config"                   GSignondConfig*       : Read / Write / Construct Only
+
+
+
+

Description

+

+GSignondStorageManager manages encrypted disk storage for storing the +databases. The default implementation maintains a simple per-user +directory accessible only to root and gsignond group, but gSSO can be +configured to use a custom extension that provides a subclassed +implementation of GSignondStorageManager +(see GSignondExtension for instructions and pointers to examples). +

+
+
+

Details

+
+

struct GSignondStorageManager

+
struct GSignondStorageManager;
+

+Opaque GSignondStorageManager data structure. +

+
+
+
+

struct GSignondStorageManagerClass

+
struct GSignondStorageManagerClass {
+    GObjectClass parent_class;
+
+    gboolean (*initialize_storage) (GSignondStorageManager *self);
+    gboolean (*delete_storage) (GSignondStorageManager *self);
+    gboolean (*storage_is_initialized) (GSignondStorageManager *self);
+    const gchar * (*mount_filesystem) (GSignondStorageManager *self);
+    gboolean (*unmount_filesystem) (GSignondStorageManager *self);
+    gboolean (*filesystem_is_mounted) (GSignondStorageManager *self);
+};
+
+

+GSignondStorageManagerClass class containing pointers to class methods. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GObjectClass parent_class;

parent class.

initialize_storage ()

an implementation of gsignond_storage_manager_initialize_storage() +

delete_storage ()

an implementation of gsignond_storage_manager_delete_storage() +

storage_is_initialized ()

an implementation of gsignond_storage_manager_storage_is_initialized() +

mount_filesystem ()

an implementation of gsignond_storage_manager_mount_filesystem() +

unmount_filesystem ()

an implementation of gsignond_storage_manager_unmount_filesystem() +

filesystem_is_mounted ()

an implementation of gsignond_storage_manager_filesystem_is_mounted() +
+
+
+
+

gsignond_storage_manager_delete_storage ()

+
gboolean            gsignond_storage_manager_delete_storage
+                                                        (GSignondStorageManager *self);
+

+Destroys all the encryption keys and wipes the storage. gsignond_wipe_directory() +is typically used for the latter. +

+
++ + + + + + + + + + +

self :

object instance.

Returns :

success?
+
+
+
+

gsignond_storage_manager_filesystem_is_mounted ()

+
gboolean            gsignond_storage_manager_filesystem_is_mounted
+                                                        (GSignondStorageManager *self);
+

+Checks if the encrypted storage filesystem is currently mounted. +

+
++ + + + + + + + + + +

self :

object instance.

Returns :

filesystem is currently mounted?
+
+
+
+

gsignond_storage_manager_initialize_storage ()

+
gboolean            gsignond_storage_manager_initialize_storage
+                                                        (GSignondStorageManager *self);
+

+Initialize encryption storage. This means making sure that the +necessary directories exist and are accessible. +

+
++ + + + + + + + + + +

self :

object instance.

Returns :

success?
+
+
+
+

gsignond_storage_manager_mount_filesystem ()

+
const gchar *       gsignond_storage_manager_mount_filesystem
+                                                        (GSignondStorageManager *self);
+

+Mounts an encrypted storage and returns the filesystem path of the storage +mount point. This path will be used to access the secret database via +GSignondSecretStorage. +

+

+The default implemenation does nothing, and immediately returns the path for the +secret database. +

+
++ + + + + + + + + + +

self :

object instance.

Returns :

path of the storage mount point. [transfer none] +
+
+
+
+

gsignond_storage_manager_storage_is_initialized ()

+
gboolean            gsignond_storage_manager_storage_is_initialized
+                                                        (GSignondStorageManager *self);
+

+Checks if the storage has been initialized. +

+
++ + + + + + + + + + +

self :

object instance.

Returns :

storage has been initialized?
+
+
+
+

gsignond_storage_manager_unmount_filesystem ()

+
gboolean            gsignond_storage_manager_unmount_filesystem
+                                                        (GSignondStorageManager *self);
+

+Unmounts a previously mounted encrypted storage filesystem. +

+
++ + + + + + + + + + +

self :

object instance.

Returns :

success?
+
+
+
+

Property Details

+
+

The "config" property

+
  "config"                   GSignondConfig*       : Read / Write / Construct Only
+

Configuration object.

+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/annotation-glossary.html b/docs/html/annotation-glossary.html new file mode 100644 index 0000000..f4b18b3 --- /dev/null +++ b/docs/html/annotation-glossary.html @@ -0,0 +1,36 @@ + + + + +Annotation Glossary + + + + + + + + + + + + + + + +
+

+Annotation Glossary

+

T

+
+transfer full
+

Free data after the code is done.

+
+transfer none
+

Don't free data after the code is done.

+
+ + + \ No newline at end of file diff --git a/docs/html/api-index-full.html b/docs/html/api-index-full.html new file mode 100644 index 0000000..226ebd4 --- /dev/null +++ b/docs/html/api-index-full.html @@ -0,0 +1,891 @@ + + + + +API Index + + + + + + + + + + + + + + + + +
+

+API Index

+

A

+
+GSignondAccessControlManager, struct in GSignondAccessControlManager +
+
+
+GSignondAccessControlManager:config, object property in GSignondAccessControlManager +
+
+
+GSignondAccessControlManagerClass, struct in GSignondAccessControlManager +
+
+
+gsignond_access_control_manager_acl_is_valid, function in GSignondAccessControlManager +
+
+
+gsignond_access_control_manager_peer_is_allowed_to_use_identity, function in GSignondAccessControlManager +
+
+
+gsignond_access_control_manager_peer_is_owner_of_identity, function in GSignondAccessControlManager +
+
+
+gsignond_access_control_manager_security_context_of_keychain, function in GSignondAccessControlManager +
+
+
+gsignond_access_control_manager_security_context_of_peer, function in GSignondAccessControlManager +
+
+

C

+
+GSignondConfig, struct in GSignondConfig +
+
+
+GSignondConfigClass, struct in GSignondConfig +
+
+
+GSIGNOND_CONFIG_DBUS_AUTH_SESSION_TIMEOUT, macro in DBus configuration +
+
+
+GSIGNOND_CONFIG_DBUS_DAEMON_TIMEOUT, macro in DBus configuration +
+
+
+GSIGNOND_CONFIG_DBUS_IDENTITY_TIMEOUT, macro in DBus configuration +
+
+
+GSIGNOND_CONFIG_DBUS_TIMEOUTS, macro in DBus configuration +
+
+
+GSIGNOND_CONFIG_DB_METADATA_DB_FILENAME, macro in Database configuration +
+
+
+GSIGNOND_CONFIG_DB_SECRET_DB_FILENAME, macro in Database configuration +
+
+
+GSIGNOND_CONFIG_DB_SSO, macro in Database configuration +
+
+
+GSIGNOND_CONFIG_GENERAL, macro in General configuration +
+
+
+GSIGNOND_CONFIG_GENERAL_BIN_DIR, macro in General configuration +
+
+
+GSIGNOND_CONFIG_GENERAL_EXTENSION, macro in General configuration +
+
+
+GSIGNOND_CONFIG_GENERAL_EXTENSIONS_DIR, macro in General configuration +
+
+
+GSIGNOND_CONFIG_GENERAL_PLUGINS_DIR, macro in General configuration +
+
+
+GSIGNOND_CONFIG_GENERAL_SECURE_DIR, macro in General configuration +
+
+
+GSIGNOND_CONFIG_GENERAL_STORAGE_PATH, macro in General configuration +
+
+
+gsignond_config_get_integer, function in GSignondConfig +
+
+
+gsignond_config_get_string, function in GSignondConfig +
+
+
+gsignond_config_new, function in GSignondConfig +
+
+
+GSIGNOND_CONFIG_PLUGIN_TIMEOUT, macro in General configuration +
+
+
+gsignond_config_set_integer, function in GSignondConfig +
+
+
+gsignond_config_set_string, function in GSignondConfig +
+
+
+GSignondCredentials, struct in GSignondCredentials +
+
+
+GSignondCredentialsClass, struct in GSignondCredentials +
+
+
+gsignond_credentials_equal, function in GSignondCredentials +
+
+
+gsignond_credentials_get_id, function in GSignondCredentials +
+
+
+gsignond_credentials_get_password, function in GSignondCredentials +
+
+
+gsignond_credentials_get_username, function in GSignondCredentials +
+
+
+gsignond_credentials_new, function in GSignondCredentials +
+
+
+gsignond_credentials_set_data, function in GSignondCredentials +
+
+
+gsignond_credentials_set_id, function in GSignondCredentials +
+
+
+gsignond_credentials_set_password, function in GSignondCredentials +
+
+
+gsignond_credentials_set_username, function in GSignondCredentials +
+
+

D

+
+DBG, macro in Logging +
+
+
+GSignondDictionary, typedef in GSignondDictionary +
+
+
+gsignond_dictionary_copy, function in GSignondDictionary +
+
+
+gsignond_dictionary_get, function in GSignondDictionary +
+
+
+gsignond_dictionary_get_boolean, function in GSignondDictionary +
+
+
+gsignond_dictionary_get_int32, function in GSignondDictionary +
+
+
+gsignond_dictionary_get_int64, function in GSignondDictionary +
+
+
+gsignond_dictionary_get_string, function in GSignondDictionary +
+
+
+gsignond_dictionary_get_uint32, function in GSignondDictionary +
+
+
+gsignond_dictionary_get_uint64, function in GSignondDictionary +
+
+
+gsignond_dictionary_new, function in GSignondDictionary +
+
+
+gsignond_dictionary_new_from_variant, function in GSignondDictionary +
+
+
+gsignond_dictionary_ref, function in GSignondDictionary +
+
+
+gsignond_dictionary_remove, function in GSignondDictionary +
+
+
+gsignond_dictionary_set, function in GSignondDictionary +
+
+
+gsignond_dictionary_set_boolean, function in GSignondDictionary +
+
+
+gsignond_dictionary_set_int32, function in GSignondDictionary +
+
+
+gsignond_dictionary_set_int64, function in GSignondDictionary +
+
+
+gsignond_dictionary_set_string, function in GSignondDictionary +
+
+
+gsignond_dictionary_set_uint32, function in GSignondDictionary +
+
+
+gsignond_dictionary_set_uint64, function in GSignondDictionary +
+
+
+gsignond_dictionary_to_variant, function in GSignondDictionary +
+
+
+gsignond_dictionary_unref, function in GSignondDictionary +
+
+
+GSignondDigestPlugin, struct in GSignondDigestPlugin +
+
+
+GSignondDigestPluginClass, struct in GSignondDigestPlugin +
+
+

E

+
+ERR, macro in Logging +
+
+
+GSignondError, enum in Errors +
+
+
+GSIGNOND_ERROR, macro in Errors +
+
+
+gsignond_error_new_from_variant, function in Errors +
+
+
+gsignond_error_quark, function in Errors +
+
+
+gsignond_error_to_variant, function in Errors +
+
+
+GSignondExtension, struct in GSignondExtension +
+
+
+GSignondExtensionClass, struct in GSignondExtension +
+
+
+gsignond_extension_get_access_control_manager, function in GSignondExtension +
+
+
+gsignond_extension_get_name, function in GSignondExtension +
+
+
+gsignond_extension_get_secret_storage, function in GSignondExtension +
+
+
+gsignond_extension_get_storage_manager, function in GSignondExtension +
+
+
+gsignond_extension_get_version, function in GSignondExtension +
+
+

G

+
+gsignond_generate_nonce, function in Utility functions +
+
+
+gsignond_get_gerror_for_id, macro in Errors +
+
+

I

+
+INFO, macro in Logging +
+
+

P

+
+GSignondPasswordPlugin, struct in GSignondPasswordPlugin +
+
+
+GSignondPasswordPluginClass, struct in GSignondPasswordPlugin +
+
+
+GSignondPluginInterface, struct in GSignondPlugin +
+
+
+GSignondPluginState, enum in GSignondPlugin +
+
+
+gsignond_plugin_cancel, function in GSignondPlugin +
+
+
+gsignond_plugin_error, function in GSignondPlugin +
+
+
+gsignond_plugin_refresh, function in GSignondPlugin +
+
+
+gsignond_plugin_refreshed, function in GSignondPlugin +
+
+
+gsignond_plugin_request, function in GSignondPlugin +
+
+
+gsignond_plugin_request_initial, function in GSignondPlugin +
+
+
+gsignond_plugin_response, function in GSignondPlugin +
+
+
+gsignond_plugin_response_final, function in GSignondPlugin +
+
+
+gsignond_plugin_status_changed, function in GSignondPlugin +
+
+
+gsignond_plugin_store, function in GSignondPlugin +
+
+
+gsignond_plugin_user_action_finished, function in GSignondPlugin +
+
+
+gsignond_plugin_user_action_required, function in GSignondPlugin +
+
+

S

+
+GSignondSecretStorage, struct in GSignondSecretStorage +
+
+
+GSignondSecretStorage:config, object property in GSignondSecretStorage +
+
+
+GSignondSecretStorageClass, struct in GSignondSecretStorage +
+
+
+gsignond_secret_storage_check_credentials, function in GSignondSecretStorage +
+
+
+gsignond_secret_storage_clear_db, function in GSignondSecretStorage +
+
+
+gsignond_secret_storage_close_db, function in GSignondSecretStorage +
+
+
+gsignond_secret_storage_get_last_error, function in GSignondSecretStorage +
+
+
+gsignond_secret_storage_is_open_db, function in GSignondSecretStorage +
+
+
+gsignond_secret_storage_load_credentials, function in GSignondSecretStorage +
+
+
+gsignond_secret_storage_load_data, function in GSignondSecretStorage +
+
+
+gsignond_secret_storage_open_db, function in GSignondSecretStorage +
+
+
+gsignond_secret_storage_remove_credentials, function in GSignondSecretStorage +
+
+
+gsignond_secret_storage_remove_data, function in GSignondSecretStorage +
+
+
+gsignond_secret_storage_update_credentials, function in GSignondSecretStorage +
+
+
+gsignond_secret_storage_update_data, function in GSignondSecretStorage +
+
+
+GSignondSecurityContext, struct in GSignondSecurityContext +
+
+
+GSignondSecurityContextList, typedef in GSignondSecurityContext +
+
+
+gsignond_security_context_check, function in GSignondSecurityContext +
+
+
+gsignond_security_context_compare, function in GSignondSecurityContext +
+
+
+gsignond_security_context_copy, function in GSignondSecurityContext +
+
+
+gsignond_security_context_free, function in GSignondSecurityContext +
+
+
+gsignond_security_context_from_variant, function in GSignondSecurityContext +
+
+
+gsignond_security_context_get_application_context, function in GSignondSecurityContext +
+
+
+gsignond_security_context_get_system_context, function in GSignondSecurityContext +
+
+
+gsignond_security_context_list_copy, function in GSignondSecurityContext +
+
+
+gsignond_security_context_list_free, function in GSignondSecurityContext +
+
+
+gsignond_security_context_list_from_variant, function in GSignondSecurityContext +
+
+
+gsignond_security_context_list_to_variant, function in GSignondSecurityContext +
+
+
+gsignond_security_context_match, function in GSignondSecurityContext +
+
+
+gsignond_security_context_new, function in GSignondSecurityContext +
+
+
+gsignond_security_context_new_from_values, function in GSignondSecurityContext +
+
+
+gsignond_security_context_set_application_context, function in GSignondSecurityContext +
+
+
+gsignond_security_context_set_system_context, function in GSignondSecurityContext +
+
+
+gsignond_security_context_to_variant, function in GSignondSecurityContext +
+
+
+GSignondSessionData, typedef in GSignondSessionData +
+
+
+gsignond_session_data_get_caption, function in GSignondSessionData +
+
+
+gsignond_session_data_get_network_proxy, function in GSignondSessionData +
+
+
+gsignond_session_data_get_network_timeout, function in GSignondSessionData +
+
+
+gsignond_session_data_get_realm, function in GSignondSessionData +
+
+
+gsignond_session_data_get_renew_token, function in GSignondSessionData +
+
+
+gsignond_session_data_get_secret, function in GSignondSessionData +
+
+
+gsignond_session_data_get_ui_policy, function in GSignondSessionData +
+
+
+gsignond_session_data_get_username, function in GSignondSessionData +
+
+
+gsignond_session_data_get_window_id, function in GSignondSessionData +
+
+
+gsignond_session_data_set_caption, function in GSignondSessionData +
+
+
+gsignond_session_data_set_network_proxy, function in GSignondSessionData +
+
+
+gsignond_session_data_set_network_timeout, function in GSignondSessionData +
+
+
+gsignond_session_data_set_realm, function in GSignondSessionData +
+
+
+gsignond_session_data_set_renew_token, function in GSignondSessionData +
+
+
+gsignond_session_data_set_secret, function in GSignondSessionData +
+
+
+gsignond_session_data_set_ui_policy, function in GSignondSessionData +
+
+
+gsignond_session_data_set_username, function in GSignondSessionData +
+
+
+gsignond_session_data_set_window_id, function in GSignondSessionData +
+
+
+GSignondSignonuiData, typedef in GSignondSignonuiData +
+
+
+GSignondSignonuiError, enum in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_captcha_response, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_captcha_url, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_caption, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_confirm, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_final_url, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_forgot_password, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_forgot_password_url, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_message, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_open_url, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_password, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_query_error, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_query_password, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_query_username, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_remember_password, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_request_id, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_test_reply, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_title, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_url_response, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_get_username, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_captcha_response, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_captcha_url, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_caption, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_confirm, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_final_url, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_forgot_password, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_forgot_password_url, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_message, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_open_url, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_password, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_query_error, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_query_password, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_query_username, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_remember_password, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_request_id, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_test_reply, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_title, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_url_response, function in GSignondSignonuiData +
+
+
+gsignond_signonui_data_set_username, function in GSignondSignonuiData +
+
+
+GSignondSsoTestPlugin, struct in GSignondSsoTestPlugin +
+
+
+GSignondSsoTestPluginClass, struct in GSignondSsoTestPlugin +
+
+
+GSignondStorageManager, struct in GSignondStorageManager +
+
+
+GSignondStorageManager:config, object property in GSignondStorageManager +
+
+
+GSignondStorageManagerClass, struct in GSignondStorageManager +
+
+
+gsignond_storage_manager_delete_storage, function in GSignondStorageManager +
+
+
+gsignond_storage_manager_filesystem_is_mounted, function in GSignondStorageManager +
+
+
+gsignond_storage_manager_initialize_storage, function in GSignondStorageManager +
+
+
+gsignond_storage_manager_mount_filesystem, function in GSignondStorageManager +
+
+
+gsignond_storage_manager_storage_is_initialized, function in GSignondStorageManager +
+
+
+gsignond_storage_manager_unmount_filesystem, function in GSignondStorageManager +
+
+

T

+
+TRACEBACK, macro in Logging +
+
+

U

+
+GSignondUiPolicy, enum in GSignondSessionData +
+
+

W

+
+WARN, macro in Logging +
+
+
+gsignond_wipe_directory, function in Utility functions +
+
+
+gsignond_wipe_file, function in Utility functions +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/ch01.html b/docs/html/ch01.html new file mode 100644 index 0000000..106fb9d --- /dev/null +++ b/docs/html/ch01.html @@ -0,0 +1,33 @@ + + + + +GSignond building and installation + + + + + + + + + + + + + + + + +
+

+GSignond building and installation

+ +
+ + + \ No newline at end of file diff --git a/docs/html/ch02.html b/docs/html/ch02.html new file mode 100644 index 0000000..e81db75 --- /dev/null +++ b/docs/html/ch02.html @@ -0,0 +1,44 @@ + + + + +GSignond configuration + + + + + + + + + + + + + + + + +
+

+GSignond configuration

+
+
+GSignondConfig — gSSO configuration information +
+
+General configuration — gSSO general configuration keys +
+
+Database configuration — gSSO database configuration keys +
+
+DBus configuration — gSSO dbus configuration keys +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/ch03.html b/docs/html/ch03.html new file mode 100644 index 0000000..f978c66 --- /dev/null +++ b/docs/html/ch03.html @@ -0,0 +1,44 @@ + + + + +GSignond API for writing authentication plugins + + + + + + + + + + + + + + + + +
+

+GSignond API for writing authentication plugins

+
+
+GSignondPlugin — an interface for implementing authentication plugins +
+
+GSignondDictionary — a dictionary container holding string keys and variant values +
+
+GSignondSessionData — definitions for authentication session parameters +
+
+GSignondSignonuiData — definitions for user interaction parameters +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/ch04.html b/docs/html/ch04.html new file mode 100644 index 0000000..35f1d17 --- /dev/null +++ b/docs/html/ch04.html @@ -0,0 +1,41 @@ + + + + +Standard in-tree authentication plugins + + + + + + + + + + + + + + + + +
+

+Standard in-tree authentication plugins

+
+
+GSignondDigestPlugin — a plugin that performs HTTP Digest authentication +
+
+GSignondSsoTestPlugin — a plugin that is used internally in gsignond unit test +
+
+GSignondPasswordPlugin — a plugin for retrieving the username/password +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/ch05.html b/docs/html/ch05.html new file mode 100644 index 0000000..3b4a82a --- /dev/null +++ b/docs/html/ch05.html @@ -0,0 +1,50 @@ + + + + +GSignond API for writing platform adaptation extensions + + + + + + + + + + + + + + + + +
+

+GSignond API for writing platform adaptation extensions

+
+
+GSignondExtension — provides platform adaptation functionality +
+
+GSignondAccessControlManager — an object that performs access control checks +
+
+GSignondSecurityContext — security context descriptor used in access control checks +
+
+GSignondStorageManager — manages encrypted disk storage for storing the secret database +
+
+GSignondSecretStorage — provides access to the database that stores user credentials and identity/method cache +
+
+GSignondCredentials — credentials (username, password) associated with an identity +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/ch06.html b/docs/html/ch06.html new file mode 100644 index 0000000..9c984a2 --- /dev/null +++ b/docs/html/ch06.html @@ -0,0 +1,41 @@ + + + + +Miscellaneous + + + + + + + + + + + + + + + + +
+

+Miscellaneous

+
+
+Errors — error definitions and utilities +
+
+Logging — logging facilities +
+
+Utility functions — miscellaneous utility functions +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/deprecated-api-index.html b/docs/html/deprecated-api-index.html new file mode 100644 index 0000000..47eb706 --- /dev/null +++ b/docs/html/deprecated-api-index.html @@ -0,0 +1,31 @@ + + + + +Index of deprecated API + + + + + + + + + + + + + + + + +
+

+Index of deprecated API

+ +
+ + + \ No newline at end of file diff --git a/docs/html/gsignond-DBus-configuration.html b/docs/html/gsignond-DBus-configuration.html new file mode 100644 index 0000000..d466a79 --- /dev/null +++ b/docs/html/gsignond-DBus-configuration.html @@ -0,0 +1,107 @@ + + + + +DBus configuration + + + + + + + + + + + + + + + + +
+
+
+ + +
+

DBus configuration

+

DBus configuration — gSSO dbus configuration keys

+
+
+

Synopsis

+
+#include <gsignond/gsignond-config.h>
+
+#define             GSIGNOND_CONFIG_DBUS_AUTH_SESSION_TIMEOUT
+#define             GSIGNOND_CONFIG_DBUS_DAEMON_TIMEOUT
+#define             GSIGNOND_CONFIG_DBUS_IDENTITY_TIMEOUT
+#define             GSIGNOND_CONFIG_DBUS_TIMEOUTS
+
+
+
+

Description

+

+DBus configuration keys are defined below. See GSignondConfig for how to use them. +

+
+
+

Details

+
+

GSIGNOND_CONFIG_DBUS_AUTH_SESSION_TIMEOUT

+
#define             GSIGNOND_CONFIG_DBUS_AUTH_SESSION_TIMEOUT
+

+A timeout in seconds, after which inactive authentication session dbus objects will be removed. +If not set, the dbus objects will persist. +

+

+Can be overriden in debug +builds by setting SSO_AUTH_SESSION_TIMEOUT environment variable. +

+
+
+
+

GSIGNOND_CONFIG_DBUS_DAEMON_TIMEOUT

+
#define             GSIGNOND_CONFIG_DBUS_DAEMON_TIMEOUT
+

+A timeout in seconds, after which the gSSO daemon will exit. If not set, +the daemon will not exit. Has no effect if P2P DBus is in use. +

+

+Can be overriden in debug +builds by setting SSO_DAEMON_TIMEOUT environment variable. +

+
+
+
+

GSIGNOND_CONFIG_DBUS_IDENTITY_TIMEOUT

+
#define             GSIGNOND_CONFIG_DBUS_IDENTITY_TIMEOUT
+

+A timeout in seconds, after which inactive identity dbus objects will be removed. +If not set, the dbus objects will persist. +

+

+Can be overriden in debug +builds by setting SSO_IDENTITY_TIMEOUT environment variable. +

+
+
+
+

GSIGNOND_CONFIG_DBUS_TIMEOUTS

+
#define GSIGNOND_CONFIG_DBUS_TIMEOUTS  "ObjectTimeouts"
+
+

+A prefix for dbus timeout keys. Should be used only when defining new keys. +

+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/gsignond-Database-configuration.html b/docs/html/gsignond-Database-configuration.html new file mode 100644 index 0000000..f60a27d --- /dev/null +++ b/docs/html/gsignond-Database-configuration.html @@ -0,0 +1,89 @@ + + + + +Database configuration + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Database configuration

+

Database configuration — gSSO database configuration keys

+
+
+

Synopsis

+
+#include <gsignond/gsignond-config.h>
+
+#define             GSIGNOND_CONFIG_DB_METADATA_DB_FILENAME
+#define             GSIGNOND_CONFIG_DB_SECRET_DB_FILENAME
+#define             GSIGNOND_CONFIG_DB_SSO
+
+
+
+

Description

+

+Database configuration keys are defined below. See GSignondConfig for how to use them. +

+
+
+

Details

+
+

GSIGNOND_CONFIG_DB_METADATA_DB_FILENAME

+
#define             GSIGNOND_CONFIG_DB_METADATA_DB_FILENAME
+

+The filename of the metadata database. +

+

+Default value: "metadata.db". +

+
+
+
+

GSIGNOND_CONFIG_DB_SECRET_DB_FILENAME

+
#define             GSIGNOND_CONFIG_DB_SECRET_DB_FILENAME
+

+The filename of the credentials database. +

+

+Default value: "secret.db". +

+
+
+
+

GSIGNOND_CONFIG_DB_SSO

+
#define GSIGNOND_CONFIG_DB_SSO                  "Storage"
+
+

+A prefix for database keys. Should be used only when defining new keys. +

+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/gsignond-Errors.html b/docs/html/gsignond-Errors.html new file mode 100644 index 0000000..75e5ddd --- /dev/null +++ b/docs/html/gsignond-Errors.html @@ -0,0 +1,433 @@ + + + + +Errors + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Errors

+

Errors — error definitions and utilities

+
+
+

Synopsis

+
+#include <gsignond/gsignond-error.h>
+
+#define             GSIGNOND_ERROR
+enum                GSignondError;
+GError *            gsignond_error_new_from_variant     (GVariant *var);
+GQuark              gsignond_error_quark                (void);
+GVariant *          gsignond_error_to_variant           (GError *error);
+#define             gsignond_get_gerror_for_id          (err,
+                                                         message,
+                                                         ...)
+
+
+
+

Description

+

+This file provides GSignond error definitions and utilities. +When creating an error, use GSIGNOND_ERROR for the error domain and errors +from GSignondError for the error code. +

+

+

+
+ + + + + + + +
1
+2
GError* err = g_error_new(GSIGNOND_ERROR, GSIGNOND_ERROR_MISSING_DATA,
+    "Not enough data");
+
+ +

+

+
+
+

Details

+
+

GSIGNOND_ERROR

+
#define GSIGNOND_ERROR   (gsignond_error_quark())
+
+

+This macro should be used when creating a GError in GSignond plugins and extensions. +(for example with g_error_new() ) +

+
+
+
+

enum GSignondError

+
typedef enum {
+    GSIGNOND_ERROR_NONE,
+
+    GSIGNOND_ERROR_UNKNOWN = 1,
+    GSIGNOND_ERROR_INTERNAL_SERVER = 2,
+    GSIGNOND_ERROR_INTERNAL_COMMUNICATION = 3,
+    GSIGNOND_ERROR_PERMISSION_DENIED = 4,
+    GSIGNOND_ERROR_ENCRYPTION_FAILURE,
+
+    GSIGNOND_ERROR_AUTH_SERVICE_ERR = 100,      /* Placeholder to rearrange enumeration - AuthService specific */
+    GSIGNOND_ERROR_METHOD_NOT_KNOWN,
+    GSIGNOND_ERROR_SERVICE_NOT_AVAILABLE,
+    GSIGNOND_ERROR_INVALID_QUERY,
+
+    GSIGNOND_ERROR_IDENTITY_ERR = 200,          /* Placeholder to rearrange enumeration - Identity specific */
+    GSIGNOND_ERROR_METHOD_NOT_AVAILABLE,
+    GSIGNOND_ERROR_IDENTITY_NOT_FOUND,
+    GSIGNOND_ERROR_STORE_FAILED,
+    GSIGNOND_ERROR_REMOVE_FAILED,
+    GSIGNOND_ERROR_SIGN_OUT_FAILED,
+    GSIGNOND_ERROR_IDENTITY_OPERATION_CANCELED,
+    GSIGNOND_ERROR_CREDENTIALS_NOT_AVAILABLE,
+    GSIGNOND_ERROR_REFERENCE_NOT_FOUND,
+
+    GSIGNOND_ERROR_AUTH_SESSION_ERR = 300,     /* Placeholder to rearrange enumeration - AuthSession/PluginInterface specific */
+    GSIGNOND_ERROR_MECHANISM_NOT_AVAILABLE,
+    GSIGNOND_ERROR_MISSING_DATA,
+    GSIGNOND_ERROR_INVALID_CREDENTIALS,
+    GSIGNOND_ERROR_NOT_AUTHORIZED,
+    GSIGNOND_ERROR_WRONG_STATE,
+    GSIGNOND_ERROR_OPERATION_NOT_SUPPORTED,
+    GSIGNOND_ERROR_NO_CONNECTION,
+    GSIGNOND_ERROR_NETWORK,
+    GSIGNOND_ERROR_SSL,
+    GSIGNOND_ERROR_RUNTIME,
+    GSIGNOND_ERROR_SESSION_CANCELED,
+    GSIGNOND_ERROR_TIMED_OUT,
+    GSIGNOND_ERROR_USER_INTERACTION,
+    GSIGNOND_ERROR_OPERATION_FAILED,
+    GSIGNOND_ERROR_ENCRYPTION_FAILED,
+    GSIGNOND_ERROR_TOS_NOT_ACCEPTED,
+    GSIGNOND_ERROR_FORGOT_PASSWORD,
+    GSIGNOND_ERROR_METHOD_OR_MECHANISM_NOT_ALLOWED,
+    GSIGNOND_ERROR_INCORRECT_DATE,
+
+    GSIGNOND_ERROR_USER_ERR = 400
+} GSignondError;
+
+

+This enum provides a list of errors that plugins and extensions can use. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GSIGNOND_ERROR_NONE

No error +

GSIGNOND_ERROR_UNKNOWN

Catch-all for errors not distinguished by another code. +

GSIGNOND_ERROR_INTERNAL_SERVER

Signon Daemon internal error. +

GSIGNOND_ERROR_INTERNAL_COMMUNICATION

Communication with Signon Daemon error. +

GSIGNOND_ERROR_PERMISSION_DENIED

The operation cannot be performed due to insufficient client permissions. +

GSIGNOND_ERROR_ENCRYPTION_FAILURE

Failure during data encryption/decryption. +

GSIGNOND_ERROR_AUTH_SERVICE_ERR

Placeholder to rearrange enumeration - AuthService specific +

GSIGNOND_ERROR_METHOD_NOT_KNOWN

The method with this name is not found. +

GSIGNOND_ERROR_SERVICE_NOT_AVAILABLE

The service is temporarily unavailable. +

GSIGNOND_ERROR_INVALID_QUERY

Parameters for the query are invalid. +

GSIGNOND_ERROR_IDENTITY_ERR

Placeholder to rearrange enumeration - Identity specific +

GSIGNOND_ERROR_METHOD_NOT_AVAILABLE

The requested method is not available. +

GSIGNOND_ERROR_IDENTITY_NOT_FOUND

The identity matching this Identity object was not found on the service. +

GSIGNOND_ERROR_STORE_FAILED

Storing credentials failed. +

GSIGNOND_ERROR_REMOVE_FAILED

Removing credentials failed. +

GSIGNOND_ERROR_SIGN_OUT_FAILED

SignOut failed. +

GSIGNOND_ERROR_IDENTITY_OPERATION_CANCELED

Identity operation was canceled by user. +

GSIGNOND_ERROR_CREDENTIALS_NOT_AVAILABLE

Query failed. +

GSIGNOND_ERROR_REFERENCE_NOT_FOUND

Trying to remove nonexistent reference. +

GSIGNOND_ERROR_AUTH_SESSION_ERR

Placeholder to rearrange enumeration - AuthSession/PluginInterface specific +

GSIGNOND_ERROR_MECHANISM_NOT_AVAILABLE

The requested mechanism is not available. +

GSIGNOND_ERROR_MISSING_DATA

The SessionData object does not contain necessary information. +

GSIGNOND_ERROR_INVALID_CREDENTIALS

The supplied credentials are invalid for the mechanism implementation. +

GSIGNOND_ERROR_NOT_AUTHORIZED

Authorization failed. +

GSIGNOND_ERROR_WRONG_STATE

An operation method has been called in a wrong state. +

GSIGNOND_ERROR_OPERATION_NOT_SUPPORTED

The operation is not supported by the mechanism implementation. +

GSIGNOND_ERROR_NO_CONNECTION

No Network connetion. +

GSIGNOND_ERROR_NETWORK

Network connetion failed. +

GSIGNOND_ERROR_SSL

Ssl connection failed. +

GSIGNOND_ERROR_RUNTIME

Casting SessionData into subclass failed +

GSIGNOND_ERROR_SESSION_CANCELED

Challenge was cancelled. +

GSIGNOND_ERROR_TIMED_OUT

Challenge was timed out. +

GSIGNOND_ERROR_USER_INTERACTION

User interaction dialog failed +

GSIGNOND_ERROR_OPERATION_FAILED

Temporary failure in authentication. +

GSIGNOND_ERROR_ENCRYPTION_FAILED

Failure during data encryption/decryption. +

GSIGNOND_ERROR_TOS_NOT_ACCEPTED

User declined Terms of Service. +

GSIGNOND_ERROR_FORGOT_PASSWORD

User requested reset password sequence. +

GSIGNOND_ERROR_METHOD_OR_MECHANISM_NOT_ALLOWED

Method or mechanism not allowed for this identity. +

GSIGNOND_ERROR_INCORRECT_DATE

Date time incorrect on device. +

GSIGNOND_ERROR_USER_ERR

Placeholder to rearrange enumeration - User space specific +
+
+
+
+

gsignond_error_new_from_variant ()

+
GError *            gsignond_error_new_from_variant     (GVariant *var);
+

+Converts the GVariant to GError. +

+
++ + + + + + + + + + +

var :

instance of GVariant +

Returns :

+GError object if successful, NULL otherwise. [transfer full] +
+
+
+
+

gsignond_error_quark ()

+
GQuark              gsignond_error_quark                (void);
+

+Creates and returns a domain for GSignond errors. +

+
+
+
+

gsignond_error_to_variant ()

+
GVariant *          gsignond_error_to_variant           (GError *error);
+

+Converts the GError to GVariant. +

+
++ + + + + + + + + + +

error :

instance of GError +

Returns :

+GVariant object if successful, NULL otherwise. [transfer full] +
+
+
+
+

gsignond_get_gerror_for_id()

+
#define             gsignond_get_gerror_for_id(err, message, args...)
+

+A helper macro that creates a GError with the proper gsignond domain +

+
++ + + + + + + + + + + + + + +

err :

A GSignondError specifying the error

message :

Format string for the error message

... :

parameters for the error string
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/gsignond-GSignondDictionary.html b/docs/html/gsignond-GSignondDictionary.html new file mode 100644 index 0000000..8c7f6e2 --- /dev/null +++ b/docs/html/gsignond-GSignondDictionary.html @@ -0,0 +1,771 @@ + + + + +GSignondDictionary + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSignondDictionary

+

GSignondDictionary — a dictionary container holding string keys and variant values

+
+
+

Synopsis

+
+#include <gsignond/gsignond-dictionary.h>
+
+typedef             GSignondDictionary;
+GSignondDictionary * gsignond_dictionary_copy           (GSignondDictionary *other);
+GVariant *          gsignond_dictionary_get             (GSignondDictionary *dict,
+                                                         const gchar *key);
+gboolean            gsignond_dictionary_get_boolean     (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         gboolean *value);
+gboolean            gsignond_dictionary_get_int32       (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         gint *value);
+gboolean            gsignond_dictionary_get_int64       (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         gint64 *value);
+const gchar *       gsignond_dictionary_get_string      (GSignondDictionary *dict,
+                                                         const gchar *key);
+gboolean            gsignond_dictionary_get_uint32      (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         guint *value);
+gboolean            gsignond_dictionary_get_uint64      (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         guint64 *value);
+GSignondDictionary * gsignond_dictionary_new            (void);
+GSignondDictionary * gsignond_dictionary_new_from_variant
+                                                        (GVariant *variant);
+GSignondDictionary * gsignond_dictionary_ref            (GSignondDictionary *dict);
+gboolean            gsignond_dictionary_remove          (GSignondDictionary *dict,
+                                                         const gchar *key);
+gboolean            gsignond_dictionary_set             (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         GVariant *value);
+gboolean            gsignond_dictionary_set_boolean     (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         gboolean value);
+gboolean            gsignond_dictionary_set_int32       (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         gint value);
+gboolean            gsignond_dictionary_set_int64       (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         gint64 value);
+gboolean            gsignond_dictionary_set_string      (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         const gchar *value);
+gboolean            gsignond_dictionary_set_uint32      (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         guint32 value);
+gboolean            gsignond_dictionary_set_uint64      (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         guint64 value);
+GVariant *          gsignond_dictionary_to_variant      (GSignondDictionary *dict);
+void                gsignond_dictionary_unref           (GSignondDictionary *dict);
+
+
+
+

Description

+

+A GSignondDictionary is a dictionary data structure that maps string keys to GVariant values. +It's used in multiple places in gsignond and its public API to pass key-value +data sets. +

+

+

+
+ + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
GSignondDictionary* dict = gsignond_dictionary_new();
+    gsignond_dictionary_set_string(dict, "name", "John Smith");
+    gsignond_dictionary_set_uint32(dict, "age", 32);
+
+    guint32 age;
+    gboolean success = gsignond_dictionary_get_uint32(dict, "age", &age);
+    const gchar* name = gsignond_dictionary_get_string(dict, "name");
+    gsignond_dictionary_unref(dict);
+
+ +

+

+
+
+

Details

+
+

GSignondDictionary

+
typedef GHashTable GSignondDictionary;
+
+

+GSignondDictionary is a typedef for GHashTable, which +means the developers may also use methods associated with that structure. +

+
+
+
+

gsignond_dictionary_copy ()

+
GSignondDictionary * gsignond_dictionary_copy           (GSignondDictionary *other);
+

+Creates a copy of the dictionary. +

+
++ + + + + + + + + + +

other :

instance of GSignondDictionary +

Returns :

+GSignondDictionary object if the copy was successful, +NULL otherwise. [transfer full] +
+
+
+
+

gsignond_dictionary_get ()

+
GVariant *          gsignond_dictionary_get             (GSignondDictionary *dict,
+                                                         const gchar *key);
+

+Retrieves a GVariant value from the dictionary. This can be used to retrieve +a value of an arbitrary type, and then convert it manually to a specific type +using GVariant methods. For most commonly used types, also getters that +return the specific type directly are provided (gsignond_dictionary_get_string() +and similar). +

+
++ + + + + + + + + + + + + + +

dict :

instance of GSignondDictionary +

key :

the key to look up in the dictionary

Returns :

the value; NULL is returned in case of failure (for +example if the entry corresponding to the supplied key doesn't exist). [transfer none] +
+
+
+
+

gsignond_dictionary_get_boolean ()

+
gboolean            gsignond_dictionary_get_boolean     (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         gboolean *value);
+

+Retrieves a gboolean value. +

+
++ + + + + + + + + + + + + + + + + + +

dict :

instance of GSignondDictionary +

key :

key to look up. [transfer none] +

value :

points to the location where the value should be set

Returns :

TRUE if the value was retrieved successfully, FALSE otherwise.
+
+
+
+

gsignond_dictionary_get_int32 ()

+
gboolean            gsignond_dictionary_get_int32       (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         gint *value);
+

+Retrieves a int32 value. +

+
++ + + + + + + + + + + + + + + + + + +

dict :

instance of GSignondDictionary +

key :

key to look up. [transfer none] +

value :

points to the location where the value should be set

Returns :

TRUE if the value was retrieved successfully, FALSE otherwise.
+
+
+
+

gsignond_dictionary_get_int64 ()

+
gboolean            gsignond_dictionary_get_int64       (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         gint64 *value);
+

+Retrieves a int64 value. +

+
++ + + + + + + + + + + + + + + + + + +

dict :

instance of GSignondDictionary +

key :

key to look up. [transfer none] +

value :

points to the location where the value should be set

Returns :

TRUE if the value was retrieved successfully, FALSE otherwise.
+
+
+
+

gsignond_dictionary_get_string ()

+
const gchar *       gsignond_dictionary_get_string      (GSignondDictionary *dict,
+                                                         const gchar *key);
+

+Retrieves a string value. +

+
++ + + + + + + + + + + + + + +

dict :

instance of GSignondDictionary +

key :

key to look up. [transfer none] +

Returns :

the value if it was retrieved successfully, NULL otherwise. [transfer none] +
+
+
+
+

gsignond_dictionary_get_uint32 ()

+
gboolean            gsignond_dictionary_get_uint32      (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         guint *value);
+

+Retrieves a uint32 value. +

+
++ + + + + + + + + + + + + + + + + + +

dict :

instance of GSignondDictionary +

key :

key to look up. [transfer none] +

value :

points to the location where the value should be set

Returns :

TRUE if the value was retrieved successfully, FALSE otherwise.
+
+
+
+

gsignond_dictionary_get_uint64 ()

+
gboolean            gsignond_dictionary_get_uint64      (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         guint64 *value);
+

+Retrieves a uint64 value. +

+
++ + + + + + + + + + + + + + + + + + +

dict :

instance of GSignondDictionary +

key :

key to look up. [transfer none] +

value :

points to the location where the value should be set

Returns :

TRUE if the value was retrieved successfully, FALSE otherwise.
+
+
+
+

gsignond_dictionary_new ()

+
GSignondDictionary * gsignond_dictionary_new            (void);
+

+Creates a new instance of GSignondDictionary. +

+
++ + + + +

Returns :

+GSignondDictionary object if successful, +NULL otherwise. [transfer full] +
+
+
+
+

gsignond_dictionary_new_from_variant ()

+
GSignondDictionary * gsignond_dictionary_new_from_variant
+                                                        (GVariant *variant);
+

+Converts the GVariant to GSignondDictionary. This is useful for example if +the dictionary needs to be deserialized, or if it's contained in another +GSignondDictionary and has been retrieved using gsignond_dictionary_get(). +

+
++ + + + + + + + + + +

variant :

instance of GVariant +

Returns :

+GSignondDictionary if successful, NULL otherwise. [transfer full] +
+
+
+
+

gsignond_dictionary_ref ()

+
GSignondDictionary * gsignond_dictionary_ref            (GSignondDictionary *dict);
+

+Increments the reference count of the dictionary structure. +

+
++ + + + + + + + + + +

dict :

instance of GSignondDictionary +

Returns :

the pointer to the passed in GSignondDictionary +
+
+
+
+

gsignond_dictionary_remove ()

+
gboolean            gsignond_dictionary_remove          (GSignondDictionary *dict,
+                                                         const gchar *key);
+

+Removes key-value pair in the dictionary as per key. +

+
++ + + + + + + + + + + + + + +

dict :

instance of GSignondDictionary +

key :

key which needs to be removed from the dictionary. [transfer none] +

Returns :

TRUE if successful, FALSE otherwise.
+
+
+
+

gsignond_dictionary_set ()

+
gboolean            gsignond_dictionary_set             (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         GVariant *value);
+

+Adds or replaces key-value pair in the dictionary. This allows to set a value +of an arbitrary type: it first needs to be converted to a GVariant. For most +commonly used types also type-specific setters are provided. +

+
++ + + + + + + + + + + + + + + + + + +

dict :

instance of GSignondDictionary +

key :

key to be set. [transfer none] +

value :

value to be set. [transfer full] +

Returns :

TRUE if successful, FALSE otherwise.
+
+
+
+

gsignond_dictionary_set_boolean ()

+
gboolean            gsignond_dictionary_set_boolean     (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         gboolean value);
+

+Sets or replaces a gboolean value in the dictionary. +

+
++ + + + + + + + + + + + + + + + + + +

dict :

instance of GSignondDictionary +

key :

key to set. [transfer none] +

value :

value to set

Returns :

TRUE if the value was set or replaced successfully, FALSE otherwise.
+
+
+
+

gsignond_dictionary_set_int32 ()

+
gboolean            gsignond_dictionary_set_int32       (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         gint value);
+

+Sets or replaces a int32 value in the dictionary. +

+
++ + + + + + + + + + + + + + + + + + +

dict :

instance of GSignondDictionary +

key :

key to set. [transfer none] +

value :

value to set

Returns :

TRUE if the value was set or replaced successfully, FALSE otherwise.
+
+
+
+

gsignond_dictionary_set_int64 ()

+
gboolean            gsignond_dictionary_set_int64       (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         gint64 value);
+

+Sets or replaces a int64 value in the dictionary. +

+
++ + + + + + + + + + + + + + + + + + +

dict :

instance of GSignondDictionary +

key :

key to set. [transfer none] +

value :

value to set

Returns :

TRUE if the value was set or replaced successfully, FALSE otherwise.
+
+
+
+

gsignond_dictionary_set_string ()

+
gboolean            gsignond_dictionary_set_string      (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         const gchar *value);
+

+Sets or replaces a string value in the dictionary. +

+
++ + + + + + + + + + + + + + + + + + +

dict :

instance of GSignondDictionary +

key :

key to set. [transfer none] +

value :

value to set. [transfer none] +

Returns :

TRUE if the value was set or replaced successfully, FALSE otherwise.
+
+
+
+

gsignond_dictionary_set_uint32 ()

+
gboolean            gsignond_dictionary_set_uint32      (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         guint32 value);
+

+Sets or replaces a uint32 value in the dictionary. +

+
++ + + + + + + + + + + + + + + + + + +

dict :

instance of GSignondDictionary +

key :

key to set. [transfer none] +

value :

value to set

Returns :

TRUE if the value was set or replaced successfully, FALSE otherwise.
+
+
+
+

gsignond_dictionary_set_uint64 ()

+
gboolean            gsignond_dictionary_set_uint64      (GSignondDictionary *dict,
+                                                         const gchar *key,
+                                                         guint64 value);
+

+Sets or replaces a uint64 value in the dictionary. +

+
++ + + + + + + + + + + + + + + + + + +

dict :

instance of GSignondDictionary +

key :

key to set. [transfer none] +

value :

value to set

Returns :

TRUE if the value was set or replaced successfully, FALSE otherwise.
+
+
+
+

gsignond_dictionary_to_variant ()

+
GVariant *          gsignond_dictionary_to_variant      (GSignondDictionary *dict);
+

+Converts the GSignondDictionary to a GVariant. The result can be serialized +or put into another GSignondDictionary using gsignond_dictionary_set(). +

+
++ + + + + + + + + + +

dict :

instance of GSignondDictionary +

Returns :

+GVariant object if successful, NULL otherwise. [transfer full] +
+
+
+
+

gsignond_dictionary_unref ()

+
void                gsignond_dictionary_unref           (GSignondDictionary *dict);
+

+Decrements the reference count of the dictionary structure. If the reference +count reaches zero, the structure is deallocated and shouldn't be used. +

+
++ + + + +

dict :

instance of GSignondDictionary +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/gsignond-GSignondPlugin.html b/docs/html/gsignond-GSignondPlugin.html new file mode 100644 index 0000000..d77d3f1 --- /dev/null +++ b/docs/html/gsignond-GSignondPlugin.html @@ -0,0 +1,694 @@ + + + + +GSignondPlugin + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSignondPlugin

+

GSignondPlugin — an interface for implementing authentication plugins

+
+
+

Synopsis

+
+#include <gsignond/gsignond-plugin-interface.h>
+
+struct              GSignondPluginInterface;
+enum                GSignondPluginState;
+void                gsignond_plugin_cancel              (GSignondPlugin *self);
+void                gsignond_plugin_error               (GSignondPlugin *self,
+                                                         GError *error);
+void                gsignond_plugin_refresh             (GSignondPlugin *self,
+                                                         GSignondSignonuiData *ui_data);
+void                gsignond_plugin_refreshed           (GSignondPlugin *self,
+                                                         GSignondSignonuiData *ui_data);
+void                gsignond_plugin_request             (GSignondPlugin *self,
+                                                         GSignondSessionData *session_data);
+void                gsignond_plugin_request_initial     (GSignondPlugin *self,
+                                                         GSignondSessionData *session_data,
+                                                         GSignondDictionary *identity_method_cache,
+                                                         const gchar *mechanism);
+void                gsignond_plugin_response            (GSignondPlugin *self,
+                                                         GSignondSessionData *session_data);
+void                gsignond_plugin_response_final      (GSignondPlugin *self,
+                                                         GSignondSessionData *session_data);
+void                gsignond_plugin_status_changed      (GSignondPlugin *self,
+                                                         GSignondPluginState state,
+                                                         const gchar *message);
+void                gsignond_plugin_store               (GSignondPlugin *self,
+                                                         GSignondDictionary *identity_method_cache);
+void                gsignond_plugin_user_action_finished
+                                                        (GSignondPlugin *self,
+                                                         GSignondSignonuiData *ui_data);
+void                gsignond_plugin_user_action_required
+                                                        (GSignondPlugin *self,
+                                                         GSignondSignonuiData *ui_data);
+
+
+
+

Description

+

+GSignondPlugin is an interface for implementing authentication plugins. +

+

+When creating a plugin, write the GObject boilerplate code as usual, but +

+

+a) declare the type as follows: +

+

+

+
+ + + + + + + +
1
+2
+3
+4
G_DEFINE_TYPE_WITH_CODE (GSignondPasswordPlugin, gsignond_password_plugin,
+                        G_TYPE_OBJECT,
+                        G_IMPLEMENT_INTERFACE (GSIGNOND_TYPE_PLUGIN,
+                                               gsignond_plugin_interface_init));
+
+ +

+

+

+b) implement gsignond_plugin_interface_init as follows: +

+

+

+
+ + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
static void
+gsignond_plugin_interface_init (GSignondPluginInterface *iface)
+{
+    iface->cancel = gsignond_password_plugin_cancel;
+    iface->request_initial = gsignond_password_plugin_request_initial;
+    iface->request = gsignond_password_plugin_request;
+    iface->user_action_finished = gsignond_password_plugin_user_action_finished;
+    iface->refresh = gsignond_password_plugin_refresh;
+}
+
+ +

+

+

+where the gsignond_password_plugin_cancel etc. are specific implementations of +plugin interface methods that every plugin must provide (see below for when +and how they're used by the daemon). +

+

+c) override "type" and "mechanisms" property +implementations in the plugin class constructor like this: +

+

+

+
+ + + + + + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
static void
+gsignond_password_plugin_class_init (GSignondPasswordPluginClass *klass)
+{
+    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+    gobject_class->set_property = gsignond_password_plugin_set_property;
+    gobject_class->get_property = gsignond_password_plugin_get_property;
+
+    g_object_class_override_property (gobject_class, PROP_TYPE, "type");
+    g_object_class_override_property (gobject_class, PROP_MECHANISMS,
+                                      "mechanisms");
+}
+
+ +

+(naturally, plugin's property setter should ignore attempts to set these properties, +and plugin's property getter should provide their values when asked) +

+

+

+
+

The plugin API

+
+

+

+

+Plugins implement authentication sessions which are controlled through the +plugin API. Authentication sessions follow one another so there is only one active +session at a time. +

+

+The plugin API is a set of methods and signals that should be used in a specific +sequence: +

+

+

+
    +
  • successful authentication session begins with gsignond_plugin_request_initial() and ends +with the plugin issuing a "response-final" signal

  • +
  • at any point the application can cancel an active session with +gsignond_plugin_cancel()

  • +
  • at any point the plugin can cancel an active session by issuing "error" +signal, which also provides some details about the cancellation reason.

  • +
  • if a session is active, and the plugin has an intermediate response or needs +additional information, it issues "response" signal, which the +application should respond to with gsignond_plugin_request() method. This can +happen more than once.

  • +
  • if the plugin needs to launch UI interaction with the user, it's issuing +"user-action-required" signal, which the application should +follow up with gsignond_plugin_user_action_finished() method. This can happen +more than once as well.

  • +
  • if, during an active UI session, the application needs a UI refresh +(for example, to fetch a new captcha image), it's +requested from the plugin with gsignond_plugin_refresh() method, followed +by the plugin's response via "refreshed" signal. This can happen +more than once.

  • +
  • changes in plugin state are reported through "status-changed" signal.

  • +
  • if the plugin needs to store information in persistent storage, it issues +"store" signal. Later, that same information is provided as a +parameter to gsignond_plugin_request_initial().

  • +
+

+

+

+

+
+

Example plugins

+
+

+

+

+See example plugin implementation here: + +https://code.google.com/p/accounts-sso/source/browse/?repo=gsignond#git%2Fsrc%2Fplugins. +

+

+For examples of out of tree plugins, you can have a look at SASL or OAuth plugin +implementations: + +http://code.google.com/p/accounts-sso/source/browse?repo=gsignond-plugin-sasl. +

+

+ +http://code.google.com/p/accounts-sso/source/browse?repo=gsignond-plugin-oa. +

+
+
+

Details

+
+

struct GSignondPluginInterface

+
struct GSignondPluginInterface {
+    GTypeInterface parent;
+
+    void (*cancel) (GSignondPlugin *self);
+    void (*request_initial) (GSignondPlugin *self, 
+                     GSignondSessionData *session_data,
+                     GSignondDictionary *identity_method_cache, 
+                     const gchar *mechanism);
+    void (*request) (GSignondPlugin *self, 
+                     GSignondSessionData *session_data);
+    void (*user_action_finished) (GSignondPlugin *self, 
+                                  GSignondSignonuiData *session_data);
+    void (*refresh) (GSignondPlugin *self, 
+                     GSignondSignonuiData *session_data);
+};
+
+

+GSignondPluginInterface interface containing pointers to methods that all +plugin implementations should provide. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

GTypeInterface parent;

parent interface type.

cancel ()

implementation of gsignond_plugin_cancel() +

request_initial ()

implementation of gsignond_plugin_request_initial() +

request ()

implementation of gsignond_plugin_request() +

user_action_finished ()

implementation of gsignond_plugin_user_action_finished() +

refresh ()

implementation of gsignond_plugin_refresh() +
+
+
+
+

enum GSignondPluginState

+
typedef enum {
+    GSIGNOND_PLUGIN_STATE_NONE = 0,
+    GSIGNOND_PLUGIN_STATE_RESOLVING,
+    GSIGNOND_PLUGIN_STATE_CONNECTING,
+    GSIGNOND_PLUGIN_STATE_SENDING_DATA,
+    GSIGNOND_PLUGIN_STATE_WAITING,
+    GSIGNOND_PLUGIN_STATE_USER_PENDING,
+    GSIGNOND_PLUGIN_STATE_REFRESHING,
+    GSIGNOND_PLUGIN_STATE_PROCESS_PENDING,
+    GSIGNOND_PLUGIN_STATE_STARTED,
+    GSIGNOND_PLUGIN_STATE_CANCELING,
+    GSIGNOND_PLUGIN_STATE_DONE,
+    GSIGNOND_PLUGIN_STATE_HOLDING,
+} GSignondPluginState;
+
+

+The plugin provides state updates by emitting "status-changed" +signal with this enum and a string describing what happened. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GSIGNOND_PLUGIN_STATE_NONE

State unknown +

GSIGNOND_PLUGIN_STATE_RESOLVING

Resolving remote server host name +

GSIGNOND_PLUGIN_STATE_CONNECTING

Connecting to remote server +

GSIGNOND_PLUGIN_STATE_SENDING_DATA

Sending data to remote server +

GSIGNOND_PLUGIN_STATE_WAITING

Waiting for reply from remote server +

GSIGNOND_PLUGIN_STATE_USER_PENDING

Waiting for response from user +

GSIGNOND_PLUGIN_STATE_REFRESHING

Refreshing ui request +

GSIGNOND_PLUGIN_STATE_PROCESS_PENDING

Request has been queued +

GSIGNOND_PLUGIN_STATE_STARTED

Request has been dequeued +

GSIGNOND_PLUGIN_STATE_CANCELING

Canceling current process +

GSIGNOND_PLUGIN_STATE_DONE

Process is finished +

GSIGNOND_PLUGIN_STATE_HOLDING

Holding long non-expired token +
+
+
+
+

gsignond_plugin_cancel ()

+
void                gsignond_plugin_cancel              (GSignondPlugin *self);
+

+This method cancels an ongoing authentication session. The plugin implementations +should issue a "error" signal with GSIGNOND_ERROR_SESSION_CANCELED +error, and prepare for a new authentication session. +

+
++ + + + +

self :

plugin instance
+
+
+
+

gsignond_plugin_error ()

+
void                gsignond_plugin_error               (GSignondPlugin *self,
+                                                         GError *error);
+

+Plugin implementations should use this to issue "error" +signal. This method should not be used otherwise. +

+
++ + + + + + + + + + +

self :

plugin instance

error :

the error
+
+
+
+

gsignond_plugin_refresh ()

+
void                gsignond_plugin_refresh             (GSignondPlugin *self,
+                                                         GSignondSignonuiData *ui_data);
+

+This method asks the plugin to refresh the UI. The plugin responds with +"refreshed" signal. +

+
++ + + + + + + + + + +

self :

plugin instance

ui_data :

UI refresh parameters
+
+
+
+

gsignond_plugin_refreshed ()

+
void                gsignond_plugin_refreshed           (GSignondPlugin *self,
+                                                         GSignondSignonuiData *ui_data);
+

+Plugin implementations should use this to issue "refreshed" +signal. This method should not be used otherwise. +

+
++ + + + + + + + + + +

self :

plugin instance

ui_data :

UI data
+
+
+
+

gsignond_plugin_request ()

+
void                gsignond_plugin_request             (GSignondPlugin *self,
+                                                         GSignondSessionData *session_data);
+

+This method provides the plugin with additional parameters for the session +after the plugin has asked for it via "response" signal. +

+
++ + + + + + + + + + +

self :

plugin instance

session_data :

additional parameters for the session
+
+
+
+

gsignond_plugin_request_initial ()

+
void                gsignond_plugin_request_initial     (GSignondPlugin *self,
+                                                         GSignondSessionData *session_data,
+                                                         GSignondDictionary *identity_method_cache,
+                                                         const gchar *mechanism);
+

+This method starts a new authentication session. +

+
++ + + + + + + + + + + + + + + + + + +

self :

plugin instance

session_data :

parameters for the session

identity_method_cache :

data from persistent storage, saved previously via +"store" signal

mechanism :

mechanism to use for the authentication
+
+
+
+

gsignond_plugin_response ()

+
void                gsignond_plugin_response            (GSignondPlugin *self,
+                                                         GSignondSessionData *session_data);
+

+Plugin implementations should use this to issue "response" +signal. This method should not be used otherwise. +

+
++ + + + + + + + + + +

self :

plugin instance

session_data :

session data
+
+
+
+

gsignond_plugin_response_final ()

+
void                gsignond_plugin_response_final      (GSignondPlugin *self,
+                                                         GSignondSessionData *session_data);
+

+Plugin implementations should use this to issue "response-final" +signal. This method should not be used otherwise. +

+
++ + + + + + + + + + +

self :

plugin instance

session_data :

session data
+
+
+
+

gsignond_plugin_status_changed ()

+
void                gsignond_plugin_status_changed      (GSignondPlugin *self,
+                                                         GSignondPluginState state,
+                                                         const gchar *message);
+

+Plugin implementations should use this to issue "status-changed" +signal. This method should not be used otherwise. +

+
++ + + + + + + + + + + + + + +

self :

plugin instance

state :

the new state

message :

the message
+
+
+
+

gsignond_plugin_store ()

+
void                gsignond_plugin_store               (GSignondPlugin *self,
+                                                         GSignondDictionary *identity_method_cache);
+

+Plugin implementations should use this to issue "store" +signal. This method should not be used otherwise. +

+
++ + + + + + + + + + +

self :

plugin instance

identity_method_cache :

data to store
+
+
+
+

gsignond_plugin_user_action_finished ()

+
void                gsignond_plugin_user_action_finished
+                                                        (GSignondPlugin *self,
+                                                         GSignondSignonuiData *ui_data);
+

+This method provides the plugin with the results of UI interaction +after the plugin has asked for it via "user-action-required" signal. +

+
++ + + + + + + + + + +

self :

plugin instance

ui_data :

results of UI interaction
+
+
+
+

gsignond_plugin_user_action_required ()

+
void                gsignond_plugin_user_action_required
+                                                        (GSignondPlugin *self,
+                                                         GSignondSignonuiData *ui_data);
+

+Plugin implementations should use this to issue "user-action-required" +signal. This method should not be used otherwise. +

+
++ + + + + + + + + + +

self :

plugin instance

ui_data :

UI data
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/gsignond-GSignondSecurityContext.html b/docs/html/gsignond-GSignondSecurityContext.html new file mode 100644 index 0000000..3fffcef --- /dev/null +++ b/docs/html/gsignond-GSignondSecurityContext.html @@ -0,0 +1,550 @@ + + + + +GSignondSecurityContext + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSignondSecurityContext

+

GSignondSecurityContext — security context descriptor used in access control checks

+
+
+

Synopsis

+
+#include <gsignond/gsignond-security-context.h>
+
+                    GSignondSecurityContext;
+typedef             GSignondSecurityContextList;
+gboolean            gsignond_security_context_check     (const GSignondSecurityContext *reference,
+                                                         const GSignondSecurityContext *test);
+int                 gsignond_security_context_compare   (const GSignondSecurityContext *ctx1,
+                                                         const GSignondSecurityContext *ctx2);
+GSignondSecurityContext * gsignond_security_context_copy
+                                                        (const GSignondSecurityContext *src_ctx);
+void                gsignond_security_context_free      (GSignondSecurityContext *ctx);
+GSignondSecurityContext * gsignond_security_context_from_variant
+                                                        (GVariant *variant);
+const gchar *       gsignond_security_context_get_application_context
+                                                        (const GSignondSecurityContext *ctx);
+const gchar *       gsignond_security_context_get_system_context
+                                                        (const GSignondSecurityContext *ctx);
+GSignondSecurityContextList * gsignond_security_context_list_copy
+                                                        (const GSignondSecurityContextList *src_list);
+void                gsignond_security_context_list_free (GSignondSecurityContextList *seclist);
+GSignondSecurityContextList * gsignond_security_context_list_from_variant
+                                                        (GVariant *variant);
+GVariant *          gsignond_security_context_list_to_variant
+                                                        (const GSignondSecurityContextList *list);
+gboolean            gsignond_security_context_match     (const GSignondSecurityContext *ctx1,
+                                                         const GSignondSecurityContext *ctx2);
+GSignondSecurityContext * gsignond_security_context_new ();
+GSignondSecurityContext * gsignond_security_context_new_from_values
+                                                        (const gchar *system_context,
+                                                         const gchar *application_context);
+void                gsignond_security_context_set_application_context
+                                                        (GSignondSecurityContext *ctx,
+                                                         const gchar *application_context);
+void                gsignond_security_context_set_system_context
+                                                        (GSignondSecurityContext *ctx,
+                                                         const gchar *system_context);
+GVariant *          gsignond_security_context_to_variant
+                                                        (const GSignondSecurityContext *ctx);
+
+
+
+

Description

+

+Security context is a string tuple of system context and application context. +

+

+System context can be a binary path, SMACK-label, or MSSF token. +

+

+Application context identifies a script or a webpage within an application, +and it's used for providing access control to runtime environments (when making an access +control decision requires not only a binary identifier, but also information +about what the binary is doing). +

+

+When an application is trying to access the gSSO service, the system context +is determined by a specific GSignondAccessControlManager instance using +system services of a specific platform. Application context is set by the +application itself. Then both contexts are used by GSignondAccessControlManager +to perform an access control check. +

+
+
+

Details

+
+

GSignondSecurityContext

+
typedef struct {
+    gchar *sys_ctx;
+    gchar *app_ctx;
+} GSignondSecurityContext;
+
+

+Security context descriptor used for access control checks. System context +and application context can contain a wildcard match "*" which has special +meaning in gsignond_security_context_match() and +gsignond_security_context_check(). +

+
++ + + + + + + + + + +

gchar *sys_ctx;

system context

gchar *app_ctx;

application context
+
+
+
+

GSignondSecurityContextList

+
typedef GList GSignondSecurityContextList;
+
+

+GList of GSignondSecurityContext items. +

+
+
+
+

gsignond_security_context_check ()

+
gboolean            gsignond_security_context_check     (const GSignondSecurityContext *reference,
+                                                         const GSignondSecurityContext *test);
+

+Check if test is covered by reference. +

+
++ + + + + + + + + + + + + + +

reference :

reference security context item to check against.

test :

security context item to be checked.

Returns :

TRUE if contexts are equal or the reference has a wildcard +system context, or if system contexts are equal and reference has a wildcard +application context, otherwise FALSE. If either or both contexts are NULL, +FALSE is returned.
+
+
+
+

gsignond_security_context_compare ()

+
int                 gsignond_security_context_compare   (const GSignondSecurityContext *ctx1,
+                                                         const GSignondSecurityContext *ctx2);
+

+Compare two GSignondSecurityContext items in a similar way to strcmp(). +

+
++ + + + + + + + + + + + + + +

ctx1 :

first item to compare.

ctx2 :

second item to compare.

Returns :

negative if ctx1 < ctx2, 0 if ctx1 == ctx2 and positive if ctx1 > ctx2.
+
+
+
+

gsignond_security_context_copy ()

+
GSignondSecurityContext * gsignond_security_context_copy
+                                                        (const GSignondSecurityContext *src_ctx);
+

+Copies a security context item. +

+
++ + + + + + + + + + +

src_ctx :

source security context to copy.

Returns :

a copy of the GSignondSecurityContext item. [transfer full] +
+
+
+
+

gsignond_security_context_free ()

+
void                gsignond_security_context_free      (GSignondSecurityContext *ctx);
+

+Frees a security context item. +

+
++ + + + +

ctx :

+GSignondSecurityContext to be freed.
+
+
+
+

gsignond_security_context_from_variant ()

+
GSignondSecurityContext * gsignond_security_context_from_variant
+                                                        (GVariant *variant);
+

+Builds a GSignondSecurityContext item from a GVariant of type "(ss)". +

+
++ + + + + + + + + + +

variant :

GVariant item with a GSignondSecurityContext construct.

Returns :

+GSignondSecurityContext item. [transfer full] +
+
+
+
+

gsignond_security_context_get_application_context ()

+
const gchar *       gsignond_security_context_get_application_context
+                                                        (const GSignondSecurityContext *ctx);
+

+Get the application context part of +the GSignondSecurityContext. +

+
++ + + + + + + + + + +

ctx :

+GSignondSecurityContext item.

Returns :

application context. [transfer none] +
+
+
+
+

gsignond_security_context_get_system_context ()

+
const gchar *       gsignond_security_context_get_system_context
+                                                        (const GSignondSecurityContext *ctx);
+

+Get the system context partof the +GSignondSecurityContext. +

+
++ + + + + + + + + + +

ctx :

+GSignondSecurityContext item.

Returns :

system context. [transfer none] +
+
+
+
+

gsignond_security_context_list_copy ()

+
GSignondSecurityContextList * gsignond_security_context_list_copy
+                                                        (const GSignondSecurityContextList *src_list);
+

+Copies a GList of GSignondSecurityContext items. +

+
++ + + + + + + + + + +

src_list :

source GSignondSecurityContextList.

Returns :

+GSignondSecurityContextList item. [transfer full] +
+
+
+
+

gsignond_security_context_list_free ()

+
void                gsignond_security_context_list_free (GSignondSecurityContextList *seclist);
+

+Frees all items and the GList of GSignondSecurityContext. +

+
++ + + + +

seclist :

+GSignondSecurityContextList item. [transfer full] +
+
+
+
+

gsignond_security_context_list_from_variant ()

+
GSignondSecurityContextList * gsignond_security_context_list_from_variant
+                                                        (GVariant *variant);
+

+Builds a GList of GSignondSecurityContext items from a GVariant of type +"a(ss)". +

+
++ + + + + + + + + + +

variant :

GVariant item with a list of security context tuples.

Returns :

+GSignondSecurityContextList item. [transfer full] +
+
+
+
+

gsignond_security_context_list_to_variant ()

+
GVariant *          gsignond_security_context_list_to_variant
+                                                        (const GSignondSecurityContextList *list);
+

+Builds a GVariant of type "a(ss)" from a GList of GSignondSecurityContext +items. +

+
++ + + + + + + + + + +

list :

+GSignondSecurityContextList item.

Returns :

GVariant construct of a GSignondSecurityContextList. [transfer full] +
+
+
+
+

gsignond_security_context_match ()

+
gboolean            gsignond_security_context_match     (const GSignondSecurityContext *ctx1,
+                                                         const GSignondSecurityContext *ctx2);
+

+Compare two GSignondSecurityContext items match. +

+
++ + + + + + + + + + + + + + +

ctx1 :

first item to compare.

ctx2 :

second item to compare.

Returns :

TRUE if contexts are equal or if either side has a wildcard match for +system context, or if system contexts are equal and either side has a wildcard +match for the app context, +otherwise FALSE. Two NULL contexts match.
+
+
+
+

gsignond_security_context_new ()

+
GSignondSecurityContext * gsignond_security_context_new ();
+

+Allocates a new security context item. System and app context are empty strings. +

+
++ + + + +

Returns :

allocated GSignondSecurityContext. [transfer full] +
+
+
+
+

gsignond_security_context_new_from_values ()

+
GSignondSecurityContext * gsignond_security_context_new_from_values
+                                                        (const gchar *system_context,
+                                                         const gchar *application_context);
+

+Allocates and initializes a new security context item. +

+
++ + + + + + + + + + + + + + +

system_context :

system security context

application_context :

application security context

Returns :

allocated GSignondSecurityContext. [transfer full] +
+
+
+
+

gsignond_security_context_set_application_context ()

+
void                gsignond_security_context_set_application_context
+                                                        (GSignondSecurityContext *ctx,
+                                                         const gchar *application_context);
+

+Sets the application context part of +the GSignondSecurityContext. +

+
++ + + + + + + + + + +

ctx :

+GSignondSecurityContext item.

application_context :

application security context.
+
+
+
+

gsignond_security_context_set_system_context ()

+
void                gsignond_security_context_set_system_context
+                                                        (GSignondSecurityContext *ctx,
+                                                         const gchar *system_context);
+

+Sets the system context part of the +GSignondSecurityContext. +

+
++ + + + + + + + + + +

ctx :

+GSignondSecurityContext item.

system_context :

system security context.
+
+
+
+

gsignond_security_context_to_variant ()

+
GVariant *          gsignond_security_context_to_variant
+                                                        (const GSignondSecurityContext *ctx);
+

+Build a GVariant of type "(ss)" from a GSignondSecurityContext item. +

+
++ + + + + + + + + + +

ctx :

+GSignondSecurityContext item.

Returns :

GVariant construct of a GSignondSecurityContext. [transfer full] +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/gsignond-GSignondSessionData.html b/docs/html/gsignond-GSignondSessionData.html new file mode 100644 index 0000000..5682ef3 --- /dev/null +++ b/docs/html/gsignond-GSignondSessionData.html @@ -0,0 +1,582 @@ + + + + +GSignondSessionData + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSignondSessionData

+

GSignondSessionData — definitions for authentication session parameters

+
+
+

Synopsis

+
+#include <gsignond/gsignond-session-data.h>
+
+typedef             GSignondSessionData;
+enum                GSignondUiPolicy;
+const gchar *       gsignond_session_data_get_caption   (GSignondSessionData *data);
+const gchar *       gsignond_session_data_get_network_proxy
+                                                        (GSignondSessionData *data);
+gboolean            gsignond_session_data_get_network_timeout
+                                                        (GSignondSessionData *data,
+                                                         guint32 *network_timeout);
+const gchar *       gsignond_session_data_get_realm     (GSignondSessionData *data);
+gboolean            gsignond_session_data_get_renew_token
+                                                        (GSignondSessionData *data,
+                                                         gboolean *renew_token);
+const gchar *       gsignond_session_data_get_secret    (GSignondSessionData *data);
+gboolean            gsignond_session_data_get_ui_policy (GSignondSessionData *data,
+                                                         GSignondUiPolicy *ui_policy);
+const gchar *       gsignond_session_data_get_username  (GSignondSessionData *data);
+gboolean            gsignond_session_data_get_window_id (GSignondSessionData *data,
+                                                         guint32 *window_id);
+void                gsignond_session_data_set_caption   (GSignondSessionData *data,
+                                                         const gchar *caption);
+void                gsignond_session_data_set_network_proxy
+                                                        (GSignondSessionData *data,
+                                                         const gchar *network_proxy);
+void                gsignond_session_data_set_network_timeout
+                                                        (GSignondSessionData *data,
+                                                         guint32 network_timeout);
+void                gsignond_session_data_set_realm     (GSignondSessionData *data,
+                                                         const gchar *realm);
+void                gsignond_session_data_set_renew_token
+                                                        (GSignondSessionData *data,
+                                                         gboolean renew_token);
+void                gsignond_session_data_set_secret    (GSignondSessionData *data,
+                                                         const gchar *secret);
+void                gsignond_session_data_set_ui_policy (GSignondSessionData *data,
+                                                         GSignondUiPolicy ui_policy);
+void                gsignond_session_data_set_username  (GSignondSessionData *data,
+                                                         const gchar *username);
+void                gsignond_session_data_set_window_id (GSignondSessionData *data,
+                                                         guint32 window_id);
+
+
+
+

Description

+

+This file provides commonly used parameters for authentication sessions. +For each of those a getter and setter is defined, on GSignondSessionData +container. The plugins may not use all of these parameters, and they commonly +require additional, custom parameters which are set using GSignondDictionary +setters with explicit key string. +

+
+
+

Details

+
+

GSignondSessionData

+
typedef GSignondDictionary GSignondSessionData;
+
+

+GSignondSessionData is simply a typedef for GSignondDictionary, which +means the developers may also freely use methods associated with that structure, +in particular for creating a GSignondSessionData object with +gsignond_dictionary_new(). +

+
+
+
+

enum GSignondUiPolicy

+
typedef enum {
+    GSIGNOND_UI_POLICY_DEFAULT = 0,
+    GSIGNOND_UI_POLICY_REQUEST_PASSWORD,
+    GSIGNOND_UI_POLICY_NO_USER_INTERACTION,
+    GSIGNOND_UI_POLICY_VALIDATION
+} GSignondUiPolicy;
+
+

+Policy setting to define how plugins should handle interaction with the user. +

+
++ + + + + + + + + + + + + + + + + + +

GSIGNOND_UI_POLICY_DEFAULT

use a default user interaction scenario +

GSIGNOND_UI_POLICY_REQUEST_PASSWORD

force an authorization request from the user; +any cached access tokens should be discarded by the plugin. +

GSIGNOND_UI_POLICY_NO_USER_INTERACTION

force no interaction with the user +

GSIGNOND_UI_POLICY_VALIDATION

interaction with the user is only allowed +for validation captchas and similar security measures +
+
+
+
+

gsignond_session_data_get_caption ()

+
const gchar *       gsignond_session_data_get_caption   (GSignondSessionData *data);
+

+A getter for a caption associated with the authentication session. +Caption tells the user which application/credentials/provider is requestion +authentication. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_session_data_get_network_proxy ()

+
const gchar *       gsignond_session_data_get_network_proxy
+                                                        (GSignondSessionData *data);
+

+A getter for a network proxy setting associated with the authentication session. +If this property is not set, the default system proxy settings should be used. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_session_data_get_network_timeout ()

+
gboolean            gsignond_session_data_get_network_timeout
+                                                        (GSignondSessionData *data,
+                                                         guint32 *network_timeout);
+

+A getter for a network timeout setting associated with the authentication session. +This can be used to change the default timeout in case of unresponsive servers. +

+
++ + + + + + + + + + + + + + +

data :

a GSignondDictionary structure

network_timeout :

the value for the parameter is written here

Returns :

whether the key-value pair exists in the data dictionary or not.
+
+
+
+

gsignond_session_data_get_realm ()

+
const gchar *       gsignond_session_data_get_realm     (GSignondSessionData *data);
+

+A getter for a realm associated with the authentication session. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_session_data_get_renew_token ()

+
gboolean            gsignond_session_data_get_renew_token
+                                                        (GSignondSessionData *data,
+                                                         gboolean *renew_token);
+

+A getter for a renew token property associated with the authentication session. +This property tells the plugin to discard any cached tokens and start +the authentication process anew. +

+
++ + + + + + + + + + + + + + +

data :

a GSignondDictionary structure

renew_token :

the value for the parameter is written here

Returns :

whether the key-value pair exists in the data dictionary or not.
+
+
+
+

gsignond_session_data_get_secret ()

+
const gchar *       gsignond_session_data_get_secret    (GSignondSessionData *data);
+

+A getter for a secret (e.g. a password) associated with the authentication session. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_session_data_get_ui_policy ()

+
gboolean            gsignond_session_data_get_ui_policy (GSignondSessionData *data,
+                                                         GSignondUiPolicy *ui_policy);
+

+A getter for UI policy setting associated with the authentication session. +The UI policy indicates how the authentication plugin should interact with the user. +

+
++ + + + + + + + + + + + + + +

data :

a GSignondDictionary structure

ui_policy :

the value for the parameter is written here

Returns :

whether the key-value pair exists in the data dictionary or not.
+
+
+
+

gsignond_session_data_get_username ()

+
const gchar *       gsignond_session_data_get_username  (GSignondSessionData *data);
+

+A getter for a username associated with the authentication session. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_session_data_get_window_id ()

+
gboolean            gsignond_session_data_get_window_id (GSignondSessionData *data,
+                                                         guint32 *window_id);
+

+A getter for a window id setting associated with the authentication session. +This can be used to embed the user interaction window produced by the authentication +session into an application window. +

+
++ + + + + + + + + + + + + + +

data :

a GSignondDictionary structure

window_id :

the value for the parameter is written here

Returns :

whether the key-value pair exists in the data dictionary or not.
+
+
+
+

gsignond_session_data_set_caption ()

+
void                gsignond_session_data_set_caption   (GSignondSessionData *data,
+                                                         const gchar *caption);
+

+A setter for a caption associated with the authentication session. +Caption tells the user which application/credentials/provider is requestion +authentication. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

caption :

a caption to set
+
+
+
+

gsignond_session_data_set_network_proxy ()

+
void                gsignond_session_data_set_network_proxy
+                                                        (GSignondSessionData *data,
+                                                         const gchar *network_proxy);
+

+A setter for a network proxy setting associated with the authentication session. +If this property is not set, the default system proxy settings should be used. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

network_proxy :

network proxy to use
+
+
+
+

gsignond_session_data_set_network_timeout ()

+
void                gsignond_session_data_set_network_timeout
+                                                        (GSignondSessionData *data,
+                                                         guint32 network_timeout);
+

+A setter for a network timeout setting associated with the authentication session. +This can be used to change the default timeout in case of unresponsive servers. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

network_timeout :

network timeout to use
+
+
+
+

gsignond_session_data_set_realm ()

+
void                gsignond_session_data_set_realm     (GSignondSessionData *data,
+                                                         const gchar *realm);
+

+A setter for a realm associated with the authentication session. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

realm :

a realm to set
+
+
+
+

gsignond_session_data_set_renew_token ()

+
void                gsignond_session_data_set_renew_token
+                                                        (GSignondSessionData *data,
+                                                         gboolean renew_token);
+

+A setter for a renew token property associated with the authentication session. +This property tells the plugin to discard any cached tokens and start +the authentication process anew. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

renew_token :

whether to renew the token set
+
+
+
+

gsignond_session_data_set_secret ()

+
void                gsignond_session_data_set_secret    (GSignondSessionData *data,
+                                                         const gchar *secret);
+

+A setter for a secret (e.g. a password) associated with the authentication session. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

secret :

a secret to set
+
+
+
+

gsignond_session_data_set_ui_policy ()

+
void                gsignond_session_data_set_ui_policy (GSignondSessionData *data,
+                                                         GSignondUiPolicy ui_policy);
+

+A getter for UI policy setting associated with the authentication session. +The UI policy indicates how the authentication plugin should interact with the user. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

ui_policy :

ui policy to set
+
+
+
+

gsignond_session_data_set_username ()

+
void                gsignond_session_data_set_username  (GSignondSessionData *data,
+                                                         const gchar *username);
+

+A setter for a username associated with the authentication session. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

username :

username to set
+
+
+
+

gsignond_session_data_set_window_id ()

+
void                gsignond_session_data_set_window_id (GSignondSessionData *data,
+                                                         guint32 window_id);
+

+A setter for a window id setting associated with the authentication session. +This can be used to embed the user interaction window produced by the authentication +session into an application window. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

window_id :

window id to use
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/gsignond-GSignondSignonuiData.html b/docs/html/gsignond-GSignondSignonuiData.html new file mode 100644 index 0000000..75053f5 --- /dev/null +++ b/docs/html/gsignond-GSignondSignonuiData.html @@ -0,0 +1,1160 @@ + + + + +GSignondSignonuiData + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSignondSignonuiData

+

GSignondSignonuiData — definitions for user interaction parameters

+
+
+

Synopsis

+
+#include <gsignond/gsignond-signonui-data.h>
+
+typedef             GSignondSignonuiData;
+enum                GSignondSignonuiError;
+const gchar *       gsignond_signonui_data_get_captcha_response
+                                                        (GSignondSignonuiData *data);
+const gchar *       gsignond_signonui_data_get_captcha_url
+                                                        (GSignondSignonuiData *data);
+const gchar *       gsignond_signonui_data_get_caption  (GSignondSignonuiData *data);
+gboolean            gsignond_signonui_data_get_confirm  (GSignondSignonuiData *data,
+                                                         gboolean *confirm);
+const gchar *       gsignond_signonui_data_get_final_url
+                                                        (GSignondSignonuiData *data);
+const gchar *       gsignond_signonui_data_get_forgot_password
+                                                        (GSignondSignonuiData *data);
+const gchar *       gsignond_signonui_data_get_forgot_password_url
+                                                        (GSignondSignonuiData *data);
+const gchar *       gsignond_signonui_data_get_message  (GSignondSignonuiData *data);
+const gchar *       gsignond_signonui_data_get_open_url (GSignondSignonuiData *data);
+const gchar *       gsignond_signonui_data_get_password (GSignondSignonuiData *data);
+gboolean            gsignond_signonui_data_get_query_error
+                                                        (GSignondSignonuiData *data,
+                                                         GSignondSignonuiError *error);
+gboolean            gsignond_signonui_data_get_query_password
+                                                        (GSignondSignonuiData *data,
+                                                         gboolean *query_password);
+gboolean            gsignond_signonui_data_get_query_username
+                                                        (GSignondSignonuiData *data,
+                                                         gboolean *query_username);
+gboolean            gsignond_signonui_data_get_remember_password
+                                                        (GSignondSignonuiData *data,
+                                                         gboolean *remember_password);
+const gchar *       gsignond_signonui_data_get_request_id
+                                                        (GSignondSignonuiData *data);
+const gchar *       gsignond_signonui_data_get_test_reply
+                                                        (GSignondSignonuiData *data);
+const gchar *       gsignond_signonui_data_get_title    (GSignondSignonuiData *data);
+const gchar *       gsignond_signonui_data_get_url_response
+                                                        (GSignondSignonuiData *data);
+const gchar *       gsignond_signonui_data_get_username (GSignondSignonuiData *data);
+void                gsignond_signonui_data_set_captcha_response
+                                                        (GSignondSignonuiData *data,
+                                                         const gchar *response);
+void                gsignond_signonui_data_set_captcha_url
+                                                        (GSignondSignonuiData *data,
+                                                         const gchar *url);
+void                gsignond_signonui_data_set_caption  (GSignondSignonuiData *data,
+                                                         const gchar *caption);
+void                gsignond_signonui_data_set_confirm  (GSignondSignonuiData *data,
+                                                         gboolean confirm);
+void                gsignond_signonui_data_set_final_url
+                                                        (GSignondSignonuiData *data,
+                                                         const gchar *url);
+void                gsignond_signonui_data_set_forgot_password
+                                                        (GSignondSignonuiData *data,
+                                                         const gchar *forgot);
+void                gsignond_signonui_data_set_forgot_password_url
+                                                        (GSignondSignonuiData *data,
+                                                         const gchar *url);
+void                gsignond_signonui_data_set_message  (GSignondSignonuiData *data,
+                                                         const gchar *message);
+void                gsignond_signonui_data_set_open_url (GSignondSignonuiData *data,
+                                                         const gchar *url);
+void                gsignond_signonui_data_set_password (GSignondSignonuiData *data,
+                                                         const gchar *password);
+void                gsignond_signonui_data_set_query_error
+                                                        (GSignondSignonuiData *data,
+                                                         GSignondSignonuiError error);
+void                gsignond_signonui_data_set_query_password
+                                                        (GSignondSignonuiData *data,
+                                                         gboolean query);
+void                gsignond_signonui_data_set_query_username
+                                                        (GSignondSignonuiData *data,
+                                                         gboolean query);
+void                gsignond_signonui_data_set_remember_password
+                                                        (GSignondSignonuiData *data,
+                                                         gboolean remember);
+void                gsignond_signonui_data_set_request_id
+                                                        (GSignondSignonuiData *data,
+                                                         const gchar *id);
+void                gsignond_signonui_data_set_test_reply
+                                                        (GSignondSignonuiData *data,
+                                                         const gchar *reply);
+void                gsignond_signonui_data_set_title    (GSignondSignonuiData *data,
+                                                         const gchar *title);
+void                gsignond_signonui_data_set_url_response
+                                                        (GSignondSignonuiData *data,
+                                                         const gchar *response);
+void                gsignond_signonui_data_set_username (GSignondSignonuiData *data,
+                                                         const gchar *username);
+
+
+
+

Description

+

+This file provides commonly used parameters for user interaction during +authentication sessions. +For each of those a getter and setter is defined, on GSignondSessionData +container. +

+

+This container is used in two directions: by plugins to specify the parameters +for user interaction that is then performed by SignonUI component, and by SignonUI +to return the results of that interaction to the plugins. See GSignondPlugin +for the user interaction API from the plugins' perspective. +

+

+The parameters that are set by the plugin and read by signon UI are captcha url, +caption, confirm, final url, forgot password, forgot password url, message, +open url, password, query password, query username, remember +password, request id, test reply values, title, username. +

+

+The parameters that are returned by signon UI to the plugin are captcha response, +password, query error code, remember password, url response. +

+
+
+

Details

+
+

GSignondSignonuiData

+
typedef GSignondDictionary GSignondSignonuiData;
+
+

+GSignondSignonuiData is simply a typedef for GSignondDictionary, which +means the developers may also freely use methods associated with that structure, +in particular for creating a GSignondSignonuiData object with +gsignond_dictionary_new(). +

+
+
+
+

enum GSignondSignonuiError

+
typedef enum {
+    SIGNONUI_ERROR_NONE = 0, 
+    SIGNONUI_ERROR_GENERAL,
+    SIGNONUI_ERROR_NO_SIGNONUI,
+    SIGNONUI_ERROR_BAD_PARAMETERS,
+    SIGNONUI_ERROR_CANCELED,
+    SIGNONUI_ERROR_NOT_AVAILABLE, 
+    SIGNONUI_ERROR_BAD_URL, 
+    SIGNONUI_ERROR_BAD_CAPTCHA,
+    SIGNONUI_ERROR_BAD_CAPTCHA_URL,
+    SIGNONUI_ERROR_REFRESH_FAILED, 
+    SIGNONUI_ERROR_FORBIDDEN,
+    SIGNONUI_ERROR_FORGOT_PASSWORD
+} GSignondSignonuiError;
+
+

+This enum defines errors that may happen during user interaction. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

SIGNONUI_ERROR_NONE

No errors +

SIGNONUI_ERROR_GENERAL

Generic error during interaction +

SIGNONUI_ERROR_NO_SIGNONUI

Cannot send request to signon-ui +

SIGNONUI_ERROR_BAD_PARAMETERS

Signon-Ui cannot create dialog based on the given UiSessionData +

SIGNONUI_ERROR_CANCELED

User canceled action. Plugin should not retry automatically after this +

SIGNONUI_ERROR_NOT_AVAILABLE

Requested ui is not available. For example browser cannot be started +

SIGNONUI_ERROR_BAD_URL

Given url was not valid +

SIGNONUI_ERROR_BAD_CAPTCHA

Given captcha image was not valid +

SIGNONUI_ERROR_BAD_CAPTCHA_URL

Given url for capctha loading was not valid +

SIGNONUI_ERROR_REFRESH_FAILED

Refresh failed +

SIGNONUI_ERROR_FORBIDDEN

Showing ui forbidden by ui policy +

SIGNONUI_ERROR_FORGOT_PASSWORD

User pressed forgot password +
+
+
+
+

gsignond_signonui_data_get_captcha_response ()

+
const gchar *       gsignond_signonui_data_get_captcha_response
+                                                        (GSignondSignonuiData *data);
+

+A getter for the user's response to a captcha query. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

the string entered by the user in response to a captcha query. [transfer none] +
+
+
+
+

gsignond_signonui_data_get_captcha_url ()

+
const gchar *       gsignond_signonui_data_get_captcha_url
+                                                        (GSignondSignonuiData *data);
+

+A getter for the captcha URL. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

the URL to the captcha image to be verified by user. [transfer none] +
+
+
+
+

gsignond_signonui_data_get_caption ()

+
const gchar *       gsignond_signonui_data_get_caption  (GSignondSignonuiData *data);
+

+A getter for the caption string. Caption tells the user which +application/credentials/provider is requestion authentication. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_signonui_data_get_confirm ()

+
gboolean            gsignond_signonui_data_get_confirm  (GSignondSignonuiData *data,
+                                                         gboolean *confirm);
+

+A getter for the confirm mode. In confirm mode the user is asked to enter +an old password (which is compared to the supplied password), and a new password twice +(which is returned). +

+
++ + + + + + + + + + + + + + +

data :

a GSignondDictionary structure

confirm :

the value for the property is written here

Returns :

whether this property exists in the data dictionary or not.
+
+
+
+

gsignond_signonui_data_get_final_url ()

+
const gchar *       gsignond_signonui_data_get_final_url
+                                                        (GSignondSignonuiData *data);
+

+A getter for the final URL. When the signon UI detects that the user is at +the final URL (possibly with additional query or fragment parameters), it +will close the window and return the full URL via url response property. +This is used by redirection-based authentication, such as OAuth. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_signonui_data_get_forgot_password ()

+
const gchar *       gsignond_signonui_data_get_forgot_password
+                                                        (GSignondSignonuiData *data);
+

+A getter for the forgot password string which is shown to the user as a link to +reset the password or remind him of the password. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_signonui_data_get_forgot_password_url ()

+
const gchar *       gsignond_signonui_data_get_forgot_password_url
+                                                        (GSignondSignonuiData *data);
+

+A getter for the forgot password URL, where the user can reset or request a +reminder of the password. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_signonui_data_get_message ()

+
const gchar *       gsignond_signonui_data_get_message  (GSignondSignonuiData *data);
+

+A getter for the message which is show to the user in the signon UI dialog. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_signonui_data_get_open_url ()

+
const gchar *       gsignond_signonui_data_get_open_url (GSignondSignonuiData *data);
+

+A getter for the URL that should be opened by signon UI. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_signonui_data_get_password ()

+
const gchar *       gsignond_signonui_data_get_password (GSignondSignonuiData *data);
+

+A getter for the password string. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_signonui_data_get_query_error ()

+
gboolean            gsignond_signonui_data_get_query_error
+                                                        (GSignondSignonuiData *data,
+                                                         GSignondSignonuiError *error);
+

+A getter for the UI interaction error. Signon UI sets this to SIGNONUI_ERROR_NONE if +there were no errors. +

+
++ + + + + + + + + + + + + + +

data :

a GSignondDictionary structure

error :

the error is written here

Returns :

whether this property exists in the data dictionary or not.
+
+
+
+

gsignond_signonui_data_get_query_password ()

+
gboolean            gsignond_signonui_data_get_query_password
+                                                        (GSignondSignonuiData *data,
+                                                         gboolean *query_password);
+

+A getter for the query password property. It indicates whether the signon UI +should ask the user for a password (and return it in the password property). +

+
++ + + + + + + + + + + + + + +

data :

a GSignondDictionary structure

query_password :

the property is written here

Returns :

whether this property exists in the data dictionary or not.
+
+
+
+

gsignond_signonui_data_get_query_username ()

+
gboolean            gsignond_signonui_data_get_query_username
+                                                        (GSignondSignonuiData *data,
+                                                         gboolean *query_username);
+

+A getter for the query username property. It indicates whether the signon UI +should ask the user for a username (and return it in the username property). +

+
++ + + + + + + + + + + + + + +

data :

a GSignondDictionary structure

query_username :

the property is written here

Returns :

whether this property exists in the data dictionary or not.
+
+
+
+

gsignond_signonui_data_get_remember_password ()

+
gboolean            gsignond_signonui_data_get_remember_password
+                                                        (GSignondSignonuiData *data,
+                                                         gboolean *remember_password);
+

+A getter for whether the password should be remembered. +

+
++ + + + + + + + + + + + + + +

data :

a GSignondDictionary structure

remember_password :

the property is written here

Returns :

whether this property exists in the data dictionary or not.
+
+
+
+

gsignond_signonui_data_get_request_id ()

+
const gchar *       gsignond_signonui_data_get_request_id
+                                                        (GSignondSignonuiData *data);
+

+A getter for the dialog request id. The id identifies the dialog so that it +can be refreshed or updated. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_signonui_data_get_test_reply ()

+
const gchar *       gsignond_signonui_data_get_test_reply
+                                                        (GSignondSignonuiData *data);
+

+A getter for the test reply values. It's used only by the signon ui +implementations to test themselves. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_signonui_data_get_title ()

+
const gchar *       gsignond_signonui_data_get_title    (GSignondSignonuiData *data);
+

+A getter for the UI dialog title. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_signonui_data_get_url_response ()

+
const gchar *       gsignond_signonui_data_get_url_response
+                                                        (GSignondSignonuiData *data);
+

+A getter for the response URL. If the final URL was set in the request to the signon UI, and the signon UI +detects that it has been reached, then the full final URL is returned using +this property. This is used by redirection-based authentication such as OAauth. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_signonui_data_get_username ()

+
const gchar *       gsignond_signonui_data_get_username (GSignondSignonuiData *data);
+

+A getter for the username string. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

Returns :

(transfer none)
+
+
+
+

gsignond_signonui_data_set_captcha_response ()

+
void                gsignond_signonui_data_set_captcha_response
+                                                        (GSignondSignonuiData *data,
+                                                         const gchar *response);
+

+A setter for the user's response to a captcha query. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

response :

the string entered by the user in response to a captcha query.
+
+
+
+

gsignond_signonui_data_set_captcha_url ()

+
void                gsignond_signonui_data_set_captcha_url
+                                                        (GSignondSignonuiData *data,
+                                                         const gchar *url);
+

+A setter for the captcha URL. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

url :

the URL to the captcha image to be verified by user
+
+
+
+

gsignond_signonui_data_set_caption ()

+
void                gsignond_signonui_data_set_caption  (GSignondSignonuiData *data,
+                                                         const gchar *caption);
+

+A setter for the caption string. Caption tells the user which +application/credentials/provider is requestion authentication. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

caption :

the caption string
+
+
+
+

gsignond_signonui_data_set_confirm ()

+
void                gsignond_signonui_data_set_confirm  (GSignondSignonuiData *data,
+                                                         gboolean confirm);
+

+A setter for the confirm mode. In confirm mode the user is asked to enter +an old password (which is compared to the supplied password), and a new password twice +(which is returned). +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

confirm :

the value for the property
+
+
+
+

gsignond_signonui_data_set_final_url ()

+
void                gsignond_signonui_data_set_final_url
+                                                        (GSignondSignonuiData *data,
+                                                         const gchar *url);
+

+A setter for the final URL. When the signon UI detects that the user is at +the final URL (possibly with additional query or fragment parameters), it +will close the window and return the full URL via url response property. +This is used by redirection-based authentication, such as OAuth. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

url :

the final url
+
+
+
+

gsignond_signonui_data_set_forgot_password ()

+
void                gsignond_signonui_data_set_forgot_password
+                                                        (GSignondSignonuiData *data,
+                                                         const gchar *forgot);
+

+A setter for the forgot password string, which is shown to the user as a link to +reset the password or remind him of the password. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

forgot :

the forgot password string
+
+
+
+

gsignond_signonui_data_set_forgot_password_url ()

+
void                gsignond_signonui_data_set_forgot_password_url
+                                                        (GSignondSignonuiData *data,
+                                                         const gchar *url);
+

+A setter for the forgot password URL, where the user can reset or request a +reminder of the password. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

url :

the forgot password URL
+
+
+
+

gsignond_signonui_data_set_message ()

+
void                gsignond_signonui_data_set_message  (GSignondSignonuiData *data,
+                                                         const gchar *message);
+

+A setter for the message which is show to the user in the signon UI dialog. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

message :

the message
+
+
+
+

gsignond_signonui_data_set_open_url ()

+
void                gsignond_signonui_data_set_open_url (GSignondSignonuiData *data,
+                                                         const gchar *url);
+

+A setter for the URL that should be opened by signon UI. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

url :

the url to open
+
+
+
+

gsignond_signonui_data_set_password ()

+
void                gsignond_signonui_data_set_password (GSignondSignonuiData *data,
+                                                         const gchar *password);
+

+A setter for the password string. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

password :

the password string
+
+
+
+

gsignond_signonui_data_set_query_error ()

+
void                gsignond_signonui_data_set_query_error
+                                                        (GSignondSignonuiData *data,
+                                                         GSignondSignonuiError error);
+

+A setter for the UI interaction error. Signon UI sets this to SIGNONUI_ERROR_NONE if +there were no errors. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

error :

the error
+
+
+
+

gsignond_signonui_data_set_query_password ()

+
void                gsignond_signonui_data_set_query_password
+                                                        (GSignondSignonuiData *data,
+                                                         gboolean query);
+

+A setter for the query password property. It indicates whether the signon UI +should ask the user for a password (and return it in the password property). +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

query :

the property value
+
+
+
+

gsignond_signonui_data_set_query_username ()

+
void                gsignond_signonui_data_set_query_username
+                                                        (GSignondSignonuiData *data,
+                                                         gboolean query);
+

+A setter for the query username property. It indicates whether the signon UI +should ask the user for a username (and return it in the username property). +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

query :

the property value
+
+
+
+

gsignond_signonui_data_set_remember_password ()

+
void                gsignond_signonui_data_set_remember_password
+                                                        (GSignondSignonuiData *data,
+                                                         gboolean remember);
+

+A setter for whether the password should be remembered. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

remember :

the property value
+
+
+
+

gsignond_signonui_data_set_request_id ()

+
void                gsignond_signonui_data_set_request_id
+                                                        (GSignondSignonuiData *data,
+                                                         const gchar *id);
+

+A setter for the dialog request id. The id identifies the dialog so that it +can be refreshed or updated. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

id :

request id
+
+
+
+

gsignond_signonui_data_set_test_reply ()

+
void                gsignond_signonui_data_set_test_reply
+                                                        (GSignondSignonuiData *data,
+                                                         const gchar *reply);
+

+A setter for the test reply values. It's used only by the signon ui +implementations to test themselves. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

reply :

test reply values
+
+
+
+

gsignond_signonui_data_set_title ()

+
void                gsignond_signonui_data_set_title    (GSignondSignonuiData *data,
+                                                         const gchar *title);
+

+A setter for the UI dialog title. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

title :

the title
+
+
+
+

gsignond_signonui_data_set_url_response ()

+
void                gsignond_signonui_data_set_url_response
+                                                        (GSignondSignonuiData *data,
+                                                         const gchar *response);
+

+A getter for the response URL. If the final URL was set in the request to the +signon UI, and the signon UI +detects that it has been reached, then the full final URL is returned using +this property. This is used by redirection-based authentication such as OAauth. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

response :

the response URL
+
+
+
+

gsignond_signonui_data_set_username ()

+
void                gsignond_signonui_data_set_username (GSignondSignonuiData *data,
+                                                         const gchar *username);
+

+A setter for the username string. +

+
++ + + + + + + + + + +

data :

a GSignondDictionary structure

username :

the username string
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/gsignond-General-configuration.html b/docs/html/gsignond-General-configuration.html new file mode 100644 index 0000000..90875dd --- /dev/null +++ b/docs/html/gsignond-General-configuration.html @@ -0,0 +1,161 @@ + + + + +General configuration + + + + + + + + + + + + + + + + +
+
+
+ + +
+

General configuration

+

General configuration — gSSO general configuration keys

+
+ +
+

Description

+

+General configuration keys are defined below. See GSignondConfig for how to use them. +

+
+
+

Details

+
+

GSIGNOND_CONFIG_GENERAL

+
#define GSIGNOND_CONFIG_GENERAL                 "General"
+
+

+A prefix for general keys. Should be used only when defining new keys. +

+
+
+
+

GSIGNOND_CONFIG_GENERAL_BIN_DIR

+
#define             GSIGNOND_CONFIG_GENERAL_BIN_DIR
+

+The path where gSSO is looking for the gsignond-plugind binary when it needs +to start a plugin process. Can be used for finding other supplementary binaries in +the future. +

+

+Default value: $(bindir), can be overriden in debug +builds by setting SSO_BIN_DIR environment variable. +

+
+
+
+

GSIGNOND_CONFIG_GENERAL_EXTENSION

+
#define             GSIGNOND_CONFIG_GENERAL_EXTENSION
+

+The name of the gSSO extension to use. If not specified, the default +implementation is used (see GSignondExtension). +

+

+Can be overriden in debug +builds by setting SSO_EXTENSION environment variable. +

+
+
+
+

GSIGNOND_CONFIG_GENERAL_EXTENSIONS_DIR

+
#define             GSIGNOND_CONFIG_GENERAL_EXTENSIONS_DIR
+

+The path where gSSO is looking for available extension modules. +

+

+Default value: $(pkglibdir)/extensions, can be overriden in debug +builds by setting SSO_EXTENSIONS_DIR environment variable. +

+
+
+
+

GSIGNOND_CONFIG_GENERAL_PLUGINS_DIR

+
#define             GSIGNOND_CONFIG_GENERAL_PLUGINS_DIR
+

+The path where gSSO is looking for available plugins. +

+

+Default value: $(pkglibdir)/plugins, can be overriden in debug +builds by setting SSO_PLUGINS_DIR environment variable. +

+
+
+
+

GSIGNOND_CONFIG_GENERAL_SECURE_DIR

+
#define             GSIGNOND_CONFIG_GENERAL_SECURE_DIR
+

+Path provided by GSignondStorageManager for storing user-specific +information, including secret and metadata databases. +

+

+Value provided by the default implementation: +GSIGNOND_CONFIG_GENERAL_STORAGE_PATH + "/gsignond." + g_get_user_name(). +

+
+
+
+

GSIGNOND_CONFIG_GENERAL_STORAGE_PATH

+
#define             GSIGNOND_CONFIG_GENERAL_STORAGE_PATH
+

+Base path for GSignondStorageManager to operate in. +

+

+Default value: "/var/db", can be overriden in debug +builds by setting SSO_STORAGE_PATH environment variable. +

+
+
+
+

GSIGNOND_CONFIG_PLUGIN_TIMEOUT

+
#define             GSIGNOND_CONFIG_PLUGIN_TIMEOUT
+

+A timeout in seconds, after which inactive plugin objects and processes are removed. +If not set, the plugin objects will persist for possible reuse. +

+

+Can be overriden in debug +builds by setting SSO_PLUGIN_TIMEOUT environment variable. +

+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/gsignond-Logging.html b/docs/html/gsignond-Logging.html new file mode 100644 index 0000000..074a419 --- /dev/null +++ b/docs/html/gsignond-Logging.html @@ -0,0 +1,177 @@ + + + + +Logging + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Logging

+

Logging — logging facilities

+
+
+

Synopsis

+
+#include <gsignond/gsignond-log.h>
+
+#define             DBG                                 (frmt,
+                                                         ...)
+#define             ERR                                 (frmt,
+                                                         ...)
+#define             INFO                                (frmt,
+                                                         ...)
+#define             TRACEBACK
+#define             WARN                                (frmt,
+                                                         ...)
+
+
+
+

Description

+

+gsignond/gsignond-log.h file contains logging macros +that plugins and extensions should use for debugging and tracing. +

+

+For example: +

+
+ + + + + + + +
1
INFO("Plugin %s initialized", plugin_mechanism);
+
+ +

+

+
+
+

Details

+
+

DBG()

+
#define             DBG(frmt, args...)
+

+Use this macro to log debug messages. GSignond will take care of +correctly saving them. +

+
++ + + + + + + + + + +

frmt :

format string for the message

... :

arguments for the format string
+
+
+
+

ERR()

+
#define             ERR(frmt, args...)
+

+Use this macro to log error messages. GSignond will take care of +correctly saving them. +

+
++ + + + + + + + + + +

frmt :

format string for the message

... :

arguments for the format string
+
+
+
+

INFO()

+
#define             INFO(frmt, args...)
+

+Use this macro to log informational messages. GSignond will take care of +correctly saving them. +

+
++ + + + + + + + + + +

frmt :

format string for the message

... :

arguments for the format string
+
+
+
+

TRACEBACK

+
#define             TRACEBACK()
+

+This macro prints the current function call stack to stderr. +

+
+
+
+

WARN()

+
#define             WARN(frmt, args...)
+

+Use this macro to log warning messages. GSignond will take care of +correctly saving them. +

+
++ + + + + + + + + + +

frmt :

format string for the message

... :

arguments for the format string
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/gsignond-Utility-functions.html b/docs/html/gsignond-Utility-functions.html new file mode 100644 index 0000000..26fcca1 --- /dev/null +++ b/docs/html/gsignond-Utility-functions.html @@ -0,0 +1,119 @@ + + + + +Utility functions + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Utility functions

+

Utility functions — miscellaneous utility functions

+
+
+

Synopsis

+
+#include <gsignond/gsignond-utils.h>
+
+gchar *             gsignond_generate_nonce             ();
+gboolean            gsignond_wipe_directory             (const gchar *dirname);
+gboolean            gsignond_wipe_file                  (const gchar *filename);
+
+
+
+

Description

+

+Miscellaneous utility functions are described below. +

+
+
+

Details

+
+

gsignond_generate_nonce ()

+
gchar *             gsignond_generate_nonce             ();
+

+This function generates a random secure nonce using SHA1 HMAC. +

+
++ + + + +

Returns :

the nonce in lowercase hexadecimal format, 40 bytes long. [transfer full] +
+
+
+
+

gsignond_wipe_directory ()

+
gboolean            gsignond_wipe_directory             (const gchar *dirname);
+

+This function securely wipes the contents of the directory by calling +gsignond_wipe_file() on each file. It also removes links and empty directories but +does not recursively wipe them. +

+
++ + + + + + + + + + +

dirname :

directory to wipe

Returns :

TRUE if wiping and removal was successful.
+
+
+
+

gsignond_wipe_file ()

+
gboolean            gsignond_wipe_file                  (const gchar *filename);
+

+This function securely wipes the contents of the file, by overwriting it with +0's, then 1's, then random data. The file is then removed. +

+
++ + + + + + + + + + +

filename :

filename to wipe

Returns :

TRUE if wiping and removal was successful.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/gsignond-building.html b/docs/html/gsignond-building.html new file mode 100644 index 0000000..d92d299 --- /dev/null +++ b/docs/html/gsignond-building.html @@ -0,0 +1,161 @@ + + + + +Building and installing the gsignond daemon + + + + + + + + + + + + + + + + +
+
+
+

Building gsignond

+

+ GSignond uses the standard GNU build system, + using autoconf for package + configuration and resolving portability issues, + automake for building makefiles + that comply with the GNU Coding Standards, and + libtool for building shared + libraries on multiple platforms. The normal sequence for + compiling and installing gsignond from distribution tarballs is thus: + +

+


+        ./configure
+        make
+        make install
+      

+

+ + If you have obtained the source code directly from git repository, + execute the ./autogen.sh script + before the steps above. +

+

+ The standard options provided by GNU + autoconf may be passed to the + configure script. Please see the + autoconf documentation or run + ./configure --help for information about + the standard options. +

+
+
+

Dependencies

+

+ Before you can compile GSignond, you need to have + various other tools and libraries installed on your + system. The two tools needed during the build process + are pkg-config and + GNU make. +

+
  • + pkg-config + is a tool for tracking the compilation flags needed for + libraries that are used by the GSignond. (For each + library, a small .pc text file is + installed in a standard location that contains the compilation + flags needed for that library along with version number + information.) +

+

+ GSignond depends on a number of other libraries. +

+
    +
  • + The GLib + library is the development framework that GSignond is built on. +

  • +
  • + The SQLite library + provides a database implementation that GSignond is using for + storing data. +

  • +
  • + The check library + provides a unit testing framework. It is needed only if you would + like to run unit tests with make check. +

  • +
  • + For building Tizen extension module that integrates gsignond into + the Tizen platform, the + libsmack and + ecryptfs are required. + They are not needed otherwise. +

  • +
+
+
+

Extra Configuration Options

+

+ In addition to the normal options, the + configure script supports these additional arguments: +

+

--enable-debug.  + Turns on debugging support. This enables unit tests and allows setting + environment variables to influence the runtime behaviour of GSignond + (see GSignondConfig and + GSignondAccessControlManager). + Also, the daemon will exit in case of critical errors. +

+

--enable-sql-log.  + Turns on SQL statement logging. For this, also + --enable-debug must be used. +

+

--enable-dbus-type=dbus-type.  + Sets the way in which GSignond is using DBus to communicate with + the client library. dbus-type can be one of +

+
    +
  • + 'p2p' which is the default and recommended + value. GSignond will use direct connection over a UNIX domain socket + with the client library without involving the DBus daemon. +

  • +
  • + 'session' which will use the session bus. + This is not recommended to use because session bus isn't secure + against eavesdropping, but it can be used for debugging purposes, + as it allows the use of standard tools such as + dbus-monitor, d-feet and + so on. +

  • +
  • + 'system' which will use the system bus. + Can be used on a single-user systems, but 'p2p' is preferred. +

  • +
+

+

+
+
+

Building distribution packages

+

+ Instead of running make install to install gsignond + into a system location it is possible to build distribution-specific + packages. dists/ directory in the source tree + contains a number of package confuguration files, and to use them also + a distribution tarball is needed. If you are building from a git tree, + use make dist to create such a tarball. +

+
+
+ + + \ No newline at end of file diff --git a/docs/html/gsignond.devhelp2 b/docs/html/gsignond.devhelp2 new file mode 100644 index 0000000..107f848 --- /dev/null +++ b/docs/html/gsignond.devhelp2 @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/home.png b/docs/html/home.png new file mode 100644 index 0000000000000000000000000000000000000000..9346b336a784463192c7daab5133a3673dd69845 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_Gz7y~NYkmHjTefRMbARQqaxysz9Q}BI-m)~Y zggoA|1V*z2{cQ=d;!=?fvu4~`n82RKrk1UubNXTJj1GP|o-=>$A29f{JgJ9K`^t{Q z-oWs>M&_hvT&MjX@T4-&sBW+1^4oB5G4r2q!qGktZ!n*!)hjrjd0_4L6;4%u<}orJ u%Vo~x?#i!!ww+1OGuHe}T=cKQUzn^_t)8|WlnDbmjKR~@&t;ucLK6T + + + +gsignond API Reference Manual + + + + + + + +
+
+
+
+

+ for gsignond daemon. + The latest version of this documentation can be found on-line at + + http://gsignon-docs.accounts-sso.googlecode.com/git/gsignond/index.html. +

+
+
+
+
+
GSignond building and installation
+
+Building and installing the gsignond daemon +
+
GSignond configuration
+
+
+GSignondConfig — gSSO configuration information +
+
+General configuration — gSSO general configuration keys +
+
+Database configuration — gSSO database configuration keys +
+
+DBus configuration — gSSO dbus configuration keys +
+
+
GSignond API for writing authentication plugins
+
+
+GSignondPlugin — an interface for implementing authentication plugins +
+
+GSignondDictionary — a dictionary container holding string keys and variant values +
+
+GSignondSessionData — definitions for authentication session parameters +
+
+GSignondSignonuiData — definitions for user interaction parameters +
+
+
Standard in-tree authentication plugins
+
+
+GSignondDigestPlugin — a plugin that performs HTTP Digest authentication +
+
+GSignondSsoTestPlugin — a plugin that is used internally in gsignond unit test +
+
+GSignondPasswordPlugin — a plugin for retrieving the username/password +
+
+
GSignond API for writing platform adaptation extensions
+
+
+GSignondExtension — provides platform adaptation functionality +
+
+GSignondAccessControlManager — an object that performs access control checks +
+
+GSignondSecurityContext — security context descriptor used in access control checks +
+
+GSignondStorageManager — manages encrypted disk storage for storing the secret database +
+
+GSignondSecretStorage — provides access to the database that stores user credentials and identity/method cache +
+
+GSignondCredentials — credentials (username, password) associated with an identity +
+
+
Miscellaneous
+
+
+Errors — error definitions and utilities +
+
+Logging — logging facilities +
+
+Utility functions — miscellaneous utility functions +
+
+
Object Hierarchy
+
API Index
+
Index of deprecated API
+
Annotation Glossary
+
+
+ + + \ No newline at end of file diff --git a/docs/html/index.sgml b/docs/html/index.sgml new file mode 100644 index 0000000..0a1fd7c --- /dev/null +++ b/docs/html/index.sgml @@ -0,0 +1,381 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/left-insensitive.png b/docs/html/left-insensitive.png new file mode 100644 index 0000000000000000000000000000000000000000..3269393a7f72af744a772c437bd7b3976c23709d GIT binary patch literal 395 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_Gz7y~NYkmHjTefH0HbvDJm`3=E7Co-U3d7N^fnTIWJ3j{^~q!iyia4kV=mdU|Jhfgdm;SLIpiYJ7wv^kjFiECCc&8T30!RG0~&BG=X zlu#U4@Z`))V`EG9e^NqDr#{!5k|)wT* zYTNt0`@q%TAD$){%#eQ?;$^ly8}yZCU%T~u0XM^%t?f#e znB*EuLv2rP%K3BMvFO}YmnR}KSgH;`EHL$)^!tH~iBxZ#h^zJi*#P5Xb6B50U@nx2 mU;T=yfcwnSOsS9SKd{M#MlNkCuvG>I8-u5-pUXO@geCx5`k@p6 literal 0 HcmV?d00001 diff --git a/docs/html/left.png b/docs/html/left.png new file mode 100644 index 0000000000000000000000000000000000000000..2abde032b0c98b756b12d380da4318205cd78470 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_Gz7y~NYkmHjTefRMaSLay~*pwMJb7sn8b(^oI8=R24v(*CjE{-BFv z0BhvLm?o9(UC{-Ci?lD?Ve-7-xypA!PTC(0^;>UheG4Altep3@`rO0#Rjs1)RxCLr zE5mee>7m*=%yEk+GVvGkRy0O&*&MTd5SjH(lgq~7r%6oRW$l1p-*S}iC>@fyDsz%y z`UIW8^Ao=maGhj3E8{7Cd_qof`K4oa->23`>&M2+XBtd2J`8jogQu&X%Q~loCIG_? BVG#fT literal 0 HcmV?d00001 diff --git a/docs/html/object-tree.html b/docs/html/object-tree.html new file mode 100644 index 0000000..78b42ff --- /dev/null +++ b/docs/html/object-tree.html @@ -0,0 +1,42 @@ + + + + +Object Hierarchy + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/html/right-insensitive.png b/docs/html/right-insensitive.png new file mode 100644 index 0000000000000000000000000000000000000000..4c95785b907b978f36674cd98bf5302669c15c1b GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_Gz7y~NYkmHjTefG`u!(zUX23=E7+o-U3d7N^fn+URvSL8NuRG*{E) z?#-+97X-^pidQ*u@StO1(S@7g8g>nnA24$?ty?)cmuaa|Y>ez2*_Ia?6HP4j{3LIs zTr!s1ao_Sz^~3e4zRJGAjKZGn=XP#)Wmuo-QN>teTzzI!&R*jMI^Oa#7_ukLYdicf zOx;1mb-rt04s-c|uIH8fnX}$)XJa^0_-F3(pA%=sGI<|(n_*&=yYt96+n5InXn_GN+EraJI9q(O+n{6MQKErp&KxRvpfn0xh z`sSMqH(2Z%?kaFBTf06W^y=UDA9gR9YrwNS*1pjB((0K%&+SbAx3`XA&dKZ}j*nX7 QfdRze>FVdQ&MBb@09|aA9{>OV literal 0 HcmV?d00001 diff --git a/docs/html/right.png b/docs/html/right.png new file mode 100644 index 0000000000000000000000000000000000000000..76260ec8865f4e13cd269ec62eccd78a33adba3c GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_Gz7y~NYkmHjTefRMbR+#PqI2*V^#7sn8b(^oI8=W9$9IsUQVezxzH zy`G{eu0`y#boSlU-NAlQG~=D)BPJG4k(^0qdDa(AdQvI0d|vJT=i7_<_D6`Cy?Dm; zP0@1EeB~D|O$oQe*sxL-P;q{2UCr}fN-o#M~tpZzsGyfNz46SZlIJCbKH zZQscEqpOfBCPDgx dd > dl > dt +{ + padding-top: 0.25em; + padding-bottom: 0.25em; +} + +dl.toc > dt +{ + padding-top: 1em; + padding-bottom: 0.5em; + font-weight: bold; +} + +.parameter +{ + font-style: normal; +} + +.footer +{ + padding-top: 3.5em; + /* tango:aluminium 3 */ + color: #babdb6; + text-align: center; + font-size: 80%; +} + +.informalfigure, +.figure +{ + margin: 2em; +} + +.informalexample, +.example +{ + margin: 2em; +} + +.warning +{ + /* tango:orange 0/1 */ + background: #ffeed9; + border-color: #ffb04f; +} +.note +{ + /* tango:chameleon 0/0.5 */ + background: #d8ffb2; + border-color: #abf562; +} +.note, .warning +{ + padding: 0.5em; + border-width: 1px; + border-style: solid; + margin: 2em; +} +.note h3, .warning h3 +{ + margin-top: 0.0em +} +.note p, .warning p +{ + margin-bottom: 0.0em +} + +p + div.section +{ + margin-top: 2.5em; +} + +div.refnamediv, +div.refsynopsisdiv, +div.refsect1, +div.refsect2, +div.toc, +div.section +{ + margin-bottom: 2.5em; +} + +/* blob links */ +h2 .extralinks, h3 .extralinks +{ + float: right; + /* tango:aluminium 3 */ + color: #babdb6; + font-size: 80%; + font-weight: normal; +} + +.annotation +{ + /* tango:aluminium 5 */ + color: #555753; + font-size: 80%; + font-weight: normal; +} + +/* code listings */ + +.listing_code .programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */ +.listing_code .programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */ +.listing_code .programlisting .function { color: #000000; font-weight: bold; } +.listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */ +.listing_code .programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */ +.listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ +.listing_code .programlisting .normal { color: #000000; } +.listing_code .programlisting .number { color: #75507b; } /* tango: plum 2 */ +.listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ +.listing_code .programlisting .string { color: #c17d11; } /* tango: chocolate 2 */ +.listing_code .programlisting .type { color: #000000; } +.listing_code .programlisting .type a { color: #11326b; } /* tango: sky blue 4 */ +.listing_code .programlisting .symbol { color: #ce5c00; } /* tango: orange 3 */ + +.listing_frame { + /* tango:sky blue 1 */ + border: solid 1px #729fcf; + padding: 0px; +} + +.listing_lines, .listing_code { + margin-top: 0px; + margin-bottom: 0px; + padding: 0.5em; +} +.listing_lines { + /* tango:sky blue 0.5 */ + background: #a6c5e3; + /* tango:aluminium 6 */ + color: #2e3436; +} +.listing_code { + /* tango:sky blue 0 */ + background: #e6f3ff; +} +.listing_code .programlisting { + /* override from previous */ + border: none 0px; + padding: 0px; +} +.listing_lines pre, .listing_code pre { + margin: 0px; +} + diff --git a/docs/html/up-insensitive.png b/docs/html/up-insensitive.png new file mode 100644 index 0000000000000000000000000000000000000000..f40498606db349a7321cf6b470523e836ee7ac2e GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_Gz7y~NYkmHjTefG~@Ex#w@70gTL^E{-7zACwHGSRJaopUzr*FR_KPpkxheNzTDP+%{a~ox zRb6~e-_l%s#;V|Jw-)bO$G_X=4F`Y7SBoCzyjAZQ8BPW>ywAP8?pbBsZ|wt?+h6S6&uqY)kkMnwQQEd@7k`4t@sCCO z@7MoiEI4Q_#IB70vhu7Ab+>SXLxu@LWH Qzz|~aboFyt=akR{08E^fv;Y7A literal 0 HcmV?d00001 diff --git a/docs/html/up.png b/docs/html/up.png new file mode 100644 index 0000000000000000000000000000000000000000..80b4b37e997d69b2e128bc3090bc447ccb74bbe9 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_Gz7y~NYkmHjTefRFevZLys@4W>+6GUE!tU04Ii{0w_tkMIDB?rA5 zttYTN +GSignondAccessControlManager + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@parent_class: +@security_context_of_peer: +@peer_is_allowed_to_use_identity: +@peer_is_owner_of_identity: +@acl_is_valid: +@security_context_of_keychain: + + + + + + +@self: +@peer_ctx: +@identity_acl: +@Returns: + + + + + + + +@self: +@peer_ctx: +@owner_ctx: +@identity_acl: +@Returns: + + + + + + + +@self: +@peer_ctx: +@owner_ctx: +@Returns: + + + + + + + +@self: +@Returns: + + + + + + + +@self: +@peer_ctx: +@peer_fd: +@peer_service: +@peer_app_ctx: + + diff --git a/docs/tmpl/gsignond-config-db.sgml b/docs/tmpl/gsignond-config-db.sgml new file mode 100644 index 0000000..7d280e2 --- /dev/null +++ b/docs/tmpl/gsignond-config-db.sgml @@ -0,0 +1,45 @@ + +gsignond-config-db + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/tmpl/gsignond-config-dbus.sgml b/docs/tmpl/gsignond-config-dbus.sgml new file mode 100644 index 0000000..acadcf1 --- /dev/null +++ b/docs/tmpl/gsignond-config-dbus.sgml @@ -0,0 +1,52 @@ + +gsignond-config-dbus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/tmpl/gsignond-config-general.sgml b/docs/tmpl/gsignond-config-general.sgml new file mode 100644 index 0000000..0f4bc08 --- /dev/null +++ b/docs/tmpl/gsignond-config-general.sgml @@ -0,0 +1,80 @@ + +gsignond-config-general + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/tmpl/gsignond-config.sgml b/docs/tmpl/gsignond-config.sgml new file mode 100644 index 0000000..8699ceb --- /dev/null +++ b/docs/tmpl/gsignond-config.sgml @@ -0,0 +1,84 @@ + +GSignondConfig + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@self: +@key: +@Returns: + + + + + + + +@self: +@key: +@Returns: + + + + + + + +@Returns: + + + + + + + +@self: +@key: +@value: + + + + + + + +@self: +@key: +@value: + + diff --git a/docs/tmpl/gsignond-credentials.sgml b/docs/tmpl/gsignond-credentials.sgml new file mode 100644 index 0000000..ea69e95 --- /dev/null +++ b/docs/tmpl/gsignond-credentials.sgml @@ -0,0 +1,123 @@ + +GSignondCredentials + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@one: +@two: +@Returns: + + + + + + + +@self: +@Returns: + + + + + + + +@self: +@Returns: + + + + + + + +@self: +@Returns: + + + + + + + +@Returns: + + + + + + + +@self: +@id: +@username: +@password: +@Returns: + + + + + + + +@self: +@id: +@Returns: + + + + + + + +@self: +@password: +@Returns: + + + + + + + +@self: +@username: +@Returns: + + diff --git a/docs/tmpl/gsignond-dictionary.sgml b/docs/tmpl/gsignond-dictionary.sgml new file mode 100644 index 0000000..14dc8b7 --- /dev/null +++ b/docs/tmpl/gsignond-dictionary.sgml @@ -0,0 +1,245 @@ + +gsignond-dictionary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@other: +@Returns: + + + + + + + +@dict: +@key: +@Returns: + + + + + + + +@dict: +@key: +@value: +@Returns: + + + + + + + +@dict: +@key: +@value: +@Returns: + + + + + + + +@dict: +@key: +@value: +@Returns: + + + + + + + +@dict: +@key: +@Returns: + + + + + + + +@dict: +@key: +@value: +@Returns: + + + + + + + +@dict: +@key: +@value: +@Returns: + + + + + + + +@void: +@Returns: + + + + + + + +@variant: +@Returns: + + + + + + + +@dict: +@Returns: + + + + + + + +@dict: +@key: +@Returns: + + + + + + + +@dict: +@key: +@value: +@Returns: + + + + + + + +@dict: +@key: +@value: +@Returns: + + + + + + + +@dict: +@key: +@value: +@Returns: + + + + + + + +@dict: +@key: +@value: +@Returns: + + + + + + + +@dict: +@key: +@value: +@Returns: + + + + + + + +@dict: +@key: +@value: +@Returns: + + + + + + + +@dict: +@key: +@value: +@Returns: + + + + + + + +@dict: +@Returns: + + + + + + + +@dict: + + diff --git a/docs/tmpl/gsignond-digest-plugin.sgml b/docs/tmpl/gsignond-digest-plugin.sgml new file mode 100644 index 0000000..c8d0d76 --- /dev/null +++ b/docs/tmpl/gsignond-digest-plugin.sgml @@ -0,0 +1,37 @@ + +GSignondDigestPlugin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@parent_class: + diff --git a/docs/tmpl/gsignond-error.sgml b/docs/tmpl/gsignond-error.sgml new file mode 100644 index 0000000..2c5f232 --- /dev/null +++ b/docs/tmpl/gsignond-error.sgml @@ -0,0 +1,114 @@ + +gsignond-error + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@GSIGNOND_ERROR_NONE: +@GSIGNOND_ERROR_UNKNOWN: +@GSIGNOND_ERROR_INTERNAL_SERVER: +@GSIGNOND_ERROR_INTERNAL_COMMUNICATION: +@GSIGNOND_ERROR_PERMISSION_DENIED: +@GSIGNOND_ERROR_ENCRYPTION_FAILURE: +@GSIGNOND_ERROR_AUTH_SERVICE_ERR: +@GSIGNOND_ERROR_METHOD_NOT_KNOWN: +@GSIGNOND_ERROR_SERVICE_NOT_AVAILABLE: +@GSIGNOND_ERROR_INVALID_QUERY: +@GSIGNOND_ERROR_IDENTITY_ERR: +@GSIGNOND_ERROR_METHOD_NOT_AVAILABLE: +@GSIGNOND_ERROR_IDENTITY_NOT_FOUND: +@GSIGNOND_ERROR_STORE_FAILED: +@GSIGNOND_ERROR_REMOVE_FAILED: +@GSIGNOND_ERROR_SIGN_OUT_FAILED: +@GSIGNOND_ERROR_IDENTITY_OPERATION_CANCELED: +@GSIGNOND_ERROR_CREDENTIALS_NOT_AVAILABLE: +@GSIGNOND_ERROR_REFERENCE_NOT_FOUND: +@GSIGNOND_ERROR_AUTH_SESSION_ERR: +@GSIGNOND_ERROR_MECHANISM_NOT_AVAILABLE: +@GSIGNOND_ERROR_MISSING_DATA: +@GSIGNOND_ERROR_INVALID_CREDENTIALS: +@GSIGNOND_ERROR_NOT_AUTHORIZED: +@GSIGNOND_ERROR_WRONG_STATE: +@GSIGNOND_ERROR_OPERATION_NOT_SUPPORTED: +@GSIGNOND_ERROR_NO_CONNECTION: +@GSIGNOND_ERROR_NETWORK: +@GSIGNOND_ERROR_SSL: +@GSIGNOND_ERROR_RUNTIME: +@GSIGNOND_ERROR_SESSION_CANCELED: +@GSIGNOND_ERROR_TIMED_OUT: +@GSIGNOND_ERROR_USER_INTERACTION: +@GSIGNOND_ERROR_OPERATION_FAILED: +@GSIGNOND_ERROR_ENCRYPTION_FAILED: +@GSIGNOND_ERROR_TOS_NOT_ACCEPTED: +@GSIGNOND_ERROR_FORGOT_PASSWORD: +@GSIGNOND_ERROR_METHOD_OR_MECHANISM_NOT_ALLOWED: +@GSIGNOND_ERROR_INCORRECT_DATE: +@GSIGNOND_ERROR_USER_ERR: + + + + + + +@var: +@Returns: + + + + + + + +@void: +@Returns: + + + + + + + +@error: +@Returns: + + + + + + + +@err: +@message: +@...: + + diff --git a/docs/tmpl/gsignond-extension-interface.sgml b/docs/tmpl/gsignond-extension-interface.sgml new file mode 100644 index 0000000..215d44f --- /dev/null +++ b/docs/tmpl/gsignond-extension-interface.sgml @@ -0,0 +1,90 @@ + +GSignondExtension + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@parent_class: +@get_extension_name: +@get_extension_version: +@get_storage_manager: +@get_secret_storage: +@get_access_control_manager: + + + + + + +@self: +@config: +@Returns: + + + + + + + +@self: +@Returns: + + + + + + + +@self: +@config: +@Returns: + + + + + + + +@self: +@config: +@Returns: + + + + + + + +@self: +@Returns: + + diff --git a/docs/tmpl/gsignond-log.sgml b/docs/tmpl/gsignond-log.sgml new file mode 100644 index 0000000..a31bbc6 --- /dev/null +++ b/docs/tmpl/gsignond-log.sgml @@ -0,0 +1,67 @@ + +gsignond-log + + + + + + + + + + + + + + + + + + + + + + + + + + + +@frmt: +@...: + + + + + + + +@frmt: +@...: + + + + + + + +@frmt: +@...: + + + + + + + + + + + + + + +@frmt: +@...: + + diff --git a/docs/tmpl/gsignond-password-plugin.sgml b/docs/tmpl/gsignond-password-plugin.sgml new file mode 100644 index 0000000..edf3bd9 --- /dev/null +++ b/docs/tmpl/gsignond-password-plugin.sgml @@ -0,0 +1,37 @@ + +GSignondPasswordPlugin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@parent_class: + diff --git a/docs/tmpl/gsignond-plugin-interface.sgml b/docs/tmpl/gsignond-plugin-interface.sgml new file mode 100644 index 0000000..1cfbef6 --- /dev/null +++ b/docs/tmpl/gsignond-plugin-interface.sgml @@ -0,0 +1,164 @@ + +GSignondPlugin + + + + + + + + + + + + + + + + + + + + + + + + + + + +@parent: +@cancel: +@request_initial: +@request: +@user_action_finished: +@refresh: + + + + + + +@GSIGNOND_PLUGIN_STATE_NONE: +@GSIGNOND_PLUGIN_STATE_RESOLVING: +@GSIGNOND_PLUGIN_STATE_CONNECTING: +@GSIGNOND_PLUGIN_STATE_SENDING_DATA: +@GSIGNOND_PLUGIN_STATE_WAITING: +@GSIGNOND_PLUGIN_STATE_USER_PENDING: +@GSIGNOND_PLUGIN_STATE_REFRESHING: +@GSIGNOND_PLUGIN_STATE_PROCESS_PENDING: +@GSIGNOND_PLUGIN_STATE_STARTED: +@GSIGNOND_PLUGIN_STATE_CANCELING: +@GSIGNOND_PLUGIN_STATE_DONE: +@GSIGNOND_PLUGIN_STATE_HOLDING: + + + + + + +@self: + + + + + + + +@self: +@error: + + + + + + + +@self: +@ui_data: + + + + + + + +@self: +@ui_data: + + + + + + + +@self: +@session_data: + + + + + + + +@self: +@session_data: +@identity_method_cache: +@mechanism: + + + + + + + +@self: +@session_data: + + + + + + + +@self: +@session_data: + + + + + + + +@self: +@state: +@message: + + + + + + + +@self: +@identity_method_cache: + + + + + + + +@self: +@ui_data: + + + + + + + +@self: +@ui_data: + + diff --git a/docs/tmpl/gsignond-secret-storage.sgml b/docs/tmpl/gsignond-secret-storage.sgml new file mode 100644 index 0000000..d33c891 --- /dev/null +++ b/docs/tmpl/gsignond-secret-storage.sgml @@ -0,0 +1,173 @@ + +GSignondSecretStorage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@parent_class: +@open_db: +@close_db: +@clear_db: +@is_open_db: +@load_credentials: +@update_credentials: +@remove_credentials: +@check_credentials: +@load_data: +@update_data: +@remove_data: +@get_last_error: + + + + + + +@self: +@creds: +@Returns: + + + + + + + +@self: +@Returns: + + + + + + + +@self: +@Returns: + + + + + + + +@self: +@Returns: + + + + + + + +@self: +@Returns: + + + + + + + +@self: +@id: +@Returns: + + + + + + + +@self: +@id: +@method: +@Returns: + + + + + + + +@self: +@Returns: + + + + + + + +@self: +@id: +@Returns: + + + + + + + +@self: +@id: +@method: +@Returns: + + + + + + + +@self: +@creds: +@Returns: + + + + + + + +@self: +@id: +@method: +@data: +@Returns: + + diff --git a/docs/tmpl/gsignond-security-context.sgml b/docs/tmpl/gsignond-security-context.sgml new file mode 100644 index 0000000..717b7d2 --- /dev/null +++ b/docs/tmpl/gsignond-security-context.sgml @@ -0,0 +1,192 @@ + +gsignond-security-context + + + + + + + + + + + + + + + + + + + + + + + + + + + +@sys_ctx: +@app_ctx: + + + + + + + + + + + + +@reference: +@test: +@Returns: + + + + + + + +@ctx1: +@ctx2: +@Returns: + + + + + + + +@src_ctx: +@Returns: + + + + + + + +@ctx: + + + + + + + +@variant: +@Returns: + + + + + + + +@ctx: +@Returns: + + + + + + + +@ctx: +@Returns: + + + + + + + +@src_list: +@Returns: + + + + + + + +@seclist: + + + + + + + +@variant: +@Returns: + + + + + + + +@list: +@Returns: + + + + + + + +@ctx1: +@ctx2: +@Returns: + + + + + + + +@Returns: + + + + + + + +@system_context: +@application_context: +@Returns: + + + + + + + +@ctx: +@application_context: + + + + + + + +@ctx: +@system_context: + + + + + + + +@ctx: +@Returns: + + diff --git a/docs/tmpl/gsignond-session-data.sgml b/docs/tmpl/gsignond-session-data.sgml new file mode 100644 index 0000000..d37ccb7 --- /dev/null +++ b/docs/tmpl/gsignond-session-data.sgml @@ -0,0 +1,206 @@ + +gsignond-session-data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@GSIGNOND_UI_POLICY_DEFAULT: +@GSIGNOND_UI_POLICY_REQUEST_PASSWORD: +@GSIGNOND_UI_POLICY_NO_USER_INTERACTION: +@GSIGNOND_UI_POLICY_VALIDATION: + + + + + + +@data: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@network_timeout: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@renew_token: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@ui_policy: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@window_id: +@Returns: + + + + + + + +@data: +@caption: + + + + + + + +@data: +@network_proxy: + + + + + + + +@data: +@network_timeout: + + + + + + + +@data: +@realm: + + + + + + + +@data: +@renew_token: + + + + + + + +@data: +@secret: + + + + + + + +@data: +@ui_policy: + + + + + + + +@data: +@username: + + + + + + + +@data: +@window_id: + + diff --git a/docs/tmpl/gsignond-signonui-data.sgml b/docs/tmpl/gsignond-signonui-data.sgml new file mode 100644 index 0000000..9c8f234 --- /dev/null +++ b/docs/tmpl/gsignond-signonui-data.sgml @@ -0,0 +1,395 @@ + +gsignond-signonui-data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@SIGNONUI_ERROR_NONE: +@SIGNONUI_ERROR_GENERAL: +@SIGNONUI_ERROR_NO_SIGNONUI: +@SIGNONUI_ERROR_BAD_PARAMETERS: +@SIGNONUI_ERROR_CANCELED: +@SIGNONUI_ERROR_NOT_AVAILABLE: +@SIGNONUI_ERROR_BAD_URL: +@SIGNONUI_ERROR_BAD_CAPTCHA: +@SIGNONUI_ERROR_BAD_CAPTCHA_URL: +@SIGNONUI_ERROR_REFRESH_FAILED: +@SIGNONUI_ERROR_FORBIDDEN: +@SIGNONUI_ERROR_FORGOT_PASSWORD: + + + + + + +@data: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@confirm: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@error: +@Returns: + + + + + + + +@data: +@query_password: +@Returns: + + + + + + + +@data: +@query_username: +@Returns: + + + + + + + +@data: +@remember_password: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@data: +@response: + + + + + + + +@data: +@url: + + + + + + + +@data: +@caption: + + + + + + + +@data: +@confirm: + + + + + + + +@data: +@url: + + + + + + + +@data: +@forgot: + + + + + + + +@data: +@url: + + + + + + + +@data: +@message: + + + + + + + +@data: +@url: + + + + + + + +@data: +@password: + + + + + + + +@data: +@error: + + + + + + + +@data: +@query: + + + + + + + +@data: +@query: + + + + + + + +@data: +@remember: + + + + + + + +@data: +@id: + + + + + + + +@data: +@reply: + + + + + + + +@data: +@title: + + + + + + + +@data: +@response: + + + + + + + +@data: +@username: + + diff --git a/docs/tmpl/gsignond-ssotest-plugin.sgml b/docs/tmpl/gsignond-ssotest-plugin.sgml new file mode 100644 index 0000000..814f309 --- /dev/null +++ b/docs/tmpl/gsignond-ssotest-plugin.sgml @@ -0,0 +1,37 @@ + +GSignondSsoTestPlugin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@parent_class: + diff --git a/docs/tmpl/gsignond-storage-manager.sgml b/docs/tmpl/gsignond-storage-manager.sgml new file mode 100644 index 0000000..0592e59 --- /dev/null +++ b/docs/tmpl/gsignond-storage-manager.sgml @@ -0,0 +1,102 @@ + +GSignondStorageManager + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@parent_class: +@initialize_storage: +@delete_storage: +@storage_is_initialized: +@mount_filesystem: +@unmount_filesystem: +@filesystem_is_mounted: + + + + + + +@self: +@Returns: + + + + + + + +@self: +@Returns: + + + + + + + +@self: +@Returns: + + + + + + + +@self: +@Returns: + + + + + + + +@self: +@Returns: + + + + + + + +@self: +@Returns: + + diff --git a/docs/tmpl/gsignond-unused.sgml b/docs/tmpl/gsignond-unused.sgml new file mode 100644 index 0000000..e69de29 diff --git a/docs/tmpl/gsignond-utils.sgml b/docs/tmpl/gsignond-utils.sgml new file mode 100644 index 0000000..ef2226d --- /dev/null +++ b/docs/tmpl/gsignond-utils.sgml @@ -0,0 +1,50 @@ + +gsignond-utils + + + + + + + + + + + + + + + + + + + + + + + + + + + +@Returns: + + + + + + + +@dirname: +@Returns: + + + + + + + +@filename: +@Returns: + + diff --git a/gsignond.conf b/gsignond.conf new file mode 100644 index 0000000..dd56fe4 --- /dev/null +++ b/gsignond.conf @@ -0,0 +1,55 @@ +# +# Example configuration for gsignond. +# + +# +# This group contains top-level settings. +# +[General] + +# Directory for binary executables. +#BinDir = +# +# Define extension / platform adaptation module to use. +# 'default' is a dummy one with no encrypted storage, but with basic Unix +# discretionary access control. +#Extension = default +# +# Extension directory where extension modules are located. +#ExtensionsDir = +# +# Base path where user specific database directories will be located. +# Default: /var/db +#StoragePath = +# +# Location for authentication plugins. +#PluginDir = +# +# Timeout for unloading cached plugin instances. +#PluginTimeout = 0 + +# +# Database related settings. +# +[Storage] + +# File name for the metadata database. (excluding path) +#MetadataDBFilename = metadata.db +# +# File name for the credential database. (excluding path) +#SecretDBFilename = secret.db + +# +# D-Bus related settings. +# +[ObjectTimeouts] + +# Timeout for the daemon. Daemon will exit after specified idle time. +#DaemonTimeout = 0 +# +# Timeout for the identity objects. +IdentityTimeout = 5 +# +# Timeout for the authentication session objects. +AuthSessionTimeout = 5 + diff --git a/gtk-doc.make b/gtk-doc.make new file mode 100644 index 0000000..ac30c4c --- /dev/null +++ b/gtk-doc.make @@ -0,0 +1,302 @@ +# -*- mode: makefile -*- + +#################################### +# Everything below here is generic # +#################################### + +if GTK_DOC_USE_LIBTOOL +GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +GTKDOC_RUN = $(LIBTOOL) --mode=execute +else +GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +GTKDOC_RUN = +endif + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) + +TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE) + +SETUP_FILES = \ + $(content_files) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt + +EXTRA_DIST = \ + $(HTML_IMAGES) \ + $(SETUP_FILES) + +DOC_STAMPS=setup-build.stamp scan-build.stamp tmpl-build.stamp sgml-build.stamp \ + html-build.stamp pdf-build.stamp \ + tmpl.stamp sgml.stamp html.stamp pdf.stamp + +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) + +if ENABLE_GTK_DOC +if GTK_DOC_BUILD_HTML +HTML_BUILD_STAMP=html-build.stamp +else +HTML_BUILD_STAMP= +endif +if GTK_DOC_BUILD_PDF +PDF_BUILD_STAMP=pdf-build.stamp +else +PDF_BUILD_STAMP= +endif + +all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) +else +all-local: +endif + +docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) + +$(REPORT_FILES): sgml-build.stamp + +#### setup #### + +GTK_DOC_V_SETUP=$(GTK_DOC_V_SETUP_$(V)) +GTK_DOC_V_SETUP_=$(GTK_DOC_V_SETUP_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_SETUP_0=@echo " DOC Preparing build"; + +setup-build.stamp: + -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ + if test "x$$files" != "x" ; then \ + for file in $$files ; do \ + test -f $(abs_srcdir)/$$file && \ + cp -pu $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ + done; \ + fi; \ + test -d $(abs_srcdir)/tmpl && \ + { cp -rp $(abs_srcdir)/tmpl $(abs_builddir)/; \ + chmod -R u+w $(abs_builddir)/tmpl; } \ + fi + $(AM_V_at)touch setup-build.stamp + +#### scan #### + +GTK_DOC_V_SCAN=$(GTK_DOC_V_SCAN_$(V)) +GTK_DOC_V_SCAN_=$(GTK_DOC_V_SCAN_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_SCAN_0=@echo " DOC Scanning header files"; + +GTK_DOC_V_INTROSPECT=$(GTK_DOC_V_INTROSPECT_$(V)) +GTK_DOC_V_INTROSPECT_=$(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_INTROSPECT_0=@echo " DOC Introspecting gobjects"; + +scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) + $(GTK_DOC_V_SCAN)_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) + $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ + scanobj_options=""; \ + gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + scanobj_options="--verbose"; \ + fi; \ + fi; \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ + gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ + else \ + for i in $(SCANOBJ_FILES) ; do \ + test -f $$i || touch $$i ; \ + done \ + fi + $(AM_V_at)touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp + @true + +#### templates #### + +GTK_DOC_V_TMPL=$(GTK_DOC_V_TMPL_$(V)) +GTK_DOC_V_TMPL_=$(GTK_DOC_V_TMPL_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_TMPL_0=@echo " DOC Rebuilding template files"; + +tmpl-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt + $(GTK_DOC_V_TMPL)gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS) + $(AM_V_at)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + if test -w $(abs_srcdir) ; then \ + cp -rp $(abs_builddir)/tmpl $(abs_srcdir)/; \ + fi \ + fi + $(AM_V_at)touch tmpl-build.stamp + +tmpl.stamp: tmpl-build.stamp + @true + +$(srcdir)/tmpl/*.sgml: + @true + +#### xml #### + +GTK_DOC_V_XML=$(GTK_DOC_V_XML_$(V)) +GTK_DOC_V_XML_=$(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_XML_0=@echo " DOC Building XML"; + +sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files) + -$(GTK_DOC_V_XML)chmod -R u+w $(srcdir) && _source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) + $(AM_V_at)touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +#### html #### + +GTK_DOC_V_HTML=$(GTK_DOC_V_HTML_$(V)) +GTK_DOC_V_HTML_=$(GTK_DOC_V_HTML_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_HTML_0=@echo " DOC Building HTML"; + +GTK_DOC_V_XREF=$(GTK_DOC_V_XREF_$(V)) +GTK_DOC_V_XREF_=$(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_XREF_0=@echo " DOC Fixing cross-references"; + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + $(GTK_DOC_V_HTML)rm -rf html && mkdir html && \ + mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkhtml_options="$$mkhtml_options --verbose"; \ + fi; \ + fi; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ + if test "$(?)" = "0"; then \ + mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ + fi; \ + cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + -@test "x$(HTML_IMAGES)" = "x" || \ + for file in $(HTML_IMAGES) ; do \ + if test -f $(abs_srcdir)/$$file ; then \ + cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ + fi; \ + if test -f $(abs_builddir)/$$file ; then \ + cp $(abs_builddir)/$$file $(abs_builddir)/html; \ + fi; \ + done; + $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + $(AM_V_at)touch html-build.stamp + +#### pdf #### + +GTK_DOC_V_PDF=$(GTK_DOC_V_PDF_$(V)) +GTK_DOC_V_PDF_=$(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_PDF_0=@echo " DOC Building PDF"; + +pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ + mkpdf_options=""; \ + gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkpdf_options="$$mkpdf_options --verbose"; \ + fi; \ + fi; \ + if test "x$(HTML_IMAGES)" != "x"; then \ + for img in $(HTML_IMAGES); do \ + part=`dirname $$img`; \ + echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ + if test $$? != 0; then \ + mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ + fi; \ + done; \ + fi; \ + gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) + $(AM_V_at)touch pdf-build.stamp + +############## + +clean-local: + @rm -f *~ *.bak + @rm -rf .libs + +distclean-local: + @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \ + rm -rf tmpl; \ + fi + +maintainer-clean-local: + @rm -rf xml html + +install-data-local: + @installfiles=`echo $(builddir)/html/*`; \ + if test "$$installfiles" = '$(builddir)/html/*'; \ + then echo 1>&2 'Nothing to install' ; \ + else \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + $(mkinstalldirs) $${installdir} ; \ + for i in $$installfiles; do \ + echo ' $(INSTALL_DATA) '$$i ; \ + $(INSTALL_DATA) $$i $${installdir}; \ + done; \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ + $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ + fi; \ + $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ + fi + +uninstall-local: + @if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + rm -rf $${installdir} + +# +# Require gtk-doc when making dist +# +if ENABLE_GTK_DOC +dist-check-gtkdoc: docs +else +dist-check-gtkdoc: + @echo "*** gtk-doc must be installed and enabled in order to make dist" + @false +endif + +dist-hook: dist-check-gtkdoc dist-hook-local + @mkdir $(distdir)/tmpl + @mkdir $(distdir)/html + @-cp ./tmpl/*.sgml $(distdir)/tmpl + @cp ./html/* $(distdir)/html + @-cp ./$(DOC_MODULE).pdf $(distdir)/ + @-cp ./$(DOC_MODULE).types $(distdir)/ + @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ + @cd $(distdir) && rm -f $(DISTCLEANFILES) + @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs diff --git a/include/gsignond/gsignond-access-control-manager.h b/include/gsignond/gsignond-access-control-manager.h index 54116b3..c79a0f2 100644 --- a/include/gsignond/gsignond-access-control-manager.h +++ b/include/gsignond/gsignond-access-control-manager.h @@ -69,49 +69,24 @@ struct _GSignondAccessControlManagerClass { GObjectClass parent_class; - /** - * security_context_of_peer: - * - * See #gsignond_access_control_manager_security_context_of_peer. - */ void (*security_context_of_peer) ( GSignondAccessControlManager *self, GSignondSecurityContext *peer_ctx, int peer_fd, const gchar *peer_service, const gchar *peer_app_ctx); - /** - * peer_is_allowed_to_use_identity: - * - * See #gsignond_access_control_manager_peer_is_allowed_to_use_identity. - */ gboolean (*peer_is_allowed_to_use_identity) ( GSignondAccessControlManager *self, const GSignondSecurityContext *peer_ctx, const GSignondSecurityContext *owner_ctx, const GSignondSecurityContextList *identity_acl); - /** - * peer_is_owner_of_identity: - * - * See #gsignond_access_control_manager_peer_is_owner_of_identity. - */ gboolean (*peer_is_owner_of_identity) ( GSignondAccessControlManager *self, const GSignondSecurityContext *peer_ctx, const GSignondSecurityContext *owner_ctx); - /** - * acl_is_valid: - * - * See #gsignond_access_control_manager_acl_is_valid. - */ gboolean (*acl_is_valid) ( GSignondAccessControlManager *self, const GSignondSecurityContext *peer_ctx, const GSignondSecurityContextList *identity_acl); - /** - * security_context_of_keychain: - * - * See #gsignond_access_control_manager_security_context_of_keychain. - */ GSignondSecurityContext * (*security_context_of_keychain) ( GSignondAccessControlManager *self); }; diff --git a/include/gsignond/gsignond-config-db.h b/include/gsignond/gsignond-config-db.h index 28ae6b9..555a711 100644 --- a/include/gsignond/gsignond-config-db.h +++ b/include/gsignond/gsignond-config-db.h @@ -26,9 +26,37 @@ #ifndef __GSIGNOND_CONFIG_DB_H_ #define __GSIGNOND_CONFIG_DB_H_ +/** + * SECTION:gsignond-config-db + * @title: Database configuration + * @short_description: gSSO database configuration keys + * @include: gsignond/gsignond-config.h + * + * Database configuration keys are defined below. See #GSignondConfig for how to use them. + */ + +/** + * GSIGNOND_CONFIG_DB_SSO: + * + * A prefix for database keys. Should be used only when defining new keys. + */ #define GSIGNOND_CONFIG_DB_SSO "Storage" +/** + * GSIGNOND_CONFIG_DB_SECRET_DB_FILENAME: + * + * The filename of the credentials database. + * + * Default value: "secret.db". + */ #define GSIGNOND_CONFIG_DB_SECRET_DB_FILENAME GSIGNOND_CONFIG_DB_SSO \ "/SecretDBFilename" +/** + * GSIGNOND_CONFIG_DB_METADATA_DB_FILENAME: + * + * The filename of the metadata database. + * + * Default value: "metadata.db". + */ #define GSIGNOND_CONFIG_DB_METADATA_DB_FILENAME GSIGNOND_CONFIG_DB_SSO \ "/MetadataDBFilename" diff --git a/include/gsignond/gsignond-config-dbus.h b/include/gsignond/gsignond-config-dbus.h index 2423b4d..a9cc13c 100644 --- a/include/gsignond/gsignond-config-dbus.h +++ b/include/gsignond/gsignond-config-dbus.h @@ -26,12 +26,52 @@ #ifndef __GSIGNOND_CONFIG_DBUS_H_ #define __GSIGNOND_CONFIG_DBUS_H_ -#define GSIGNOND_CONFIG_DBUS_TIMEOUTS "ObjectTimeouts" +/** + * SECTION:gsignond-config-dbus + * @title: DBus configuration + * @short_description: gSSO dbus configuration keys + * @include: gsignond/gsignond-config.h + * + * DBus configuration keys are defined below. See #GSignondConfig for how to use them. + */ +/** + * GSIGNOND_CONFIG_DBUS_TIMEOUTS: + * + * A prefix for dbus timeout keys. Should be used only when defining new keys. + */ +#define GSIGNOND_CONFIG_DBUS_TIMEOUTS "ObjectTimeouts" +/** + * GSIGNOND_CONFIG_DBUS_DAEMON_TIMEOUT: + * + * A timeout in seconds, after which the gSSO daemon will exit. If not set, + * the daemon will not exit. Has no effect if P2P DBus is in use. + * + * Can be overriden in debug + * builds by setting SSO_DAEMON_TIMEOUT environment variable. + */ #define GSIGNOND_CONFIG_DBUS_DAEMON_TIMEOUT GSIGNOND_CONFIG_DBUS_TIMEOUTS \ "/DaemonTimeout" +/** + * GSIGNOND_CONFIG_DBUS_IDENTITY_TIMEOUT: + * + * A timeout in seconds, after which inactive identity dbus objects will be removed. + * If not set, the dbus objects will persist. + * + * Can be overriden in debug + * builds by setting SSO_IDENTITY_TIMEOUT environment variable. + */ #define GSIGNOND_CONFIG_DBUS_IDENTITY_TIMEOUT GSIGNOND_CONFIG_DBUS_TIMEOUTS \ "/IdentityTimeout" +/** + * GSIGNOND_CONFIG_DBUS_AUTH_SESSION_TIMEOUT: + * + * A timeout in seconds, after which inactive authentication session dbus objects will be removed. + * If not set, the dbus objects will persist. + * + * Can be overriden in debug + * builds by setting SSO_AUTH_SESSION_TIMEOUT environment variable. + */ #define GSIGNOND_CONFIG_DBUS_AUTH_SESSION_TIMEOUT GSIGNOND_CONFIG_DBUS_TIMEOUTS \ "/AuthSessionTimeout" #endif /* __GSIGNOND_CONFIG_DBUS_H_ */ diff --git a/include/gsignond/gsignond-config-general.h b/include/gsignond/gsignond-config-general.h index 31419cd..7538c6a 100644 --- a/include/gsignond/gsignond-config-general.h +++ b/include/gsignond/gsignond-config-general.h @@ -26,19 +26,94 @@ #ifndef __GSIGNOND_CONFIG_GENERAL_H_ #define __GSIGNOND_CONFIG_GENERAL_H_ +/** + * SECTION:gsignond-config-general + * @title: General configuration + * @short_description: gSSO general configuration keys + * @include: gsignond/gsignond-config.h + * + * General configuration keys are defined below. See #GSignondConfig for how to use them. + */ + +/** + * GSIGNOND_CONFIG_GENERAL: + * + * A prefix for general keys. Should be used only when defining new keys. + */ #define GSIGNOND_CONFIG_GENERAL "General" +/** + * GSIGNOND_CONFIG_GENERAL_STORAGE_PATH: + * + * Base path for #GSignondStorageManager to operate in. + * + * Default value: "/var/db", can be overriden in debug + * builds by setting SSO_STORAGE_PATH environment variable. + */ #define GSIGNOND_CONFIG_GENERAL_STORAGE_PATH GSIGNOND_CONFIG_GENERAL \ "/StoragePath" +/** + * GSIGNOND_CONFIG_GENERAL_EXTENSIONS_DIR: + * + * The path where gSSO is looking for available extension modules. + * + * Default value: $(pkglibdir)/extensions, can be overriden in debug + * builds by setting SSO_EXTENSIONS_DIR environment variable. + */ #define GSIGNOND_CONFIG_GENERAL_EXTENSIONS_DIR GSIGNOND_CONFIG_GENERAL \ "/ExtensionsDir" +/** + * GSIGNOND_CONFIG_GENERAL_PLUGINS_DIR: + * + * The path where gSSO is looking for available plugins. + * + * Default value: $(pkglibdir)/plugins, can be overriden in debug + * builds by setting SSO_PLUGINS_DIR environment variable. + */ #define GSIGNOND_CONFIG_GENERAL_PLUGINS_DIR GSIGNOND_CONFIG_GENERAL \ "/PluginsDir" +/** + * GSIGNOND_CONFIG_GENERAL_BIN_DIR: + * + * The path where gSSO is looking for the gsignond-plugind binary when it needs + * to start a plugin process. Can be used for finding other supplementary binaries in + * the future. + * + * Default value: $(bindir), can be overriden in debug + * builds by setting SSO_BIN_DIR environment variable. + */ #define GSIGNOND_CONFIG_GENERAL_BIN_DIR GSIGNOND_CONFIG_GENERAL \ "/BinDir" +/** + * GSIGNOND_CONFIG_GENERAL_EXTENSION: + * + * The name of the gSSO extension to use. If not specified, the default + * implementation is used (see #GSignondExtension). + * + * Can be overriden in debug + * builds by setting SSO_EXTENSION environment variable. + */ #define GSIGNOND_CONFIG_GENERAL_EXTENSION GSIGNOND_CONFIG_GENERAL \ "/Extension" +/** + * GSIGNOND_CONFIG_GENERAL_SECURE_DIR: + * + * Path provided by #GSignondStorageManager for storing user-specific + * information, including secret and metadata databases. + * + * Value provided by the default implementation: + * #GSIGNOND_CONFIG_GENERAL_STORAGE_PATH + "/gsignond." + g_get_user_name(). + */ #define GSIGNOND_CONFIG_GENERAL_SECURE_DIR GSIGNOND_CONFIG_GENERAL \ "/SecureDir" +/** + * GSIGNOND_CONFIG_PLUGIN_TIMEOUT: + * + * A timeout in seconds, after which inactive plugin objects and processes are removed. + * If not set, the plugin objects will persist for possible reuse. + * + * Can be overriden in debug + * builds by setting SSO_PLUGIN_TIMEOUT environment variable. + */ #define GSIGNOND_CONFIG_PLUGIN_TIMEOUT GSIGNOND_CONFIG_GENERAL \ "/PluginTimeout" diff --git a/include/gsignond/gsignond-config.h b/include/gsignond/gsignond-config.h index 2b779f6..edcdaa4 100644 --- a/include/gsignond/gsignond-config.h +++ b/include/gsignond/gsignond-config.h @@ -56,6 +56,7 @@ struct _GSignondConfig struct _GSignondConfigClass { + /*< private >*/ GObjectClass parent_class; }; @@ -64,16 +65,16 @@ GType gsignond_config_get_type (void) G_GNUC_CONST; GSignondConfig * gsignond_config_new (); gint -gsignond_config_get_integer (GSignondConfig *config, const gchar *key); +gsignond_config_get_integer (GSignondConfig *self, const gchar *key); void -gsignond_config_set_integer (GSignondConfig *config, const gchar *key, +gsignond_config_set_integer (GSignondConfig *self, const gchar *key, gint value) ; const gchar* -gsignond_config_get_string (GSignondConfig *config, const gchar *key); +gsignond_config_get_string (GSignondConfig *self, const gchar *key); void -gsignond_config_set_string (GSignondConfig *config, const gchar *key, +gsignond_config_set_string (GSignondConfig *self, const gchar *key, const gchar *value); G_END_DECLS diff --git a/include/gsignond/gsignond-credentials.h b/include/gsignond/gsignond-credentials.h index 1bd009e..634845c 100644 --- a/include/gsignond/gsignond-credentials.h +++ b/include/gsignond/gsignond-credentials.h @@ -60,6 +60,7 @@ typedef struct { } GSignondCredentials; typedef struct { + /*< private >*/ GObjectClass parent_class; } GSignondCredentialsClass; diff --git a/include/gsignond/gsignond-dictionary.h b/include/gsignond/gsignond-dictionary.h index e5f951b..d34944f 100644 --- a/include/gsignond/gsignond-dictionary.h +++ b/include/gsignond/gsignond-dictionary.h @@ -41,13 +41,10 @@ G_BEGIN_DECLS typedef GHashTable GSignondDictionary; -GType -gsignond_dictionary_get_type (void); - GSignondDictionary * gsignond_dictionary_new (void); -void +GSignondDictionary * gsignond_dictionary_ref (GSignondDictionary *dict); void @@ -60,7 +57,7 @@ GSignondDictionary * gsignond_dictionary_new_from_variant (GVariant *variant); GVariant * -gsignond_dictionary_to_variant (GSignondDictionary *self); +gsignond_dictionary_to_variant (GSignondDictionary *dict); GVariant * gsignond_dictionary_get (GSignondDictionary *dict, const gchar *key); diff --git a/include/gsignond/gsignond-error.h b/include/gsignond/gsignond-error.h index aa94b29..41f0f61 100644 --- a/include/gsignond/gsignond-error.h +++ b/include/gsignond/gsignond-error.h @@ -31,92 +31,60 @@ G_BEGIN_DECLS -#define GSIGNOND_ERROR_DOMAIN "gsignond" - -/** - * GSIGNOND_ERROR: - * - */ #define GSIGNOND_ERROR (gsignond_error_quark()) typedef enum { GSIGNOND_ERROR_NONE, - GSIGNOND_ERROR_UNKNOWN = 1, /**< Catch-all for errors not distinguished by another code. */ - GSIGNOND_ERROR_INTERNAL_SERVER = 2, /**< Signon Daemon internal error. */ - GSIGNOND_ERROR_INTERNAL_COMMUNICATION = 3, /**< Communication with Signon Daemon error. */ - GSIGNOND_ERROR_PERMISSION_DENIED = 4, /**< The operation cannot be performed due to insufficient client permissions. */ - GSIGNOND_ERROR_ENCRYPTION_FAILURE, /**< Failure during data encryption/decryption. */ + GSIGNOND_ERROR_UNKNOWN = 1, + GSIGNOND_ERROR_INTERNAL_SERVER = 2, + GSIGNOND_ERROR_INTERNAL_COMMUNICATION = 3, + GSIGNOND_ERROR_PERMISSION_DENIED = 4, + GSIGNOND_ERROR_ENCRYPTION_FAILURE, GSIGNOND_ERROR_AUTH_SERVICE_ERR = 100, /* Placeholder to rearrange enumeration - AuthService specific */ - GSIGNOND_ERROR_METHOD_NOT_KNOWN, /**< The method with this name is not found. */ - GSIGNOND_ERROR_SERVICE_NOT_AVAILABLE, /**< The service is temporarily unavailable. */ - GSIGNOND_ERROR_INVALID_QUERY, /**< Parameters for the query are invalid. */ + GSIGNOND_ERROR_METHOD_NOT_KNOWN, + GSIGNOND_ERROR_SERVICE_NOT_AVAILABLE, + GSIGNOND_ERROR_INVALID_QUERY, GSIGNOND_ERROR_IDENTITY_ERR = 200, /* Placeholder to rearrange enumeration - Identity specific */ - GSIGNOND_ERROR_METHOD_NOT_AVAILABLE, /**< The requested method is not available. */ - GSIGNOND_ERROR_IDENTITY_NOT_FOUND, /**< The identity matching this Identity object was not found on the service. */ - GSIGNOND_ERROR_STORE_FAILED, /**< Storing credentials failed. */ - GSIGNOND_ERROR_REMOVE_FAILED, /**< Removing credentials failed. */ - GSIGNOND_ERROR_SIGN_OUT_FAILED, /**< SignOut failed. */ - GSIGNOND_ERROR_IDENTITY_OPERATION_CANCELED, /**< Identity operation was canceled by user. */ - GSIGNOND_ERROR_CREDENTIALS_NOT_AVAILABLE, /**< Query failed. */ - GSIGNOND_ERROR_REFERENCE_NOT_FOUND, /**< Trying to remove nonexistent reference. */ + GSIGNOND_ERROR_METHOD_NOT_AVAILABLE, + GSIGNOND_ERROR_IDENTITY_NOT_FOUND, + GSIGNOND_ERROR_STORE_FAILED, + GSIGNOND_ERROR_REMOVE_FAILED, + GSIGNOND_ERROR_SIGN_OUT_FAILED, + GSIGNOND_ERROR_IDENTITY_OPERATION_CANCELED, + GSIGNOND_ERROR_CREDENTIALS_NOT_AVAILABLE, + GSIGNOND_ERROR_REFERENCE_NOT_FOUND, GSIGNOND_ERROR_AUTH_SESSION_ERR = 300, /* Placeholder to rearrange enumeration - AuthSession/PluginInterface specific */ - GSIGNOND_ERROR_MECHANISM_NOT_AVAILABLE, /**< The requested mechanism is not available. */ - GSIGNOND_ERROR_MISSING_DATA, /**< The SessionData object does not contain necessary information. */ - GSIGNOND_ERROR_INVALID_CREDENTIALS, /**< The supplied credentials are invalid for the mechanism implementation. */ - GSIGNOND_ERROR_NOT_AUTHORIZED, /**< Authorization failed. */ - GSIGNOND_ERROR_WRONG_STATE, /**< An operation method has been called in a wrong state. */ - GSIGNOND_ERROR_OPERATION_NOT_SUPPORTED, /**< The operation is not supported by the mechanism implementation. */ - GSIGNOND_ERROR_NO_CONNECTION, /**< No Network connetion. */ - GSIGNOND_ERROR_NETWORK, /**< Network connetion failed. */ - GSIGNOND_ERROR_SSL, /**< Ssl connection failed. */ - GSIGNOND_ERROR_RUNTIME, /**< Casting SessionData into subclass failed */ - GSIGNOND_ERROR_SESSION_CANCELED, /**< Challenge was cancelled. */ - GSIGNOND_ERROR_TIMED_OUT, /**< Challenge was timed out. */ - GSIGNOND_ERROR_USER_INTERACTION, /**< User interaction dialog failed */ - GSIGNOND_ERROR_OPERATION_FAILED, /**< Temporary failure in authentication. */ - GSIGNOND_ERROR_ENCRYPTION_FAILED, /**< @deprecated Failure during data encryption/decryption. */ - GSIGNOND_ERROR_TOS_NOT_ACCEPTED, /**< User declined Terms of Service. */ - GSIGNOND_ERROR_FORGOT_PASSWORD, /**< User requested reset password sequence. */ - GSIGNOND_ERROR_METHOD_OR_MECHANISM_NOT_ALLOWED, /**< Method or mechanism not allowed for this identity. */ - GSIGNOND_ERROR_INCORRECT_DATE, /**< Date time incorrect on device. */ - - GSIGNOND_ERROR_USER_ERR = 400 /* Placeholder to rearrange enumeration - User space specific */ + GSIGNOND_ERROR_MECHANISM_NOT_AVAILABLE, + GSIGNOND_ERROR_MISSING_DATA, + GSIGNOND_ERROR_INVALID_CREDENTIALS, + GSIGNOND_ERROR_NOT_AUTHORIZED, + GSIGNOND_ERROR_WRONG_STATE, + GSIGNOND_ERROR_OPERATION_NOT_SUPPORTED, + GSIGNOND_ERROR_NO_CONNECTION, + GSIGNOND_ERROR_NETWORK, + GSIGNOND_ERROR_SSL, + GSIGNOND_ERROR_RUNTIME, + GSIGNOND_ERROR_SESSION_CANCELED, + GSIGNOND_ERROR_TIMED_OUT, + GSIGNOND_ERROR_USER_INTERACTION, + GSIGNOND_ERROR_OPERATION_FAILED, + GSIGNOND_ERROR_ENCRYPTION_FAILED, + GSIGNOND_ERROR_TOS_NOT_ACCEPTED, + GSIGNOND_ERROR_FORGOT_PASSWORD, + GSIGNOND_ERROR_METHOD_OR_MECHANISM_NOT_ALLOWED, + GSIGNOND_ERROR_INCORRECT_DATE, + + GSIGNOND_ERROR_USER_ERR = 400 } GSignondError; -#define gsignond_gerr(error, handler) \ - G_STMT_START { \ - GString* msg = gsignond_prepend_domain_to_error_msg(error); \ - handler(msg->str); \ - g_string_free(msg, TRUE); \ - } G_STMT_END\ - -#define gsignond_error_gerr(err) gsignond_gerr(err, g_error) - -#define gsignond_critical_gerr(err) gsignond_gerr(err, g_critical) - -#define gsignond_warning_gerr(err) gsignond_gerr(err, g_warning) - -#define gsignond_message_gerr(err) gsignond_gerr(err, g_message) - -#define gsignond_debug_gerr(err) gsignond_gerr(err, g_debug) - GQuark gsignond_error_quark (void); -GString* -gsignond_concat_domain_and_error ( - const gchar *str1, - const gchar *str2); - -GString* -gsignond_prepend_domain_to_error_msg ( - const GError *err); - GError * gsignond_error_new_from_variant ( GVariant *var); diff --git a/include/gsignond/gsignond-extension-interface.h b/include/gsignond/gsignond-extension-interface.h index 1299093..07a0279 100644 --- a/include/gsignond/gsignond-extension-interface.h +++ b/include/gsignond/gsignond-extension-interface.h @@ -54,7 +54,6 @@ G_BEGIN_DECLS typedef struct _GSignondExtension GSignondExtension; typedef struct _GSignondExtensionClass GSignondExtensionClass; typedef struct _GSignondExtensionPrivate GSignondExtensionPrivate; -typedef GSignondExtension * (*GSignondExtensionInit) (void); struct _GSignondExtension { @@ -66,54 +65,16 @@ struct _GSignondExtensionClass { GObjectClass parent_class; - /** - * get_extension_name: - * @self: object instance. - * - * Get human readable name of the extension. - * - * Returns: (transfer none) name of the extension. - */ const gchar * (*get_extension_name) (GSignondExtension *self); - /** - * get_extension_version: - * @self: object instance. - * - * Get version of the extension, split into four bytes in order from MSB - * to LSB; major, minor, patchlevel, build. - */ + guint32 (*get_extension_version) (GSignondExtension *self); - /** - * get_storage_manager: - * @self: object instance. - * @config: configuration object instance. - * - * Factory method to get a singleton storage manager object. - * - * Returns: storage manager object instance. - */ + GSignondStorageManager * (*get_storage_manager) (GSignondExtension *self, GSignondConfig *config); - /** - * get_secret_storage: - * @self: object instance. - * @config: configuration object instance. - * - * Factory method to get a singleton secret storage object. - * - * Returns: secret storage object instance. - */ + GSignondSecretStorage * (*get_secret_storage) (GSignondExtension *self, GSignondConfig *config); - /** - * get_access_control_manager: - * @self: object instance. - * @config: configuration object instance. - * - * Factory method to get a singleton access control manager object. - * - * Returns: access control manager object instance. - */ + GSignondAccessControlManager * (*get_access_control_manager) ( GSignondExtension *self, GSignondConfig *config); @@ -139,9 +100,6 @@ GSignondAccessControlManager * gsignond_extension_get_access_control_manager (GSignondExtension *self, GSignondConfig *config); -GSignondExtension * -default_extension_init (); - G_END_DECLS #endif /* _GSIGNOND_EXTENSION_INTERFACE_H_ */ diff --git a/include/gsignond/gsignond-log.h b/include/gsignond/gsignond-log.h index f1bac1f..65af19f 100644 --- a/include/gsignond/gsignond-log.h +++ b/include/gsignond/gsignond-log.h @@ -31,6 +31,24 @@ #include #include +/** + * SECTION:gsignond-log + * @short_description: logging facilities + * @title: Logging + * @include: gsignond/gsignond-log.h + * + * gsignond/gsignond-log.h file contains logging macros + * that plugins and extensions should use for debugging and tracing. + * + * For example: + * |[ INFO("Plugin %s initialized", plugin_mechanism); ]| + */ + +/** + * TRACEBACK: + * + * This macro prints the current function call stack to stderr. + */ #define TRACEBACK() \ { \ void *array[256];\ @@ -46,15 +64,49 @@ }\ } +/** + * INFO: + * @frmt: format string for the message + * @...: arguments for the format string + * + * Use this macro to log informational messages. GSignond will take care of + * correctly saving them. + */ #define INFO(frmt, args...) g_message("%f %s:%d %s " frmt , \ g_get_monotonic_time()*1.0e-6, __FILE__, __LINE__, \ __PRETTY_FUNCTION__, ##args) + +/** + * ERR: + * @frmt: format string for the message + * @...: arguments for the format string + * + * Use this macro to log error messages. GSignond will take care of + * correctly saving them. + */ #define ERR(frmt, args...) g_critical("%f %s:%d %s " frmt , \ g_get_monotonic_time()*1.0e-6, __FILE__, __LINE__, \ __PRETTY_FUNCTION__, ##args) + +/** + * WARN: + * @frmt: format string for the message + * @...: arguments for the format string + * + * Use this macro to log warning messages. GSignond will take care of + * correctly saving them. + */ #define WARN(frmt, args...) g_warning("%f %s:%d %s " frmt , \ g_get_monotonic_time()*1.0e-6, __FILE__, __LINE__, \ __PRETTY_FUNCTION__, ##args) +/** + * DBG: + * @frmt: format string for the message + * @...: arguments for the format string + * + * Use this macro to log debug messages. GSignond will take care of + * correctly saving them. + */ #define DBG(frmt, args...) g_debug("%f %s:%d %s " frmt , \ g_get_monotonic_time()*1.0e-6, __FILE__, __LINE__, \ __PRETTY_FUNCTION__, ##args) diff --git a/include/gsignond/gsignond-plugin-interface.h b/include/gsignond/gsignond-plugin-interface.h index 29bcdf2..82c7762 100644 --- a/include/gsignond/gsignond-plugin-interface.h +++ b/include/gsignond/gsignond-plugin-interface.h @@ -41,22 +41,6 @@ G_BEGIN_DECLS typedef struct _GSignondPlugin GSignondPlugin; /* dummy object */ typedef struct _GSignondPluginInterface GSignondPluginInterface; -/** - * GSignondPluginState: - * @GSIGNOND_PLUGIN_STATE_NONE: State unknown - * @SIGNOND_PLUGIN_STATE_RESOLVING: Resolving remote server host name - * @GSIGNOND_PLUGIN_STATE_CONNECTING: Connecting to remote server - * @GSIGNOND_PLUGIN_STATE_SENDING_DATA: Sending data to remote server - * @GSIGNOND_PLUGIN_STATE_WAITING: Waiting for reply from remote server - * @GSIGNOND_PLUGIN_STATE_USER_PENDING: Waiting for response from user - * @GSIGNOND_PLUGIN_STATE_REFRESHING: Refreshing ui request - * @GSIGNOND_PLUGIN_STATE_PROCESS_PENDING: Request has been queued - * @GSIGNOND_PLUGIN_STATE_STARTED: Request has been dequeued - * @GSIGNOND_PLUGIN_STATE_CANCELING: Canceling current process - * @GSIGNOND_PLUGIN_STATE_DONE: Process is finished - * @GSIGNOND_PLUGIN_STATE_HOLDING: Holding long non-expired token - * @GSIGNOND_PLUGIN_STATE_CUSTOM: Custom message - */ typedef enum { GSIGNOND_PLUGIN_STATE_NONE = 0, GSIGNOND_PLUGIN_STATE_RESOLVING, @@ -70,15 +54,15 @@ typedef enum { GSIGNOND_PLUGIN_STATE_CANCELING, GSIGNOND_PLUGIN_STATE_DONE, GSIGNOND_PLUGIN_STATE_HOLDING, -} PluginState; -typedef PluginState GSignondPluginState; +} GSignondPluginState; struct _GSignondPluginInterface { GTypeInterface parent; void (*cancel) (GSignondPlugin *self); void (*request_initial) (GSignondPlugin *self, - GSignondSessionData *session_data, + GSignondSessionData *session_data, + GSignondDictionary *identity_method_cache, const gchar *mechanism); void (*request) (GSignondPlugin *self, GSignondSessionData *session_data); @@ -96,6 +80,7 @@ gsignond_plugin_cancel (GSignondPlugin *self); void gsignond_plugin_request_initial (GSignondPlugin *self, GSignondSessionData *session_data, + GSignondDictionary *identity_method_cache, const gchar *mechanism); void gsignond_plugin_request (GSignondPlugin *self, @@ -116,7 +101,7 @@ gsignond_plugin_response_final (GSignondPlugin *self, GSignondSessionData *session_data); void gsignond_plugin_store (GSignondPlugin *self, - GSignondDictionary *token_data); + GSignondDictionary *identity_method_cache); void gsignond_plugin_error (GSignondPlugin *self, GError *error); void diff --git a/include/gsignond/gsignond-secret-storage.h b/include/gsignond/gsignond-secret-storage.h index f424b8f..dc9cbab 100644 --- a/include/gsignond/gsignond-secret-storage.h +++ b/include/gsignond/gsignond-secret-storage.h @@ -31,6 +31,7 @@ #include #include +#include G_BEGIN_DECLS @@ -69,113 +70,59 @@ typedef struct { typedef struct { GObjectClass parent_class; - /** - * open_db: - * - * See #gsignond_secret_storage_open_db. - */ gboolean (*open_db) (GSignondSecretStorage *self); - /** - * close_db: - * - * See #gsignond_secret_storage_close_db. - */ gboolean (*close_db) (GSignondSecretStorage *self); - /** - * clear_db: - * - * See #gsignond_secret_storage_clear_db. - */ gboolean (*clear_db) (GSignondSecretStorage *self); - /** - * is_open_db: - * - * See #gsignond_secret_storage_is_open_db. - */ gboolean (*is_open_db) (GSignondSecretStorage *self); - /** - * load_credentials: - * - * See #gsignond_secret_storage_load_credentials. - */ GSignondCredentials* (*load_credentials) ( GSignondSecretStorage *self, const guint32 id); - /** - * update_credentials: - * - * See #gsignond_secret_storage_update_credentials. - */ gboolean (*update_credentials) ( GSignondSecretStorage *self, GSignondCredentials* creds); - /** - * remove_credentials: - * - * See #gsignond_secret_storage_remove_credentials. - */ gboolean (*remove_credentials) ( GSignondSecretStorage *self, const guint32 id); - /** - * check_credentials: - * - * See #gsignond_secret_storage_check_credentials. - */ gboolean (*check_credentials) ( GSignondSecretStorage *self, GSignondCredentials* creds); - /** - * load_data: - * - * See #gsignond_secret_storage_load_data. - * - */ - GHashTable* + GSignondDictionary* (*load_data) ( GSignondSecretStorage *self, const guint32 id, const guint32 method); - /** - * update_data: - * - * See #gsignond_secret_storage_update_data. - */ gboolean (*update_data) ( GSignondSecretStorage *self, const guint32 id, const guint32 method, - GHashTable *data); + GSignondDictionary *data); - /** - * remove_data: - * - * See #gsignond_secret_storage_remove_data. - */ gboolean (*remove_data) ( GSignondSecretStorage *self, const guint32 id, const guint32 method); + const GError* + (*get_last_error) (GSignondSecretStorage *self); } GSignondSecretStorageClass; /* used by GSIGNOND_TYPE_SECRET_STORAGE */ @@ -233,17 +180,9 @@ gsignond_secret_storage_remove_data ( const guint32 id, const guint32 method); -void -gsignond_secret_storage_set_last_error (GSignondSecretStorage *self, - GError *error); - const GError* gsignond_secret_storage_get_last_error (GSignondSecretStorage *self); -void -gsignond_secret_storage_clear_last_error (GSignondSecretStorage *self); - - G_END_DECLS #endif /* __GSIGNOND_SECRET_STORAGE_H__ */ diff --git a/include/gsignond/gsignond-security-context.h b/include/gsignond/gsignond-security-context.h index 828082f..c5db7bb 100644 --- a/include/gsignond/gsignond-security-context.h +++ b/include/gsignond/gsignond-security-context.h @@ -30,24 +30,12 @@ G_BEGIN_DECLS -/** - * Security context descriptor. - * - * Practically a string tuple. - * - * @sys_ctx: system context, such as SMACK-label, MSSF token or just a - * binary path. - * @app_ctx: application context, such as a script or a web page. - */ -typedef struct _GSignondSecurityContext -{ +typedef struct _GSignondSecurityContext { gchar *sys_ctx; gchar *app_ctx; } GSignondSecurityContext; -/** - * GList of #GSignondSecurityContext items. - */ + typedef GList GSignondSecurityContextList; GSignondSecurityContext * diff --git a/include/gsignond/gsignond-session-data.h b/include/gsignond/gsignond-session-data.h index 846df47..4ca4865 100644 --- a/include/gsignond/gsignond-session-data.h +++ b/include/gsignond/gsignond-session-data.h @@ -88,11 +88,11 @@ gsignond_session_data_set_renew_token (GSignondSessionData *data, gboolean gsignond_session_data_get_ui_policy (GSignondSessionData *data, - guint32 *ui_policy); + GSignondUiPolicy *ui_policy); void gsignond_session_data_set_ui_policy (GSignondSessionData *data, - guint32 ui_policy); + GSignondUiPolicy ui_policy); const gchar * gsignond_session_data_get_network_proxy (GSignondSessionData *data); diff --git a/include/gsignond/gsignond-signonui-data.h b/include/gsignond/gsignond-signonui-data.h index e6fc74d..5846914 100644 --- a/include/gsignond/gsignond-signonui-data.h +++ b/include/gsignond/gsignond-signonui-data.h @@ -27,7 +27,6 @@ #define __GSIGNOND_SIGNONUI_DATA_H__ #include -#include G_BEGIN_DECLS @@ -41,15 +40,20 @@ G_BEGIN_DECLS typedef GSignondDictionary GSignondSignonuiData; -#define gsignond_signonui_data_new() gsignond_dictionary_new() - -#define gsignond_signonui_data_new_from_variant(variantmap) gsignond_dictionary_new_from_variant(variantmap) - -#define gsignond_signonui_data_to_variant(data) gsignond_dictionary_to_variant (data) - -#define gsignond_signonui_data_ref(data) /*gsignond_dictionary_ref*/g_hash_table_ref (data) - -#define gsignond_signonui_data_unref(data) /*gsignond_dictionary_unref*/g_hash_table_unref (data); +typedef enum { + SIGNONUI_ERROR_NONE = 0, + SIGNONUI_ERROR_GENERAL, + SIGNONUI_ERROR_NO_SIGNONUI, + SIGNONUI_ERROR_BAD_PARAMETERS, + SIGNONUI_ERROR_CANCELED, + SIGNONUI_ERROR_NOT_AVAILABLE, + SIGNONUI_ERROR_BAD_URL, + SIGNONUI_ERROR_BAD_CAPTCHA, + SIGNONUI_ERROR_BAD_CAPTCHA_URL, + SIGNONUI_ERROR_REFRESH_FAILED, + SIGNONUI_ERROR_FORBIDDEN, + SIGNONUI_ERROR_FORGOT_PASSWORD +} GSignondSignonuiError; const gchar* gsignond_signonui_data_get_captcha_response (GSignondSignonuiData *data); @@ -77,12 +81,11 @@ gsignond_signonui_data_get_final_url (GSignondSignonuiData *data); void gsignond_signonui_data_set_final_url (GSignondSignonuiData *data, const gchar *url); -gboolean -gsignond_signonui_data_get_forgot_password (GSignondSignonuiData *data, - gboolean *forgot_password); +const gchar* +gsignond_signonui_data_get_forgot_password (GSignondSignonuiData *data); void gsignond_signonui_data_set_forgot_password (GSignondSignonuiData *data, - gboolean forgot); + const gchar *forgot); const gchar* gsignond_signonui_data_get_forgot_password_url (GSignondSignonuiData *data); void @@ -123,7 +126,7 @@ gsignond_signonui_data_set_query_username (GSignondSignonuiData *data, gboolean query); gboolean gsignond_signonui_data_get_remember_password (GSignondSignonuiData *data, - gboolean *query_password); + gboolean *remember_password); void gsignond_signonui_data_set_remember_password (GSignondSignonuiData *data, gboolean remember); diff --git a/include/gsignond/gsignond-storage-manager.h b/include/gsignond/gsignond-storage-manager.h index a5b7eba..0b0d42e 100644 --- a/include/gsignond/gsignond-storage-manager.h +++ b/include/gsignond/gsignond-storage-manager.h @@ -65,41 +65,11 @@ struct _GSignondStorageManagerClass { GObjectClass parent_class; - /** - * initialize_storage: - * - * See #gsignond_storage_manager_initialize_storage. - */ gboolean (*initialize_storage) (GSignondStorageManager *self); - /** - * delete_storage: - * - * See #gsignond_storage_manager_delete_storage. - */ gboolean (*delete_storage) (GSignondStorageManager *self); - /** - * storage_is_initialized: - * - * See #gsignond_storage_manager_storage_is_initialized. - */ gboolean (*storage_is_initialized) (GSignondStorageManager *self); - /** - * mount_filesystem: - * - * See #gsignond_storage_manager_mount_filesystem. - */ const gchar * (*mount_filesystem) (GSignondStorageManager *self); - /** - * unmount_filesystem: - * - * See #gsignond_storage_manager_unmount_filesystem. - */ gboolean (*unmount_filesystem) (GSignondStorageManager *self); - /** - * filesystem_is_mounted: - * - * See #gsignond_storage_manager_filesystem_is_mounted. - */ gboolean (*filesystem_is_mounted) (GSignondStorageManager *self); }; diff --git a/include/gsignond/gsignond-utils.h b/include/gsignond/gsignond-utils.h index 5334732..66c0202 100644 --- a/include/gsignond/gsignond-utils.h +++ b/include/gsignond/gsignond-utils.h @@ -31,10 +31,13 @@ G_BEGIN_DECLS gboolean -gsignond_wipe_file (const gchar *); +gsignond_wipe_file (const gchar *filename); gboolean -gsignond_wipe_directory (const gchar *); +gsignond_wipe_directory (const gchar *dirname); + +gchar * +gsignond_generate_nonce (); G_END_DECLS diff --git a/m4/gtk-doc.m4 b/m4/gtk-doc.m4 new file mode 100644 index 0000000..ac2eccb --- /dev/null +++ b/m4/gtk-doc.m4 @@ -0,0 +1,71 @@ +dnl -*- mode: autoconf -*- + +# serial 1 + +dnl Usage: +dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) +AC_DEFUN([GTK_DOC_CHECK], +[ + AC_REQUIRE([PKG_PROG_PKG_CONFIG]) + AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first + AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first + + dnl check for tools we added during development + AC_PATH_PROG([GTKDOC_CHECK],[gtkdoc-check]) + AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true]) + AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf]) + + dnl for overriding the documentation installation directory + AC_ARG_WITH([html-dir], + AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),, + [with_html_dir='${datadir}/gtk-doc/html']) + HTML_DIR="$with_html_dir" + AC_SUBST([HTML_DIR]) + + dnl enable/disable documentation building + AC_ARG_ENABLE([gtk-doc], + AS_HELP_STRING([--enable-gtk-doc], + [use gtk-doc to build documentation [[default=no]]]),, + [enable_gtk_doc=no]) + + if test x$enable_gtk_doc = xyes; then + ifelse([$1],[], + [PKG_CHECK_EXISTS([gtk-doc],, + AC_MSG_ERROR([gtk-doc not installed and --enable-gtk-doc requested]))], + [PKG_CHECK_EXISTS([gtk-doc >= $1],, + AC_MSG_ERROR([You need to have gtk-doc >= $1 installed to build $PACKAGE_NAME]))]) + dnl don't check for glib if we build glib + if test "x$PACKAGE_NAME" != "xglib"; then + dnl don't fail if someone does not have glib + PKG_CHECK_MODULES(GTKDOC_DEPS, glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0,,[:]) + fi + fi + + AC_MSG_CHECKING([whether to build gtk-doc documentation]) + AC_MSG_RESULT($enable_gtk_doc) + + dnl enable/disable output formats + AC_ARG_ENABLE([gtk-doc-html], + AS_HELP_STRING([--enable-gtk-doc-html], + [build documentation in html format [[default=yes]]]),, + [enable_gtk_doc_html=yes]) + AC_ARG_ENABLE([gtk-doc-pdf], + AS_HELP_STRING([--enable-gtk-doc-pdf], + [build documentation in pdf format [[default=no]]]),, + [enable_gtk_doc_pdf=no]) + + if test -z "$GTKDOC_MKPDF"; then + enable_gtk_doc_pdf=no + fi + + if test -z "$AM_DEFAULT_VERBOSITY"; then + AM_DEFAULT_VERBOSITY=1 + fi + AC_SUBST([AM_DEFAULT_VERBOSITY]) + + AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes]) + AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes]) + AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes]) + AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"]) + AM_CONDITIONAL([GTK_DOC_USE_REBASE], [test -n "$GTKDOC_REBASE"]) +]) diff --git a/packaging/gsignond.changes b/packaging/gsignond.changes index 422e3d1..0fc9fd8 100644 --- a/packaging/gsignond.changes +++ b/packaging/gsignond.changes @@ -1,3 +1,8 @@ +* Thu Aug 22 2013 Amarnath Valluri +- Release 0.0.3 +- Bug fixes in UI interaction +- Documentation support + * Mon Jun 24 2013 Imran Zaman - Release 0.0.2 that comprises of bug fixes diff --git a/packaging/gsignond.spec b/packaging/gsignond.spec index f5fa51d..8ee6300 100644 --- a/packaging/gsignond.spec +++ b/packaging/gsignond.spec @@ -6,11 +6,12 @@ Name: gsignond Summary: GLib based Single Sign-On daemon -Version: 0.0.2 -Release: 9 +Version: 0.0.3 +Release: 1 Group: System/Daemons -License: LGPL +License: LGPL-2.1+ Source: %{name}-%{version}.tar.gz +Provides: gsignon %if %{dbus_type} != "p2p" Requires: dbus-1 %endif @@ -38,6 +39,15 @@ Requires: %{name} = %{version}-%{release} %{summary}. +%package doc +Summary: Documentation files for %{name} +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description doc +%{summary}. + + %prep %setup -q -n %{name}-%{version} if [ -f = "gtk-doc.make" ] @@ -66,6 +76,7 @@ rm -rf %{buildroot} %post /sbin/ldconfig chmod u+s %{_bindir}/%{name} +groupadd -f -r gsignond %postun -p /sbin/ldconfig @@ -82,6 +93,7 @@ chmod u+s %{_bindir}/%{name} %if %{dbus_type} != "p2p" %{_datadir}/dbus-1/services/*SingleSignOn*.service %endif +%config(noreplace) %{_sysconfdir}/gsignond.conf %files devel @@ -93,3 +105,8 @@ chmod u+s %{_bindir}/%{name} %{_datadir}/dbus-1/interfaces/*SSO*.xml %endif + +%files doc +%defattr(-,root,root,-) +%{_datadir}/gtk-doc/html/gsignond/* + diff --git a/src/Makefile.in b/src/Makefile.in index ea93f09..270afdc 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -15,6 +15,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -37,9 +54,10 @@ subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -61,6 +79,11 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ @@ -441,13 +464,10 @@ distdir: $(DISTFILES) done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ diff --git a/src/common/Makefile.am b/src/common/Makefile.am index 38ac909..b89d47e 100644 --- a/src/common/Makefile.am +++ b/src/common/Makefile.am @@ -13,16 +13,16 @@ BUILT_SOURCES = \ GSIGNOND_INCLUDE_DIR=$(top_srcdir)/include/gsignond gsignond-plugin-enum-types.h: gsignond-enum.h.template $(GSIGNOND_INCLUDE_DIR)/gsignond-plugin-interface.h - $(GLIB_MKENUMS) --template gsignond-enum.h.template \ - --fhead "#ifndef GSIGNOND_PLUGIN_ENUM_TYPES_H_\n#define GSIGNOND_PLUGIND_ENUM_TYPES_H_\n\n#include \n\nG_BEGIN_DECLS" \ - --identifier-prefix gsignond \ + $(GLIB_MKENUMS) --template $(srcdir)/gsignond-enum.h.template \ + --fhead "#ifndef GSIGNOND_PLUGIN_ENUM_TYPES_H_\n#define GSIGNOND_PLUGIN_ENUM_TYPES_H_\n\n#include \n\nG_BEGIN_DECLS" \ + --identifier-prefix GSignond \ --ftail "\nG_END_DECLS\n\n#endif\n" \ $(GSIGNOND_INCLUDE_DIR)/gsignond-plugin-interface.h > $@ gsignond-plugin-enum-types.c: gsignond-enum.c.template $(GSIGNOND_INCLUDE_DIR)/gsignond-plugin-interface.h - $(GLIB_MKENUMS) --template gsignond-enum.c.template \ + $(GLIB_MKENUMS) --template $(srcdir)/gsignond-enum.c.template \ --fhead "#include \"gsignond-plugin-enum-types.h\"\n" \ - --identifier-prefix gsignond \ + --identifier-prefix GSignond \ $(GSIGNOND_INCLUDE_DIR)/gsignond-plugin-interface.h > $@ @@ -30,6 +30,7 @@ libgsignond_common_la_CPPFLAGS = \ -I$(top_builddir) \ -I$(top_srcdir)/src \ -I$(top_srcdir)/include \ + -I. \ $(GSIGNOND_CFLAGS) \ -DGSIGNOND_PLUGINS_DIR='"$(pluginsdir)"' \ -DGSIGNOND_EXTENSIONS_DIR='"$(extensionsdir)"' \ @@ -51,6 +52,7 @@ libgsignond_common_la_SOURCES = \ gsignond-access-control-manager.c \ gsignond-extension-interface.c \ gsignond-storage-manager.c \ + gsignond-identity-info.h \ gsignond-identity-info-internal.h \ gsignond-identity-info.c \ gsignond-credentials.c \ @@ -75,5 +77,7 @@ dist_libgsignond_common_la_SOURCES = \ gsignond-enum.h.template \ $(NULL) -CLEANFILES = - +CLEANFILES = \ + gsignond-plugin-enum-types.h \ + gsignond-plugin-enum-types.c \ + $(NULL) diff --git a/src/common/Makefile.in b/src/common/Makefile.in index a166acb..ddf1481 100644 --- a/src/common/Makefile.in +++ b/src/common/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -16,6 +16,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -39,9 +56,10 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ subdir = src/common ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -142,6 +160,11 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ @@ -329,6 +352,7 @@ libgsignond_common_la_CPPFLAGS = \ -I$(top_builddir) \ -I$(top_srcdir)/src \ -I$(top_srcdir)/include \ + -I. \ $(GSIGNOND_CFLAGS) \ -DGSIGNOND_PLUGINS_DIR='"$(pluginsdir)"' \ -DGSIGNOND_EXTENSIONS_DIR='"$(extensionsdir)"' \ @@ -350,6 +374,7 @@ libgsignond_common_la_SOURCES = \ gsignond-access-control-manager.c \ gsignond-extension-interface.c \ gsignond-storage-manager.c \ + gsignond-identity-info.h \ gsignond-identity-info-internal.h \ gsignond-identity-info.c \ gsignond-credentials.c \ @@ -374,7 +399,11 @@ dist_libgsignond_common_la_SOURCES = \ gsignond-enum.h.template \ $(NULL) -CLEANFILES = +CLEANFILES = \ + gsignond-plugin-enum-types.h \ + gsignond-plugin-enum-types.c \ + $(NULL) + all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive @@ -413,7 +442,6 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ @@ -421,6 +449,8 @@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) else :; fi; \ done; \ test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } @@ -785,13 +815,10 @@ distdir: $(DISTFILES) done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ @@ -946,16 +973,16 @@ uninstall-am: uninstall-libLTLIBRARIES gsignond-plugin-enum-types.h: gsignond-enum.h.template $(GSIGNOND_INCLUDE_DIR)/gsignond-plugin-interface.h - $(GLIB_MKENUMS) --template gsignond-enum.h.template \ - --fhead "#ifndef GSIGNOND_PLUGIN_ENUM_TYPES_H_\n#define GSIGNOND_PLUGIND_ENUM_TYPES_H_\n\n#include \n\nG_BEGIN_DECLS" \ - --identifier-prefix gsignond \ + $(GLIB_MKENUMS) --template $(srcdir)/gsignond-enum.h.template \ + --fhead "#ifndef GSIGNOND_PLUGIN_ENUM_TYPES_H_\n#define GSIGNOND_PLUGIN_ENUM_TYPES_H_\n\n#include \n\nG_BEGIN_DECLS" \ + --identifier-prefix GSignond \ --ftail "\nG_END_DECLS\n\n#endif\n" \ $(GSIGNOND_INCLUDE_DIR)/gsignond-plugin-interface.h > $@ gsignond-plugin-enum-types.c: gsignond-enum.c.template $(GSIGNOND_INCLUDE_DIR)/gsignond-plugin-interface.h - $(GLIB_MKENUMS) --template gsignond-enum.c.template \ + $(GLIB_MKENUMS) --template $(srcdir)/gsignond-enum.c.template \ --fhead "#include \"gsignond-plugin-enum-types.h\"\n" \ - --identifier-prefix gsignond \ + --identifier-prefix GSignond \ $(GSIGNOND_INCLUDE_DIR)/gsignond-plugin-interface.h > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/src/common/db/Makefile.in b/src/common/db/Makefile.in index fca2c67..6faf597 100644 --- a/src/common/db/Makefile.in +++ b/src/common/db/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -16,6 +16,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -38,9 +55,10 @@ subdir = src/common/db DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -89,6 +107,11 @@ am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgsignond_common_db_la_SOURCES) DIST_SOURCES = $(libgsignond_common_db_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) diff --git a/src/common/db/gsignond-db-error.h b/src/common/db/gsignond-db-error.h index 13a1b83..bd4bf11 100644 --- a/src/common/db/gsignond-db-error.h +++ b/src/common/db/gsignond-db-error.h @@ -31,10 +31,6 @@ G_BEGIN_DECLS -/** - * GSIGNOND_DB_ERROR: - * - */ #define GSIGNOND_DB_ERROR (gsignond_db_error_quark()) typedef enum { diff --git a/src/common/db/gsignond-db-secret-database.c b/src/common/db/gsignond-db-secret-database.c index 51fa0da..b723539 100644 --- a/src/common/db/gsignond-db-secret-database.c +++ b/src/common/db/gsignond-db-secret-database.c @@ -81,11 +81,23 @@ _gsignond_db_read_key_value ( GSignondDictionary* data) { const gchar *key = NULL; + gpointer v_data = 0; GVariant *value = NULL; + const GVariantType *type; + gsize type_len ; + gsize size = (gsize) sqlite3_column_bytes(stmt, 1); + + type = (const GVariantType *)sqlite3_column_blob(stmt, 1) ; + type_len = g_variant_type_get_string_length (type) + 1; + + size -= type_len; + v_data = g_new0(gconstpointer, size); + mempcpy(v_data, sqlite3_column_blob(stmt, 1) + type_len, size); + key = (const gchar *)sqlite3_column_text (stmt, 0); - value = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, - (gconstpointer) sqlite3_column_blob(stmt, 1), - (gsize) sqlite3_column_bytes(stmt, 1), sizeof(guchar)); + value = g_variant_new_from_data (type, + (gconstpointer)v_data, size, + TRUE, (GDestroyNotify)g_free, v_data); gsignond_dictionary_set (data, key, value); return TRUE; @@ -125,8 +137,8 @@ gsignond_db_secret_database_init (GSignondDbSecretDatabase *self) * gsignond_db_secret_database_new: * * Creates new #GSignondDbSecretDatabase object - * Returns : (transfer full) the #GSignondDbSecretDatabase object * + * Returns: (transfer full): the #GSignondDbSecretDatabase object */ GSignondDbSecretDatabase * gsignond_db_secret_database_new () @@ -350,7 +362,9 @@ gsignond_db_secret_database_update_data ( g_hash_table_iter_init (&iter, data); while (g_hash_table_iter_next (&iter,(gpointer *) &key, (gpointer *) &value)) { - data_counter = data_counter + strlen (key) + g_variant_get_size(value); + data_counter = data_counter + strlen (key) + + g_variant_type_get_string_length (g_variant_get_type (value)) + 1 + + g_variant_get_size(value); if (data_counter >= GSIGNOND_DB_MAX_DATA_STORAGE) { gsignond_db_sql_database_rollback_transaction (parent); DBG ("size limit is exceeded"); @@ -366,7 +380,9 @@ gsignond_db_secret_database_update_data ( while (g_hash_table_iter_next (&iter, (gpointer *)&key, (gpointer *) &value )) { gsize val_size; - gconstpointer value_data; + const gchar *val_type; + gsize val_type_length; + gpointer value_data; sqlite3_stmt *sql_stmt; ret = sqlite3_prepare_v2 (parent->priv->db, statement, -1, @@ -377,13 +393,19 @@ gsignond_db_secret_database_update_data ( gsignond_db_sql_database_rollback_transaction (parent); return FALSE; } - value_data = g_variant_get_data (value); + val_type = g_variant_get_type_string(value); + val_type_length = g_variant_type_get_string_length ( + (const GVariantType *)val_type) + 1; val_size = g_variant_get_size (value); + value_data = g_new0(gconstpointer, val_size + val_type_length); + sprintf ((gchar*)value_data, "%s", val_type); + memcpy(value_data + val_type_length, g_variant_get_data (value), val_size); + sqlite3_bind_int(sql_stmt, 1, (int)id); sqlite3_bind_int(sql_stmt, 2, (int)method); sqlite3_bind_text(sql_stmt, 3, key, -1, SQLITE_STATIC); - sqlite3_bind_blob(sql_stmt, 4, value_data, (int)val_size, SQLITE_STATIC); + sqlite3_bind_blob(sql_stmt, 4, value_data, (int)val_size + val_type_length, g_free); ret = sqlite3_step (sql_stmt); if (G_UNLIKELY (ret != SQLITE_DONE)) { diff --git a/src/common/db/gsignond-db-sql-database.c b/src/common/db/gsignond-db-sql-database.c index caddd98..0ba63be 100644 --- a/src/common/db/gsignond-db-sql-database.c +++ b/src/common/db/gsignond-db-sql-database.c @@ -356,7 +356,7 @@ gsignond_db_sql_database_clear (GSignondDbSqlDatabase *self) * * Prepares the statement from the query. * - * Returns: (transfer full) NULL if fails, valid sql statement otherwise. + * Returns: (transfer full): NULL if fails, valid sql statement otherwise. */ sqlite3_stmt * gsignond_db_sql_database_prepare_statement ( @@ -382,7 +382,7 @@ gsignond_db_sql_database_prepare_statement ( /** * gsignond_db_sql_database_exec: * @self: instance of #GSignondDbSqlDatabase - * @stmts: sql statements to be executed on the database + * @statements: sql statements to be executed on the database * * Executes SQL statements. transaction begin and commit statements should be * explicitly called if needed. @@ -462,7 +462,7 @@ _gsignond_db_read_string ( * * Executes an SQL statement, and returns the fetched integer from the result. * - * Returns: (transfer full) string if rows fetched are greater than 0, + * Returns: (transfer full): string if rows fetched are greater than 0, * NULL otherwise. */ gchar * @@ -507,7 +507,7 @@ _gsignond_db_read_strings ( * Executes an SQL statement, and returns the fetched strings from the results * in the list. * - * Returns: (transfer full) list if rows fetched are greater than 0, + * Returns: (transfer full): list if rows fetched are greater than 0, * NULL otherwise. When done with list, it must be freed using * g_list_free_full (list, g_free) */ @@ -554,7 +554,7 @@ _gsignond_db_read_string_tuple ( * Executes an SQL statement, and returns the fetched string tuples from * the results into the hash table. * - * Returns: (transfer full) string tuples if rows fetched are greater than 0, + * Returns: (transfer full): string tuples if rows fetched are greater than 0, * NULL otherwise. When done with tuples, it must be freed using * g_hash_table_unref (tuples) */ @@ -609,7 +609,7 @@ _gsignond_db_read_int_string_tuple ( * Executes an SQL statement, and returns the fetched int-string tuples from * the results into the hash table. * - * Returns: (transfer full) string tuples if rows fetched are greater than 0, + * Returns: (transfer full): string tuples if rows fetched are greater than 0, * NULL otherwise. */ GHashTable * @@ -702,7 +702,7 @@ _gsignond_db_read_array ( * Executes an SQL statement, and returns the fetched integers from the results * in the array. * - * Returns: (transfer full) list if rows fetched are greater than 0, NULL otherwise. + * Returns: (transfer full): list if rows fetched are greater than 0, NULL otherwise. */ GArray * gsignond_db_sql_database_query_exec_int_array ( @@ -732,7 +732,7 @@ gsignond_db_sql_database_query_exec_int_array ( /** * gsignond_db_sql_database_query_exec_stmt: * @self: instance of #GSignondDbSqlDatabase - * @sql_stmt: (transfer full) sql statement executed on the database + * @sql_stmt: (transfer full): sql statement executed on the database * @callback: callback to be invoked if not NULL for the result of each row * @userdata: user_data to be relayed back through the callback * @@ -947,7 +947,7 @@ gsignond_db_sql_database_get_db_version ( /** * gsignond_db_sql_database_set_last_error: * @self: instance of #GSignondDbDefaultStorage - * @error: (transfer full) last occurred #GError + * @error: (transfer full): last occurred #GError * * sets the last occurred error * diff --git a/src/common/db/gsignond-secret-storage.c b/src/common/db/gsignond-secret-storage.c index 90209fa..97e021d 100644 --- a/src/common/db/gsignond-secret-storage.c +++ b/src/common/db/gsignond-secret-storage.c @@ -29,6 +29,26 @@ #include "gsignond/gsignond-log.h" #include "gsignond/gsignond-secret-storage.h" +/** + * SECTION:gsignond-secret-storage + * @short_description: provides access to the database that stores user credentials and identity/method cache + * @include: gsignond/gsignond-secret-storage.h + * + * #GSignondSecretStorage provides access to the database where sensitive identity + * data (#GSignondCredentials) and identity/method cache are stored. It's preferred + * that this database is protected against access by processes other than gSSO. + * + * gSSO can be configured to use a custom extension + * that provides a subclassed implementation of #GSignondSecretStorage + * (see #GSignondExtension), otherwise a default implementation is used. + * + */ +/** + * GSignondSecretStorage: + * + * Opaque #GSignondSecretStorage data structure. + */ + #define GSIGNOND_SECRET_STORAGE_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE ((obj),\ GSIGNOND_TYPE_SECRET_STORAGE, \ @@ -105,62 +125,8 @@ _gsignond_secret_storage_dispose (GObject *gobject) gobject); } -static void -gsignond_secret_storage_class_init (GSignondSecretStorageClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->set_property = _set_property; - gobject_class->get_property = _get_property; - gobject_class->dispose = _gsignond_secret_storage_dispose; - - properties[PROP_CONFIG] = g_param_spec_object ("config", - "config", - "Configuration object", - GSIGNOND_TYPE_CONFIG, - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS); - g_object_class_install_properties (gobject_class, N_PROPERTIES, properties); - - /* virtual methods */ - klass->open_db = gsignond_secret_storage_open_db; - klass->close_db = gsignond_secret_storage_close_db; - klass->clear_db = gsignond_secret_storage_clear_db; - klass->is_open_db = gsignond_secret_storage_is_open_db; - klass->load_credentials = - gsignond_secret_storage_load_credentials; - klass->update_credentials = - gsignond_secret_storage_update_credentials; - klass->remove_credentials = - gsignond_secret_storage_remove_credentials; - klass->load_data = gsignond_secret_storage_load_data; - klass->update_data = gsignond_secret_storage_update_data; - klass->remove_data = gsignond_secret_storage_remove_data; - - g_type_class_add_private (klass, sizeof (GSignondSecretStoragePrivate)); -} - -static void -gsignond_secret_storage_init (GSignondSecretStorage *self) -{ - self->priv = GSIGNOND_SECRET_STORAGE_GET_PRIVATE (self); - self->priv->database = gsignond_db_secret_database_new (); - self->config = NULL; -} - -/** - * gsignond_secret_storage_open_db: - * - * @self: instance of #GSignondSecretStorage - * - * Opens (and initializes) DB. The implementation should take - * care of creating the DB, if it doesn't exist. - * - * Returns: TRUE if successful, FALSE otherwise. - */ -gboolean -gsignond_secret_storage_open_db (GSignondSecretStorage *self) +static gboolean +_open_db (GSignondSecretStorage *self) { const gchar *dir = NULL; const gchar *filename = NULL; @@ -211,71 +177,268 @@ gsignond_secret_storage_open_db (GSignondSecretStorage *self) return TRUE; } +static gboolean +_close_db (GSignondSecretStorage *self) +{ + g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); + + if (self->priv->database != NULL) { + gsignond_db_sql_database_close (GSIGNOND_DB_SQL_DATABASE ( + self->priv->database)); + } + return TRUE; +} + +static gboolean +_clear_db (GSignondSecretStorage *self) +{ + g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); + return gsignond_db_sql_database_clear (GSIGNOND_DB_SQL_DATABASE ( + self->priv->database)); +} + +static gboolean +_is_open_db (GSignondSecretStorage *self) +{ + g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); + return ((self->priv->database != NULL) && + gsignond_db_sql_database_is_open (GSIGNOND_DB_SQL_DATABASE ( + self->priv->database))); +} + +static GSignondCredentials* +_load_credentials ( + GSignondSecretStorage *self, + const guint32 id) +{ + g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); + return gsignond_db_secret_database_load_credentials (self->priv->database, + id); +} + +static gboolean +_update_credentials ( + GSignondSecretStorage *self, + GSignondCredentials *creds) +{ + g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); + return gsignond_db_secret_database_update_credentials (self->priv->database, + creds); +} + +static gboolean +_remove_credentials ( + GSignondSecretStorage *self, + const guint32 id) +{ + g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); + return gsignond_db_secret_database_remove_credentials (self->priv->database, + id); +} + +static gboolean +_check_credentials ( + GSignondSecretStorage *self, + GSignondCredentials *creds) +{ + gboolean equal = FALSE; + GSignondCredentials *stored_creds = NULL; + + g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); + g_return_val_if_fail (creds != NULL, FALSE); + + GSignondSecretStorageClass *klass = + GSIGNOND_SECRET_STORAGE_GET_CLASS (self); + + stored_creds = klass->load_credentials (self, + gsignond_credentials_get_id(creds)); + + if (stored_creds) { + DBG ("Credentials from DB found"); + equal = gsignond_credentials_equal(creds, stored_creds); + g_object_unref (stored_creds); + } + + return equal; +} + +static GHashTable* +_load_data ( + GSignondSecretStorage *self, + const guint32 id, + const guint32 method) +{ + g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), NULL); + return gsignond_db_secret_database_load_data (self->priv->database, + id, method); +} + +static gboolean +_update_data ( + GSignondSecretStorage *self, + const guint32 id, + const guint32 method, + GHashTable *data) +{ + g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); + return gsignond_db_secret_database_update_data (self->priv->database, + id, method, data); +} + +static gboolean +_remove_data ( + GSignondSecretStorage *self, + const guint32 id, + const guint32 method) +{ + g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); + return gsignond_db_secret_database_remove_data (self->priv->database, + id, method); +} + +static const GError * +_get_last_error (GSignondSecretStorage *self) +{ + g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), NULL); + if (self->priv->database != NULL) { + return gsignond_db_sql_database_get_last_error ( + GSIGNOND_DB_SQL_DATABASE (self->priv->database)); + } + return NULL; +} + + + /** - * gsignond_secret_storage_close_db: + * GSignondSecretStorageClass: + * @parent_class: parent class. + * @open_db: an implementation of gsignond_secret_storage_open_db() + * @close_db: an implementation of gsignond_secret_storage_close_db() + * @clear_db: an implementation of gsignond_secret_storage_clear_db() + * @is_open_db: an implementation of gsignond_secret_storage_is_open_db() + * @load_credentials: an implementation of gsignond_secret_storage_load_credentials() + * @update_credentials: an implementation of gsignond_secret_storage_update_credentials() + * @remove_credentials: an implementation of gsignond_secret_storage_remove_credentials() + * @check_credentials: an implementation of gsignond_secret_storage_check_credentials() + * @load_data: an implementation of gsignond_secret_storage_load_data() + * @update_data: an implementation of gsignond_secret_storage_update_data() + * @remove_data: an implementation of gsignond_secret_storage_remove_data() + * @get_last_error: an implementation of gsignond_secret_storage_get_last_error() + * + * #GSignondSecretStorageClass class containing pointers to class methods. + */ +static void +gsignond_secret_storage_class_init (GSignondSecretStorageClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = _set_property; + gobject_class->get_property = _get_property; + gobject_class->dispose = _gsignond_secret_storage_dispose; + + properties[PROP_CONFIG] = g_param_spec_object ("config", + "config", + "Configuration object", + GSIGNOND_TYPE_CONFIG, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (gobject_class, N_PROPERTIES, properties); + + /* virtual methods */ + klass->open_db = _open_db; + klass->close_db = _close_db; + klass->clear_db = _clear_db; + klass->is_open_db = _is_open_db; + klass->load_credentials = _load_credentials; + klass->update_credentials = _update_credentials; + klass->remove_credentials = _remove_credentials; + klass->check_credentials = _check_credentials; + klass->load_data = _load_data; + klass->update_data = _update_data; + klass->remove_data = _remove_data; + klass->get_last_error = _get_last_error; + + g_type_class_add_private (klass, sizeof (GSignondSecretStoragePrivate)); +} + +static void +gsignond_secret_storage_init (GSignondSecretStorage *self) +{ + self->priv = GSIGNOND_SECRET_STORAGE_GET_PRIVATE (self); + self->priv->database = gsignond_db_secret_database_new (); + self->config = NULL; +} + +/** + * gsignond_secret_storage_open_db: + * @self: instance of #GSignondSecretStorage * + * Opens (and initializes) the database. The implementation should take + * care of creating the DB, if it doesn't exist, and it should use + * #GSIGNOND_CONFIG_GENERAL_SECURE_DIR and #GSIGNOND_CONFIG_DB_SECRET_DB_FILENAME + * to determine database location in the filesystem. + * + * The default implementation is using SQLite for the storage. + * + * Returns: TRUE if successful, FALSE otherwise. + */ +gboolean +gsignond_secret_storage_open_db (GSignondSecretStorage *self) +{ + return GSIGNOND_SECRET_STORAGE_GET_CLASS (self)->open_db (self); +} + +/** + * gsignond_secret_storage_close_db: * @self: instance of #GSignondSecretStorage * - * Closes the secrets DB. To reopen it, call open_db(). + * Closes the database. To reopen it, call gsignond_secret_storage_open_db(). * * Returns: TRUE if successful, FALSE otherwise. */ gboolean gsignond_secret_storage_close_db (GSignondSecretStorage *self) { - g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); - - if (self->priv->database != NULL) { - gsignond_db_sql_database_close (GSIGNOND_DB_SQL_DATABASE ( - self->priv->database)); - } - return TRUE; + return GSIGNOND_SECRET_STORAGE_GET_CLASS (self)->close_db (self); } /** * gsignond_secret_storage_clear_db: - * * @self: instance of #GSignondSecretStorage * - * Removes all stored secrets. + * Removes all stored secrets from the database. * * Returns: TRUE if successful, FALSE otherwise. */ gboolean gsignond_secret_storage_clear_db (GSignondSecretStorage *self) { - g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); - return gsignond_db_sql_database_clear (GSIGNOND_DB_SQL_DATABASE ( - self->priv->database)); + return GSIGNOND_SECRET_STORAGE_GET_CLASS (self)->clear_db (self); } /** * gsignond_secret_storage_is_open_db: - * * @self: instance of #GSignondSecretStorage * - * Checks if the db is open or not. + * Checks if the database is open or not. * * Returns: TRUE if successful, FALSE otherwise. */ gboolean gsignond_secret_storage_is_open_db (GSignondSecretStorage *self) { - g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); - return ((self->priv->database != NULL) && - gsignond_db_sql_database_is_open (GSIGNOND_DB_SQL_DATABASE ( - self->priv->database))); + return GSIGNOND_SECRET_STORAGE_GET_CLASS (self)->is_open_db (self); } /** * gsignond_secret_storage_load_credentials: - * * @self: instance of #GSignondSecretStorage - * @id: the identity whose credentials are being loaded. + * @id: the identity id whose credentials are being loaded. * - * Loads the credentials. + * Loads the credentials from the database. * - * Returns: (transfer full) #GSignondCredentials if successful, + * Returns: (transfer full): #GSignondCredentials if successful, * NULL otherwise. */ GSignondCredentials* @@ -283,16 +446,13 @@ gsignond_secret_storage_load_credentials ( GSignondSecretStorage *self, const guint32 id) { - g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); - return gsignond_db_secret_database_load_credentials (self->priv->database, - id); + return GSIGNOND_SECRET_STORAGE_GET_CLASS (self)->load_credentials (self, id); } /** * gsignond_secret_storage_update_credentials: - * * @self: instance of #GSignondSecretStorage - * @creds: (transfer none) the credentials that are being updated. + * @creds: (transfer none): the credentials that are being updated. * * Stores/updates the credentials for the given identity. * @@ -303,14 +463,11 @@ gsignond_secret_storage_update_credentials ( GSignondSecretStorage *self, GSignondCredentials *creds) { - g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); - return gsignond_db_secret_database_update_credentials (self->priv->database, - creds); + return GSIGNOND_SECRET_STORAGE_GET_CLASS (self)->update_credentials (self, creds); } /** * gsignond_secret_storage_remove_credentials: - * * @self: instance of #GSignondSecretStorage * @id: the identity whose credentials are being updated. * @@ -323,19 +480,15 @@ gsignond_secret_storage_remove_credentials ( GSignondSecretStorage *self, const guint32 id) { - g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); - return gsignond_db_secret_database_remove_credentials (self->priv->database, - id); + return GSIGNOND_SECRET_STORAGE_GET_CLASS (self)->remove_credentials (self, id); } /** * gsignond_secret_storage_check_credentials: - * * @self: instance of #GSignondSecretStorage - * @creds: (transfer none) the credentials that are being checked. + * @creds: (transfer none): the credentials that are being checked. * - * Checks whether the given credentials are correct for the - * given identity. + * Checks whether the given credentials match what is stored in the database. * * Returns: TRUE if successful, FALSE otherwise. */ @@ -344,60 +497,37 @@ gsignond_secret_storage_check_credentials ( GSignondSecretStorage *self, GSignondCredentials *creds) { - gboolean equal = FALSE; - GSignondCredentials *stored_creds = NULL; - - g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); - g_return_val_if_fail (creds != NULL, FALSE); - - GSignondSecretStorageClass *klass = - GSIGNOND_SECRET_STORAGE_GET_CLASS (self); - - stored_creds = klass->load_credentials (self, - gsignond_credentials_get_id(creds)); - - if (stored_creds) { - DBG ("Credentials from DB found"); - equal = gsignond_credentials_equal(creds, stored_creds); - g_object_unref (stored_creds); - } - - return equal; + return GSIGNOND_SECRET_STORAGE_GET_CLASS (self)->check_credentials (self, creds); } /** * gsignond_secret_storage_load_data: - * * @self: instance of #GSignondSecretStorage - * @id: the identity whose credentials are being fetched. + * @id: the identity id whose data are fetched * @method: the authentication method the data is used for. * - * Loads secret data. + * Loads the secret data associated with a given identity and method. * - * Returns: (transfer full) #GHashTable (gchar*, GBytes*) data. When done data - * should be freed with g_hash_table_unref (data) + * Returns: (transfer full): the secret data */ -GHashTable* +GSignondDictionary* gsignond_secret_storage_load_data ( GSignondSecretStorage *self, const guint32 id, const guint32 method) { - g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), NULL); - return gsignond_db_secret_database_load_data (self->priv->database, - id, method); + return GSIGNOND_SECRET_STORAGE_GET_CLASS (self)->load_data (self, id, method); } /** * gsignond_secret_storage_update_data: - * * @self: instance of #GSignondSecretStorage - * @id: the identity whose credentials are being fetched. + * @id: the identity whose data are fetched. * @method: the authentication method the data is used for. - * @data: (transfer none) the data as #GHashTable (gchar*, GBytes*) + * @data: (transfer none): the data to update * - * Stores/replaces secret data. Calling this method replaces any data - * which was previously stored for the given id/method. + * Calling this method updates the secret data + * associated with the given id/method. * * Returns: TRUE if successful, FALSE otherwise. */ @@ -406,21 +536,18 @@ gsignond_secret_storage_update_data ( GSignondSecretStorage *self, const guint32 id, const guint32 method, - GHashTable *data) + GSignondDictionary *data) { - g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); - return gsignond_db_secret_database_update_data (self->priv->database, - id, method, data); + return GSIGNOND_SECRET_STORAGE_GET_CLASS (self)->update_data (self, id, method, data); } /** * gsignond_secret_storage_remove_data: - * * @self: instance of #GSignondSecretStorage - * @id: the identity whose credentials are being checked. + * @id: the identity whose data are fetched. * @method: the authentication method the data is used for. * - * Removes secret data. + * Removes secret data associated with a given id/method. * * Returns: TRUE if successful, FALSE otherwise. */ @@ -430,67 +557,20 @@ gsignond_secret_storage_remove_data ( const guint32 id, const guint32 method) { - g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), FALSE); - return gsignond_db_secret_database_remove_data (self->priv->database, - id, method); -} - -/** - * gsignond_secret_storage_set_last_error: - * @self: instance of #GSignondDbDefaultStorage - * @error : (transfer full) last occurred #GError - * - * sets the last occurred error - * - */ -void -gsignond_secret_storage_set_last_error ( - GSignondSecretStorage *self, - GError* error) -{ - g_return_if_fail (GSIGNOND_IS_SECRET_STORAGE (self)); - g_return_if_fail (self->priv->database != NULL); - gsignond_db_sql_database_set_last_error ( - GSIGNOND_DB_SQL_DATABASE (self->priv->database), error); + return GSIGNOND_SECRET_STORAGE_GET_CLASS (self)->remove_data (self, id, method); } /** * gsignond_secret_storage_get_last_error: - * * @self: instance of #GSignondSecretStorage * - * retrieves the last occurred error + * Retrieves the last occurred error that has occured * - * Returns: (transfer none) last occurred #GError + * Returns: (transfer none): last occurred #GError */ const GError * gsignond_secret_storage_get_last_error (GSignondSecretStorage *self) { - g_return_val_if_fail (GSIGNOND_IS_SECRET_STORAGE (self), NULL); - if (self->priv->database != NULL) { - return gsignond_db_sql_database_get_last_error ( - GSIGNOND_DB_SQL_DATABASE (self->priv->database)); - } - return NULL; -} - -/** - * gsignond_secret_storage_clear_last_error: - * - * @self: instance of #GSignondSecretStorage - * - * clears the last occurred error - */ -void -gsignond_secret_storage_clear_last_error (GSignondSecretStorage *self) -{ - g_return_if_fail (GSIGNOND_IS_SECRET_STORAGE (self)); - if (self->priv->database != NULL) { - gsignond_db_sql_database_clear_last_error ( - GSIGNOND_DB_SQL_DATABASE (self->priv->database)); - } + return GSIGNOND_SECRET_STORAGE_GET_CLASS (self)->get_last_error (self); } - - - diff --git a/src/common/gsignond-access-control-manager.c b/src/common/gsignond-access-control-manager.c index 438b0f0..ef5d8f8 100644 --- a/src/common/gsignond-access-control-manager.c +++ b/src/common/gsignond-access-control-manager.c @@ -35,6 +35,22 @@ #include "gsignond/gsignond-log.h" #include "gsignond/gsignond-access-control-manager.h" +/** + * SECTION:gsignond-access-control-manager + * @short_description: an object that performs access control checks + * @include: gsignond/gsignond-access-control-manager.h + * + * #GSignondAccessControlManager performs access control checks using + * available system services. gSSO can be configured to use a custom extension + * that provides a subclassed implementation of #GSignondAccessControlManager + * (see #GSignondExtension), otherwise a default implementation is used. + */ +/** + * GSignondAccessControlManager: + * + * Opaque #GSignondAccessControlManager data structure. + */ + #define GSIGNOND_ACCESS_CONTROL_MANAGER_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \ GSIGNOND_TYPE_ACCESS_CONTROL_MANAGER, \ @@ -265,14 +281,27 @@ _security_context_of_keychain (GSignondAccessControlManager *self) (void) self; -# ifdef ENABLE_DEBUG +# if defined(ENABLE_DEBUG) keychain_sysctx = g_getenv ("SSO_KEYCHAIN_SYSCTX"); +# elif defined(KEYCHAIN_SYSCTX) + keychain_sysctx = KEYCHAIN_SYSCTX; # endif if (!keychain_sysctx) keychain_sysctx = ""; return gsignond_security_context_new_from_values (keychain_sysctx, ""); } +/** + * GSignondAccessControlManagerClass: + * @parent_class: parent class. + * @security_context_of_peer: an implementation of gsignond_access_control_manager_security_context_of_peer() + * @peer_is_allowed_to_use_identity: an implementation of gsignond_access_control_manager_peer_is_allowed_to_use_identity() + * @peer_is_owner_of_identity: an implementation of gsignond_access_control_manager_peer_is_owner_of_identity() + * @acl_is_valid: an implementation of gsignond_access_control_manager_acl_is_valid() + * @security_context_of_keychain: an implementation of gsignond_access_control_manager_security_context_of_keychain() + * + * #GSignondAccessControlManagerClass class containing pointers to class methods. + */ static void gsignond_access_control_manager_class_init ( GSignondAccessControlManagerClass *klass) @@ -313,10 +342,15 @@ gsignond_access_control_manager_init (GSignondAccessControlManager *self) * gsignond_access_control_manager_security_context_of_peer: * @self: object instance. * @peer_ctx: instance of security context to be set. - * @peer_fd: file descriptor of the peer connection. + * @peer_fd: file descriptor of the peer connection if using peer-to-peer dbus, -1 otherwise. + * @peer_service: g_dbus_method_invocation_get_sender() of the peer connection, if not using peer-to-peer dbus, NULL otherwise * @peer_app_ctx: application context of the peer connection. * - * Retrieves #GSignondSecurityContext of the specified peer. + * Retrieves and sets #GSignondSecurityContext of the specified peer. + * + * The default implementation sets the app context as it was passed, and sets + * the system context to the binary path of the process that is determined from + * @peer_fd and @peer_service parameters. */ void gsignond_access_control_manager_security_context_of_peer ( @@ -335,9 +369,12 @@ gsignond_access_control_manager_security_context_of_peer ( * @self: object instance. * @peer_ctx: security context of the peer connection. * @owner_ctx: security context of the identity owner. - * @identity_acl: access control list for the identity in question. + * @identity_acl: access control list for the identity in question. Includes the @owner_ctx as well. * * Checks if specified peer is allowed to access the specified identity. + * + * The default implementation goes over items in @identity_acl, using + * gsignond_security_context_check() to check them against @peer_ctx. * * Returns: access is allowed? */ @@ -358,7 +395,10 @@ gsignond_access_control_manager_peer_is_allowed_to_use_identity ( * @peer_ctx: security context of the peer connection. * @owner_ctx: security context of the identity owner. * - * Checks if the specified peer is owner of the identity. + * Checks if the peer specified in @peer_ctx is the owner of the identity. + * + * The default implementation is using gsignond_security_context_check() + * to check @peer_ctx against @owner_ctx directly. * * Returns: is owner? */ @@ -379,7 +419,10 @@ gsignond_access_control_manager_peer_is_owner_of_identity ( * @identity_acl: access control list for the identity. * * Checks if the specified peer is allowed to set the specified access - * control list. + * control list. gsignond_access_control_manager_peer_is_owner_of_identity() + * is used before calling this method to verify identity ownership. + * + * The default implementation always returns TRUE. * * Returns: access control list is OK? */ @@ -398,7 +441,12 @@ gsignond_access_control_manager_acl_is_valid ( * @self: object instance. * * Retrieves security context of the keychain application. Keychain application - * has a special management access to all stored identities. + * has a special management access to all stored identities and is able to + * perform deletion of all identities from storage. + * + * The default implementation returns an empty context. If gSSO was compiled + * with --enable-debug and SSO_KEYCHAIN_SYSCTX environment variable is set, then + * the value of that variable is used to set the returned system context instead. * * Returns: security context of the keychain application. */ diff --git a/src/common/gsignond-config.c b/src/common/gsignond-config.c index 714622d..855777d 100644 --- a/src/common/gsignond-config.c +++ b/src/common/gsignond-config.c @@ -37,6 +37,54 @@ #include "gsignond/gsignond-log.h" #include "gsignond/gsignond-dictionary.h" +/** + * SECTION:gsignond-config + * @short_description: gSSO configuration information + * @include: gsignond/gsignond-config.h + * + * #GSignondConfig holds configuration information as a set of keys and values + * (integer or strings). The key names are defined in + * general config keys, + * database config keys, and + * DBus config keys. + * + * The configuration is discovered from these sources, in decreasing order of + * priority: + * - environment variables, if gSSO has been compiled with --enable-debug switch. + * See the specific keys documentation for the variable names. + * - gSSO configuration file. See below for where the file is searched for. + * - default values. See the documentation for specific keys for those. + * + * Where the configuration file is searched for + * + * If gSSO has been compiled with --enable-debug, then these locations are used, + * in decreasing order of priority: + * - GSIGNOND_CONFIG environment variable + * - g_get_user_config_dir() + "gsignond/gsignond.conf" + * - each of g_get_system_config_dirs() + "gsignond/gsignond.conf" + * + * Otherwise, the config file location is determined at compilation time as + * $(sysconfdir) + "gsignond/gsignond.conf" + * + * Example configuration file + * + * See example configuration file here: + * + * http://code.google.com/p/accounts-sso/source/browse/gsignond.conf?repo=gsignond + */ + +/** + * GSignondConfig: + * + * Opaque structure for the object. + */ +/** + * GSignondConfigClass: + * + * Opaque structure for the class. + */ + + #define GSIGNOND_DB_METADATA_DEFAULT_DB_FILENAME "metadata.db" #define GSIGNOND_DB_SECRET_DEFAULT_DB_FILENAME "secret.db" @@ -195,7 +243,7 @@ _load_environment (GSignondConfig *self) GSIGNOND_CONFIG_DBUS_IDENTITY_TIMEOUT, e_val); - e_val = g_getenv ("SSO_AUTHSESSION_TIMEOUT"); + e_val = g_getenv ("SSO_AUTH_SESSION_TIMEOUT"); if (e_val && (timeout = atoi(e_val))) gsignond_config_set_string (self, GSIGNOND_CONFIG_DBUS_AUTH_SESSION_TIMEOUT, @@ -234,15 +282,19 @@ _load_environment (GSignondConfig *self) e_val = g_getenv ("SSO_STORAGE_PATH"); if (e_val) _set_storage_path (self, e_val); - - e_val = g_getenv ("SSO_SECRET_PATH"); - if (e_val) - gsignond_config_set_string (self, - GSIGNOND_CONFIG_GENERAL_SECURE_DIR, - e_val); } #endif /* ENABLE_DEBUG */ +/** + * gsignond_config_get_integer: + * @self: an instance of #GSignondConfig + * @key: the key name + * + * Get an integer configuration value. + * + * Returns: the value corresponding to the key as an integer. If the key does not + * exist or cannot be converted to the integer, 0 is returned. + */ gint gsignond_config_get_integer (GSignondConfig *self, const gchar *key) { @@ -250,6 +302,14 @@ gsignond_config_get_integer (GSignondConfig *self, const gchar *key) return (gint) (str_value ? atoi (str_value) : 0); } +/** + * gsignond_config_set_integer: + * @self: an instance of #GSignondConfig + * @key: the key name + * @value: the value + * + * Sets the configuration value to the provided integer. + */ void gsignond_config_set_integer (GSignondConfig *self, const gchar *key, gint value) @@ -266,6 +326,16 @@ gsignond_config_set_integer (GSignondConfig *self, const gchar *key, } +/** + * gsignond_config_get_string: + * @self: an instance of #GSignondConfig + * @key: the key name + * + * Get a string configuration value. + * + * Returns: (transfer none): the value corresponding to the key as string. If the key does not + * exist, NULL is returned. + */ const gchar * gsignond_config_get_string (GSignondConfig *self, const gchar *key) { @@ -278,6 +348,14 @@ gsignond_config_get_string (GSignondConfig *self, const gchar *key) return g_variant_get_string (value, NULL); } +/** + * gsignond_config_set_string: + * @self: an instance of #GSignondConfig + * @key: the key name + * @value: (transfer none): the value + * + * Sets the configuration value to the provided string. + */ void gsignond_config_set_string (GSignondConfig *self, const gchar *key, const gchar *value) @@ -340,15 +418,9 @@ gsignond_config_init (GSignondConfig *self) (GSIGNOND_CONFIG_GENERAL_BIN_DIR), (GSIGNOND_BIN_DIR)); - gchar *default_data_path = - g_build_filename (g_get_user_data_dir (), "gsignond", NULL); gsignond_config_set_string (self, GSIGNOND_CONFIG_GENERAL_STORAGE_PATH, - default_data_path); - gsignond_config_set_string (self, - GSIGNOND_CONFIG_GENERAL_SECURE_DIR, - default_data_path); - g_free (default_data_path); + "/var/db"); gsignond_config_set_string (self, GSIGNOND_CONFIG_DB_SECRET_DB_FILENAME, @@ -376,6 +448,14 @@ gsignond_config_class_init (GSignondConfigClass *klass) } +/** + * gsignond_config_new: + * + * Create a #GSignondConfig object. + * + * Returns: an instance of #GSignondConfig. gSSO extensions should not use this + * as they're already provided with a config object when they're created. + */ GSignondConfig * gsignond_config_new () { diff --git a/src/common/gsignond-credentials.c b/src/common/gsignond-credentials.c index 397f88e..3697b8f 100644 --- a/src/common/gsignond-credentials.c +++ b/src/common/gsignond-credentials.c @@ -26,6 +26,26 @@ #include "gsignond/gsignond-log.h" #include "gsignond/gsignond-credentials.h" +/** + * SECTION:gsignond-credentials + * @short_description: credentials (username, password) associated with an identity + * @include: gsignond/gsignond-credentials.h + * + * #GSignondCredentials hold a username, password, and identity id, associated + * with an identity. This information in stored in secret storage using + * #GSignondSecretStorage. + */ +/** + * GSignondCredentials: + * + * Opaque #GSignondCredentials data structure. + */ +/** + * GSignondCredentialsClass: + * + * Opaque #GSignondCredentialsClass data structure. + */ + #define GSIGNOND_CREDENTIALS_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE ((obj),\ GSIGNOND_TYPE_CREDENTIALS, \ @@ -82,9 +102,9 @@ gsignond_credentials_init (GSignondCredentials *self) /** * gsignond_credentials_new: * - * Creates new #GSignondCredentials object - * Returns : (transfer full) the #GSignondCredentials object - * + * Creates a new empty #GSignondCredentials object + * + * Returns: (transfer full): the #GSignondCredentials object */ GSignondCredentials * gsignond_credentials_new () @@ -95,13 +115,12 @@ gsignond_credentials_new () /** * gsignond_credentials_set_data: - * * @self: the object whose data is to be set. - * @id: the identity associated with the credentials. - * @username: the username. - * @password: the password. + * @id: the identity id associated with the credentials. + * @username: (transfer none): the username. + * @password: (transfer none):the password. * - * Sets the data of the object. + * Sets the data of the #GSignondCredentials. * * Returns: TRUE if successful, FALSE otherwise. */ @@ -121,11 +140,10 @@ gsignond_credentials_set_data( /** * gsignond_credentials_set_id: - * * @self: the object whose id is to be set. * @id: the id. * - * Sets the id of the GSignondCredentials object + * Sets the identity id of the #GSignondCredentials object * * Returns: TRUE if successful, FALSE otherwise. */ @@ -141,12 +159,11 @@ gsignond_credentials_set_id( /** * gsignond_credentials_get_id: - * * @self: the object whose id is to be set. * - * Returns the id from the #GSignondCredentials object + * Gets the identity id * - * Returns: the id if the object is valid, NULL otherwise. + * Returns: the id */ guint32 gsignond_credentials_get_id(GSignondCredentials *self) @@ -158,12 +175,10 @@ gsignond_credentials_get_id(GSignondCredentials *self) /** * gsignond_credentials_set_username: - * * @self: the object whose username is to be set. - * @username: the username. + * @username: (transfer none): the username. * - * Sets the username of the GSignondCredentials object; old username is - * freed if it exits + * Sets the username of the GSignondCredentials object * * Returns: TRUE if successful, FALSE otherwise. */ @@ -186,12 +201,11 @@ gsignond_credentials_set_username( /** * gsignond_credentials_get_username: - * * @self: the object whose username is to be set. * - * Returns the username from the #GSignondCredentials object + * Gets the username of the #GSignondCredentials object * - * Returns: the username if the object is valid, NULL otherwise. + * Returns: (transfer none): the username if the object is valid, NULL otherwise. */ const gchar* gsignond_credentials_get_username(GSignondCredentials *self) @@ -202,12 +216,10 @@ gsignond_credentials_get_username(GSignondCredentials *self) /** * gsignond_credentials_set_password: - * * @self: the object whose password is to be set. - * @password: the password. + * @password: (transfer none): the password. * - * Sets the password of the GSignondCredentials object; old password is - * freed if it exits + * Sets the password of the GSignondCredentials object * * Returns: TRUE if successful, FALSE otherwise. */ @@ -230,12 +242,11 @@ gsignond_credentials_set_password( /** * gsignond_credentials_get_password: - * * @self: the object whose password is to be set. * - * Returns the password from the #GSignondCredentials object + * Gets the password from the #GSignondCredentials object * - * Returns: the password if the object is valid, NULL otherwise. + * Returns: (transfer none): the password if the object is valid, NULL otherwise. */ const gchar* gsignond_credentials_get_password(GSignondCredentials *self) @@ -246,7 +257,6 @@ gsignond_credentials_get_password(GSignondCredentials *self) /** * gsignond_credentials_equal: - * * @one: the first credential to be compared. * @two: the second credential to be compared. * diff --git a/src/common/gsignond-dictionary.c b/src/common/gsignond-dictionary.c index 7d2c0c2..8ec88c3 100644 --- a/src/common/gsignond-dictionary.c +++ b/src/common/gsignond-dictionary.c @@ -27,12 +27,42 @@ #include /** + * SECTION:gsignond-dictionary + * @short_description: a dictionary container holding string keys and variant values + * @title: GSignondDictionary + * @include: gsignond/gsignond-dictionary.h + * + * A #GSignondDictionary is a dictionary data structure that maps string keys to #GVariant values. + * It's used in multiple places in gsignond and its public API to pass key-value + * data sets. + * + * |[ GSignondDictionary* dict = gsignond_dictionary_new(); + * gsignond_dictionary_set_string(dict, "name", "John Smith"); + * gsignond_dictionary_set_uint32(dict, "age", 32); + * + * guint32 age; + * gboolean success = gsignond_dictionary_get_uint32(dict, "age", &age); + * const gchar* name = gsignond_dictionary_get_string(dict, "name"); + * gsignond_dictionary_unref(dict); + * ]| + */ + +/** + * GSignondDictionary: + * + * #GSignondDictionary is a typedef for #GHashTable, which + * means the developers may also use methods associated with that structure. + */ + +/** * gsignond_dictionary_new_from_variant: * @variant: instance of #GVariant * - * Converts the variant to GSignondDictionary. + * Converts the #GVariant to #GSignondDictionary. This is useful for example if + * the dictionary needs to be deserialized, or if it's contained in another + * #GSignondDictionary and has been retrieved using gsignond_dictionary_get(). * - * Returns: (transfer full) object if successful, NULL otherwise. + * Returns: (transfer full): #GSignondDictionary if successful, NULL otherwise. */ GSignondDictionary * gsignond_dictionary_new_from_variant (GVariant *variant) @@ -58,9 +88,10 @@ gsignond_dictionary_new_from_variant (GVariant *variant) * gsignond_dictionary_to_variant: * @dict: instance of #GSignondDictionary * - * Converts the GSignondDictionary to variant. + * Converts the #GSignondDictionary to a #GVariant. The result can be serialized + * or put into another #GSignondDictionary using gsignond_dictionary_set(). * - * Returns: (transfer full) #GVariant object if successful, NULL otherwise. + * Returns: (transfer full): #GVariant object if successful, NULL otherwise. */ GVariant * gsignond_dictionary_to_variant (GSignondDictionary *dict) @@ -90,9 +121,9 @@ gsignond_dictionary_to_variant (GSignondDictionary *dict) /** * gsignond_dictionary_new: * - * Creates new instance of GSignondDictionary. + * Creates a new instance of #GSignondDictionary. * - * Returns: (transfer full) #GSignondDictionary object if successful, + * Returns: (transfer full): #GSignondDictionary object if successful, * NULL otherwise. */ GSignondDictionary * @@ -108,21 +139,24 @@ gsignond_dictionary_new (void) * gsignond_dictionary_ref: * @dict: instance of #GSignondDictionary * - * Increment reference count of the dictionary structure. + * Increments the reference count of the dictionary structure. + * + * Returns: the pointer to the passed in #GSignondDictionary */ -void +GSignondDictionary* gsignond_dictionary_ref (GSignondDictionary *dict) { - g_return_if_fail (dict != NULL); + g_return_val_if_fail (dict != NULL, NULL); - g_hash_table_ref (dict); + return (GSignondDictionary*)g_hash_table_ref (dict); } /** * gsignond_dictionary_unref: * @dict: instance of #GSignondDictionary * - * Decrement reference count of the dictionary structure. + * Decrements the reference count of the dictionary structure. If the reference + * count reaches zero, the structure is deallocated and shouldn't be used. * */ void @@ -137,10 +171,16 @@ gsignond_dictionary_unref (GSignondDictionary *dict) /** * gsignond_dictionary_get: * @dict: instance of #GSignondDictionary + * @key: the key to look up in the dictionary * - * Retrieves a value from the dictionary. + * Retrieves a #GVariant value from the dictionary. This can be used to retrieve + * a value of an arbitrary type, and then convert it manually to a specific type + * using #GVariant methods. For most commonly used types, also getters that + * return the specific type directly are provided (gsignond_dictionary_get_string() + * and similar). * - * Returns: (transfer none) the value; NULL is returned in case of failure. + * Returns: (transfer none): the value; NULL is returned in case of failure (for + * example if the entry corresponding to the supplied key doesn't exist). */ GVariant * gsignond_dictionary_get (GSignondDictionary *dict, const gchar *key) @@ -154,11 +194,12 @@ gsignond_dictionary_get (GSignondDictionary *dict, const gchar *key) /** * gsignond_dictionary_set: * @dict: instance of #GSignondDictionary + * @key: (transfer none): key to be set + * @value: (transfer full): value to be set * - * @key: key to be set - * @value: value to be set - * - * Adds or replaces key-value pair in the dictionary. + * Adds or replaces key-value pair in the dictionary. This allows to set a value + * of an arbitrary type: it first needs to be converted to a #GVariant. For most + * commonly used types also type-specific setters are provided. * * Returns: TRUE if successful, FALSE otherwise. */ @@ -181,8 +222,13 @@ gsignond_dictionary_set (GSignondDictionary *dict, /** * gsignond_dictionary_get_boolean: + * @dict: instance of #GSignondDictionary + * @key: (transfer none): key to look up + * @value: points to the location where the value should be set + * + * Retrieves a gboolean value. * - * Overload, see #gsignond_dictionary_get for details. + * Returns: TRUE if the value was retrieved successfully, FALSE otherwise. */ gboolean gsignond_dictionary_get_boolean (GSignondDictionary *dict, const gchar *key, @@ -199,9 +245,14 @@ gsignond_dictionary_get_boolean (GSignondDictionary *dict, const gchar *key, } /** - * gsignon_dictionary_set_boolean: + * gsignond_dictionary_set_boolean: + * @dict: instance of #GSignondDictionary + * @key: (transfer none): key to set + * @value: value to set * - * Overload, see #gsignond_dictionary_set for details. + * Sets or replaces a gboolean value in the dictionary. + * + * Returns: TRUE if the value was set or replaced successfully, FALSE otherwise. */ gboolean gsignond_dictionary_set_boolean (GSignondDictionary *dict, const gchar *key, @@ -212,8 +263,13 @@ gsignond_dictionary_set_boolean (GSignondDictionary *dict, const gchar *key, /** * gsignond_dictionary_get_int32: + * @dict: instance of #GSignondDictionary + * @key: (transfer none): key to look up + * @value: points to the location where the value should be set * - * Overload, see #gsignond_dictionary_get for details. + * Retrieves a int32 value. + * + * Returns: TRUE if the value was retrieved successfully, FALSE otherwise. */ gboolean gsignond_dictionary_get_int32 (GSignondDictionary *dict, const gchar *key, @@ -230,9 +286,14 @@ gsignond_dictionary_get_int32 (GSignondDictionary *dict, const gchar *key, } /** - * gsignon_dictionary_set_int32: + * gsignond_dictionary_set_int32: + * @dict: instance of #GSignondDictionary + * @key: (transfer none): key to set + * @value: value to set * - * Overload, see #gsignond_dictionary_set for details. + * Sets or replaces a int32 value in the dictionary. + * + * Returns: TRUE if the value was set or replaced successfully, FALSE otherwise. */ gboolean gsignond_dictionary_set_int32 (GSignondDictionary *dict, const gchar *key, @@ -242,9 +303,14 @@ gsignond_dictionary_set_int32 (GSignondDictionary *dict, const gchar *key, } /** - * gsignond_dictionary_get_guint32: + * gsignond_dictionary_get_uint32: + * @dict: instance of #GSignondDictionary + * @key: (transfer none): key to look up + * @value: points to the location where the value should be set * - * Overload, see #gsignond_dictionary_get for details. + * Retrieves a uint32 value. + * + * Returns: TRUE if the value was retrieved successfully, FALSE otherwise. */ gboolean gsignond_dictionary_get_uint32 (GSignondDictionary *dict, const gchar *key, @@ -261,9 +327,14 @@ gsignond_dictionary_get_uint32 (GSignondDictionary *dict, const gchar *key, } /** - * gsignon_dictionary_set_guint32: + * gsignond_dictionary_set_uint32: + * @dict: instance of #GSignondDictionary + * @key: (transfer none): key to set + * @value: value to set * - * Overload, see #gsignond_dictionary_set for details. + * Sets or replaces a uint32 value in the dictionary. + * + * Returns: TRUE if the value was set or replaced successfully, FALSE otherwise. */ gboolean gsignond_dictionary_set_uint32 (GSignondDictionary *dict, const gchar *key, @@ -274,8 +345,13 @@ gsignond_dictionary_set_uint32 (GSignondDictionary *dict, const gchar *key, /** * gsignond_dictionary_get_int64: + * @dict: instance of #GSignondDictionary + * @key: (transfer none): key to look up + * @value: points to the location where the value should be set * - * Overload, see #gsignond_dictionary_get for details. + * Retrieves a int64 value. + * + * Returns: TRUE if the value was retrieved successfully, FALSE otherwise. */ gboolean gsignond_dictionary_get_int64 (GSignondDictionary *dict, const gchar *key, @@ -292,9 +368,14 @@ gsignond_dictionary_get_int64 (GSignondDictionary *dict, const gchar *key, } /** - * gsignon_dictionary_set_int32: + * gsignond_dictionary_set_int64: + * @dict: instance of #GSignondDictionary + * @key: (transfer none): key to set + * @value: value to set * - * Overload, see #gsignond_dictionary_set for details. + * Sets or replaces a int64 value in the dictionary. + * + * Returns: TRUE if the value was set or replaced successfully, FALSE otherwise. */ gboolean gsignond_dictionary_set_int64 (GSignondDictionary *dict, const gchar *key, @@ -304,9 +385,14 @@ gsignond_dictionary_set_int64 (GSignondDictionary *dict, const gchar *key, } /** - * gsignond_dictionary_get_guint32: + * gsignond_dictionary_get_uint64: + * @dict: instance of #GSignondDictionary + * @key: (transfer none): key to look up + * @value: points to the location where the value should be set * - * Overload, see #gsignond_dictionary_get for details. + * Retrieves a uint64 value. + * + * Returns: TRUE if the value was retrieved successfully, FALSE otherwise. */ gboolean gsignond_dictionary_get_uint64 (GSignondDictionary *dict, const gchar *key, @@ -323,9 +409,14 @@ gsignond_dictionary_get_uint64 (GSignondDictionary *dict, const gchar *key, } /** - * gsignon_dictionary_set_guint32: + * gsignond_dictionary_set_uint64: + * @dict: instance of #GSignondDictionary + * @key: (transfer none): key to set + * @value: value to set * - * Overload, see #gsignond_dictionary_set for details. + * Sets or replaces a uint64 value in the dictionary. + * + * Returns: TRUE if the value was set or replaced successfully, FALSE otherwise. */ gboolean gsignond_dictionary_set_uint64 (GSignondDictionary *dict, const gchar *key, @@ -337,8 +428,12 @@ gsignond_dictionary_set_uint64 (GSignondDictionary *dict, const gchar *key, /** * gsignond_dictionary_get_string: + * @dict: instance of #GSignondDictionary + * @key: (transfer none): key to look up * - * Overload, see #gsignond_dictionary_get for details. + * Retrieves a string value. + * + * Returns: (transfer none): the value if it was retrieved successfully, NULL otherwise. */ const gchar * gsignond_dictionary_get_string (GSignondDictionary *dict, const gchar *key) @@ -352,9 +447,14 @@ gsignond_dictionary_get_string (GSignondDictionary *dict, const gchar *key) } /** - * gsignon_dictionary_set_string: + * gsignond_dictionary_set_string: + * @dict: instance of #GSignondDictionary + * @key: (transfer none): key to set + * @value: (transfer none): value to set * - * Overload, see #gsignond_dictionary_set for details. + * Sets or replaces a string value in the dictionary. + * + * Returns: TRUE if the value was set or replaced successfully, FALSE otherwise. */ gboolean gsignond_dictionary_set_string (GSignondDictionary *dict, const gchar *key, @@ -366,9 +466,7 @@ gsignond_dictionary_set_string (GSignondDictionary *dict, const gchar *key, /** * gsignond_dictionary_remove: * @dict: instance of #GSignondDictionary - * - * @key: key which needs to be removed from the dictionary - * @value: value to be set + * @key: (transfer none): key which needs to be removed from the dictionary * * Removes key-value pair in the dictionary as per key. * @@ -391,7 +489,7 @@ gsignond_dictionary_remove (GSignondDictionary *dict, const gchar *key) * * Creates a copy of the dictionary. * - * Returns: (transfer full) #GSignondDictionary object if successful, + * Returns: (transfer full): #GSignondDictionary object if the copy was successful, * NULL otherwise. */ GSignondDictionary * diff --git a/src/common/gsignond-enum.c.template b/src/common/gsignond-enum.c.template index 6391b95..d8ce58a 100644 --- a/src/common/gsignond-enum.c.template +++ b/src/common/gsignond-enum.c.template @@ -23,7 +23,7 @@ GType }; the_type = g_@type@_register_static ( - g_intern_static_string ("GSignond@EnumName@"), + g_intern_static_string ("@EnumName@"), values); } diff --git a/src/common/gsignond-error.c b/src/common/gsignond-error.c index 462b43c..7a5dd90 100644 --- a/src/common/gsignond-error.c +++ b/src/common/gsignond-error.c @@ -27,6 +27,85 @@ #include #include +/** + * SECTION:gsignond-error + * @short_description: error definitions and utilities + * @title: Errors + * @include: gsignond/gsignond-error.h + * + * This file provides GSignond error definitions and utilities. + * When creating an error, use #GSIGNOND_ERROR for the error domain and errors + * from #GSignondError for the error code. + * + * |[ GError* err = g_error_new(GSIGNOND_ERROR, GSIGNOND_ERROR_MISSING_DATA, + * "Not enough data"); + * ]| + */ + +/** + * GSIGNOND_ERROR: + * + * This macro should be used when creating a #GError in GSignond plugins and extensions. + * (for example with g_error_new() ) + */ + +/** + * GSignondError: + * @GSIGNOND_ERROR_NONE: No error + * @GSIGNOND_ERROR_UNKNOWN: Catch-all for errors not distinguished by another code. + * @GSIGNOND_ERROR_INTERNAL_SERVER: Signon Daemon internal error. + * @GSIGNOND_ERROR_INTERNAL_COMMUNICATION: Communication with Signon Daemon error. + * @GSIGNOND_ERROR_PERMISSION_DENIED: The operation cannot be performed due to insufficient client permissions. + * @GSIGNOND_ERROR_ENCRYPTION_FAILURE: Failure during data encryption/decryption. + * @GSIGNOND_ERROR_AUTH_SERVICE_ERR: Placeholder to rearrange enumeration - AuthService specific + * @GSIGNOND_ERROR_METHOD_NOT_KNOWN: The method with this name is not found. + * @GSIGNOND_ERROR_SERVICE_NOT_AVAILABLE: The service is temporarily unavailable. + * @GSIGNOND_ERROR_INVALID_QUERY: Parameters for the query are invalid. + * @GSIGNOND_ERROR_IDENTITY_ERR: Placeholder to rearrange enumeration - Identity specific + * @GSIGNOND_ERROR_METHOD_NOT_AVAILABLE: The requested method is not available. + * @GSIGNOND_ERROR_IDENTITY_NOT_FOUND: The identity matching this Identity object was not found on the service. + * @GSIGNOND_ERROR_STORE_FAILED: Storing credentials failed. + * @GSIGNOND_ERROR_REMOVE_FAILED: Removing credentials failed. + * @GSIGNOND_ERROR_SIGN_OUT_FAILED: SignOut failed. + * @GSIGNOND_ERROR_IDENTITY_OPERATION_CANCELED: Identity operation was canceled by user. + * @GSIGNOND_ERROR_CREDENTIALS_NOT_AVAILABLE: Query failed. + * @GSIGNOND_ERROR_REFERENCE_NOT_FOUND: Trying to remove nonexistent reference. + * @GSIGNOND_ERROR_AUTH_SESSION_ERR: Placeholder to rearrange enumeration - AuthSession/PluginInterface specific + * @GSIGNOND_ERROR_MECHANISM_NOT_AVAILABLE: The requested mechanism is not available. + * @GSIGNOND_ERROR_MISSING_DATA: The SessionData object does not contain necessary information. + * @GSIGNOND_ERROR_INVALID_CREDENTIALS: The supplied credentials are invalid for the mechanism implementation. + * @GSIGNOND_ERROR_NOT_AUTHORIZED: Authorization failed. + * @GSIGNOND_ERROR_WRONG_STATE: An operation method has been called in a wrong state. + * @GSIGNOND_ERROR_OPERATION_NOT_SUPPORTED: The operation is not supported by the mechanism implementation. + * @GSIGNOND_ERROR_NO_CONNECTION: No Network connetion. + * @GSIGNOND_ERROR_NETWORK: Network connetion failed. + * @GSIGNOND_ERROR_SSL: Ssl connection failed. + * @GSIGNOND_ERROR_RUNTIME: Casting SessionData into subclass failed + * @GSIGNOND_ERROR_SESSION_CANCELED: Challenge was cancelled. + * @GSIGNOND_ERROR_TIMED_OUT: Challenge was timed out. + * @GSIGNOND_ERROR_USER_INTERACTION: User interaction dialog failed + * @GSIGNOND_ERROR_OPERATION_FAILED: Temporary failure in authentication. + * @GSIGNOND_ERROR_ENCRYPTION_FAILED: Failure during data encryption/decryption. + * @GSIGNOND_ERROR_TOS_NOT_ACCEPTED: User declined Terms of Service. + * @GSIGNOND_ERROR_FORGOT_PASSWORD: User requested reset password sequence. + * @GSIGNOND_ERROR_METHOD_OR_MECHANISM_NOT_ALLOWED: Method or mechanism not allowed for this identity. + * @GSIGNOND_ERROR_INCORRECT_DATE: Date time incorrect on device. + * @GSIGNOND_ERROR_USER_ERR: Placeholder to rearrange enumeration - User space specific + * + * This enum provides a list of errors that plugins and extensions can use. + * + */ + +/** + * gsignond_get_gerror_for_id: + * @err: A #GSignondError specifying the error + * @message: Format string for the error message + * @...: parameters for the error string + * + * A helper macro that creates a #GError with the proper gsignond domain + */ + +#define GSIGNOND_ERROR_DOMAIN "gsignond" #define _ERROR_PREFIX "com.google.code.AccountsSSO.gSingleSignOn.Error" GDBusErrorEntry _gsignond_errors[] = @@ -53,7 +132,7 @@ GDBusErrorEntry _gsignond_errors[] = {GSIGNOND_ERROR_MECHANISM_NOT_AVAILABLE, _ERROR_PREFIX".MechanismNotAvailable"}, {GSIGNOND_ERROR_MISSING_DATA, _ERROR_PREFIX".MissingData"}, {GSIGNOND_ERROR_INVALID_CREDENTIALS, _ERROR_PREFIX".InvalidCredentials"}, - {GSIGNOND_ERROR_NOT_AUTHORIZED, _ERROR_PREFIX".NotAutherized"}, + {GSIGNOND_ERROR_NOT_AUTHORIZED, _ERROR_PREFIX".NotAuthorized"}, {GSIGNOND_ERROR_WRONG_STATE, _ERROR_PREFIX".WrongState"}, {GSIGNOND_ERROR_OPERATION_NOT_SUPPORTED, _ERROR_PREFIX".OperationNotSupported"}, {GSIGNOND_ERROR_NO_CONNECTION, _ERROR_PREFIX".NoConnection"}, @@ -72,6 +151,11 @@ GDBusErrorEntry _gsignond_errors[] = {GSIGNOND_ERROR_INCORRECT_DATE, _ERROR_PREFIX".IncorrectDate"}, } ; +/** + * gsignond_error_quark: + * + * Creates and returns a domain for GSignond errors. + */ GQuark gsignond_error_quark (void) { @@ -85,38 +169,13 @@ gsignond_error_quark (void) return (GQuark) quark_volatile; } -GString* -gsignond_concat_domain_and_error ( - const gchar *str1, - const gchar *str2) -{ - GString *str = NULL; - g_return_val_if_fail (str1 != NULL && str2 != NULL, NULL); - str = g_string_sized_new (strlen(str1)+strlen(str2)-1); - g_string_printf (str,"[%s].%s\n",str1,str2); - return str; -} - -GString* -gsignond_prepend_domain_to_error_msg (const GError *err) -{ - GString *msg = NULL; - const gchar *domain = NULL; - g_return_val_if_fail (err != NULL, NULL); - if (err->message != NULL) { - domain = g_quark_to_string(err->domain); - msg = gsignond_concat_domain_and_error(domain, err->message); - } - return msg; -} - /** * gsignond_error_new_from_variant: * @var: instance of #GVariant * * Converts the GVariant to GError. * - * Returns: (transfer full) #GError object if successful, NULL otherwise. + * Returns: (transfer full): #GError object if successful, NULL otherwise. */ GError * gsignond_error_new_from_variant ( @@ -143,7 +202,7 @@ gsignond_error_new_from_variant ( * * Converts the GError to GVariant. * - * Returns: (transfer full) #GVariant object if successful, NULL otherwise. + * Returns: (transfer full): #GVariant object if successful, NULL otherwise. */ GVariant * gsignond_error_to_variant ( diff --git a/src/common/gsignond-extension-interface.c b/src/common/gsignond-extension-interface.c index 45362b4..96510d7 100644 --- a/src/common/gsignond-extension-interface.c +++ b/src/common/gsignond-extension-interface.c @@ -25,6 +25,41 @@ #include "gsignond/gsignond-extension-interface.h" +/** + * SECTION:gsignond-extension-interface + * @short_description: provides platform adaptation functionality + * @include: gsignond/gsignond-plugin-interface.h + * + * #GSignondExtension provides access to platform adaptation functionality. It + * contains getter methods for default implementations of #GSignondAccessControlManager, + * #GSignondSecretStorage and #GSignondStorageManager. + * + * gSSO can be adapted to a specific platform environment by implementing a + * custom extension module. The following steps need to be taken: + * + * a) subclass and re-implement some (or all) of the functionality of the above + * three classes. + * + * b) subclass #GSignondExtension and provide implementations of its getter methods for those + * of the adaptation classes that have been changed. + * + * d) provide a function GSignondExtension * extensionname_extension_init(void) + * that returns an instance of the #GSignondExtension subclass. + * + * c) build and install these implementations as a gSSO extension module and + * configure gSSO to use it. + * + * Examples of custom extensions can be seen here: + * + * https://code.google.com/p/accounts-sso/source/browse/?repo=gsignond#git%2Fsrc%2Fextensions + * and gSSO configuration is described in #GSignondConfig. + */ +/** + * GSignondExtension: + * + * Opaque #GSignondExtension data structure. + */ + G_DEFINE_TYPE (GSignondExtension, gsignond_extension, G_TYPE_OBJECT); #define GSIGNOND_EXTENSION_PRIV(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), GSIGNOND_TYPE_EXTENSION, GSignondExtensionPrivate) @@ -112,6 +147,17 @@ _get_access_control_manager (GSignondExtension *self, GSignondConfig *config) return priv->access_control_manager; } +/** + * GSignondExtensionClass: + * @parent_class: the parent class + * @get_extension_name: implementation of gsignond_extension_get_name() + * @get_extension_version: implementation of gsignond_extension_get_version() + * @get_storage_manager: implementation of gsignond_extension_get_storage_manager() + * @get_secret_storage: implementation of gsignond_extension_get_secret_storage() + * @get_access_control_manager: implementation of gsignond_extension_get_access_control_manager() + * + * #GSignondExtensionClass class containing pointers to class methods. + */ static void gsignond_extension_class_init (GSignondExtensionClass *klass) { @@ -137,35 +183,14 @@ gsignond_extension_init (GSignondExtension *self) self->priv->secret_storage = NULL; } -static void -_on_extension_dispose (gpointer data, GObject *object) -{ - if (data) *(GSignondExtension **)data = NULL; -} - -GSignondExtension * default_extension_init () -{ - static GSignondExtension *default_extension = NULL; - - if (!default_extension) { - default_extension = - g_object_new (GSIGNOND_TYPE_EXTENSION, NULL); - - g_object_weak_ref (G_OBJECT (default_extension), - _on_extension_dispose, - &default_extension); - } - - return default_extension; -} - /** * gsignond_extension_get_name: * @self: object instance. * - * Get human readable name of the extension. + * Get a human readable name of the extension. Default implementation + * returns "default". * - * Returns: (transfer none) name of the extension. + * Returns: (transfer none): name of the extension. */ const gchar * gsignond_extension_get_name (GSignondExtension *self) @@ -178,7 +203,7 @@ gsignond_extension_get_name (GSignondExtension *self) * @self: object instance. * * Get version of the extension, split into four bytes in order from MSB to LSB; - * major, minor, patchlevel, build. + * major, minor, patchlevel, build. Default implementation returns 0. */ guint32 gsignond_extension_get_version (GSignondExtension *self) @@ -191,9 +216,10 @@ gsignond_extension_get_version (GSignondExtension *self) * @self: object instance. * @config: configuration object instance. * - * Factory method to get a singleton storage manager object. + * Factory method to get a singleton storage manager object. See + * #GSignondStorageManager for the description of the default implementation. * - * Returns: (transfer none) storage manager object instance. + * Returns: (transfer none): storage manager object instance. */ GSignondStorageManager * gsignond_extension_get_storage_manager (GSignondExtension *self, @@ -208,9 +234,10 @@ gsignond_extension_get_storage_manager (GSignondExtension *self, * @self: object instance. * @config: configuration object instance. * - * Factory method to get a singleton secret storage object. + * Factory method to get a singleton secret storage object. See + * #GSignondSecretStorage for the description of the default implementation. * - * Returns: (transfer none) secret storage object instance. + * Returns: (transfer none): secret storage object instance. */ GSignondSecretStorage * gsignond_extension_get_secret_storage (GSignondExtension *self, @@ -225,9 +252,10 @@ gsignond_extension_get_secret_storage (GSignondExtension *self, * @self: object instance. * @config: configuration object instance. * - * Factory method to get a singleton access control manager object. + * Factory method to get a singleton access control manager object. See + * #GSignondAccessControlManager for the description of the default implementation. * - * Returns: (transfer none) access control manager object instance. + * Returns: (transfer none): access control manager object instance. */ GSignondAccessControlManager * gsignond_extension_get_access_control_manager (GSignondExtension *self, diff --git a/src/common/gsignond-identity-info-internal.h b/src/common/gsignond-identity-info-internal.h index 2375cbe..60ce7a1 100644 --- a/src/common/gsignond-identity-info-internal.h +++ b/src/common/gsignond-identity-info-internal.h @@ -27,7 +27,7 @@ #define __GSIGNOND_IDENTITY_INFO_INTERNAL_H__ #include -#include +#include "gsignond-identity-info.h" G_BEGIN_DECLS diff --git a/src/common/gsignond-identity-info.c b/src/common/gsignond-identity-info.c index 9e41a41..02af6c3 100644 --- a/src/common/gsignond-identity-info.c +++ b/src/common/gsignond-identity-info.c @@ -23,7 +23,7 @@ * 02110-1301 USA */ -#include +#include "gsignond-identity-info.h" #include "gsignond-identity-info-internal.h" @@ -35,16 +35,25 @@ _gsignond_identity_info_seq_cmp ( GSequenceIter *iter1 = NULL, *iter2 = NULL; gboolean equal = TRUE; - if (one == NULL && two == NULL) + if (one == two) return TRUE; - if ((one != NULL && two == NULL) || - (one == NULL && two != NULL) || - (g_sequence_get_length (one) != g_sequence_get_length (two))) - return FALSE; + if (one == NULL) { + if (g_sequence_get_length (two) == 0) + return TRUE; + else + return FALSE; + } + + if (two == NULL) { + if (g_sequence_get_length (one) == 0) + return TRUE; + else + return FALSE; + } - if (one == two) - return TRUE; + if (g_sequence_get_length (one) != g_sequence_get_length (two)) + return FALSE; iter1 = g_sequence_get_begin_iter (one); while (!g_sequence_iter_is_end (iter1)) { @@ -222,7 +231,7 @@ _gsignond_identity_info_methods_cmp ( * * Creates new instance of GSignondIdentityInfo. * - * Returns: (transfer full) #GSignondIdentityInfo object if successful, + * Returns: (transfer full): #GSignondIdentityInfo object if successful, * NULL otherwise. */ GSignondIdentityInfo * @@ -629,7 +638,7 @@ gsignond_identity_info_set_caption ( * * Retrieves the realms from the info. * - * Returns: (transfer full) the realms if successful, NULL Otherwise. + * Returns: (transfer full): the realms if successful, NULL Otherwise. * when done realms should be freed using g_sequence_free. */ GSequence * @@ -649,7 +658,7 @@ gsignond_identity_info_get_realms (GSignondIdentityInfo *info) * gsignond_identity_info_set_realms: * @info: instance of #GSignondIdentityInfo * - * @realms: (transfer none) realms to be set + * @realms: (transfer none): realms to be set * * Sets the realms of the info. * @@ -674,9 +683,9 @@ gsignond_identity_info_set_realms ( * @info: instance of #GSignondIdentityInfo * * Retrieves the methods from the info whereas #GHashTable consists of - * and #GSequence is a sequence of gchar *. + * (gchar*,GSequence*) and #GSequence is a sequence of gchar *. * - * Returns: (transfer full) the methods if successful, NULL otherwise. + * Returns: (transfer full): the methods if successful, NULL otherwise. * when done, methods should be freed using g_hash_table_unref. */ GHashTable * @@ -714,8 +723,8 @@ gsignond_identity_info_get_methods (GSignondIdentityInfo *info) * gsignond_identity_info_set_methods: * @info: instance of #GSignondIdentityInfo * - * @methods: (transfer none) methods to be set whereas #GHashTable consists of - * and #GSequence is a sequence of gchar *. + * @methods: (transfer none): methods to be set whereas #GHashTable consists of + * (gchar*,#GSequence*) and #GSequence is a sequence of gchar *. * * Sets the methods of the info. * @@ -762,7 +771,7 @@ gsignond_identity_info_set_methods ( * * Retrieves the mechanisms from the info. * - * Returns: (transfer full) the mechanisms if successful, NULL otherwise. + * Returns: (transfer full): the mechanisms if successful, NULL otherwise. * when done, mechanisms should be freed using g_sequence_free; #GSequence is a * sequence of gchar *. */ @@ -837,7 +846,7 @@ gsignond_identity_info_remove_method ( * * Retrieves the access control list from the info. * - * Returns: (transfer full) the list if successful, NULL otherwise. + * Returns: (transfer full): the list if successful, NULL otherwise. * when done, list should be freed using gsignond_security_context_list_free. */ GSignondSecurityContextList * @@ -857,7 +866,7 @@ gsignond_identity_info_get_access_control_list (GSignondIdentityInfo *info) * gsignond_identity_info_set_access_control_list: * @info: instance of #GSignondIdentityInfo * - * @acl: (transfer none) access control list to be set + * @acl: (transfer none): access control list to be set * * Sets the access control list of the info. * @@ -883,7 +892,7 @@ gsignond_identity_info_set_access_control_list ( * * Retrieves the id from the info. * - * Returns: (transfer full) the owner if successful, NULL otherwise. + * Returns: (transfer full): the owner if successful, NULL otherwise. * when done, owner list should be freed using * gsignond_security_context_free. */ @@ -904,7 +913,7 @@ gsignond_identity_info_get_owner (GSignondIdentityInfo *info) * gsignond_identity_info_set_owner: * @info: instance of #GSignondIdentityInfo * - * @owners: (transfer none) owner to be set + * @owners: (transfer none): owner to be set * * Sets the owner of the info. * diff --git a/src/common/gsignond-identity-info.h b/src/common/gsignond-identity-info.h new file mode 100644 index 0000000..be6d318 --- /dev/null +++ b/src/common/gsignond-identity-info.h @@ -0,0 +1,187 @@ +/* vi: set et sw=4 ts=4 cino=t0,(0: */ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of gsignond + * + * Copyright (C) 2012-2013 Intel Corporation. + * + * Contact: Imran Zaman + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#ifndef __GSIGNOND_IDENTITY_INFO_H__ +#define __GSIGNOND_IDENTITY_INFO_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GSIGNOND_TYPE_IDENTITY_INFO (GSIGNOND_TYPE_DICTIONARY) + +#define GSIGNOND_IDENTITY_INFO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + GSIGNOND_TYPE_IDENTITY_INFO, \ + GSignondIdentityInfo)) +#define GSIGNOND_IS_IDENTITY_INFO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),\ + GSIGNOND_TYPE_IDENTITY_INFO)) + +typedef GSignondDictionary GSignondIdentityInfo; +typedef GList GSignondIdentityInfoList; + +GSignondIdentityInfo * +gsignond_identity_info_new (void); + +GSignondIdentityInfo * +gsignond_identity_info_copy (GSignondIdentityInfo *info); + +void +gsignond_identity_info_ref (GSignondIdentityInfo *info); + +void +gsignond_identity_info_unref (GSignondIdentityInfo *info); + +guint32 +gsignond_identity_info_get_id (GSignondIdentityInfo *info); + +gboolean +gsignond_identity_info_set_id ( + GSignondIdentityInfo *info, + guint32 id); + +gboolean +gsignond_identity_info_get_is_identity_new (GSignondIdentityInfo *info); + +gboolean +gsignond_identity_info_set_identity_new (GSignondIdentityInfo *info); + +const gchar * +gsignond_identity_info_get_username (GSignondIdentityInfo *info); + +gboolean +gsignond_identity_info_set_username ( + GSignondIdentityInfo *info, + const gchar *username); + +void +gsignond_identity_info_remove_username (GSignondIdentityInfo *info); + +gboolean +gsignond_identity_info_get_is_username_secret (GSignondIdentityInfo *info); + +gboolean +gsignond_identity_info_set_username_secret ( + GSignondIdentityInfo *info, + gboolean username_secret); + +const gchar * +gsignond_identity_info_get_secret (GSignondIdentityInfo *info); + +gboolean +gsignond_identity_info_set_secret ( + GSignondIdentityInfo *info, + const gchar *secret); + +void +gsignond_identity_info_remove_secret (GSignondIdentityInfo *info); + +gboolean +gsignond_identity_info_get_store_secret (GSignondIdentityInfo *info); + +gboolean +gsignond_identity_info_set_store_secret ( + GSignondIdentityInfo *info, + gboolean store_secret); + +const gchar * +gsignond_identity_info_get_caption (GSignondIdentityInfo *info); + +gboolean +gsignond_identity_info_set_caption ( + GSignondIdentityInfo *info, + const gchar *caption); + +GSequence * +gsignond_identity_info_get_realms (GSignondIdentityInfo *info); + +gboolean +gsignond_identity_info_set_realms ( + GSignondIdentityInfo *info, + GSequence *realms); + +GHashTable * +gsignond_identity_info_get_methods (GSignondIdentityInfo *info); + +gboolean +gsignond_identity_info_set_methods ( + GSignondIdentityInfo *info, + GHashTable *methods); + +GSequence * +gsignond_identity_info_get_mechanisms ( + GSignondIdentityInfo *info, + const gchar *method); + +gboolean +gsignond_identity_info_remove_method ( + GSignondIdentityInfo *info, + const gchar *method); + +GSignondSecurityContextList * +gsignond_identity_info_get_access_control_list (GSignondIdentityInfo *info); + +gboolean +gsignond_identity_info_set_access_control_list ( + GSignondIdentityInfo *info, + const GSignondSecurityContextList *acl); + +GSignondSecurityContext * +gsignond_identity_info_get_owner (GSignondIdentityInfo *info); + +gboolean +gsignond_identity_info_set_owner ( + GSignondIdentityInfo *info, + const GSignondSecurityContext *owner); + +gboolean +gsignond_identity_info_get_validated (GSignondIdentityInfo *info); + +gboolean +gsignond_identity_info_set_validated ( + GSignondIdentityInfo *info, + gboolean validated); + +guint32 +gsignond_identity_info_get_identity_type (GSignondIdentityInfo *info); + +gboolean +gsignond_identity_info_set_identity_type ( + GSignondIdentityInfo *info, + guint32 type); + +gboolean +gsignond_identity_info_compare ( + GSignondIdentityInfo *info, + GSignondIdentityInfo *other); + +void +gsignond_identity_info_list_free (GSignondIdentityInfoList *list); + +G_END_DECLS + +#endif /* __GSIGNOND_IDENTITY_INFO_H__ */ diff --git a/src/common/gsignond-plugin-enum-types.h b/src/common/gsignond-plugin-enum-types.h index a301213..a894461 100644 --- a/src/common/gsignond-plugin-enum-types.h +++ b/src/common/gsignond-plugin-enum-types.h @@ -2,7 +2,7 @@ /* Generated data (by glib-mkenums) */ #ifndef GSIGNOND_PLUGIN_ENUM_TYPES_H_ -#define GSIGNOND_PLUGIND_ENUM_TYPES_H_ +#define GSIGNOND_PLUGIN_ENUM_TYPES_H_ #include diff --git a/src/common/gsignond-plugin-interface.c b/src/common/gsignond-plugin-interface.c index fa9d131..be98631 100644 --- a/src/common/gsignond-plugin-interface.c +++ b/src/common/gsignond-plugin-interface.c @@ -27,8 +27,148 @@ #include "gsignond/gsignond-plugin-interface.h" #include "gsignond-plugin-enum-types.h" +/** + * SECTION:gsignond-plugin-interface + * @short_description: an interface for implementing authentication plugins + * @include: gsignond/gsignond-plugin-interface.h + * + * #GSignondPlugin is an interface for implementing authentication plugins. + * + * When creating a plugin, write the #GObject boilerplate code as usual, but + * + * a) declare the type as follows: + * + * |[ G_DEFINE_TYPE_WITH_CODE (GSignondPasswordPlugin, gsignond_password_plugin, + * G_TYPE_OBJECT, + * G_IMPLEMENT_INTERFACE (GSIGNOND_TYPE_PLUGIN, + * gsignond_plugin_interface_init)); + * ]| + * + * b) implement gsignond_plugin_interface_init as follows: + * + * |[ static void + * gsignond_plugin_interface_init (GSignondPluginInterface *iface) + * { + * iface->cancel = gsignond_password_plugin_cancel; + * iface->request_initial = gsignond_password_plugin_request_initial; + * iface->request = gsignond_password_plugin_request; + * iface->user_action_finished = gsignond_password_plugin_user_action_finished; + * iface->refresh = gsignond_password_plugin_refresh; + * } + * ]| + * + * where the gsignond_password_plugin_cancel etc. are specific implementations of + * plugin interface methods that every plugin must provide (see below for when + * and how they're used by the daemon). + * + * c) override #GSignondPlugin:type and #GSignondPlugin:mechanisms property + * implementations in the plugin class constructor like this: + * + * |[static void + * gsignond_password_plugin_class_init (GSignondPasswordPluginClass *klass) + * { + * GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + * + * gobject_class->set_property = gsignond_password_plugin_set_property; + * gobject_class->get_property = gsignond_password_plugin_get_property; + * + * g_object_class_override_property (gobject_class, PROP_TYPE, "type"); + * g_object_class_override_property (gobject_class, PROP_MECHANISMS, + * "mechanisms"); + * } + * ]| + * (naturally, plugin's property setter should ignore attempts to set these properties, + * and plugin's property getter should provide their values when asked) + * + * The plugin API + * + * Plugins implement authentication sessions which are controlled through the + * plugin API. Authentication sessions follow one another so there is only one active + * session at a time. + * + * The plugin API is a set of methods and signals that should be used in a specific + * sequence: + * + * - successful authentication session begins with gsignond_plugin_request_initial() and ends + * with the plugin issuing a #GSignondPlugin::response-final signal + * - at any point the application can cancel an active session with + * gsignond_plugin_cancel() + * - at any point the plugin can cancel an active session by issuing #GSignondPlugin::error + * signal, which also provides some details about the cancellation reason. + * - if a session is active, and the plugin has an intermediate response or needs + * additional information, it issues #GSignondPlugin::response signal, which the + * application should respond to with gsignond_plugin_request() method. This can + * happen more than once. + * - if the plugin needs to launch UI interaction with the user, it's issuing + * #GSignondPlugin::user-action-required signal, which the application should + * follow up with gsignond_plugin_user_action_finished() method. This can happen + * more than once as well. + * - if, during an active UI session, the application needs a UI refresh + * (for example, to fetch a new captcha image), it's + * requested from the plugin with gsignond_plugin_refresh() method, followed + * by the plugin's response via #GSignondPlugin::refreshed signal. This can happen + * more than once. + * - changes in plugin state are reported through #GSignondPlugin::status-changed signal. + * - if the plugin needs to store information in persistent storage, it issues + * #GSignondPlugin::store signal. Later, that same information is provided as a + * parameter to gsignond_plugin_request_initial(). + * + * Example plugins + * + * See example plugin implementation here: + * + * https://code.google.com/p/accounts-sso/source/browse/?repo=gsignond#git%2Fsrc%2Fplugins. + * + * For examples of out of tree plugins, you can have a look at SASL or OAuth plugin + * implementations: + * + * http://code.google.com/p/accounts-sso/source/browse?repo=gsignond-plugin-sasl. + * + * + * http://code.google.com/p/accounts-sso/source/browse?repo=gsignond-plugin-oa. + * + */ + + +/** + * GSignondPluginState: + * @GSIGNOND_PLUGIN_STATE_NONE: State unknown + * @GSIGNOND_PLUGIN_STATE_RESOLVING: Resolving remote server host name + * @GSIGNOND_PLUGIN_STATE_CONNECTING: Connecting to remote server + * @GSIGNOND_PLUGIN_STATE_SENDING_DATA: Sending data to remote server + * @GSIGNOND_PLUGIN_STATE_WAITING: Waiting for reply from remote server + * @GSIGNOND_PLUGIN_STATE_USER_PENDING: Waiting for response from user + * @GSIGNOND_PLUGIN_STATE_REFRESHING: Refreshing ui request + * @GSIGNOND_PLUGIN_STATE_PROCESS_PENDING: Request has been queued + * @GSIGNOND_PLUGIN_STATE_STARTED: Request has been dequeued + * @GSIGNOND_PLUGIN_STATE_CANCELING: Canceling current process + * @GSIGNOND_PLUGIN_STATE_DONE: Process is finished + * @GSIGNOND_PLUGIN_STATE_HOLDING: Holding long non-expired token + * + * The plugin provides state updates by emitting #GSignondPlugin::status-changed + * signal with this enum and a string describing what happened. + */ + +/** + * GSignondPlugin: + * + * Opaque #GSignondPlugin data structure. + */ G_DEFINE_INTERFACE (GSignondPlugin, gsignond_plugin, 0) +/** + * GSignondPluginInterface: + * @parent: parent interface type. + * @cancel: implementation of gsignond_plugin_cancel() + * @request_initial: implementation of gsignond_plugin_request_initial() + * @request: implementation of gsignond_plugin_request() + * @user_action_finished: implementation of gsignond_plugin_user_action_finished() + * @refresh: implementation of gsignond_plugin_refresh() + * + * #GSignondPluginInterface interface containing pointers to methods that all + * plugin implementations should provide. + */ + /* signals */ enum { @@ -46,46 +186,135 @@ static guint signals[LAST_SIGNAL] = { 0 }; static void gsignond_plugin_default_init (GSignondPluginInterface *g_class) { + /** + * GSignondPlugin::response: + * @plugin: the plugin which emitted the signal + * @session_data: a #GSignondSessionData containing signal parameters + * + * This signal is issued by the plugin when it wants to provide an intermediate + * response to the application or needs additional information from the application. + * + * After issuing this signal the plugin expects a gsignond_plugin_response() call. + */ signals[RESPONSE] = g_signal_new ("response", G_TYPE_FROM_CLASS (g_class), G_SIGNAL_RUN_FIRST, 0, NULL, NULL, NULL, G_TYPE_NONE, 1, GSIGNOND_TYPE_SESSION_DATA); + /** + * GSignondPlugin::response-final: + * @plugin: the plugin which emitted the signal + * @session_data: a #GSignondSessionData containing signal parameters + * + * This signal is issued by the plugin when it has completed the authentication + * sequence and is used to provide the final response to the application. + * + * After issuing this signal the plugin is idle and is ready for a new + * authentication session. + */ signals[RESPONSE_FINAL] = g_signal_new ("response-final", G_TYPE_FROM_CLASS (g_class), G_SIGNAL_RUN_FIRST, 0, NULL, NULL, NULL, G_TYPE_NONE, 1, GSIGNOND_TYPE_SESSION_DATA); + /** + * GSignondPlugin::store: + * @plugin: the plugin which emitted the signal + * @data: a #GSignondDictionary containing data to place in persistent storage + * + * This signal is issued by the plugin when it has data to store in persistant + * storage. The same data would later be provided to plugin via + * gsignond_plugin_request_initial @identity_method_cache parameter. + */ signals[STORE] = g_signal_new ("store", G_TYPE_FROM_CLASS (g_class), G_SIGNAL_RUN_FIRST, 0, NULL, NULL, NULL, G_TYPE_NONE, 1, GSIGNOND_TYPE_DICTIONARY); + /** + * GSignondPlugin::error: + * @plugin: the plugin which emitted the signal + * @error: the details of the error + * + * This signal is issued by the plugin when an error has occured, or the + * plugin otherwise has a reason to cancel the authentication session. The + * @error should be specified according to + * GSignond errors. + * + */ signals[ERROR] = g_signal_new ("error", G_TYPE_FROM_CLASS (g_class), G_SIGNAL_RUN_FIRST, 0, NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_ERROR); + /** + * GSignondPlugin::user-action-required: + * @plugin: the plugin which emitted the signal + * @ui_data: parameters for UI interaction + * + * This signal is issued by the plugin when it needs a UI interaction with + * the user to happen. When the interaction is complete, gsignond_plugin_user_action_finished() + * should be issued. + */ signals[USER_ACTION_REQUIRED] = g_signal_new ("user-action-required", G_TYPE_FROM_CLASS (g_class), G_SIGNAL_RUN_FIRST, 0, NULL, NULL, NULL, G_TYPE_NONE, 1, GSIGNOND_TYPE_SIGNONUI_DATA); + /** + * GSignondPlugin::refreshed: + * @plugin: the plugin which emitted the signal + * @ui_data: parameters for UI refresh + * + * This signal is issued by the plugin when the UI interaction is ongoing + * and the UI needs to be refreshed. This can be used for example to update + * captcha image in the UI. + */ signals[REFRESHED] = g_signal_new ("refreshed", G_TYPE_FROM_CLASS (g_class), G_SIGNAL_RUN_FIRST, 0, NULL, NULL, NULL, G_TYPE_NONE, 1, GSIGNOND_TYPE_SIGNONUI_DATA); + /** + * GSignondPlugin::status-changed: + * @plugin: the plugin which emitted the signal + * @state: the plugin state + * @message: the message that accompanies the state change + * + * This signal is issued by the plugin when plugin state has changed. This + * can be used by applications to report authentication progress. + */ signals[STATUS_CHANGED] = g_signal_new ("status-changed", G_TYPE_FROM_CLASS (g_class), G_SIGNAL_RUN_FIRST, 0, NULL, NULL, NULL, G_TYPE_NONE, 2, GSIGNOND_TYPE_PLUGIN_STATE, G_TYPE_STRING); + /** + * GSignondPlugin:type: + * + * This property holds a plugin type, or authentication method it implements + * (for example "oauth" or "sasl"). + */ g_object_interface_install_property (g_class, g_param_spec_string ("type", "Type", "Plugin type", "none", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); + /** + * GSignondPlugin:mechanisms: + * + * This property holds a list of authentication mechanisms that the plugin + * implements, all specified within the authentication method. For example, + * OAuth plugin could implement "oauth1" and "oauth2" mechanisms. + */ g_object_interface_install_property (g_class, g_param_spec_boxed ( "mechanisms", "Mechanisms", "List of plugin mechanisms", G_TYPE_STRV, G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } +/** + * gsignond_plugin_cancel: + * @self: plugin instance + * + * This method cancels an ongoing authentication session. The plugin implementations + * should issue a #GSignondPlugin::error signal with #GSIGNOND_ERROR_SESSION_CANCELED + * error, and prepare for a new authentication session. + */ void gsignond_plugin_cancel (GSignondPlugin *self) { g_return_if_fail (GSIGNOND_IS_PLUGIN (self)); @@ -93,16 +322,36 @@ void gsignond_plugin_cancel (GSignondPlugin *self) GSIGNOND_PLUGIN_GET_INTERFACE (self)->cancel (self); } +/** + * gsignond_plugin_request_initial: + * @self: plugin instance + * @session_data: parameters for the session + * @identity_method_cache: data from persistent storage, saved previously via + * #GSignondPlugin::store signal + * @mechanism: mechanism to use for the authentication + * + * This method starts a new authentication session. + */ void gsignond_plugin_request_initial (GSignondPlugin *self, GSignondSessionData *session_data, + GSignondDictionary *identity_method_cache, const gchar *mechanism) { g_return_if_fail (GSIGNOND_IS_PLUGIN (self)); GSIGNOND_PLUGIN_GET_INTERFACE (self)->request_initial (self, session_data, + identity_method_cache, mechanism); } +/** + * gsignond_plugin_request: + * @self: plugin instance + * @session_data: additional parameters for the session + * + * This method provides the plugin with additional parameters for the session + * after the plugin has asked for it via #GSignondPlugin::response signal. + */ void gsignond_plugin_request (GSignondPlugin *self, GSignondSessionData *session_data) { @@ -111,6 +360,14 @@ void gsignond_plugin_request (GSignondPlugin *self, GSIGNOND_PLUGIN_GET_INTERFACE (self)->request (self, session_data); } +/** + * gsignond_plugin_user_action_finished: + * @self: plugin instance + * @ui_data: results of UI interaction + * + * This method provides the plugin with the results of UI interaction + * after the plugin has asked for it via #GSignondPlugin::user-action-required signal. + */ void gsignond_plugin_user_action_finished (GSignondPlugin *self, GSignondSignonuiData *ui_data) { @@ -120,6 +377,14 @@ void gsignond_plugin_user_action_finished (GSignondPlugin *self, ui_data); } +/** + * gsignond_plugin_refresh: + * @self: plugin instance + * @ui_data: UI refresh parameters + * + * This method asks the plugin to refresh the UI. The plugin responds with + * #GSignondPlugin::refreshed signal. + */ void gsignond_plugin_refresh (GSignondPlugin *self, GSignondSignonuiData *ui_data) { @@ -128,41 +393,98 @@ void gsignond_plugin_refresh (GSignondPlugin *self, GSIGNOND_PLUGIN_GET_INTERFACE (self)->refresh (self, ui_data); } +/** + * gsignond_plugin_response: + * @self: plugin instance + * @session_data: session data + * + * Plugin implementations should use this to issue #GSignondPlugin::response + * signal. This method should not be used otherwise. + */ void gsignond_plugin_response (GSignondPlugin *self, GSignondSessionData *session_data) { g_signal_emit (self, signals[RESPONSE], 0, session_data); } +/** + * gsignond_plugin_response_final: + * @self: plugin instance + * @session_data: session data + * + * Plugin implementations should use this to issue #GSignondPlugin::response-final + * signal. This method should not be used otherwise. + */ void gsignond_plugin_response_final (GSignondPlugin *self, GSignondSessionData *session_data) { g_signal_emit (self, signals[RESPONSE_FINAL], 0, session_data); } +/** + * gsignond_plugin_store: + * @self: plugin instance + * @identity_method_cache: data to store + * + * Plugin implementations should use this to issue #GSignondPlugin::store + * signal. This method should not be used otherwise. + */ void gsignond_plugin_store (GSignondPlugin *self, - GSignondDictionary *token_data) + GSignondDictionary *identity_method_cache) { - g_signal_emit (self, signals[STORE], 0, token_data); + g_signal_emit (self, signals[STORE], 0, identity_method_cache); } +/** + * gsignond_plugin_error: + * @self: plugin instance + * @error: the error + * + * Plugin implementations should use this to issue #GSignondPlugin::error + * signal. This method should not be used otherwise. + */ void gsignond_plugin_error (GSignondPlugin *self, GError *error) { g_signal_emit (self, signals[ERROR], 0, error); } +/** + * gsignond_plugin_user_action_required: + * @self: plugin instance + * @ui_data: UI data + * + * Plugin implementations should use this to issue #GSignondPlugin::user-action-required + * signal. This method should not be used otherwise. + */ void gsignond_plugin_user_action_required (GSignondPlugin *self, GSignondSignonuiData *ui_data) { g_signal_emit (self, signals[USER_ACTION_REQUIRED], 0, ui_data); } +/** + * gsignond_plugin_refreshed: + * @self: plugin instance + * @ui_data: UI data + * + * Plugin implementations should use this to issue #GSignondPlugin::refreshed + * signal. This method should not be used otherwise. + */ void gsignond_plugin_refreshed (GSignondPlugin *self, GSignondSignonuiData *ui_data) { g_signal_emit (self, signals[REFRESHED], 0, ui_data); } +/** + * gsignond_plugin_status_changed: + * @self: plugin instance + * @state: the new state + * @message: the message + * + * Plugin implementations should use this to issue #GSignondPlugin::status-changed + * signal. This method should not be used otherwise. + */ void gsignond_plugin_status_changed (GSignondPlugin *self, GSignondPluginState state, const gchar *message) { diff --git a/src/common/gsignond-security-context.c b/src/common/gsignond-security-context.c index 7b1c3f0..4de8461 100644 --- a/src/common/gsignond-security-context.c +++ b/src/common/gsignond-security-context.c @@ -25,6 +25,45 @@ #include "gsignond/gsignond-security-context.h" + +/** + * SECTION:gsignond-security-context + * @title: GSignondSecurityContext + * @short_description: security context descriptor used in access control checks + * @include: gsignond/gsignond-security-context.h + * + * Security context is a string tuple of system context and application context. + * + * System context can be a binary path, SMACK-label, or MSSF token. + * + * Application context identifies a script or a webpage within an application, + * and it's used for providing access control to runtime environments (when making an access + * control decision requires not only a binary identifier, but also information + * about what the binary is doing). + * + * When an application is trying to access the gSSO service, the system context + * is determined by a specific #GSignondAccessControlManager instance using + * system services of a specific platform. Application context is set by the + * application itself. Then both contexts are used by #GSignondAccessControlManager + * to perform an access control check. + */ + +/** + * GSignondSecurityContext: + * @sys_ctx: system context + * @app_ctx: application context + * + * Security context descriptor used for access control checks. System context + * and application context can contain a wildcard match "*" which has special + * meaning in gsignond_security_context_match() and + * gsignond_security_context_check(). + */ + +/** + * GSignondSecurityContextList: + * + * GList of #GSignondSecurityContext items. + */ static void _security_context_free (gpointer ptr) { @@ -36,9 +75,9 @@ _security_context_free (gpointer ptr) /** * gsignond_security_context_new: * - * Allocates a new security context item. + * Allocates a new security context item. System and app context are empty strings. * - * Returns: (transfer full) allocated #GSignondSecurityContext. + * Returns: (transfer full): allocated #GSignondSecurityContext. */ GSignondSecurityContext * gsignond_security_context_new () @@ -53,13 +92,13 @@ gsignond_security_context_new () } /** - * gsignond_security_context_new_from_vaues: - * @system_context: system security context (such as SMACK/MSSF label/token). - * @application_context: application security context (such as a script name). + * gsignond_security_context_new_from_values: + * @system_context: system security context + * @application_context: application security context * * Allocates and initializes a new security context item. * - * Returns: (transfer full) allocated #GSignondSecurityContext. + * Returns: (transfer full): allocated #GSignondSecurityContext. */ GSignondSecurityContext * gsignond_security_context_new_from_values (const gchar *system_context, @@ -83,9 +122,9 @@ gsignond_security_context_new_from_values (const gchar *system_context, * gsignond_security_context_copy: * @src_ctx: source security context to copy. * - * Copy a security context item. + * Copies a security context item. * - * Returns: (transfer full) a copy of the #GSignondSecurityContext item. + * Returns: (transfer full): a copy of the #GSignondSecurityContext item. */ GSignondSecurityContext * gsignond_security_context_copy (const GSignondSecurityContext *src_ctx) @@ -117,7 +156,7 @@ gsignond_security_context_free (GSignondSecurityContext *ctx) * @ctx: #GSignondSecurityContext item. * @system_context: system security context. * - * Sets the system context part (such as SMACK label or MSSF token) of the + * Sets the system context part of the * #GSignondSecurityContext. */ void @@ -135,10 +174,10 @@ gsignond_security_context_set_system_context (GSignondSecurityContext *ctx, * gsignond_security_context_get_system_context: * @ctx: #GSignondSecurityContext item. * - * Get the system context part (such as SMACK label or MSSF token) of the + * Get the system context partof the * #GSignondSecurityContext. * - * Returns: (transfer none) system context. + * Returns: (transfer none): system context. */ const gchar * gsignond_security_context_get_system_context ( @@ -154,7 +193,7 @@ gsignond_security_context_get_system_context ( * @ctx: #GSignondSecurityContext item. * @application_context: application security context. * - * Sets the application context part (such as a script name or a web page) of + * Sets the application context part of * the #GSignondSecurityContext. */ void @@ -173,10 +212,10 @@ gsignond_security_context_set_application_context ( * gsignond_security_context_get_application_context: * @ctx: #GSignondSecurityContext item. * - * Get the application context part (such as script name or a web page) of + * Get the application context part of * the #GSignondSecurityContext. * - * Returns: (transfer none) application context. + * Returns: (transfer none): application context. */ const gchar * gsignond_security_context_get_application_context ( @@ -188,12 +227,12 @@ gsignond_security_context_get_application_context ( } /** - * signon_security_conetxt_to_variant: + * gsignond_security_context_to_variant: * @ctx: #GSignondSecurityContext item. * * Build a GVariant of type "(ss)" from a #GSignondSecurityContext item. * - * Returns: (transfer full) GVariant construct of a #GSignondSecurityContext. + * Returns: (transfer full): GVariant construct of a #GSignondSecurityContext. */ GVariant * gsignond_security_context_to_variant (const GSignondSecurityContext *ctx) @@ -215,7 +254,7 @@ gsignond_security_context_to_variant (const GSignondSecurityContext *ctx) * * Builds a #GSignondSecurityContext item from a GVariant of type "(ss)". * - * Returns: (transfer full) #GSignondSecurityContext item. + * Returns: (transfer full): #GSignondSecurityContext item. */ GSignondSecurityContext * gsignond_security_context_from_variant (GVariant *variant) @@ -238,7 +277,7 @@ gsignond_security_context_from_variant (GVariant *variant) * @ctx1: first item to compare. * @ctx2: second item to compare. * - * Compare two #GSignondSecurityContext items similar in a way to strcmp(). + * Compare two #GSignondSecurityContext items in a similar way to strcmp(). * * Returns: negative if ctx1 < ctx2, 0 if ctx1 == ctx2 and positive if ctx1 > ctx2. */ @@ -250,8 +289,10 @@ gsignond_security_context_compare (const GSignondSecurityContext *ctx1, if (ctx1 == ctx2) return 0; - g_return_val_if_fail (ctx1 != NULL, -1); - g_return_val_if_fail (ctx2 != NULL, 1); + if (ctx1 == NULL) + return -1; + if (ctx2 == NULL) + return 1; res = g_strcmp0(ctx1->sys_ctx, ctx2->sys_ctx); if (res == 0) @@ -267,7 +308,10 @@ gsignond_security_context_compare (const GSignondSecurityContext *ctx1, * * Compare two #GSignondSecurityContext items match. * - * Returns: TRUE if contexts are equal or either side has wildcard match, otherwise FALSE. Two NULL contexts match. + * Returns: TRUE if contexts are equal or if either side has a wildcard match for + * system context, or if system contexts are equal and either side has a wildcard + * match for the app context, + * otherwise FALSE. Two NULL contexts match. */ gboolean gsignond_security_context_match (const GSignondSecurityContext *ctx1, @@ -275,7 +319,8 @@ gsignond_security_context_match (const GSignondSecurityContext *ctx1, { if (ctx1 == ctx2) return TRUE; - g_return_val_if_fail (ctx1 != NULL && ctx2 != NULL, FALSE); + if (ctx1 == NULL || ctx2 == NULL) + return FALSE; if (g_strcmp0(ctx1->sys_ctx, "*") == 0 || g_strcmp0(ctx2->sys_ctx, "*") == 0) return TRUE; @@ -294,15 +339,19 @@ gsignond_security_context_match (const GSignondSecurityContext *ctx1, * @reference: reference security context item to check against. * @test: security context item to be checked. * - * Check if item @test is covered by @reference. + * Check if @test is covered by @reference. * - * Returns: TRUE if contexts are equal or wildcards of the @reference arguments match, otherwise FALSE. If either or both contexts are NULL, FALSE is returned. + * Returns: TRUE if contexts are equal or the @reference has a wildcard + * system context, or if system contexts are equal and @reference has a wildcard + * application context, otherwise FALSE. If either or both contexts are NULL, + * FALSE is returned. */ gboolean gsignond_security_context_check (const GSignondSecurityContext *reference, const GSignondSecurityContext *test) { - g_return_val_if_fail (reference != NULL && test != NULL, FALSE); + if (reference == NULL || test == NULL) + return FALSE; if (g_strcmp0(reference->sys_ctx, "*") == 0) return TRUE; if (g_strcmp0(reference->sys_ctx, test->sys_ctx) == 0) { @@ -320,7 +369,7 @@ gsignond_security_context_check (const GSignondSecurityContext *reference, * Builds a GVariant of type "a(ss)" from a GList of #GSignondSecurityContext * items. * - * Returns: (transfer full) GVariant construct of a #GSignondSecurityContextList. + * Returns: (transfer full): GVariant construct of a #GSignondSecurityContextList. */ GVariant * gsignond_security_context_list_to_variant ( @@ -349,7 +398,7 @@ gsignond_security_context_list_to_variant ( * Builds a GList of #GSignondSecurityContext items from a GVariant of type * "a(ss)". * - * Returns: (transfer full) #GSignondSecurityContextList item. + * Returns: (transfer full): #GSignondSecurityContextList item. */ GSignondSecurityContextList * gsignond_security_context_list_from_variant (GVariant *variant) @@ -376,7 +425,7 @@ gsignond_security_context_list_from_variant (GVariant *variant) * * Copies a GList of #GSignondSecurityContext items. * - * Returns: (transfer full) #GSignondSecurityContextList item. + * Returns: (transfer full): #GSignondSecurityContextList item. */ GSignondSecurityContextList * gsignond_security_context_list_copy ( @@ -396,7 +445,7 @@ gsignond_security_context_list_copy ( /** * gsignond_security_context_list_free: - * @seclist: (transfer full) #GSignondSecurityContextList item. + * @seclist: (transfer full): #GSignondSecurityContextList item. * * Frees all items and the GList of #GSignondSecurityContext. */ diff --git a/src/common/gsignond-session-data.c b/src/common/gsignond-session-data.c index b07f23c..a8583f3 100644 --- a/src/common/gsignond-session-data.c +++ b/src/common/gsignond-session-data.c @@ -25,12 +25,63 @@ #include + +/** + * SECTION:gsignond-session-data + * @short_description: definitions for authentication session parameters + * @title: GSignondSessionData + * @include: gsignond/gsignond-session-data.h + * + * This file provides commonly used parameters for authentication sessions. + * For each of those a getter and setter is defined, on #GSignondSessionData + * container. The plugins may not use all of these parameters, and they commonly + * require additional, custom parameters which are set using #GSignondDictionary + * setters with explicit key string. + */ + + +/** + * GSignondSessionData: + * + * #GSignondSessionData is simply a typedef for #GSignondDictionary, which + * means the developers may also freely use methods associated with that structure, + * in particular for creating a #GSignondSessionData object with + * gsignond_dictionary_new(). + */ + +/** + * GSignondUiPolicy: + * @GSIGNOND_UI_POLICY_DEFAULT: use a default user interaction scenario + * @GSIGNOND_UI_POLICY_REQUEST_PASSWORD: force an authorization request from the user; + * any cached access tokens should be discarded by the plugin. + * @GSIGNOND_UI_POLICY_NO_USER_INTERACTION: force no interaction with the user + * @GSIGNOND_UI_POLICY_VALIDATION: interaction with the user is only allowed + * for validation captchas and similar security measures + * + * Policy setting to define how plugins should handle interaction with the user. + */ + +/** + * gsignond_session_data_get_username: + * @data: a #GSignondDictionary structure + * + * A getter for a username associated with the authentication session. + * + * Returns: (transfer none) + */ const gchar * gsignond_session_data_get_username (GSignondSessionData *data) { return gsignond_dictionary_get_string (data, "UserName"); } +/** + * gsignond_session_data_set_username: + * @data: a #GSignondDictionary structure + * @username: username to set + * + * A setter for a username associated with the authentication session. + */ void gsignond_session_data_set_username (GSignondSessionData *data, const gchar *username) @@ -38,12 +89,27 @@ gsignond_session_data_set_username (GSignondSessionData *data, gsignond_dictionary_set_string (data, "UserName", username); } +/** + * gsignond_session_data_get_secret: + * @data: a #GSignondDictionary structure + * + * A getter for a secret (e.g. a password) associated with the authentication session. + * + * Returns: (transfer none) + */ const gchar * gsignond_session_data_get_secret (GSignondSessionData *data) { return gsignond_dictionary_get_string (data, "Secret"); } +/** + * gsignond_session_data_set_secret: + * @data: a #GSignondDictionary structure + * @secret: a secret to set + * + * A setter for a secret (e.g. a password) associated with the authentication session. + */ void gsignond_session_data_set_secret (GSignondSessionData *data, const gchar *secret) @@ -51,12 +117,27 @@ gsignond_session_data_set_secret (GSignondSessionData *data, gsignond_dictionary_set_string (data, "Secret", secret); } +/** + * gsignond_session_data_get_realm: + * @data: a #GSignondDictionary structure + * + * A getter for a realm associated with the authentication session. + * + * Returns: (transfer none) + */ const gchar * gsignond_session_data_get_realm (GSignondSessionData *data) { return gsignond_dictionary_get_string (data, "Realm"); } +/** + * gsignond_session_data_set_realm: + * @data: a #GSignondDictionary structure + * @realm: a realm to set + * + * A setter for a realm associated with the authentication session. + */ void gsignond_session_data_set_realm (GSignondSessionData *data, const gchar *realm) @@ -64,12 +145,31 @@ gsignond_session_data_set_realm (GSignondSessionData *data, gsignond_dictionary_set_string (data, "Realm", realm); } +/** + * gsignond_session_data_get_caption: + * @data: a #GSignondDictionary structure + * + * A getter for a caption associated with the authentication session. + * Caption tells the user which application/credentials/provider is requestion + * authentication. + * + * Returns: (transfer none) + */ const gchar * gsignond_session_data_get_caption (GSignondSessionData *data) { return gsignond_dictionary_get_string (data, "Caption"); } +/** + * gsignond_session_data_set_caption: + * @data: a #GSignondDictionary structure + * @caption: a caption to set + * + * A setter for a caption associated with the authentication session. + * Caption tells the user which application/credentials/provider is requestion + * authentication. + */ void gsignond_session_data_set_caption (GSignondSessionData *data, const gchar *caption) @@ -77,6 +177,17 @@ gsignond_session_data_set_caption (GSignondSessionData *data, gsignond_dictionary_set_string (data, "Caption", caption); } +/** + * gsignond_session_data_get_renew_token: + * @data: a #GSignondDictionary structure + * @renew_token: the value for the parameter is written here + * + * A getter for a renew token property associated with the authentication session. + * This property tells the plugin to discard any cached tokens and start + * the authentication process anew. + * + * Returns: whether the key-value pair exists in the @data dictionary or not. + */ gboolean gsignond_session_data_get_renew_token (GSignondSessionData *data, gboolean *renew_token) @@ -84,6 +195,15 @@ gsignond_session_data_get_renew_token (GSignondSessionData *data, return gsignond_dictionary_get_boolean (data, "RenewToken", renew_token); } +/** + * gsignond_session_data_set_renew_token: + * @data: a #GSignondDictionary structure + * @renew_token: whether to renew the token set + * + * A setter for a renew token property associated with the authentication session. + * This property tells the plugin to discard any cached tokens and start + * the authentication process anew. + */ void gsignond_session_data_set_renew_token (GSignondSessionData *data, gboolean renew_token) @@ -91,26 +211,61 @@ gsignond_session_data_set_renew_token (GSignondSessionData *data, gsignond_dictionary_set_boolean (data, "RenewToken", renew_token); } +/** + * gsignond_session_data_get_ui_policy: + * @data: a #GSignondDictionary structure + * @ui_policy: the value for the parameter is written here + * + * A getter for UI policy setting associated with the authentication session. + * The UI policy indicates how the authentication plugin should interact with the user. + * + * Returns: whether the key-value pair exists in the @data dictionary or not. + */ gboolean gsignond_session_data_get_ui_policy (GSignondSessionData *data, - guint32 *ui_policy) + GSignondUiPolicy *ui_policy) { return gsignond_dictionary_get_uint32 (data, "UiPolicy", ui_policy); } +/** + * gsignond_session_data_set_ui_policy: + * @data: a #GSignondDictionary structure + * @ui_policy: ui policy to set + * + * A getter for UI policy setting associated with the authentication session. + * The UI policy indicates how the authentication plugin should interact with the user. + */ void gsignond_session_data_set_ui_policy (GSignondSessionData *data, - guint32 ui_policy) + GSignondUiPolicy ui_policy) { gsignond_dictionary_set_uint32 (data, "UiPolicy", ui_policy); } +/** + * gsignond_session_data_get_network_proxy: + * @data: a #GSignondDictionary structure + * + * A getter for a network proxy setting associated with the authentication session. + * If this property is not set, the default system proxy settings should be used. + * + * Returns: (transfer none) + */ const gchar * gsignond_session_data_get_network_proxy (GSignondSessionData *data) { return gsignond_dictionary_get_string (data, "NetworkProxy"); } +/** + * gsignond_session_data_set_network_proxy: + * @data: a #GSignondDictionary structure + * @network_proxy: network proxy to use + * + * A setter for a network proxy setting associated with the authentication session. + * If this property is not set, the default system proxy settings should be used. + */ void gsignond_session_data_set_network_proxy (GSignondSessionData *data, const gchar *network_proxy) @@ -118,6 +273,16 @@ gsignond_session_data_set_network_proxy (GSignondSessionData *data, gsignond_dictionary_set_string (data, "NetworkProxy", network_proxy); } +/** + * gsignond_session_data_get_network_timeout: + * @data: a #GSignondDictionary structure + * @network_timeout: the value for the parameter is written here + * + * A getter for a network timeout setting associated with the authentication session. + * This can be used to change the default timeout in case of unresponsive servers. + * + * Returns: whether the key-value pair exists in the @data dictionary or not. + */ gboolean gsignond_session_data_get_network_timeout (GSignondSessionData *data, guint32 *network_timeout) @@ -126,6 +291,14 @@ gsignond_session_data_get_network_timeout (GSignondSessionData *data, network_timeout); } +/** + * gsignond_session_data_set_network_timeout: + * @data: a #GSignondDictionary structure + * @network_timeout: network timeout to use + * + * A setter for a network timeout setting associated with the authentication session. + * This can be used to change the default timeout in case of unresponsive servers. + */ void gsignond_session_data_set_network_timeout (GSignondSessionData *data, guint32 network_timeout) @@ -134,6 +307,17 @@ gsignond_session_data_set_network_timeout (GSignondSessionData *data, network_timeout); } +/** + * gsignond_session_data_get_window_id: + * @data: a #GSignondDictionary structure + * @window_id: the value for the parameter is written here + * + * A getter for a window id setting associated with the authentication session. + * This can be used to embed the user interaction window produced by the authentication + * session into an application window. + * + * Returns: whether the key-value pair exists in the @data dictionary or not. + */ gboolean gsignond_session_data_get_window_id (GSignondSessionData *data, guint32 *window_id) @@ -141,6 +325,15 @@ gsignond_session_data_get_window_id (GSignondSessionData *data, return gsignond_dictionary_get_uint32 (data, "WindowId", window_id); } +/** + * gsignond_session_data_set_window_id: + * @data: a #GSignondDictionary structure + * @window_id: window id to use + * + * A setter for a window id setting associated with the authentication session. + * This can be used to embed the user interaction window produced by the authentication + * session into an application window. + */ void gsignond_session_data_set_window_id (GSignondSessionData *data, guint32 window_id) diff --git a/src/common/gsignond-signonui-data.c b/src/common/gsignond-signonui-data.c index c489b9b..af53312 100644 --- a/src/common/gsignond-signonui-data.c +++ b/src/common/gsignond-signonui-data.c @@ -25,6 +25,59 @@ #include +/** + * SECTION:gsignond-signonui-data + * @short_description: definitions for user interaction parameters + * @title: GSignondSignonuiData + * @include: gsignond/gsignond-signonui-data.h + * + * This file provides commonly used parameters for user interaction during + * authentication sessions. + * For each of those a getter and setter is defined, on #GSignondSessionData + * container. + * + * This container is used in two directions: by plugins to specify the parameters + * for user interaction that is then performed by SignonUI component, and by SignonUI + * to return the results of that interaction to the plugins. See #GSignondPlugin + * for the user interaction API from the plugins' perspective. + * + * The parameters that are set by the plugin and read by signon UI are captcha url, + * caption, confirm, final url, forgot password, forgot password url, message, + * open url, password, query password, query username, remember + * password, request id, test reply values, title, username. + * + * The parameters that are returned by signon UI to the plugin are captcha response, + * password, query error code, remember password, url response. + */ + +/** + * GSignondSignonuiData: + * + * #GSignondSignonuiData is simply a typedef for #GSignondDictionary, which + * means the developers may also freely use methods associated with that structure, + * in particular for creating a #GSignondSignonuiData object with + * gsignond_dictionary_new(). + */ + +/** + * GSignondSignonuiError: + * @SIGNONUI_ERROR_NONE: No errors + * @SIGNONUI_ERROR_GENERAL: Generic error during interaction + * @SIGNONUI_ERROR_NO_SIGNONUI: Cannot send request to signon-ui + * @SIGNONUI_ERROR_BAD_PARAMETERS: Signon-Ui cannot create dialog based on the given UiSessionData + * @SIGNONUI_ERROR_CANCELED: User canceled action. Plugin should not retry automatically after this + * @SIGNONUI_ERROR_NOT_AVAILABLE: Requested ui is not available. For example browser cannot be started + * @SIGNONUI_ERROR_BAD_URL: Given url was not valid + * @SIGNONUI_ERROR_BAD_CAPTCHA: Given captcha image was not valid + * @SIGNONUI_ERROR_BAD_CAPTCHA_URL: Given url for capctha loading was not valid + * @SIGNONUI_ERROR_REFRESH_FAILED: Refresh failed + * @SIGNONUI_ERROR_FORBIDDEN: Showing ui forbidden by ui policy + * @SIGNONUI_ERROR_FORGOT_PASSWORD: User pressed forgot password + * + * This enum defines errors that may happen during user interaction. + */ + + #define SIGNONUI_KEY_CAPTCHA_RESPONSE "CaptchaResponse" #define SIGNONUI_KEY_CAPTCHA_URL "CaptchaUrl" #define SIGNONUI_KEY_CAPTION "Caption" @@ -45,12 +98,27 @@ #define SIGNONUI_KEY_URL_RESPONSE "UrlResponse" #define SIGNONUI_KEY_USERNAME "UserName" +/** + * gsignond_signonui_data_get_captcha_response: + * @data: a #GSignondDictionary structure + * + * A getter for the user's response to a captcha query. + * + * Returns: (transfer none): the string entered by the user in response to a captcha query. + */ const gchar* gsignond_signonui_data_get_captcha_response (GSignondSignonuiData *data) { return gsignond_dictionary_get_string (data, SIGNONUI_KEY_CAPTCHA_RESPONSE); } +/** + * gsignond_signonui_data_set_captcha_response: + * @data: a #GSignondDictionary structure + * @response: the string entered by the user in response to a captcha query. + * + * A setter for the user's response to a captcha query. + */ void gsignond_signonui_data_set_captcha_response (GSignondSignonuiData *data, const gchar *response) @@ -58,12 +126,27 @@ gsignond_signonui_data_set_captcha_response (GSignondSignonuiData *data, gsignond_dictionary_set_string (data, SIGNONUI_KEY_CAPTCHA_RESPONSE, response); } +/** + * gsignond_signonui_data_get_captcha_url: + * @data: a #GSignondDictionary structure + * + * A getter for the captcha URL. + * + * Returns: (transfer none): the URL to the captcha image to be verified by user. + */ const gchar* gsignond_signonui_data_get_captcha_url (GSignondSignonuiData *data) { return gsignond_dictionary_get_string (data, SIGNONUI_KEY_CAPTCHA_URL); } +/** + * gsignond_signonui_data_set_captcha_url: + * @data: a #GSignondDictionary structure + * @url: the URL to the captcha image to be verified by user + * + * A setter for the captcha URL. + */ void gsignond_signonui_data_set_captcha_url (GSignondSignonuiData *data, const gchar *url) @@ -71,12 +154,30 @@ gsignond_signonui_data_set_captcha_url (GSignondSignonuiData *data, gsignond_dictionary_set_string (data, SIGNONUI_KEY_CAPTCHA_URL, url); } +/** + * gsignond_signonui_data_get_caption: + * @data: a #GSignondDictionary structure + * + * A getter for the caption string. Caption tells the user which + * application/credentials/provider is requestion authentication. + * + * Returns: (transfer none) + */ const gchar* gsignond_signonui_data_get_caption (GSignondSignonuiData *data) { return gsignond_dictionary_get_string (data, SIGNONUI_KEY_CAPTION); } +/** + * gsignond_signonui_data_set_caption: + * @data: a #GSignondDictionary structure + * @caption: the caption string + * + * A setter for the caption string. Caption tells the user which + * application/credentials/provider is requestion authentication. + * + */ void gsignond_signonui_data_set_caption (GSignondSignonuiData *data, const gchar *caption) @@ -84,6 +185,17 @@ gsignond_signonui_data_set_caption (GSignondSignonuiData *data, gsignond_dictionary_set_string (data, SIGNONUI_KEY_CAPTION, caption); } +/** + * gsignond_signonui_data_get_confirm: + * @data: a #GSignondDictionary structure + * @confirm: the value for the property is written here + * + * A getter for the confirm mode. In confirm mode the user is asked to enter + * an old password (which is compared to the supplied password), and a new password twice + * (which is returned). + * + * Returns: whether this property exists in the @data dictionary or not. + */ gboolean gsignond_signonui_data_get_confirm (GSignondSignonuiData *data, gboolean *confirm) @@ -91,6 +203,16 @@ gsignond_signonui_data_get_confirm (GSignondSignonuiData *data, return gsignond_dictionary_get_boolean (data, SIGNONUI_KEY_CONFIRM, confirm); } +/** + * gsignond_signonui_data_set_confirm: + * @data: a #GSignondDictionary structure + * @confirm: the value for the property + * + * A setter for the confirm mode. In confirm mode the user is asked to enter + * an old password (which is compared to the supplied password), and a new password twice + * (which is returned). + * + */ void gsignond_signonui_data_set_confirm (GSignondSignonuiData *data, gboolean confirm) @@ -98,12 +220,34 @@ gsignond_signonui_data_set_confirm (GSignondSignonuiData *data, gsignond_dictionary_set_boolean (data, SIGNONUI_KEY_CONFIRM, confirm); } +/** + * gsignond_signonui_data_get_final_url: + * @data: a #GSignondDictionary structure + * + * A getter for the final URL. When the signon UI detects that the user is at + * the final URL (possibly with additional query or fragment parameters), it + * will close the window and return the full URL via url response property. + * This is used by redirection-based authentication, such as OAuth. + * + * Returns: (transfer none) + */ const gchar* gsignond_signonui_data_get_final_url (GSignondSignonuiData *data) { return gsignond_dictionary_get_string (data, SIGNONUI_KEY_FINAL_URL); } +/** + * gsignond_signonui_data_set_final_url: + * @data: a #GSignondDictionary structure + * @url: the final url + * + * A setter for the final URL. When the signon UI detects that the user is at + * the final URL (possibly with additional query or fragment parameters), it + * will close the window and return the full URL via url response property. + * This is used by redirection-based authentication, such as OAuth. + * + */ void gsignond_signonui_data_set_final_url (GSignondSignonuiData *data, const gchar *url) @@ -111,28 +255,64 @@ gsignond_signonui_data_set_final_url (GSignondSignonuiData *data, gsignond_dictionary_set_string (data, SIGNONUI_KEY_FINAL_URL, url); } -gboolean -gsignond_signonui_data_get_forgot_password (GSignondSignonuiData *data, - gboolean *forgot_password) +/** + * gsignond_signonui_data_get_forgot_password: + * @data: a #GSignondDictionary structure + * + * A getter for the forgot password string which is shown to the user as a link to + * reset the password or remind him of the password. + * + * Returns: (transfer none) + */ +const gchar* +gsignond_signonui_data_get_forgot_password (GSignondSignonuiData *data) { - return gsignond_dictionary_get_boolean (data, - SIGNONUI_KEY_FORGOT_PASSWORD, - forgot_password); + return gsignond_dictionary_get_string (data, + SIGNONUI_KEY_FORGOT_PASSWORD); } +/** + * gsignond_signonui_data_set_forgot_password: + * @data: a #GSignondDictionary structure + * @forgot: the forgot password string + * + * A setter for the forgot password string, which is shown to the user as a link to + * reset the password or remind him of the password. + * + * Returns: (transfer none): + */ void gsignond_signonui_data_set_forgot_password (GSignondSignonuiData *data, - gboolean forgot) + const gchar* forgot) { - gsignond_dictionary_set_boolean (data, SIGNONUI_KEY_FORGOT_PASSWORD, forgot); + gsignond_dictionary_set_string (data, SIGNONUI_KEY_FORGOT_PASSWORD, forgot); } +/** + * gsignond_signonui_data_get_forgot_password_url: + * @data: a #GSignondDictionary structure + * + * A getter for the forgot password URL, where the user can reset or request a + * reminder of the password. + * + * Returns: (transfer none) + */ const gchar* gsignond_signonui_data_get_forgot_password_url (GSignondSignonuiData *data) { return gsignond_dictionary_get_string (data, SIGNONUI_KEY_FORGOT_PASSWORD_URL); } +/** + * gsignond_signonui_data_set_forgot_password_url: + * @data: a #GSignondDictionary structure + * @url: the forgot password URL + * + * A setter for the forgot password URL, where the user can reset or request a + * reminder of the password. + * + * Returns: (transfer none) + */ void gsignond_signonui_data_set_forgot_password_url (GSignondSignonuiData *data, const gchar *url) @@ -140,12 +320,28 @@ gsignond_signonui_data_set_forgot_password_url (GSignondSignonuiData *data, gsignond_dictionary_set_string (data, SIGNONUI_KEY_FORGOT_PASSWORD_URL, url); } +/** + * gsignond_signonui_data_get_message: + * @data: a #GSignondDictionary structure + * + * A getter for the message which is show to the user in the signon UI dialog. + * + * Returns: (transfer none) + */ const gchar* gsignond_signonui_data_get_message (GSignondSignonuiData *data) { return gsignond_dictionary_get_string (data, SIGNONUI_KEY_MESSAGE); } +/** + * gsignond_signonui_data_set_message: + * @data: a #GSignondDictionary structure + * @message: the message + * + * A setter for the message which is show to the user in the signon UI dialog. + * + */ void gsignond_signonui_data_set_message (GSignondSignonuiData *data, const gchar *message) @@ -153,12 +349,28 @@ gsignond_signonui_data_set_message (GSignondSignonuiData *data, gsignond_dictionary_set_string (data, SIGNONUI_KEY_MESSAGE, message); } +/** + * gsignond_signonui_data_get_open_url: + * @data: a #GSignondDictionary structure + * + * A getter for the URL that should be opened by signon UI. + * + * Returns: (transfer none) + */ const gchar* gsignond_signonui_data_get_open_url (GSignondSignonuiData *data) { return gsignond_dictionary_get_string (data, SIGNONUI_KEY_OPEN_URL); } +/** + * gsignond_signonui_data_set_open_url: + * @data: a #GSignondDictionary structure + * @url: the url to open + * + * A setter for the URL that should be opened by signon UI. + * + */ void gsignond_signonui_data_set_open_url (GSignondSignonuiData *data, const gchar *url) @@ -166,12 +378,28 @@ gsignond_signonui_data_set_open_url (GSignondSignonuiData *data, gsignond_dictionary_set_string (data, SIGNONUI_KEY_OPEN_URL, url); } +/** + * gsignond_signonui_data_get_password: + * @data: a #GSignondDictionary structure + * + * A getter for the password string. + * + * Returns: (transfer none) + */ const gchar* gsignond_signonui_data_get_password (GSignondSignonuiData *data) { return gsignond_dictionary_get_string (data, SIGNONUI_KEY_PASSWORD); } +/** + * gsignond_signonui_data_set_password: + * @data: a #GSignondDictionary structure + * @password: the password string + * + * A setter for the password string. + * + */ void gsignond_signonui_data_set_password (GSignondSignonuiData *data, const gchar *password) @@ -179,6 +407,16 @@ gsignond_signonui_data_set_password (GSignondSignonuiData *data, gsignond_dictionary_set_string (data, SIGNONUI_KEY_PASSWORD, password); } +/** + * gsignond_signonui_data_get_query_error: + * @data: a #GSignondDictionary structure + * @error: the error is written here + * + * A getter for the UI interaction error. Signon UI sets this to @SIGNONUI_ERROR_NONE if + * there were no errors. + * + * Returns: whether this property exists in the @data dictionary or not. + */ gboolean gsignond_signonui_data_get_query_error (GSignondSignonuiData *data, GSignondSignonuiError *error) @@ -188,6 +426,15 @@ gsignond_signonui_data_get_query_error (GSignondSignonuiData *data, error); } +/** + * gsignond_signonui_data_set_query_error: + * @data: a #GSignondDictionary structure + * @error: the error + * + * A setter for the UI interaction error. Signon UI sets this to @SIGNONUI_ERROR_NONE if + * there were no errors. + * + */ void gsignond_signonui_data_set_query_error (GSignondSignonuiData *data, GSignondSignonuiError error) @@ -195,6 +442,16 @@ gsignond_signonui_data_set_query_error (GSignondSignonuiData *data, gsignond_dictionary_set_uint32 (data, SIGNONUI_KEY_QUERY_ERROR_CODE, error); } +/** + * gsignond_signonui_data_get_query_password: + * @data: a #GSignondDictionary structure + * @query_password: the property is written here + * + * A getter for the query password property. It indicates whether the signon UI + * should ask the user for a password (and return it in the password property). + * + * Returns: whether this property exists in the @data dictionary or not. + */ gboolean gsignond_signonui_data_get_query_password (GSignondSignonuiData *data, gboolean *query_password) @@ -204,6 +461,15 @@ gsignond_signonui_data_get_query_password (GSignondSignonuiData *data, query_password); } +/** + * gsignond_signonui_data_set_query_password: + * @data: a #GSignondDictionary structure + * @query: the property value + * + * A setter for the query password property. It indicates whether the signon UI + * should ask the user for a password (and return it in the password property). + * + */ void gsignond_signonui_data_set_query_password (GSignondSignonuiData *data, gboolean query) @@ -211,6 +477,16 @@ gsignond_signonui_data_set_query_password (GSignondSignonuiData *data, gsignond_dictionary_set_boolean (data, SIGNONUI_KEY_QUERY_PASSWORD, query); } +/** + * gsignond_signonui_data_get_query_username: + * @data: a #GSignondDictionary structure + * @query_username: the property is written here + * + * A getter for the query username property. It indicates whether the signon UI + * should ask the user for a username (and return it in the username property). + * + * Returns: whether this property exists in the @data dictionary or not. + */ gboolean gsignond_signonui_data_get_query_username (GSignondSignonuiData *data, gboolean *query_username) @@ -220,6 +496,15 @@ gsignond_signonui_data_get_query_username (GSignondSignonuiData *data, query_username); } +/** + * gsignond_signonui_data_set_query_username: + * @data: a #GSignondDictionary structure + * @query: the property value + * + * A setter for the query username property. It indicates whether the signon UI + * should ask the user for a username (and return it in the username property). + * + */ void gsignond_signonui_data_set_query_username (GSignondSignonuiData *data, gboolean query) @@ -227,6 +512,15 @@ gsignond_signonui_data_set_query_username (GSignondSignonuiData *data, gsignond_dictionary_set_boolean (data, SIGNONUI_KEY_QUERY_USERNAME, query); } +/** + * gsignond_signonui_data_get_remember_password: + * @data: a #GSignondDictionary structure + * @remember_password: the property is written here + * + * A getter for whether the password should be remembered. + * + * Returns: whether this property exists in the @data dictionary or not. + */ gboolean gsignond_signonui_data_get_remember_password (GSignondSignonuiData *data, gboolean *remember_password) @@ -236,6 +530,14 @@ gsignond_signonui_data_get_remember_password (GSignondSignonuiData *data, remember_password); } +/** + * gsignond_signonui_data_set_remember_password: + * @data: a #GSignondDictionary structure + * @remember: the property value + * + * A setter for whether the password should be remembered. + * + */ void gsignond_signonui_data_set_remember_password (GSignondSignonuiData *data, gboolean remember) @@ -243,12 +545,30 @@ gsignond_signonui_data_set_remember_password (GSignondSignonuiData *data, gsignond_dictionary_set_boolean (data, SIGNONUI_KEY_REMEMBER_PASSWORD, remember); } +/** + * gsignond_signonui_data_get_request_id: + * @data: a #GSignondDictionary structure + * + * A getter for the dialog request id. The id identifies the dialog so that it + * can be refreshed or updated. + * + * Returns: (transfer none) + */ const gchar* gsignond_signonui_data_get_request_id (GSignondSignonuiData *data) { return gsignond_dictionary_get_string (data, SIGNONUI_KEY_REQUEST_ID); } +/** + * gsignond_signonui_data_set_request_id: + * @data: a #GSignondDictionary structure + * @id: request id + * + * A setter for the dialog request id. The id identifies the dialog so that it + * can be refreshed or updated. + * + */ void gsignond_signonui_data_set_request_id (GSignondSignonuiData *data, const gchar *id) @@ -256,12 +576,30 @@ gsignond_signonui_data_set_request_id (GSignondSignonuiData *data, gsignond_dictionary_set_string (data, SIGNONUI_KEY_REQUEST_ID, id); } +/** + * gsignond_signonui_data_get_test_reply: + * @data: a #GSignondDictionary structure + * + * A getter for the test reply values. It's used only by the signon ui + * implementations to test themselves. + * + * Returns: (transfer none) + */ const gchar* gsignond_signonui_data_get_test_reply (GSignondSignonuiData *data) { return gsignond_dictionary_get_string (data, SIGNONUI_KEY_TEST_REPLY_VALUES); } +/** + * gsignond_signonui_data_set_test_reply: + * @data: a #GSignondDictionary structure + * @reply: test reply values + * + * A setter for the test reply values. It's used only by the signon ui + * implementations to test themselves. + * + */ void gsignond_signonui_data_set_test_reply (GSignondSignonuiData *data, const gchar *reply) @@ -269,12 +607,28 @@ gsignond_signonui_data_set_test_reply (GSignondSignonuiData *data, gsignond_dictionary_set_string (data, SIGNONUI_KEY_TEST_REPLY_VALUES, reply); } +/** + * gsignond_signonui_data_get_title: + * @data: a #GSignondDictionary structure + * + * A getter for the UI dialog title. + * + * Returns: (transfer none) + */ const gchar* gsignond_signonui_data_get_title (GSignondSignonuiData *data) { return gsignond_dictionary_get_string (data, SIGNONUI_KEY_TITLE); } +/** + * gsignond_signonui_data_set_title: + * @data: a #GSignondDictionary structure + * @title: the title + * + * A setter for the UI dialog title. + * + */ void gsignond_signonui_data_set_title (GSignondSignonuiData *data, const gchar* title) @@ -282,12 +636,34 @@ gsignond_signonui_data_set_title (GSignondSignonuiData *data, gsignond_dictionary_set_string (data, SIGNONUI_KEY_TITLE, title); } +/** + * gsignond_signonui_data_get_url_response: + * @data: a #GSignondDictionary structure + * + * A getter for the response URL. If the final URL was set in the request to the signon UI, and the signon UI + * detects that it has been reached, then the full final URL is returned using + * this property. This is used by redirection-based authentication such as OAauth. + * + * Returns: (transfer none) + */ const gchar* gsignond_signonui_data_get_url_response (GSignondSignonuiData *data) { return gsignond_dictionary_get_string (data, SIGNONUI_KEY_URL_RESPONSE); } +/** + * gsignond_signonui_data_set_url_response: + * @data: a #GSignondDictionary structure + * @response: the response URL + * + * A getter for the response URL. If the final URL was set in the request to the + * signon UI, and the signon UI + * detects that it has been reached, then the full final URL is returned using + * this property. This is used by redirection-based authentication such as OAauth. + * + * Returns: (transfer none) + */ void gsignond_signonui_data_set_url_response (GSignondSignonuiData *data, const gchar *response) @@ -295,12 +671,28 @@ gsignond_signonui_data_set_url_response (GSignondSignonuiData *data, gsignond_dictionary_set_string (data, SIGNONUI_KEY_URL_RESPONSE, response); } +/** + * gsignond_signonui_data_get_username: + * @data: a #GSignondDictionary structure + * + * A getter for the username string. + * + * Returns: (transfer none) + */ const gchar* gsignond_signonui_data_get_username (GSignondSignonuiData *data) { return gsignond_dictionary_get_string (data, SIGNONUI_KEY_USERNAME); } +/** + * gsignond_signonui_data_set_username: + * @data: a #GSignondDictionary structure + * @username: the username string + * + * A setter for the username string. + * + */ void gsignond_signonui_data_set_username (GSignondSignonuiData *data, const gchar *username) diff --git a/src/common/gsignond-storage-manager.c b/src/common/gsignond-storage-manager.c index 64e7d72..7df6c27 100644 --- a/src/common/gsignond-storage-manager.c +++ b/src/common/gsignond-storage-manager.c @@ -23,6 +23,7 @@ * 02110-1301 USA */ +#include #include #include @@ -31,6 +32,25 @@ #include "gsignond/gsignond-storage-manager.h" #include "gsignond/gsignond-utils.h" +/** + * SECTION:gsignond-storage-manager + * @short_description: manages encrypted disk storage for storing the secret database + * @include: gsignond/gsignond-plugin-interface.h + * + * #GSignondStorageManager manages encrypted disk storage for storing the + * databases. The default implementation maintains a simple per-user + * directory accessible only to root and gsignond group, but gSSO can be + * configured to use a custom extension that provides a subclassed + * implementation of #GSignondStorageManager + * (see #GSignondExtension for instructions and pointers to examples). + */ +/** + * GSignondStorageManager: + * + * Opaque #GSignondStorageManager data structure. + */ + + #define GSIGNOND_STORAGE_MANAGER_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \ GSIGNOND_TYPE_STORAGE_MANAGER, \ @@ -57,17 +77,19 @@ _set_config (GSignondStorageManager *self, GSignondConfig *config) g_assert (self->config == NULL); self->config = config; - const gchar *secure_dir = gsignond_config_get_string ( - self->config, - GSIGNOND_CONFIG_GENERAL_SECURE_DIR); - if (secure_dir) - self->location = g_build_filename (secure_dir, - "gsignond.secret", + gchar *user_dir = g_strdup_printf ("gsignond.%s", g_get_user_name ()); + const gchar *storage_path = gsignond_config_get_string ( + self->config, + GSIGNOND_CONFIG_GENERAL_STORAGE_PATH); + if (storage_path) + self->location = g_build_filename (storage_path, + user_dir, NULL); else - self->location = g_build_filename (g_get_user_data_dir (), - "gsignond.secret", + self->location = g_build_filename ("/var/db", + user_dir, NULL); + g_free (user_dir); DBG ("secure dir %s", self->location); } @@ -142,10 +164,28 @@ _initialize_storage (GSignondStorageManager *self) g_return_val_if_fail (self != NULL, FALSE); g_return_val_if_fail (self->location, FALSE); - if (g_mkdir_with_parents (self->location, S_IRWXU)) - return FALSE; + if (g_access (self->location, R_OK) == 0) + return TRUE; - return TRUE; + gboolean res = FALSE; + + uid_t uid = getuid (); + if (seteuid (0)) + WARN ("seteuid() failed"); + + if (g_mkdir_with_parents (self->location, S_IRWXU | S_IRWXG)) + goto init_exit; + if (chown (self->location, 0, getegid ())) + WARN ("chown() failed"); + if (chmod (self->location, S_IRWXU | S_IRWXG)) + WARN ("chmod() failed"); + res = TRUE; + +init_exit: + if (seteuid (uid)) + WARN ("seteuid failed"); + + return res; } static gboolean @@ -191,6 +231,18 @@ _filesystem_is_mounted (GSignondStorageManager *self) return _storage_is_initialized (self); } +/** + * GSignondStorageManagerClass: + * @parent_class: parent class. + * @initialize_storage: an implementation of gsignond_storage_manager_initialize_storage() + * @delete_storage: an implementation of gsignond_storage_manager_delete_storage() + * @storage_is_initialized: an implementation of gsignond_storage_manager_storage_is_initialized() + * @mount_filesystem: an implementation of gsignond_storage_manager_mount_filesystem() + * @unmount_filesystem: an implementation of gsignond_storage_manager_unmount_filesystem() + * @filesystem_is_mounted: an implementation of gsignond_storage_manager_filesystem_is_mounted() + * + * #GSignondStorageManagerClass class containing pointers to class methods. + */ static void gsignond_storage_manager_class_init (GSignondStorageManagerClass *klass) { @@ -232,8 +284,8 @@ gsignond_storage_manager_init (GSignondStorageManager *self) * gsignond_storage_manager_initialize_storage: * @self: object instance. * - * Initialize encryption storage. Initiali key should be set using - * #gsignond_storage_manager_set_encryption_key before calling this. + * Initialize encryption storage. This means making sure that the + * necessary directories exist and are accessible. * * Returns: success? */ @@ -248,7 +300,8 @@ gsignond_storage_manager_initialize_storage (GSignondStorageManager *self) * gsignond_storage_manager_delete_storage: * @self: object instance. * - * Destroys all the encryption keys and wipes the storage. + * Destroys all the encryption keys and wipes the storage. gsignond_wipe_directory() + * is typically used for the latter. * * Returns: success? */ @@ -263,7 +316,7 @@ gsignond_storage_manager_delete_storage (GSignondStorageManager *self) * gsignond_storage_manager_storage_is_initialized: * @self: object instance. * - * Checks if the storage exists, and if possible if it has been initialized. + * Checks if the storage has been initialized. * * Returns: storage has been initialized? */ @@ -278,10 +331,14 @@ gsignond_storage_manager_storage_is_initialized (GSignondStorageManager *self) * gsignond_storage_manager_mount_filesystem: * @self: object instance. * - * Mounts an encrypted storage and returns filesystem path of the storage - * mount point. + * Mounts an encrypted storage and returns the filesystem path of the storage + * mount point. This path will be used to access the secret database via + * #GSignondSecretStorage. + * + * The default implemenation does nothing, and immediately returns the path for the + * secret database. * - * Returns: (transfer none) path of the storage mount point. + * Returns: (transfer none): path of the storage mount point. */ const gchar * gsignond_storage_manager_mount_filesystem (GSignondStorageManager *self) @@ -294,7 +351,7 @@ gsignond_storage_manager_mount_filesystem (GSignondStorageManager *self) * gsignond_storage_manager_unmount_filesystem: * @self: object instance. * - * Unmounts a previously mounted storage filesystem. + * Unmounts a previously mounted encrypted storage filesystem. * * Returns: success? */ @@ -309,7 +366,7 @@ gsignond_storage_manager_unmount_filesystem (GSignondStorageManager *self) * gsignond_storage_manager_filesystem_is_mounted: * @self: object instance. * - * Checks if the filesystem is currently mounted. + * Checks if the encrypted storage filesystem is currently mounted. * * Returns: filesystem is currently mounted? */ diff --git a/src/common/gsignond-utils.c b/src/common/gsignond-utils.c index 98d4065..df84032 100644 --- a/src/common/gsignond-utils.c +++ b/src/common/gsignond-utils.c @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -32,10 +33,36 @@ #include "gsignond/gsignond-utils.h" #include "gsignond/gsignond-log.h" +/** + * SECTION:gsignond-utils + * @title: Utility functions + * @short_description: miscellaneous utility functions + * @include: gsignond/gsignond-utils.h + * + * Miscellaneous utility functions are described below. + */ -static size_t pagesize = 0; +typedef struct __nonce_ctx_t +{ + gboolean initialized; + guint32 serial; + guchar key[32]; + guchar entropy[16]; +} _nonce_ctx_t; +static size_t pagesize = 0; +static _nonce_ctx_t _nonce_ctx = { 0, }; +G_LOCK_DEFINE_STATIC (_nonce_lock); +/** + * gsignond_wipe_file: + * @filename: filename to wipe + * + * This function securely wipes the contents of the file, by overwriting it with + * 0's, then 1's, then random data. The file is then removed. + * + * Returns: TRUE if wiping and removal was successful. + */ gboolean gsignond_wipe_file (const gchar *filename) { @@ -123,7 +150,16 @@ _rng_exit: return retval; } - +/** + * gsignond_wipe_directory: + * @dirname: directory to wipe + * + * This function securely wipes the contents of the directory by calling + * gsignond_wipe_file() on each file. It also removes links and empty directories but + * does not recursively wipe them. + * + * Returns: TRUE if wiping and removal was successful. + */ gboolean gsignond_wipe_directory (const gchar *dirname) { @@ -161,3 +197,70 @@ _dir_exit: return retval; } +static gboolean +_init_nonce_gen () +{ + if (G_LIKELY(_nonce_ctx.initialized)) + return TRUE; + + int fd; + + fd = open ("/dev/urandom", O_RDONLY); + if (fd < 0) + goto init_exit; + if (read (fd, _nonce_ctx.key, sizeof (_nonce_ctx.key)) != + sizeof (_nonce_ctx.key)) + goto init_close; + if (read (fd, _nonce_ctx.entropy, sizeof(_nonce_ctx.entropy)) != + sizeof (_nonce_ctx.entropy)) + goto init_close; + + _nonce_ctx.serial = 0; + + _nonce_ctx.initialized = TRUE; + +init_close: + close (fd); + +init_exit: + return _nonce_ctx.initialized; +} + +/** + * gsignond_generate_nonce: + * + * This function generates a random secure nonce using SHA1 HMAC. + * + * Returns: (transfer full): the nonce in lowercase hexadecimal format, 40 bytes long. + */ +gchar * +gsignond_generate_nonce () +{ + GHmac *hmac; + gchar *nonce = NULL; + struct timespec ts; + + G_LOCK (_nonce_lock); + + if (G_UNLIKELY (!_init_nonce_gen())) + goto nonce_exit; + + hmac = g_hmac_new (G_CHECKSUM_SHA1, + _nonce_ctx.key, sizeof (_nonce_ctx.key)); + g_hmac_update (hmac, _nonce_ctx.entropy, sizeof (_nonce_ctx.entropy)); + _nonce_ctx.serial++; + g_hmac_update (hmac, + (const guchar *) &_nonce_ctx.serial, + sizeof (_nonce_ctx.serial)); + if (clock_gettime (CLOCK_MONOTONIC, &ts) == 0) + g_hmac_update (hmac, (const guchar *) &ts, sizeof (ts)); + memset (&ts, 0x00, sizeof(ts)); + nonce = g_strdup (g_hmac_get_string (hmac)); + g_hmac_unref (hmac); + +nonce_exit: + G_UNLOCK (_nonce_lock); + + return nonce; +} + diff --git a/src/daemon/Makefile.am b/src/daemon/Makefile.am index 9d45622..2feb112 100644 --- a/src/daemon/Makefile.am +++ b/src/daemon/Makefile.am @@ -11,15 +11,15 @@ BUILT_SOURCES = \ gsignond-identity-enum-types.h: $(top_srcdir)/src/common/gsignond-enum.h.template gsignond-identity.h $(GLIB_MKENUMS) --template $(top_srcdir)/src/common/gsignond-enum.h.template \ --fhead "#ifndef GSIGNOND_IDENTITY_ENUM_TYPES_H_\n#define GSIGNOND_IDENTITY_ENUM_TYPES_H_\n\n#include \n\nG_BEGIN_DECLS" \ - --identifier-prefix gsignond \ + --identifier-prefix GSignond \ --ftail "\nG_END_DECLS\n\n#endif\n" \ - gsignond-identity.h > $@ + $(srcdir)/gsignond-identity.h > $@ gsignond-identity-enum-types.c: $(top_srcdir)/src/common/gsignond-enum.c.template gsignond-identity.h $(GLIB_MKENUMS) --template $(top_srcdir)/src/common/gsignond-enum.c.template \ --fhead "#include \"gsignond-identity-enum-types.h\"\n" \ - --identifier-prefix gsignond \ - gsignond-identity.h > $@ + --identifier-prefix GSignond \ + $(srcdir)/gsignond-identity.h > $@ gsignond_includedir = $(includedir)/gsignond gsignond_pubhdr = ../../include/gsignond @@ -33,14 +33,12 @@ gsignond_include_HEADERS = \ $(gsignond_pubhdr)/gsignond-dictionary.h \ $(gsignond_pubhdr)/gsignond-error.h \ $(gsignond_pubhdr)/gsignond-extension-interface.h \ - $(gsignond_pubhdr)/gsignond-identity-info.h \ $(gsignond_pubhdr)/gsignond-log.h \ $(gsignond_pubhdr)/gsignond-plugin-interface.h \ $(gsignond_pubhdr)/gsignond-secret-storage.h \ $(gsignond_pubhdr)/gsignond-security-context.h \ $(gsignond_pubhdr)/gsignond-session-data.h \ $(gsignond_pubhdr)/gsignond-signonui-data.h \ - $(gsignond_pubhdr)/gsignond-signonui.h \ $(gsignond_pubhdr)/gsignond-storage-manager.h \ $(gsignond_pubhdr)/gsignond-utils.h @@ -58,6 +56,10 @@ gsignond_SOURCES = \ $(BUILT_SOURCES) \ $(NULL) +gsignond_CPPFLAGS = \ + -I. \ + $(NULL) + gsignond_CFLAGS = \ -I$(top_builddir) \ -I$(top_srcdir)/include/ \ @@ -73,3 +75,13 @@ gsignond_LDADD = \ $(GSIGNOND_LIBS) \ $(NULL) +if SET_PERMISSIONS +install-exec-hook: + chown root $(DESTDIR)$(bindir)/gsignond || true + chmod u+s $(DESTDIR)$(bindir)/gsignond || true +endif + +CLEANFILES = \ + gsignond-identity-enum-types.h \ + gsignond-identity-enum-types.c \ + $(NULL) diff --git a/src/daemon/Makefile.in b/src/daemon/Makefile.in index 1076c86..36c7c95 100644 --- a/src/daemon/Makefile.in +++ b/src/daemon/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -17,6 +17,23 @@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -41,9 +58,10 @@ DIST_COMMON = $(gsignond_include_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -111,6 +129,11 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -330,14 +353,12 @@ gsignond_include_HEADERS = \ $(gsignond_pubhdr)/gsignond-dictionary.h \ $(gsignond_pubhdr)/gsignond-error.h \ $(gsignond_pubhdr)/gsignond-extension-interface.h \ - $(gsignond_pubhdr)/gsignond-identity-info.h \ $(gsignond_pubhdr)/gsignond-log.h \ $(gsignond_pubhdr)/gsignond-plugin-interface.h \ $(gsignond_pubhdr)/gsignond-secret-storage.h \ $(gsignond_pubhdr)/gsignond-security-context.h \ $(gsignond_pubhdr)/gsignond-session-data.h \ $(gsignond_pubhdr)/gsignond-signonui-data.h \ - $(gsignond_pubhdr)/gsignond-signonui.h \ $(gsignond_pubhdr)/gsignond-storage-manager.h \ $(gsignond_pubhdr)/gsignond-utils.h @@ -355,6 +376,10 @@ gsignond_SOURCES = \ $(BUILT_SOURCES) \ $(NULL) +gsignond_CPPFLAGS = \ + -I. \ + $(NULL) + gsignond_CFLAGS = \ -I$(top_builddir) \ -I$(top_srcdir)/include/ \ @@ -370,6 +395,11 @@ gsignond_LDADD = \ $(GSIGNOND_LIBS) \ $(NULL) +CLEANFILES = \ + gsignond-identity-enum-types.h \ + gsignond-identity-enum-types.c \ + $(NULL) + all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive @@ -407,8 +437,11 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ @@ -490,88 +523,88 @@ distclean-compile: @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< gsignond-main.o: main.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-main.o -MD -MP -MF $(DEPDIR)/gsignond-main.Tpo -c -o gsignond-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-main.o -MD -MP -MF $(DEPDIR)/gsignond-main.Tpo -c -o gsignond-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsignond-main.Tpo $(DEPDIR)/gsignond-main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main.c' object='gsignond-main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c gsignond-main.obj: main.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-main.obj -MD -MP -MF $(DEPDIR)/gsignond-main.Tpo -c -o gsignond-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-main.obj -MD -MP -MF $(DEPDIR)/gsignond-main.Tpo -c -o gsignond-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsignond-main.Tpo $(DEPDIR)/gsignond-main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main.c' object='gsignond-main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` gsignond-gsignond-auth-session.o: gsignond-auth-session.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-auth-session.o -MD -MP -MF $(DEPDIR)/gsignond-gsignond-auth-session.Tpo -c -o gsignond-gsignond-auth-session.o `test -f 'gsignond-auth-session.c' || echo '$(srcdir)/'`gsignond-auth-session.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-auth-session.o -MD -MP -MF $(DEPDIR)/gsignond-gsignond-auth-session.Tpo -c -o gsignond-gsignond-auth-session.o `test -f 'gsignond-auth-session.c' || echo '$(srcdir)/'`gsignond-auth-session.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsignond-gsignond-auth-session.Tpo $(DEPDIR)/gsignond-gsignond-auth-session.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsignond-auth-session.c' object='gsignond-gsignond-auth-session.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-auth-session.o `test -f 'gsignond-auth-session.c' || echo '$(srcdir)/'`gsignond-auth-session.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-auth-session.o `test -f 'gsignond-auth-session.c' || echo '$(srcdir)/'`gsignond-auth-session.c gsignond-gsignond-auth-session.obj: gsignond-auth-session.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-auth-session.obj -MD -MP -MF $(DEPDIR)/gsignond-gsignond-auth-session.Tpo -c -o gsignond-gsignond-auth-session.obj `if test -f 'gsignond-auth-session.c'; then $(CYGPATH_W) 'gsignond-auth-session.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-auth-session.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-auth-session.obj -MD -MP -MF $(DEPDIR)/gsignond-gsignond-auth-session.Tpo -c -o gsignond-gsignond-auth-session.obj `if test -f 'gsignond-auth-session.c'; then $(CYGPATH_W) 'gsignond-auth-session.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-auth-session.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsignond-gsignond-auth-session.Tpo $(DEPDIR)/gsignond-gsignond-auth-session.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsignond-auth-session.c' object='gsignond-gsignond-auth-session.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-auth-session.obj `if test -f 'gsignond-auth-session.c'; then $(CYGPATH_W) 'gsignond-auth-session.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-auth-session.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-auth-session.obj `if test -f 'gsignond-auth-session.c'; then $(CYGPATH_W) 'gsignond-auth-session.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-auth-session.c'; fi` gsignond-gsignond-daemon.o: gsignond-daemon.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-daemon.o -MD -MP -MF $(DEPDIR)/gsignond-gsignond-daemon.Tpo -c -o gsignond-gsignond-daemon.o `test -f 'gsignond-daemon.c' || echo '$(srcdir)/'`gsignond-daemon.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-daemon.o -MD -MP -MF $(DEPDIR)/gsignond-gsignond-daemon.Tpo -c -o gsignond-gsignond-daemon.o `test -f 'gsignond-daemon.c' || echo '$(srcdir)/'`gsignond-daemon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsignond-gsignond-daemon.Tpo $(DEPDIR)/gsignond-gsignond-daemon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsignond-daemon.c' object='gsignond-gsignond-daemon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-daemon.o `test -f 'gsignond-daemon.c' || echo '$(srcdir)/'`gsignond-daemon.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-daemon.o `test -f 'gsignond-daemon.c' || echo '$(srcdir)/'`gsignond-daemon.c gsignond-gsignond-daemon.obj: gsignond-daemon.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-daemon.obj -MD -MP -MF $(DEPDIR)/gsignond-gsignond-daemon.Tpo -c -o gsignond-gsignond-daemon.obj `if test -f 'gsignond-daemon.c'; then $(CYGPATH_W) 'gsignond-daemon.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-daemon.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-daemon.obj -MD -MP -MF $(DEPDIR)/gsignond-gsignond-daemon.Tpo -c -o gsignond-gsignond-daemon.obj `if test -f 'gsignond-daemon.c'; then $(CYGPATH_W) 'gsignond-daemon.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-daemon.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsignond-gsignond-daemon.Tpo $(DEPDIR)/gsignond-gsignond-daemon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsignond-daemon.c' object='gsignond-gsignond-daemon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-daemon.obj `if test -f 'gsignond-daemon.c'; then $(CYGPATH_W) 'gsignond-daemon.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-daemon.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-daemon.obj `if test -f 'gsignond-daemon.c'; then $(CYGPATH_W) 'gsignond-daemon.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-daemon.c'; fi` gsignond-gsignond-identity.o: gsignond-identity.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-identity.o -MD -MP -MF $(DEPDIR)/gsignond-gsignond-identity.Tpo -c -o gsignond-gsignond-identity.o `test -f 'gsignond-identity.c' || echo '$(srcdir)/'`gsignond-identity.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-identity.o -MD -MP -MF $(DEPDIR)/gsignond-gsignond-identity.Tpo -c -o gsignond-gsignond-identity.o `test -f 'gsignond-identity.c' || echo '$(srcdir)/'`gsignond-identity.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsignond-gsignond-identity.Tpo $(DEPDIR)/gsignond-gsignond-identity.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsignond-identity.c' object='gsignond-gsignond-identity.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-identity.o `test -f 'gsignond-identity.c' || echo '$(srcdir)/'`gsignond-identity.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-identity.o `test -f 'gsignond-identity.c' || echo '$(srcdir)/'`gsignond-identity.c gsignond-gsignond-identity.obj: gsignond-identity.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-identity.obj -MD -MP -MF $(DEPDIR)/gsignond-gsignond-identity.Tpo -c -o gsignond-gsignond-identity.obj `if test -f 'gsignond-identity.c'; then $(CYGPATH_W) 'gsignond-identity.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-identity.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-identity.obj -MD -MP -MF $(DEPDIR)/gsignond-gsignond-identity.Tpo -c -o gsignond-gsignond-identity.obj `if test -f 'gsignond-identity.c'; then $(CYGPATH_W) 'gsignond-identity.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-identity.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsignond-gsignond-identity.Tpo $(DEPDIR)/gsignond-gsignond-identity.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsignond-identity.c' object='gsignond-gsignond-identity.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-identity.obj `if test -f 'gsignond-identity.c'; then $(CYGPATH_W) 'gsignond-identity.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-identity.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-identity.obj `if test -f 'gsignond-identity.c'; then $(CYGPATH_W) 'gsignond-identity.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-identity.c'; fi` gsignond-gsignond-signonui-proxy.o: gsignond-signonui-proxy.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-signonui-proxy.o -MD -MP -MF $(DEPDIR)/gsignond-gsignond-signonui-proxy.Tpo -c -o gsignond-gsignond-signonui-proxy.o `test -f 'gsignond-signonui-proxy.c' || echo '$(srcdir)/'`gsignond-signonui-proxy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-signonui-proxy.o -MD -MP -MF $(DEPDIR)/gsignond-gsignond-signonui-proxy.Tpo -c -o gsignond-gsignond-signonui-proxy.o `test -f 'gsignond-signonui-proxy.c' || echo '$(srcdir)/'`gsignond-signonui-proxy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsignond-gsignond-signonui-proxy.Tpo $(DEPDIR)/gsignond-gsignond-signonui-proxy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsignond-signonui-proxy.c' object='gsignond-gsignond-signonui-proxy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-signonui-proxy.o `test -f 'gsignond-signonui-proxy.c' || echo '$(srcdir)/'`gsignond-signonui-proxy.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-signonui-proxy.o `test -f 'gsignond-signonui-proxy.c' || echo '$(srcdir)/'`gsignond-signonui-proxy.c gsignond-gsignond-signonui-proxy.obj: gsignond-signonui-proxy.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-signonui-proxy.obj -MD -MP -MF $(DEPDIR)/gsignond-gsignond-signonui-proxy.Tpo -c -o gsignond-gsignond-signonui-proxy.obj `if test -f 'gsignond-signonui-proxy.c'; then $(CYGPATH_W) 'gsignond-signonui-proxy.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-signonui-proxy.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-signonui-proxy.obj -MD -MP -MF $(DEPDIR)/gsignond-gsignond-signonui-proxy.Tpo -c -o gsignond-gsignond-signonui-proxy.obj `if test -f 'gsignond-signonui-proxy.c'; then $(CYGPATH_W) 'gsignond-signonui-proxy.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-signonui-proxy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsignond-gsignond-signonui-proxy.Tpo $(DEPDIR)/gsignond-gsignond-signonui-proxy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsignond-signonui-proxy.c' object='gsignond-gsignond-signonui-proxy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-signonui-proxy.obj `if test -f 'gsignond-signonui-proxy.c'; then $(CYGPATH_W) 'gsignond-signonui-proxy.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-signonui-proxy.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-signonui-proxy.obj `if test -f 'gsignond-signonui-proxy.c'; then $(CYGPATH_W) 'gsignond-signonui-proxy.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-signonui-proxy.c'; fi` gsignond-gsignond-identity-enum-types.o: gsignond-identity-enum-types.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-identity-enum-types.o -MD -MP -MF $(DEPDIR)/gsignond-gsignond-identity-enum-types.Tpo -c -o gsignond-gsignond-identity-enum-types.o `test -f 'gsignond-identity-enum-types.c' || echo '$(srcdir)/'`gsignond-identity-enum-types.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-identity-enum-types.o -MD -MP -MF $(DEPDIR)/gsignond-gsignond-identity-enum-types.Tpo -c -o gsignond-gsignond-identity-enum-types.o `test -f 'gsignond-identity-enum-types.c' || echo '$(srcdir)/'`gsignond-identity-enum-types.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsignond-gsignond-identity-enum-types.Tpo $(DEPDIR)/gsignond-gsignond-identity-enum-types.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsignond-identity-enum-types.c' object='gsignond-gsignond-identity-enum-types.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-identity-enum-types.o `test -f 'gsignond-identity-enum-types.c' || echo '$(srcdir)/'`gsignond-identity-enum-types.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-identity-enum-types.o `test -f 'gsignond-identity-enum-types.c' || echo '$(srcdir)/'`gsignond-identity-enum-types.c gsignond-gsignond-identity-enum-types.obj: gsignond-identity-enum-types.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-identity-enum-types.obj -MD -MP -MF $(DEPDIR)/gsignond-gsignond-identity-enum-types.Tpo -c -o gsignond-gsignond-identity-enum-types.obj `if test -f 'gsignond-identity-enum-types.c'; then $(CYGPATH_W) 'gsignond-identity-enum-types.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-identity-enum-types.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -MT gsignond-gsignond-identity-enum-types.obj -MD -MP -MF $(DEPDIR)/gsignond-gsignond-identity-enum-types.Tpo -c -o gsignond-gsignond-identity-enum-types.obj `if test -f 'gsignond-identity-enum-types.c'; then $(CYGPATH_W) 'gsignond-identity-enum-types.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-identity-enum-types.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsignond-gsignond-identity-enum-types.Tpo $(DEPDIR)/gsignond-gsignond-identity-enum-types.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsignond-identity-enum-types.c' object='gsignond-gsignond-identity-enum-types.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-identity-enum-types.obj `if test -f 'gsignond-identity-enum-types.c'; then $(CYGPATH_W) 'gsignond-identity-enum-types.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-identity-enum-types.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gsignond_CPPFLAGS) $(CPPFLAGS) $(gsignond_CFLAGS) $(CFLAGS) -c -o gsignond-gsignond-identity-enum-types.obj `if test -f 'gsignond-identity-enum-types.c'; then $(CYGPATH_W) 'gsignond-identity-enum-types.c'; else $(CYGPATH_W) '$(srcdir)/gsignond-identity-enum-types.c'; fi` mostlyclean-libtool: -rm -f *.lo @@ -580,8 +613,11 @@ clean-libtool: -rm -rf .libs _libs install-gsignond_includeHEADERS: $(gsignond_include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(gsignond_includedir)" || $(MKDIR_P) "$(DESTDIR)$(gsignond_includedir)" @list='$(gsignond_include_HEADERS)'; test -n "$(gsignond_includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(gsignond_includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(gsignond_includedir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -764,13 +800,10 @@ distdir: $(DISTFILES) done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ @@ -822,6 +855,7 @@ install-strip: mostlyclean-generic: clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) @@ -831,6 +865,7 @@ maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +@SET_PERMISSIONS_FALSE@install-exec-hook: clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am @@ -860,7 +895,8 @@ install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS - + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-html: install-html-recursive install-html-am: @@ -902,8 +938,8 @@ ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-gsignond_includeHEADERS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ - ctags-recursive install install-am install-strip \ - tags-recursive + ctags-recursive install install-am install-exec-am \ + install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-binPROGRAMS \ @@ -912,29 +948,33 @@ uninstall-am: uninstall-binPROGRAMS uninstall-gsignond_includeHEADERS distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-gsignond_includeHEADERS install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - installdirs-am maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am uninstall-binPROGRAMS \ - uninstall-gsignond_includeHEADERS + install-exec-am install-exec-hook \ + install-gsignond_includeHEADERS install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-gsignond_includeHEADERS gsignond-identity-enum-types.h: $(top_srcdir)/src/common/gsignond-enum.h.template gsignond-identity.h $(GLIB_MKENUMS) --template $(top_srcdir)/src/common/gsignond-enum.h.template \ --fhead "#ifndef GSIGNOND_IDENTITY_ENUM_TYPES_H_\n#define GSIGNOND_IDENTITY_ENUM_TYPES_H_\n\n#include \n\nG_BEGIN_DECLS" \ - --identifier-prefix gsignond \ + --identifier-prefix GSignond \ --ftail "\nG_END_DECLS\n\n#endif\n" \ - gsignond-identity.h > $@ + $(srcdir)/gsignond-identity.h > $@ gsignond-identity-enum-types.c: $(top_srcdir)/src/common/gsignond-enum.c.template gsignond-identity.h $(GLIB_MKENUMS) --template $(top_srcdir)/src/common/gsignond-enum.c.template \ --fhead "#include \"gsignond-identity-enum-types.h\"\n" \ - --identifier-prefix gsignond \ - gsignond-identity.h > $@ + --identifier-prefix GSignond \ + $(srcdir)/gsignond-identity.h > $@ + +@SET_PERMISSIONS_TRUE@install-exec-hook: +@SET_PERMISSIONS_TRUE@ chown root $(DESTDIR)$(bindir)/gsignond || true +@SET_PERMISSIONS_TRUE@ chmod u+s $(DESTDIR)$(bindir)/gsignond || true # 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. diff --git a/src/daemon/db/Makefile.am b/src/daemon/db/Makefile.am index 3bb7fac..665f241 100644 --- a/src/daemon/db/Makefile.am +++ b/src/daemon/db/Makefile.am @@ -1,4 +1,4 @@ -lib_LTLIBRARIES = libgsignond-db.la +noinst_LTLIBRARIES = libgsignond-db.la libgsignond_db_la_CPPFLAGS = \ -I$(top_builddir) \ diff --git a/src/daemon/db/Makefile.in b/src/daemon/db/Makefile.in index b876238..7bf4f14 100644 --- a/src/daemon/db/Makefile.in +++ b/src/daemon/db/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -16,6 +16,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -38,44 +55,17 @@ subdir = src/daemon/db DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = -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 = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(libdir)" -LTLIBRARIES = $(lib_LTLIBRARIES) +LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = libgsignond_db_la_DEPENDENCIES = \ $(top_builddir)/src/common/libgsignond-common.la \ @@ -115,6 +105,11 @@ am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgsignond_db_la_SOURCES) DIST_SOURCES = $(libgsignond_db_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -256,7 +251,7 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -lib_LTLIBRARIES = libgsignond-db.la +noinst_LTLIBRARIES = libgsignond-db.la libgsignond_db_la_CPPFLAGS = \ -I$(top_builddir) \ -I$(top_srcdir)/src \ @@ -308,39 +303,17 @@ $(top_srcdir)/configure: $(am__configure_deps) $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ - } - -uninstall-libLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ - done -clean-libLTLIBRARIES: - -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgsignond-db.la: $(libgsignond_db_la_OBJECTS) $(libgsignond_db_la_DEPENDENCIES) $(EXTRA_libgsignond_db_la_DEPENDENCIES) - $(AM_V_CCLD)$(LINK) -rpath $(libdir) $(libgsignond_db_la_OBJECTS) $(libgsignond_db_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libgsignond_db_la_OBJECTS) $(libgsignond_db_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -481,9 +454,6 @@ check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: - for dir in "$(DESTDIR)$(libdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done install: install-am install-exec: install-exec-am install-data: install-data-am @@ -517,7 +487,7 @@ maintainer-clean-generic: @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am @@ -544,7 +514,7 @@ install-dvi: install-dvi-am install-dvi-am: -install-exec-am: install-libLTLIBRARIES +install-exec-am: install-html: install-html-am @@ -584,23 +554,22 @@ ps: ps-am ps-am: -uninstall-am: uninstall-libLTLIBRARIES +uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libLTLIBRARIES clean-libtool ctags distclean \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am \ - install-libLTLIBRARIES install-man install-pdf install-pdf-am \ - install-ps install-ps-am 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-libLTLIBRARIES + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + 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 # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/src/daemon/db/gsignond-db-credentials-database.c b/src/daemon/db/gsignond-db-credentials-database.c index a72a629..33e0c6c 100644 --- a/src/daemon/db/gsignond-db-credentials-database.c +++ b/src/daemon/db/gsignond-db-credentials-database.c @@ -371,20 +371,21 @@ gsignond_db_credentials_database_update_identity ( gsignond_db_credentials_database_is_open_secret_storage (self)) { GSignondCredentials *creds = NULL; gboolean un_sec, pwd_sec; + const gchar *tmp_str = NULL; creds = gsignond_credentials_new (); gsignond_credentials_set_id (creds, id); - pwd_sec = gsignond_identity_info_get_store_secret (identity); + pwd_sec = gsignond_identity_info_get_store_secret (identity) && + (tmp_str = gsignond_identity_info_get_secret (identity)); if (pwd_sec) { - gsignond_credentials_set_password (creds, - gsignond_identity_info_get_secret (identity)); + gsignond_credentials_set_password (creds, tmp_str); } - un_sec = gsignond_identity_info_get_is_username_secret (identity); + un_sec = gsignond_identity_info_get_is_username_secret (identity) && + (tmp_str = gsignond_identity_info_get_username (identity)); if (un_sec) { - gsignond_credentials_set_username (creds, - gsignond_identity_info_get_username (identity)); + gsignond_credentials_set_username (creds, tmp_str); } if (un_sec || pwd_sec) { diff --git a/src/daemon/db/gsignond-db-credentials-database.h b/src/daemon/db/gsignond-db-credentials-database.h index d4296d1..5cd481c 100644 --- a/src/daemon/db/gsignond-db-credentials-database.h +++ b/src/daemon/db/gsignond-db-credentials-database.h @@ -28,7 +28,7 @@ #include #include -#include +#include "common/gsignond-identity-info.h" #include #include diff --git a/src/daemon/db/gsignond-db-metadata-database.c b/src/daemon/db/gsignond-db-metadata-database.c index e191b4a..8b76b3a 100644 --- a/src/daemon/db/gsignond-db-metadata-database.c +++ b/src/daemon/db/gsignond-db-metadata-database.c @@ -22,6 +22,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA */ +#if HAVE_CONFIG_H +#include "config.h" +#endif #include #include @@ -130,7 +133,6 @@ static GSequence * _gsignond_db_metadata_database_list_to_sequence (GList *list) { GSequence *seq = NULL; - if (!list) return seq; seq = g_sequence_new ((GDestroyNotify)g_free); list = g_list_first (list); for ( ; list != NULL; list = g_list_next (list)) { @@ -504,7 +506,7 @@ _gsignond_db_metadata_database_open ( return FALSE; } dir = gsignond_config_get_string (self->config, - GSIGNOND_CONFIG_GENERAL_STORAGE_PATH); + GSIGNOND_CONFIG_GENERAL_SECURE_DIR); if (!dir) { ERR ("Invalid Metadata DB directory"); return FALSE; @@ -659,6 +661,7 @@ _gsignond_db_metadata_database_create ( " REFS.secctx_id = OLD.secctx_id) == 0;" "END;" +#ifdef ENABLE_DB_ACL_TRIGGERS // Trigger for deleting orphan METHODS entries "CREATE TRIGGER fkdstale_ACL_method_id_METHODS_id" "BEFORE DELETE ON [ACL]" @@ -676,6 +679,7 @@ _gsignond_db_metadata_database_create ( " AND (SELECT COUNT(*) FROM ACL WHERE " " ACL.mechanism_id = OLD.mechanism_id) == 1;" "END;" +#endif /* * triggers generated with @@ -1077,6 +1081,17 @@ gsignond_db_metadata_database_update_identity ( return 0; } + if (!gsignond_identity_info_get_is_identity_new (identity)) { + DBG ("Remove old acl and owner list as identity is not new"); + /* remove acl */ + _gsignond_db_metadata_database_exec (self, + "DELETE FROM ACL WHERE identity_id = %u;", id); + + /* remove owner */ + _gsignond_db_metadata_database_exec (self, + "DELETE FROM OWNER WHERE identity_id = %u;", id); + } + /* methods */ methods = gsignond_identity_info_get_methods (identity); if (!_gsignond_db_metadata_database_insert_methods (self, identity, @@ -1109,16 +1124,6 @@ gsignond_db_metadata_database_update_identity ( goto finished; } - if (!gsignond_identity_info_get_is_identity_new (identity)) { - DBG ("Remove old acl and owner list as identity is not new"); - /* remove acl */ - _gsignond_db_metadata_database_exec (self, - "DELETE FROM ACL WHERE identity_id = %u;", id); - - /* remove owner */ - _gsignond_db_metadata_database_exec (self, - "DELETE FROM OWNER WHERE identity_id = %u;", id); - } /* ACL insert, this will do basically identity level ACL */ g_hash_table_iter_init (&method_iter, methods); diff --git a/src/daemon/db/gsignond-db-metadata-database.h b/src/daemon/db/gsignond-db-metadata-database.h index 0a787af..4e5a943 100644 --- a/src/daemon/db/gsignond-db-metadata-database.h +++ b/src/daemon/db/gsignond-db-metadata-database.h @@ -28,7 +28,7 @@ #include #include -#include +#include "common/gsignond-identity-info.h" #include #include diff --git a/src/daemon/dbus/Makefile.am b/src/daemon/dbus/Makefile.am index 009a814..bfc2982 100644 --- a/src/daemon/dbus/Makefile.am +++ b/src/daemon/dbus/Makefile.am @@ -52,7 +52,7 @@ gsignond-dbus-remote-plugin-gen.c gsignond-dbus-remote-plugin-gen.h : $(INTERFAC --generate-docbook gsignond-dbus-remote-plugin-doc-gen \ $< -lib_LTLIBRARIES = libgsignond-dbus-glue.la +noinst_LTLIBRARIES = libgsignond-dbus-glue.la libgsignond_dbus_glue_la_CPPFLAGS = \ -I$(top_builddir) \ @@ -65,7 +65,7 @@ libgsignond_dbus_glue_la_LIBADD = \ libgsignond_dbus_glue_la_SOURCES = $(DBUS_BUILT_SOURCES) -lib_LTLIBRARIES += libgsignond-dbus.la +noinst_LTLIBRARIES += libgsignond-dbus.la libgsignond_dbus_la_CPPFLAGS = \ -I$(top_builddir) \ diff --git a/src/daemon/dbus/Makefile.in b/src/daemon/dbus/Makefile.in index 7f46d8e..8a7ea13 100644 --- a/src/daemon/dbus/Makefile.in +++ b/src/daemon/dbus/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -17,6 +17,23 @@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -39,46 +56,17 @@ subdir = src/daemon/dbus DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = -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 = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(libdir)" \ - "$(DESTDIR)$(dbusinterfacesdir)" "$(DESTDIR)$(dbusservicedir)" \ - "$(DESTDIR)$(dbusservicedir)" -LTLIBRARIES = $(lib_LTLIBRARIES) +LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = libgsignond_dbus_glue_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) @@ -140,6 +128,40 @@ SOURCES = $(libgsignond_dbus_glue_la_SOURCES) \ $(libgsignond_dbus_la_SOURCES) DIST_SOURCES = $(libgsignond_dbus_glue_la_SOURCES) \ $(libgsignond_dbus_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +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 = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(dbusinterfacesdir)" \ + "$(DESTDIR)$(dbusservicedir)" "$(DESTDIR)$(dbusservicedir)" DATA = $(dbusinterfaces_DATA) $(dbusservice_DATA) \ $(nodist_dbusservice_DATA) ETAGS = etags @@ -305,7 +327,7 @@ DBUS_BUILT_DOCS = \ $(NULL) DBUS_INTERFACE_PREFIX = "com.google.code.AccountsSSO.gSingleSignOn." -lib_LTLIBRARIES = libgsignond-dbus-glue.la libgsignond-dbus.la +noinst_LTLIBRARIES = libgsignond-dbus-glue.la libgsignond-dbus.la libgsignond_dbus_glue_la_CPPFLAGS = \ -I$(top_builddir) \ $(GSIGNOND_CFLAGS) \ @@ -392,41 +414,19 @@ $(top_srcdir)/configure: $(am__configure_deps) $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ - } -uninstall-libLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ - done - -clean-libLTLIBRARIES: - -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgsignond-dbus-glue.la: $(libgsignond_dbus_glue_la_OBJECTS) $(libgsignond_dbus_glue_la_DEPENDENCIES) $(EXTRA_libgsignond_dbus_glue_la_DEPENDENCIES) - $(AM_V_CCLD)$(LINK) -rpath $(libdir) $(libgsignond_dbus_glue_la_OBJECTS) $(libgsignond_dbus_glue_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libgsignond_dbus_glue_la_OBJECTS) $(libgsignond_dbus_glue_la_LIBADD) $(LIBS) libgsignond-dbus.la: $(libgsignond_dbus_la_OBJECTS) $(libgsignond_dbus_la_DEPENDENCIES) $(EXTRA_libgsignond_dbus_la_DEPENDENCIES) - $(AM_V_CCLD)$(LINK) -rpath $(libdir) $(libgsignond_dbus_la_OBJECTS) $(libgsignond_dbus_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libgsignond_dbus_la_OBJECTS) $(libgsignond_dbus_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -570,8 +570,11 @@ clean-libtool: -rm -rf .libs _libs install-dbusinterfacesDATA: $(dbusinterfaces_DATA) @$(NORMAL_INSTALL) - test -z "$(dbusinterfacesdir)" || $(MKDIR_P) "$(DESTDIR)$(dbusinterfacesdir)" @list='$(dbusinterfaces_DATA)'; test -n "$(dbusinterfacesdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(dbusinterfacesdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(dbusinterfacesdir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -588,8 +591,11 @@ uninstall-dbusinterfacesDATA: dir='$(DESTDIR)$(dbusinterfacesdir)'; $(am__uninstall_files_from_dir) install-dbusserviceDATA: $(dbusservice_DATA) @$(NORMAL_INSTALL) - test -z "$(dbusservicedir)" || $(MKDIR_P) "$(DESTDIR)$(dbusservicedir)" @list='$(dbusservice_DATA)'; test -n "$(dbusservicedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(dbusservicedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(dbusservicedir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -606,8 +612,11 @@ uninstall-dbusserviceDATA: dir='$(DESTDIR)$(dbusservicedir)'; $(am__uninstall_files_from_dir) install-nodist_dbusserviceDATA: $(nodist_dbusservice_DATA) @$(NORMAL_INSTALL) - test -z "$(dbusservicedir)" || $(MKDIR_P) "$(DESTDIR)$(dbusservicedir)" @list='$(nodist_dbusservice_DATA)'; test -n "$(dbusservicedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(dbusservicedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(dbusservicedir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -709,7 +718,7 @@ check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(dbusinterfacesdir)" "$(DESTDIR)$(dbusservicedir)" "$(DESTDIR)$(dbusservicedir)"; do \ + for dir in "$(DESTDIR)$(dbusinterfacesdir)" "$(DESTDIR)$(dbusservicedir)" "$(DESTDIR)$(dbusservicedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am @@ -744,8 +753,8 @@ maintainer-clean-generic: @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ - mostlyclean-am +clean-am: clean-generic clean-libtool clean-local \ + clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) @@ -772,7 +781,7 @@ install-dvi: install-dvi-am install-dvi-am: -install-exec-am: install-libLTLIBRARIES +install-exec-am: install-html: install-html-am @@ -813,27 +822,26 @@ ps: ps-am ps-am: uninstall-am: uninstall-dbusinterfacesDATA uninstall-dbusserviceDATA \ - uninstall-libLTLIBRARIES uninstall-nodist_dbusserviceDATA + uninstall-nodist_dbusserviceDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libLTLIBRARIES clean-libtool clean-local ctags distclean \ - distclean-compile distclean-generic distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am \ - install-dbusinterfacesDATA install-dbusserviceDATA install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am \ - install-libLTLIBRARIES install-man \ + clean-libtool clean-local clean-noinstLTLIBRARIES ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dbusinterfacesDATA \ + install-dbusserviceDATA install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ install-nodist_dbusserviceDATA install-pdf install-pdf-am \ install-ps install-ps-am 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-dbusinterfacesDATA \ - uninstall-dbusserviceDATA uninstall-libLTLIBRARIES \ - uninstall-nodist_dbusserviceDATA + uninstall-dbusserviceDATA uninstall-nodist_dbusserviceDATA gsignond-dbus-auth-service-gen.c gsignond-dbus-auth-service-gen.h : $(INTERFACES_DIR)/com.google.code.AccountsSSO.gSingleSignOn.AuthService.xml gdbus-codegen \ diff --git a/src/daemon/dbus/gsignond-dbus-auth-service-adapter.c b/src/daemon/dbus/gsignond-dbus-auth-service-adapter.c index 8be08f2..3c6f162 100644 --- a/src/daemon/dbus/gsignond-dbus-auth-service-adapter.c +++ b/src/daemon/dbus/gsignond-dbus-auth-service-adapter.c @@ -23,11 +23,11 @@ * 02110-1301 USA */ -#include +#include "config.h" +#include "gsignond/gsignond-log.h" #include "gsignond-dbus-auth-service-adapter.h" #include "gsignond-dbus-identity-adapter.h" #include "gsignond-dbus.h" -#include "gsignond/gsignond-log.h" enum { @@ -72,6 +72,7 @@ static gboolean _handle_query_identities (GSignondDbusAuthServiceAdapter *, const gchar *, gpointer); static gboolean _handle_clear (GSignondDbusAuthServiceAdapter *, GDBusMethodInvocation *, gpointer); +static void _on_identity_disposed (gpointer data, GObject *object); static void _set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) @@ -116,7 +117,11 @@ _get_property (GObject *object, guint property_id, GValue *value, GParamSpec *ps static void _identity_unref (gpointer data, gpointer user_data) { - if (data) g_object_unref (data); + if (data && GSIGNOND_IS_DBUS_IDENTITY_ADAPTER(data)) { + GObject *identity = G_OBJECT (data); + g_object_weak_unref (identity, _on_identity_disposed, user_data); + g_object_unref (identity); + } } static void @@ -127,7 +132,7 @@ _dispose (GObject *object) DBG("- unregistering dubs auth service. %d", G_OBJECT (self->priv->auth_service)->ref_count); if (self->priv->identities) { - g_list_foreach (self->priv->identities, _identity_unref, NULL); + g_list_foreach (self->priv->identities, _identity_unref, self); } if (self->priv->auth_service) { diff --git a/src/daemon/dbus/gsignond-dbus-auth-service-gen.c b/src/daemon/dbus/gsignond-dbus-auth-service-gen.c index 79b1adc..1ca2490 100644 --- a/src/daemon/dbus/gsignond-dbus-auth-service-gen.c +++ b/src/daemon/dbus/gsignond-dbus-auth-service-gen.c @@ -1,5 +1,5 @@ /* - * Generated by gdbus-codegen 2.32.3. DO NOT EDIT. + * Generated by gdbus-codegen 2.34.1. DO NOT EDIT. * * The license of this code is the same as for the source it was derived from. */ @@ -10,6 +10,7 @@ #include "gsignond-dbus-auth-service-gen.h" +#include #ifdef G_OS_UNIX # include #endif @@ -124,7 +125,12 @@ _g_value_equal (const GValue *a, const GValue *b) ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b)); break; case G_TYPE_DOUBLE: - ret = (g_value_get_double (a) == g_value_get_double (b)); + { + /* Avoid -Wfloat-equal warnings by doing a direct bit compare */ + gdouble da = g_value_get_double (a); + gdouble db = g_value_get_double (b); + ret = memcmp (&da, &db, sizeof (gdouble)) == 0; + } break; case G_TYPE_STRING: ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0); @@ -161,8 +167,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_regis { { -1, - "applicationContext", - "s", + (gchar *) "applicationContext", + (gchar *) "s", NULL }, FALSE @@ -178,8 +184,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_regis { { -1, - "objectPath", - "o", + (gchar *) "objectPath", + (gchar *) "o", NULL }, FALSE @@ -195,7 +201,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_auth_service_method_info_re { { -1, - "registerNewIdentity", + (gchar *) "registerNewIdentity", (GDBusArgInfo **) &_gsignond_dbus_auth_service_method_info_register_new_identity_IN_ARG_pointers, (GDBusArgInfo **) &_gsignond_dbus_auth_service_method_info_register_new_identity_OUT_ARG_pointers, NULL @@ -208,8 +214,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_get_i { { -1, - "id", - "u", + (gchar *) "id", + (gchar *) "u", NULL }, FALSE @@ -219,8 +225,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_get_i { { -1, - "applicationContext", - "s", + (gchar *) "applicationContext", + (gchar *) "s", NULL }, FALSE @@ -237,8 +243,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_get_i { { -1, - "objectPath", - "o", + (gchar *) "objectPath", + (gchar *) "o", NULL }, FALSE @@ -248,8 +254,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_get_i { { -1, - "identityData", - "a{sv}", + (gchar *) "identityData", + (gchar *) "a{sv}", NULL }, FALSE @@ -266,7 +272,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_auth_service_method_info_ge { { -1, - "getIdentity", + (gchar *) "getIdentity", (GDBusArgInfo **) &_gsignond_dbus_auth_service_method_info_get_identity_IN_ARG_pointers, (GDBusArgInfo **) &_gsignond_dbus_auth_service_method_info_get_identity_OUT_ARG_pointers, NULL @@ -279,8 +285,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_query { { -1, - "authMethods", - "as", + (gchar *) "authMethods", + (gchar *) "as", NULL }, FALSE @@ -296,7 +302,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_auth_service_method_info_qu { { -1, - "queryMethods", + (gchar *) "queryMethods", NULL, (GDBusArgInfo **) &_gsignond_dbus_auth_service_method_info_query_methods_OUT_ARG_pointers, NULL @@ -309,8 +315,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_query { { -1, - "method", - "s", + (gchar *) "method", + (gchar *) "s", NULL }, FALSE @@ -326,8 +332,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_query { { -1, - "mechanisms", - "as", + (gchar *) "mechanisms", + (gchar *) "as", NULL }, FALSE @@ -343,7 +349,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_auth_service_method_info_qu { { -1, - "queryMechanisms", + (gchar *) "queryMechanisms", (GDBusArgInfo **) &_gsignond_dbus_auth_service_method_info_query_mechanisms_IN_ARG_pointers, (GDBusArgInfo **) &_gsignond_dbus_auth_service_method_info_query_mechanisms_OUT_ARG_pointers, NULL @@ -356,8 +362,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_query { { -1, - "filter", - "a{sv}", + (gchar *) "filter", + (gchar *) "a{sv}", NULL }, FALSE @@ -367,8 +373,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_query { { -1, - "applicationContext", - "s", + (gchar *) "applicationContext", + (gchar *) "s", NULL }, FALSE @@ -385,8 +391,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_query { { -1, - "identities", - "aa{sv}", + (gchar *) "identities", + (gchar *) "aa{sv}", NULL }, FALSE @@ -402,7 +408,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_auth_service_method_info_qu { { -1, - "queryIdentities", + (gchar *) "queryIdentities", (GDBusArgInfo **) &_gsignond_dbus_auth_service_method_info_query_identities_IN_ARG_pointers, (GDBusArgInfo **) &_gsignond_dbus_auth_service_method_info_query_identities_OUT_ARG_pointers, NULL @@ -415,8 +421,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_clear { { -1, - "unnamed_arg0", - "b", + (gchar *) "unnamed_arg0", + (gchar *) "b", NULL }, FALSE @@ -432,7 +438,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_auth_service_method_info_cl { { -1, - "clear", + (gchar *) "clear", NULL, (GDBusArgInfo **) &_gsignond_dbus_auth_service_method_info_clear_OUT_ARG_pointers, NULL @@ -445,8 +451,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_backu { { -1, - "unnamed_arg0", - "y", + (gchar *) "unnamed_arg0", + (gchar *) "y", NULL }, FALSE @@ -462,7 +468,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_auth_service_method_info_ba { { -1, - "backupStarts", + (gchar *) "backupStarts", NULL, (GDBusArgInfo **) &_gsignond_dbus_auth_service_method_info_backup_starts_OUT_ARG_pointers, NULL @@ -475,8 +481,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_backu { { -1, - "unnamed_arg0", - "y", + (gchar *) "unnamed_arg0", + (gchar *) "y", NULL }, FALSE @@ -492,7 +498,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_auth_service_method_info_ba { { -1, - "backupFinished", + (gchar *) "backupFinished", NULL, (GDBusArgInfo **) &_gsignond_dbus_auth_service_method_info_backup_finished_OUT_ARG_pointers, NULL @@ -505,8 +511,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_resto { { -1, - "unnamed_arg0", - "y", + (gchar *) "unnamed_arg0", + (gchar *) "y", NULL }, FALSE @@ -522,7 +528,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_auth_service_method_info_re { { -1, - "restoreStarts", + (gchar *) "restoreStarts", NULL, (GDBusArgInfo **) &_gsignond_dbus_auth_service_method_info_restore_starts_OUT_ARG_pointers, NULL @@ -535,8 +541,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_service_method_info_resto { { -1, - "unnamed_arg0", - "y", + (gchar *) "unnamed_arg0", + (gchar *) "y", NULL }, FALSE @@ -552,7 +558,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_auth_service_method_info_re { { -1, - "restoreFinished", + (gchar *) "restoreFinished", NULL, (GDBusArgInfo **) &_gsignond_dbus_auth_service_method_info_restore_finished_OUT_ARG_pointers, NULL @@ -580,7 +586,7 @@ static const _ExtendedGDBusInterfaceInfo _gsignond_dbus_auth_service_interface_i { { -1, - "com.google.code.AccountsSSO.gSingleSignOn.AuthService", + (gchar *) "com.google.code.AccountsSSO.gSingleSignOn.AuthService", (GDBusMethodInfo **) &_gsignond_dbus_auth_service_method_info_pointers, NULL, NULL, @@ -600,7 +606,7 @@ static const _ExtendedGDBusInterfaceInfo _gsignond_dbus_auth_service_interface_i GDBusInterfaceInfo * gsignond_dbus_auth_service_interface_info (void) { - return (GDBusInterfaceInfo *) &_gsignond_dbus_auth_service_interface_info; + return (GDBusInterfaceInfo *) &_gsignond_dbus_auth_service_interface_info.parent_struct; } /** @@ -2176,7 +2182,7 @@ gsignond_dbus_auth_service_proxy_g_signal (GDBusProxy *proxy, guint num_params; guint n; guint signal_id; - info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_service_interface_info, signal_name); + info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_service_interface_info.parent_struct, signal_name); if (info == NULL) return; num_params = g_variant_n_children (parameters); @@ -2218,7 +2224,7 @@ gsignond_dbus_auth_service_proxy_g_properties_changed (GDBusProxy *_proxy, g_variant_get (changed_properties, "a{sv}", &iter); while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) { - info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_service_interface_info, key); + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_service_interface_info.parent_struct, key); g_datalist_remove_data (&proxy->priv->qdata, key); if (info != NULL) g_object_notify (G_OBJECT (proxy), info->hyphen_name); @@ -2226,7 +2232,7 @@ gsignond_dbus_auth_service_proxy_g_properties_changed (GDBusProxy *_proxy, g_variant_iter_free (iter); for (n = 0; invalidated_properties[n] != NULL; n++) { - info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_service_interface_info, invalidated_properties[n]); + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_service_interface_info.parent_struct, invalidated_properties[n]); g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]); if (info != NULL) g_object_notify (G_OBJECT (proxy), info->hyphen_name); @@ -2548,7 +2554,7 @@ _gsignond_dbus_auth_service_skeleton_handle_get_property ( _ExtendedGDBusPropertyInfo *info; GVariant *ret; ret = NULL; - info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_service_interface_info, property_name); + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_service_interface_info.parent_struct, property_name); g_assert (info != NULL); pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); if (pspec == NULL) @@ -2582,7 +2588,7 @@ _gsignond_dbus_auth_service_skeleton_handle_set_property ( _ExtendedGDBusPropertyInfo *info; gboolean ret; ret = FALSE; - info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_service_interface_info, property_name); + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_service_interface_info.parent_struct, property_name); g_assert (info != NULL); pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); if (pspec == NULL) diff --git a/src/daemon/dbus/gsignond-dbus-auth-service-gen.h b/src/daemon/dbus/gsignond-dbus-auth-service-gen.h index 2d5eb2d..60f63bd 100644 --- a/src/daemon/dbus/gsignond-dbus-auth-service-gen.h +++ b/src/daemon/dbus/gsignond-dbus-auth-service-gen.h @@ -1,5 +1,5 @@ /* - * Generated by gdbus-codegen 2.32.3. DO NOT EDIT. + * Generated by gdbus-codegen 2.34.1. DO NOT EDIT. * * The license of this code is the same as for the source it was derived from. */ diff --git a/src/daemon/dbus/gsignond-dbus-auth-session-adapter.c b/src/daemon/dbus/gsignond-dbus-auth-session-adapter.c index c537118..53c24e5 100644 --- a/src/daemon/dbus/gsignond-dbus-auth-session-adapter.c +++ b/src/daemon/dbus/gsignond-dbus-auth-session-adapter.c @@ -3,7 +3,7 @@ /* * This file is part of gsignond * - * Copyright (C) 2012 Intel Corporation. + * Copyright (C) 2012-2013 Intel Corporation. * * Contact: Amarnath Valluri * @@ -23,9 +23,11 @@ * 02110-1301 USA */ -#include -#include "gsignond-dbus-auth-session-adapter.h" +#include "config.h" #include "gsignond/gsignond-log.h" +#include "gsignond/gsignond-utils.h" +#include "gsignond/gsignond-error.h" +#include "gsignond-dbus-auth-session-adapter.h" #include "gsignond-dbus.h" enum @@ -92,7 +94,7 @@ gsignond_dbus_auth_session_adapter_set_property (GObject *object, } case PROP_CONNECTION: { if (self->priv->connection) g_object_unref (self->priv->connection); - self->priv->connection = G_DBUS_CONNECTION (g_value_get_object (value)); + self->priv->connection = G_DBUS_CONNECTION (g_value_dup_object (value)); break; } case PROP_APP_CONTEXT: { @@ -301,7 +303,7 @@ _emit_state_changed (gint state, const gchar *message, gpointer user_data) GSignondDbusAuthSessionAdapter *self = NULL; _AuthSessionDbusInfo *info = (_AuthSessionDbusInfo*) user_data; - if (!info) return ; + if (!info || !GSIGNOND_IS_DBUS_AUTH_SESSION_ADAPTER(info->adapter)) return ; self = info->adapter; gsignond_dbus_auth_session_emit_state_changed ( @@ -314,17 +316,23 @@ _on_process_done (GSignondSessionData *reply, const GError *error, gpointer user GSignondDbusAuthSessionAdapter *self = NULL; _AuthSessionDbusInfo *info = (_AuthSessionDbusInfo*) user_data; - if (!info) return ; + if (!info || !GSIGNOND_IS_DBUS_AUTH_SESSION_ADAPTER(info->adapter)) return ; self = info->adapter; - self->priv->is_process_active = FALSE; - if (error) - g_dbus_method_invocation_return_gerror (info->invocation, error); - else { - GVariant *result = gsignond_dictionary_to_variant ((GSignondDictionary *)reply); - gsignond_dbus_auth_session_complete_process ( - self->priv->dbus_auth_session, info->invocation, result); + if (self->priv->is_process_active) { + self->priv->is_process_active = FALSE; + + if (error) { + DBG("ERROR : %s(%d)", error->message, error->code); + GError *dbus_err = gsignond_get_gerror_for_id (error->code, error->message, NULL); + g_dbus_method_invocation_take_error (info->invocation, dbus_err); + } + else { + GVariant *result = gsignond_dictionary_to_variant ((GSignondDictionary *)reply); + gsignond_dbus_auth_session_complete_process ( + self->priv->dbus_auth_session, info->invocation, result); + } } gsignond_disposable_set_auto_dispose (GSIGNOND_DISPOSABLE (self), TRUE); @@ -402,13 +410,35 @@ gsignond_dbus_auth_session_adapter_get_object_path (GSignondDbusAuthSessionAdapt return g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON(self->priv->dbus_auth_session)); } +gboolean +gsignond_dbus_auth_session_adapter_is_process_active (GSignondDbusAuthSessionAdapter *self) +{ + g_return_val_if_fail (self && GSIGNOND_IS_DBUS_AUTH_SESSION_ADAPTER (self), FALSE); + + return self->priv->is_process_active; +} + +gboolean +gsignond_dbus_auth_session_adapter_abort_process (GSignondDbusAuthSessionAdapter *self) +{ + g_return_val_if_fail (self && GSIGNOND_IS_DBUS_AUTH_SESSION_ADAPTER (self), FALSE); + + if (self->priv->is_process_active) { + gsignond_auth_session_abort_process (self->priv->session); + self->priv->is_process_active = FALSE; + } + + return TRUE; +} + GSignondDbusAuthSessionAdapter * gsignond_dbus_auth_session_adapter_new_with_connection (GDBusConnection *connection, GSignondAuthSession *session, const gchar *app_context, guint timeout) { - static guint32 object_counter; + static guint32 object_counter = 0; + gchar *nonce; gchar *object_path = NULL; GSignondDbusAuthSessionAdapter *adapter = NULL; GError *error = NULL; @@ -419,7 +449,12 @@ gsignond_dbus_auth_session_adapter_new_with_connection (GDBusConnection *connect if (!adapter) return NULL; - object_path = g_strdup_printf ("%s/AuthSession_%d", GSIGNOND_DAEMON_OBJECTPATH, object_counter++); + nonce = gsignond_generate_nonce (); + object_path = g_strdup_printf ("%s/AuthSession_%s_%d", + GSIGNOND_DAEMON_OBJECTPATH, + nonce, + object_counter++); + g_free (nonce); if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (adapter->priv->dbus_auth_session), adapter->priv->connection, object_path, diff --git a/src/daemon/dbus/gsignond-dbus-auth-session-adapter.h b/src/daemon/dbus/gsignond-dbus-auth-session-adapter.h index 9405a4b..43fd652 100644 --- a/src/daemon/dbus/gsignond-dbus-auth-session-adapter.h +++ b/src/daemon/dbus/gsignond-dbus-auth-session-adapter.h @@ -77,6 +77,14 @@ const gchar * gsignond_dbus_auth_session_adapter_get_object_path ( GSignondDbusAuthSessionAdapter *dbus_session) G_GNUC_CONST; +gboolean +gsignond_dbus_auth_session_adapter_is_process_active ( + GSignondDbusAuthSessionAdapter *dbus_session) G_GNUC_CONST; + +gboolean +gsignond_dbus_auth_session_adapter_abort_process ( + GSignondDbusAuthSessionAdapter *dbus_session); + G_END_DECLS #endif /* __GSIGNOND_DBUS_AUTH_SESSION_ADAPTER_H_ */ diff --git a/src/daemon/dbus/gsignond-dbus-auth-session-gen.c b/src/daemon/dbus/gsignond-dbus-auth-session-gen.c index eaea53d..76ac813 100644 --- a/src/daemon/dbus/gsignond-dbus-auth-session-gen.c +++ b/src/daemon/dbus/gsignond-dbus-auth-session-gen.c @@ -1,5 +1,5 @@ /* - * Generated by gdbus-codegen 2.32.3. DO NOT EDIT. + * Generated by gdbus-codegen 2.34.1. DO NOT EDIT. * * The license of this code is the same as for the source it was derived from. */ @@ -10,6 +10,7 @@ #include "gsignond-dbus-auth-session-gen.h" +#include #ifdef G_OS_UNIX # include #endif @@ -124,7 +125,12 @@ _g_value_equal (const GValue *a, const GValue *b) ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b)); break; case G_TYPE_DOUBLE: - ret = (g_value_get_double (a) == g_value_get_double (b)); + { + /* Avoid -Wfloat-equal warnings by doing a direct bit compare */ + gdouble da = g_value_get_double (a); + gdouble db = g_value_get_double (b); + ret = memcmp (&da, &db, sizeof (gdouble)) == 0; + } break; case G_TYPE_STRING: ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0); @@ -161,8 +167,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_session_method_info_query { { -1, - "wantedMechanisms", - "as", + (gchar *) "wantedMechanisms", + (gchar *) "as", NULL }, FALSE @@ -178,8 +184,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_session_method_info_query { { -1, - "unnamed_arg1", - "as", + (gchar *) "unnamed_arg1", + (gchar *) "as", NULL }, FALSE @@ -195,7 +201,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_auth_session_method_info_qu { { -1, - "queryAvailableMechanisms", + (gchar *) "queryAvailableMechanisms", (GDBusArgInfo **) &_gsignond_dbus_auth_session_method_info_query_available_mechanisms_IN_ARG_pointers, (GDBusArgInfo **) &_gsignond_dbus_auth_session_method_info_query_available_mechanisms_OUT_ARG_pointers, NULL @@ -208,8 +214,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_session_method_info_proce { { -1, - "sessionDataVa", - "a{sv}", + (gchar *) "sessionDataVa", + (gchar *) "a{sv}", NULL }, FALSE @@ -219,8 +225,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_session_method_info_proce { { -1, - "mechanism", - "s", + (gchar *) "mechanism", + (gchar *) "s", NULL }, FALSE @@ -237,8 +243,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_session_method_info_proce { { -1, - "unnamed_arg2", - "a{sv}", + (gchar *) "unnamed_arg2", + (gchar *) "a{sv}", NULL }, FALSE @@ -254,7 +260,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_auth_session_method_info_pr { { -1, - "process", + (gchar *) "process", (GDBusArgInfo **) &_gsignond_dbus_auth_session_method_info_process_IN_ARG_pointers, (GDBusArgInfo **) &_gsignond_dbus_auth_session_method_info_process_OUT_ARG_pointers, NULL @@ -266,8 +272,8 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_auth_session_method_info_pr static const GDBusAnnotationInfo _gsignond_dbus_auth_session_method_cancel_annotation_info_0 = { -1, - "org.freedesktop.DBus.Method.NoReply", - "true", + (gchar *) "org.freedesktop.DBus.Method.NoReply", + (gchar *) "true", NULL }; @@ -281,7 +287,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_auth_session_method_info_ca { { -1, - "cancel", + (gchar *) "cancel", NULL, NULL, (GDBusAnnotationInfo **) &_gsignond_dbus_auth_session_method_cancel_annotation_info_pointers @@ -302,8 +308,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_session_signal_info_state { { -1, - "state", - "i", + (gchar *) "state", + (gchar *) "i", NULL }, FALSE @@ -313,8 +319,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_auth_session_signal_info_state { { -1, - "message", - "s", + (gchar *) "message", + (gchar *) "s", NULL }, FALSE @@ -331,7 +337,7 @@ static const _ExtendedGDBusSignalInfo _gsignond_dbus_auth_session_signal_info_st { { -1, - "stateChanged", + (gchar *) "stateChanged", (GDBusArgInfo **) &_gsignond_dbus_auth_session_signal_info_state_changed_ARG_pointers, NULL }, @@ -342,7 +348,7 @@ static const _ExtendedGDBusSignalInfo _gsignond_dbus_auth_session_signal_info_un { { -1, - "unregistered", + (gchar *) "unregistered", NULL, NULL }, @@ -360,7 +366,7 @@ static const _ExtendedGDBusInterfaceInfo _gsignond_dbus_auth_session_interface_i { { -1, - "com.google.code.AccountsSSO.gSingleSignOn.AuthSession", + (gchar *) "com.google.code.AccountsSSO.gSingleSignOn.AuthSession", (GDBusMethodInfo **) &_gsignond_dbus_auth_session_method_info_pointers, (GDBusSignalInfo **) &_gsignond_dbus_auth_session_signal_info_pointers, NULL, @@ -380,7 +386,7 @@ static const _ExtendedGDBusInterfaceInfo _gsignond_dbus_auth_session_interface_i GDBusInterfaceInfo * gsignond_dbus_auth_session_interface_info (void) { - return (GDBusInterfaceInfo *) &_gsignond_dbus_auth_session_interface_info; + return (GDBusInterfaceInfo *) &_gsignond_dbus_auth_session_interface_info.parent_struct; } /** @@ -994,7 +1000,7 @@ gsignond_dbus_auth_session_proxy_g_signal (GDBusProxy *proxy, guint num_params; guint n; guint signal_id; - info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_session_interface_info, signal_name); + info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_session_interface_info.parent_struct, signal_name); if (info == NULL) return; num_params = g_variant_n_children (parameters); @@ -1036,7 +1042,7 @@ gsignond_dbus_auth_session_proxy_g_properties_changed (GDBusProxy *_proxy, g_variant_get (changed_properties, "a{sv}", &iter); while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) { - info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_session_interface_info, key); + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_session_interface_info.parent_struct, key); g_datalist_remove_data (&proxy->priv->qdata, key); if (info != NULL) g_object_notify (G_OBJECT (proxy), info->hyphen_name); @@ -1044,7 +1050,7 @@ gsignond_dbus_auth_session_proxy_g_properties_changed (GDBusProxy *_proxy, g_variant_iter_free (iter); for (n = 0; invalidated_properties[n] != NULL; n++) { - info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_session_interface_info, invalidated_properties[n]); + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_session_interface_info.parent_struct, invalidated_properties[n]); g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]); if (info != NULL) g_object_notify (G_OBJECT (proxy), info->hyphen_name); @@ -1366,7 +1372,7 @@ _gsignond_dbus_auth_session_skeleton_handle_get_property ( _ExtendedGDBusPropertyInfo *info; GVariant *ret; ret = NULL; - info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_session_interface_info, property_name); + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_session_interface_info.parent_struct, property_name); g_assert (info != NULL); pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); if (pspec == NULL) @@ -1400,7 +1406,7 @@ _gsignond_dbus_auth_session_skeleton_handle_set_property ( _ExtendedGDBusPropertyInfo *info; gboolean ret; ret = FALSE; - info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_session_interface_info, property_name); + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_auth_session_interface_info.parent_struct, property_name); g_assert (info != NULL); pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); if (pspec == NULL) diff --git a/src/daemon/dbus/gsignond-dbus-auth-session-gen.h b/src/daemon/dbus/gsignond-dbus-auth-session-gen.h index 5059507..f1e2405 100644 --- a/src/daemon/dbus/gsignond-dbus-auth-session-gen.h +++ b/src/daemon/dbus/gsignond-dbus-auth-session-gen.h @@ -1,5 +1,5 @@ /* - * Generated by gdbus-codegen 2.32.3. DO NOT EDIT. + * Generated by gdbus-codegen 2.34.1. DO NOT EDIT. * * The license of this code is the same as for the source it was derived from. */ diff --git a/src/daemon/dbus/gsignond-dbus-identity-adapter.c b/src/daemon/dbus/gsignond-dbus-identity-adapter.c index 9e236aa..7de4ef6 100644 --- a/src/daemon/dbus/gsignond-dbus-identity-adapter.c +++ b/src/daemon/dbus/gsignond-dbus-identity-adapter.c @@ -3,7 +3,7 @@ /* * This file is part of gsignond * - * Copyright (C) 2012 Intel Corporation. + * Copyright (C) 2012-2013 Intel Corporation. * * Contact: Amarnath Valluri * @@ -23,8 +23,9 @@ * 02110-1301 USA */ -#include +#include "config.h" #include "gsignond/gsignond-log.h" +#include "gsignond/gsignond-utils.h" #include "gsignond-dbus-identity-adapter.h" #include "gsignond-dbus-auth-session-adapter.h" #include "gsignond-dbus.h" @@ -122,6 +123,7 @@ static gboolean _handle_store (GSignondDbusIdentityAdapter *, GDBusMethodInvocat static gboolean _handle_add_reference (GSignondDbusIdentityAdapter *, GDBusMethodInvocation *, const gchar *, gpointer); static gboolean _handle_remove_reference (GSignondDbusIdentityAdapter *, GDBusMethodInvocation *, const gchar *, gpointer); static void _emit_info_updated (GSignondIdentity *identity, GSignondIdentityChangeType change, gpointer userdata); +static void _on_session_disposed (gpointer data, GObject *session); static void gsignond_dbus_identity_adapter_set_property (GObject *object, @@ -203,8 +205,13 @@ gsignond_dbus_identity_adapter_get_property (GObject *object, static void _destroy_session (gpointer data, gpointer user_data) { - (void)user_data; - if (data) g_object_unref (G_OBJECT(data)); + if (data && GSIGNOND_IS_DBUS_AUTH_SESSION_ADAPTER (data)) { + GObject *dbus_session = G_OBJECT (data); + g_object_weak_unref (dbus_session, _on_session_disposed, user_data); + gsignond_dbus_auth_session_adapter_abort_process ( + GSIGNOND_DBUS_AUTH_SESSION_ADAPTER (dbus_session)); + g_object_unref (dbus_session); + } } static void @@ -212,6 +219,10 @@ gsignond_dbus_identity_adapter_dispose (GObject *object) { GSignondDbusIdentityAdapter *self = GSIGNOND_DBUS_IDENTITY_ADAPTER (object); + if (self->priv->sessions) { + g_list_foreach (self->priv->sessions, _destroy_session, self); + } + if (self->priv->identity) { if (self->priv->info_updated_handler_id) { g_signal_handler_disconnect (self->priv->identity, self->priv->info_updated_handler_id); @@ -235,10 +246,6 @@ gsignond_dbus_identity_adapter_dispose (GObject *object) self->priv->identity = NULL; } - if (self->priv->sessions) { - g_list_foreach (self->priv->sessions, _destroy_session, NULL); - } - if (self->priv->dbus_identity) { GDBusInterfaceSkeleton *iface = G_DBUS_INTERFACE_SKELETON(self->priv->dbus_identity); gsignond_dbus_identity_emit_unregistered (self->priv->dbus_identity); @@ -782,7 +789,8 @@ gsignond_dbus_identity_adapter_new_with_connection (GDBusConnection *connection, const gchar *app_context, guint timeout) { - static guint32 object_counter; + static guint32 object_counter = 0; + gchar *nonce; gchar *object_path = NULL; GError *err = NULL; GSignondDbusIdentityAdapter *adapter = GSIGNOND_DBUS_IDENTITY_ADAPTER ( @@ -791,7 +799,13 @@ gsignond_dbus_identity_adapter_new_with_connection (GDBusConnection *connection, if (!adapter) return NULL; - object_path = g_strdup_printf ("%s/Identity_%d", GSIGNOND_DAEMON_OBJECTPATH, object_counter++); + nonce = gsignond_generate_nonce (); + object_path = g_strdup_printf ("%s/Identity_%s_%d", + GSIGNOND_DAEMON_OBJECTPATH, + nonce, + object_counter++); + g_free (nonce); + if (!g_dbus_interface_skeleton_export ( G_DBUS_INTERFACE_SKELETON (adapter->priv->dbus_identity), adapter->priv->connection, object_path, &err)) { diff --git a/src/daemon/dbus/gsignond-dbus-identity-gen.c b/src/daemon/dbus/gsignond-dbus-identity-gen.c index 2f8b74b..b8399cc 100644 --- a/src/daemon/dbus/gsignond-dbus-identity-gen.c +++ b/src/daemon/dbus/gsignond-dbus-identity-gen.c @@ -1,5 +1,5 @@ /* - * Generated by gdbus-codegen 2.32.3. DO NOT EDIT. + * Generated by gdbus-codegen 2.34.1. DO NOT EDIT. * * The license of this code is the same as for the source it was derived from. */ @@ -10,6 +10,7 @@ #include "gsignond-dbus-identity-gen.h" +#include #ifdef G_OS_UNIX # include #endif @@ -124,7 +125,12 @@ _g_value_equal (const GValue *a, const GValue *b) ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b)); break; case G_TYPE_DOUBLE: - ret = (g_value_get_double (a) == g_value_get_double (b)); + { + /* Avoid -Wfloat-equal warnings by doing a direct bit compare */ + gdouble da = g_value_get_double (a); + gdouble db = g_value_get_double (b); + ret = memcmp (&da, &db, sizeof (gdouble)) == 0; + } break; case G_TYPE_STRING: ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0); @@ -161,8 +167,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_method_info_request_c { { -1, - "message", - "s", + (gchar *) "message", + (gchar *) "s", NULL }, FALSE @@ -178,8 +184,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_method_info_request_c { { -1, - "unnamed_arg1", - "u", + (gchar *) "unnamed_arg1", + (gchar *) "u", NULL }, FALSE @@ -195,7 +201,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_identity_method_info_reques { { -1, - "requestCredentialsUpdate", + (gchar *) "requestCredentialsUpdate", (GDBusArgInfo **) &_gsignond_dbus_identity_method_info_request_credentials_update_IN_ARG_pointers, (GDBusArgInfo **) &_gsignond_dbus_identity_method_info_request_credentials_update_OUT_ARG_pointers, NULL @@ -208,8 +214,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_method_info_get_info_ { { -1, - "identityInfo", - "a{sv}", + (gchar *) "identityInfo", + (gchar *) "a{sv}", NULL }, FALSE @@ -225,7 +231,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_identity_method_info_get_in { { -1, - "getInfo", + (gchar *) "getInfo", NULL, (GDBusArgInfo **) &_gsignond_dbus_identity_method_info_get_info_OUT_ARG_pointers, NULL @@ -238,8 +244,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_method_info_get_auth_ { { -1, - "method", - "s", + (gchar *) "method", + (gchar *) "s", NULL }, FALSE @@ -255,8 +261,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_method_info_get_auth_ { { -1, - "objectPath", - "o", + (gchar *) "objectPath", + (gchar *) "o", NULL }, FALSE @@ -272,7 +278,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_identity_method_info_get_au { { -1, - "getAuthSession", + (gchar *) "getAuthSession", (GDBusArgInfo **) &_gsignond_dbus_identity_method_info_get_auth_session_IN_ARG_pointers, (GDBusArgInfo **) &_gsignond_dbus_identity_method_info_get_auth_session_OUT_ARG_pointers, NULL @@ -285,8 +291,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_method_info_verify_us { { -1, - "params", - "a{sv}", + (gchar *) "params", + (gchar *) "a{sv}", NULL }, FALSE @@ -302,8 +308,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_method_info_verify_us { { -1, - "unnamed_arg1", - "b", + (gchar *) "unnamed_arg1", + (gchar *) "b", NULL }, FALSE @@ -319,7 +325,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_identity_method_info_verify { { -1, - "verifyUser", + (gchar *) "verifyUser", (GDBusArgInfo **) &_gsignond_dbus_identity_method_info_verify_user_IN_ARG_pointers, (GDBusArgInfo **) &_gsignond_dbus_identity_method_info_verify_user_OUT_ARG_pointers, NULL @@ -332,8 +338,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_method_info_verify_se { { -1, - "secret", - "s", + (gchar *) "secret", + (gchar *) "s", NULL }, FALSE @@ -349,8 +355,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_method_info_verify_se { { -1, - "unnamed_arg1", - "b", + (gchar *) "unnamed_arg1", + (gchar *) "b", NULL }, FALSE @@ -366,7 +372,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_identity_method_info_verify { { -1, - "verifySecret", + (gchar *) "verifySecret", (GDBusArgInfo **) &_gsignond_dbus_identity_method_info_verify_secret_IN_ARG_pointers, (GDBusArgInfo **) &_gsignond_dbus_identity_method_info_verify_secret_OUT_ARG_pointers, NULL @@ -379,7 +385,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_identity_method_info_remove { { -1, - "remove", + (gchar *) "remove", NULL, NULL, NULL @@ -392,8 +398,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_method_info_sign_out_ { { -1, - "unnamed_arg0", - "b", + (gchar *) "unnamed_arg0", + (gchar *) "b", NULL }, FALSE @@ -409,7 +415,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_identity_method_info_sign_o { { -1, - "signOut", + (gchar *) "signOut", NULL, (GDBusArgInfo **) &_gsignond_dbus_identity_method_info_sign_out_OUT_ARG_pointers, NULL @@ -422,8 +428,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_method_info_store_IN_ { { -1, - "unnamed_arg0", - "a{sv}", + (gchar *) "unnamed_arg0", + (gchar *) "a{sv}", NULL }, FALSE @@ -439,8 +445,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_method_info_store_OUT { { -1, - "unnamed_arg1", - "u", + (gchar *) "unnamed_arg1", + (gchar *) "u", NULL }, FALSE @@ -456,7 +462,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_identity_method_info_store { { -1, - "store", + (gchar *) "store", (GDBusArgInfo **) &_gsignond_dbus_identity_method_info_store_IN_ARG_pointers, (GDBusArgInfo **) &_gsignond_dbus_identity_method_info_store_OUT_ARG_pointers, NULL @@ -469,8 +475,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_method_info_add_refer { { -1, - "reference", - "s", + (gchar *) "reference", + (gchar *) "s", NULL }, FALSE @@ -486,8 +492,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_method_info_add_refer { { -1, - "unnamed_arg1", - "i", + (gchar *) "unnamed_arg1", + (gchar *) "i", NULL }, FALSE @@ -503,7 +509,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_identity_method_info_add_re { { -1, - "addReference", + (gchar *) "addReference", (GDBusArgInfo **) &_gsignond_dbus_identity_method_info_add_reference_IN_ARG_pointers, (GDBusArgInfo **) &_gsignond_dbus_identity_method_info_add_reference_OUT_ARG_pointers, NULL @@ -516,8 +522,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_method_info_remove_re { { -1, - "reference", - "s", + (gchar *) "reference", + (gchar *) "s", NULL }, FALSE @@ -533,8 +539,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_method_info_remove_re { { -1, - "unnamed_arg1", - "i", + (gchar *) "unnamed_arg1", + (gchar *) "i", NULL }, FALSE @@ -550,7 +556,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_identity_method_info_remove { { -1, - "removeReference", + (gchar *) "removeReference", (GDBusArgInfo **) &_gsignond_dbus_identity_method_info_remove_reference_IN_ARG_pointers, (GDBusArgInfo **) &_gsignond_dbus_identity_method_info_remove_reference_OUT_ARG_pointers, NULL @@ -578,7 +584,7 @@ static const _ExtendedGDBusSignalInfo _gsignond_dbus_identity_signal_info_unregi { { -1, - "unregistered", + (gchar *) "unregistered", NULL, NULL }, @@ -589,8 +595,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_identity_signal_info_info_upda { { -1, - "unnamed_arg0", - "i", + (gchar *) "unnamed_arg0", + (gchar *) "i", NULL }, FALSE @@ -606,7 +612,7 @@ static const _ExtendedGDBusSignalInfo _gsignond_dbus_identity_signal_info_info_u { { -1, - "infoUpdated", + (gchar *) "infoUpdated", (GDBusArgInfo **) &_gsignond_dbus_identity_signal_info_info_updated_ARG_pointers, NULL }, @@ -624,7 +630,7 @@ static const _ExtendedGDBusInterfaceInfo _gsignond_dbus_identity_interface_info { { -1, - "com.google.code.AccountsSSO.gSingleSignOn.Identity", + (gchar *) "com.google.code.AccountsSSO.gSingleSignOn.Identity", (GDBusMethodInfo **) &_gsignond_dbus_identity_method_info_pointers, (GDBusSignalInfo **) &_gsignond_dbus_identity_signal_info_pointers, NULL, @@ -644,7 +650,7 @@ static const _ExtendedGDBusInterfaceInfo _gsignond_dbus_identity_interface_info GDBusInterfaceInfo * gsignond_dbus_identity_interface_info (void) { - return (GDBusInterfaceInfo *) &_gsignond_dbus_identity_interface_info; + return (GDBusInterfaceInfo *) &_gsignond_dbus_identity_interface_info.parent_struct; } /** @@ -2277,7 +2283,7 @@ gsignond_dbus_identity_proxy_g_signal (GDBusProxy *proxy, guint num_params; guint n; guint signal_id; - info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_gsignond_dbus_identity_interface_info, signal_name); + info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_gsignond_dbus_identity_interface_info.parent_struct, signal_name); if (info == NULL) return; num_params = g_variant_n_children (parameters); @@ -2319,7 +2325,7 @@ gsignond_dbus_identity_proxy_g_properties_changed (GDBusProxy *_proxy, g_variant_get (changed_properties, "a{sv}", &iter); while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) { - info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_identity_interface_info, key); + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_identity_interface_info.parent_struct, key); g_datalist_remove_data (&proxy->priv->qdata, key); if (info != NULL) g_object_notify (G_OBJECT (proxy), info->hyphen_name); @@ -2327,7 +2333,7 @@ gsignond_dbus_identity_proxy_g_properties_changed (GDBusProxy *_proxy, g_variant_iter_free (iter); for (n = 0; invalidated_properties[n] != NULL; n++) { - info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_identity_interface_info, invalidated_properties[n]); + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_identity_interface_info.parent_struct, invalidated_properties[n]); g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]); if (info != NULL) g_object_notify (G_OBJECT (proxy), info->hyphen_name); @@ -2649,7 +2655,7 @@ _gsignond_dbus_identity_skeleton_handle_get_property ( _ExtendedGDBusPropertyInfo *info; GVariant *ret; ret = NULL; - info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_identity_interface_info, property_name); + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_identity_interface_info.parent_struct, property_name); g_assert (info != NULL); pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); if (pspec == NULL) @@ -2683,7 +2689,7 @@ _gsignond_dbus_identity_skeleton_handle_set_property ( _ExtendedGDBusPropertyInfo *info; gboolean ret; ret = FALSE; - info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_identity_interface_info, property_name); + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_identity_interface_info.parent_struct, property_name); g_assert (info != NULL); pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); if (pspec == NULL) diff --git a/src/daemon/dbus/gsignond-dbus-identity-gen.h b/src/daemon/dbus/gsignond-dbus-identity-gen.h index 752a70c..8745c2a 100644 --- a/src/daemon/dbus/gsignond-dbus-identity-gen.h +++ b/src/daemon/dbus/gsignond-dbus-identity-gen.h @@ -1,5 +1,5 @@ /* - * Generated by gdbus-codegen 2.32.3. DO NOT EDIT. + * Generated by gdbus-codegen 2.34.1. DO NOT EDIT. * * The license of this code is the same as for the source it was derived from. */ diff --git a/src/daemon/dbus/gsignond-dbus-remote-plugin-gen.c b/src/daemon/dbus/gsignond-dbus-remote-plugin-gen.c index b8cb666..b0c19e9 100644 --- a/src/daemon/dbus/gsignond-dbus-remote-plugin-gen.c +++ b/src/daemon/dbus/gsignond-dbus-remote-plugin-gen.c @@ -1,5 +1,5 @@ /* - * Generated by gdbus-codegen 2.32.3. DO NOT EDIT. + * Generated by gdbus-codegen 2.34.1. DO NOT EDIT. * * The license of this code is the same as for the source it was derived from. */ @@ -10,6 +10,7 @@ #include "gsignond-dbus-remote-plugin-gen.h" +#include #ifdef G_OS_UNIX # include #endif @@ -124,7 +125,12 @@ _g_value_equal (const GValue *a, const GValue *b) ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b)); break; case G_TYPE_DOUBLE: - ret = (g_value_get_double (a) == g_value_get_double (b)); + { + /* Avoid -Wfloat-equal warnings by doing a direct bit compare */ + gdouble da = g_value_get_double (a); + gdouble db = g_value_get_double (b); + ret = memcmp (&da, &db, sizeof (gdouble)) == 0; + } break; case G_TYPE_STRING: ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0); @@ -161,7 +167,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_remote_plugin_method_info_c { { -1, - "cancel", + (gchar *) "cancel", NULL, NULL, NULL @@ -174,8 +180,19 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_method_info_requ { { -1, - "sessionData", - "a{sv}", + (gchar *) "sessionData", + (gchar *) "a{sv}", + NULL + }, + FALSE +}; + +static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_method_info_request_initial_IN_ARG_identityMethodCache = +{ + { + -1, + (gchar *) "identityMethodCache", + (gchar *) "a{sv}", NULL }, FALSE @@ -185,8 +202,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_method_info_requ { { -1, - "mechanism", - "s", + (gchar *) "mechanism", + (gchar *) "s", NULL }, FALSE @@ -195,6 +212,7 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_method_info_requ static const _ExtendedGDBusArgInfo * const _gsignond_dbus_remote_plugin_method_info_request_initial_IN_ARG_pointers[] = { &_gsignond_dbus_remote_plugin_method_info_request_initial_IN_ARG_sessionData, + &_gsignond_dbus_remote_plugin_method_info_request_initial_IN_ARG_identityMethodCache, &_gsignond_dbus_remote_plugin_method_info_request_initial_IN_ARG_mechanism, NULL }; @@ -203,7 +221,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_remote_plugin_method_info_r { { -1, - "requestInitial", + (gchar *) "requestInitial", (GDBusArgInfo **) &_gsignond_dbus_remote_plugin_method_info_request_initial_IN_ARG_pointers, NULL, NULL @@ -216,8 +234,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_method_info_requ { { -1, - "sessionData", - "a{sv}", + (gchar *) "sessionData", + (gchar *) "a{sv}", NULL }, FALSE @@ -233,7 +251,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_remote_plugin_method_info_r { { -1, - "request", + (gchar *) "request", (GDBusArgInfo **) &_gsignond_dbus_remote_plugin_method_info_request_IN_ARG_pointers, NULL, NULL @@ -246,8 +264,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_method_info_user { { -1, - "uiData", - "a{sv}", + (gchar *) "uiData", + (gchar *) "a{sv}", NULL }, FALSE @@ -263,7 +281,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_remote_plugin_method_info_u { { -1, - "userActionFinished", + (gchar *) "userActionFinished", (GDBusArgInfo **) &_gsignond_dbus_remote_plugin_method_info_user_action_finished_IN_ARG_pointers, NULL, NULL @@ -276,8 +294,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_method_info_refr { { -1, - "uiData", - "a{sv}", + (gchar *) "uiData", + (gchar *) "a{sv}", NULL }, FALSE @@ -293,7 +311,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_remote_plugin_method_info_r { { -1, - "refresh", + (gchar *) "refresh", (GDBusArgInfo **) &_gsignond_dbus_remote_plugin_method_info_refresh_IN_ARG_pointers, NULL, NULL @@ -306,8 +324,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_method_info_get_ { { -1, - "type", - "s", + (gchar *) "type", + (gchar *) "s", NULL }, FALSE @@ -317,8 +335,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_method_info_get_ { { -1, - "mechanisms", - "as", + (gchar *) "mechanisms", + (gchar *) "as", NULL }, FALSE @@ -335,7 +353,7 @@ static const _ExtendedGDBusMethodInfo _gsignond_dbus_remote_plugin_method_info_g { { -1, - "getInfo", + (gchar *) "getInfo", NULL, (GDBusArgInfo **) &_gsignond_dbus_remote_plugin_method_info_get_info_OUT_ARG_pointers, NULL @@ -359,8 +377,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_signal_info_resp { { -1, - "sessionData", - "a{sv}", + (gchar *) "sessionData", + (gchar *) "a{sv}", NULL }, FALSE @@ -376,7 +394,7 @@ static const _ExtendedGDBusSignalInfo _gsignond_dbus_remote_plugin_signal_info_r { { -1, - "response", + (gchar *) "response", (GDBusArgInfo **) &_gsignond_dbus_remote_plugin_signal_info_response_ARG_pointers, NULL }, @@ -387,8 +405,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_signal_info_resp { { -1, - "sessionData", - "a{sv}", + (gchar *) "sessionData", + (gchar *) "a{sv}", NULL }, FALSE @@ -404,7 +422,7 @@ static const _ExtendedGDBusSignalInfo _gsignond_dbus_remote_plugin_signal_info_r { { -1, - "responseFinal", + (gchar *) "responseFinal", (GDBusArgInfo **) &_gsignond_dbus_remote_plugin_signal_info_response_final_ARG_pointers, NULL }, @@ -415,8 +433,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_signal_info_stor { { -1, - "sessionData", - "a{sv}", + (gchar *) "sessionData", + (gchar *) "a{sv}", NULL }, FALSE @@ -432,7 +450,7 @@ static const _ExtendedGDBusSignalInfo _gsignond_dbus_remote_plugin_signal_info_s { { -1, - "store", + (gchar *) "store", (GDBusArgInfo **) &_gsignond_dbus_remote_plugin_signal_info_store_ARG_pointers, NULL }, @@ -443,8 +461,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_signal_info_erro { { -1, - "error", - "(uis)", + (gchar *) "error", + (gchar *) "(uis)", NULL }, FALSE @@ -460,7 +478,7 @@ static const _ExtendedGDBusSignalInfo _gsignond_dbus_remote_plugin_signal_info_e { { -1, - "error", + (gchar *) "error", (GDBusArgInfo **) &_gsignond_dbus_remote_plugin_signal_info_error_ARG_pointers, NULL }, @@ -471,8 +489,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_signal_info_user { { -1, - "uiData", - "a{sv}", + (gchar *) "uiData", + (gchar *) "a{sv}", NULL }, FALSE @@ -488,7 +506,7 @@ static const _ExtendedGDBusSignalInfo _gsignond_dbus_remote_plugin_signal_info_u { { -1, - "userActionRequired", + (gchar *) "userActionRequired", (GDBusArgInfo **) &_gsignond_dbus_remote_plugin_signal_info_user_action_required_ARG_pointers, NULL }, @@ -499,8 +517,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_signal_info_refr { { -1, - "uiData", - "a{sv}", + (gchar *) "uiData", + (gchar *) "a{sv}", NULL }, FALSE @@ -516,7 +534,7 @@ static const _ExtendedGDBusSignalInfo _gsignond_dbus_remote_plugin_signal_info_r { { -1, - "refreshed", + (gchar *) "refreshed", (GDBusArgInfo **) &_gsignond_dbus_remote_plugin_signal_info_refreshed_ARG_pointers, NULL }, @@ -527,8 +545,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_signal_info_stat { { -1, - "state", - "i", + (gchar *) "state", + (gchar *) "i", NULL }, FALSE @@ -538,8 +556,8 @@ static const _ExtendedGDBusArgInfo _gsignond_dbus_remote_plugin_signal_info_stat { { -1, - "message", - "s", + (gchar *) "message", + (gchar *) "s", NULL }, FALSE @@ -556,7 +574,7 @@ static const _ExtendedGDBusSignalInfo _gsignond_dbus_remote_plugin_signal_info_s { { -1, - "statusChanged", + (gchar *) "statusChanged", (GDBusArgInfo **) &_gsignond_dbus_remote_plugin_signal_info_status_changed_ARG_pointers, NULL }, @@ -579,7 +597,7 @@ static const _ExtendedGDBusInterfaceInfo _gsignond_dbus_remote_plugin_interface_ { { -1, - "com.google.code.AccountsSSO.gSingleSignOn.RemotePlugin", + (gchar *) "com.google.code.AccountsSSO.gSingleSignOn.RemotePlugin", (GDBusMethodInfo **) &_gsignond_dbus_remote_plugin_method_info_pointers, (GDBusSignalInfo **) &_gsignond_dbus_remote_plugin_signal_info_pointers, NULL, @@ -599,7 +617,7 @@ static const _ExtendedGDBusInterfaceInfo _gsignond_dbus_remote_plugin_interface_ GDBusInterfaceInfo * gsignond_dbus_remote_plugin_interface_info (void) { - return (GDBusInterfaceInfo *) &_gsignond_dbus_remote_plugin_interface_info; + return (GDBusInterfaceInfo *) &_gsignond_dbus_remote_plugin_interface_info.parent_struct; } /** @@ -677,6 +695,7 @@ gsignond_dbus_remote_plugin_default_init (GSignondDbusRemotePluginIface *iface) * @object: A #GSignondDbusRemotePlugin. * @invocation: A #GDBusMethodInvocation. * @arg_sessionData: Argument passed by remote caller. + * @arg_identityMethodCache: Argument passed by remote caller. * @arg_mechanism: Argument passed by remote caller. * * Signal emitted when a remote caller is invoking the requestInitial() D-Bus method. @@ -693,8 +712,8 @@ gsignond_dbus_remote_plugin_default_init (GSignondDbusRemotePluginIface *iface) NULL, g_cclosure_marshal_generic, G_TYPE_BOOLEAN, - 3, - G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_VARIANT, G_TYPE_STRING); + 4, + G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_VARIANT, G_TYPE_VARIANT, G_TYPE_STRING); /** * GSignondDbusRemotePlugin::handle-request: @@ -1130,6 +1149,7 @@ _out: * gsignond_dbus_remote_plugin_call_request_initial: * @proxy: A #GSignondDbusRemotePluginProxy. * @arg_sessionData: Argument to pass with the method invocation. + * @arg_identityMethodCache: Argument to pass with the method invocation. * @arg_mechanism: Argument to pass with the method invocation. * @cancellable: (allow-none): A #GCancellable or %NULL. * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL. @@ -1145,6 +1165,7 @@ void gsignond_dbus_remote_plugin_call_request_initial ( GSignondDbusRemotePlugin *proxy, GVariant *arg_sessionData, + GVariant *arg_identityMethodCache, const gchar *arg_mechanism, GCancellable *cancellable, GAsyncReadyCallback callback, @@ -1152,8 +1173,9 @@ gsignond_dbus_remote_plugin_call_request_initial ( { g_dbus_proxy_call (G_DBUS_PROXY (proxy), "requestInitial", - g_variant_new ("(@a{sv}s)", + g_variant_new ("(@a{sv}@a{sv}s)", arg_sessionData, + arg_identityMethodCache, arg_mechanism), G_DBUS_CALL_FLAGS_NONE, -1, @@ -1193,6 +1215,7 @@ _out: * gsignond_dbus_remote_plugin_call_request_initial_sync: * @proxy: A #GSignondDbusRemotePluginProxy. * @arg_sessionData: Argument to pass with the method invocation. + * @arg_identityMethodCache: Argument to pass with the method invocation. * @arg_mechanism: Argument to pass with the method invocation. * @cancellable: (allow-none): A #GCancellable or %NULL. * @error: Return location for error or %NULL. @@ -1207,6 +1230,7 @@ gboolean gsignond_dbus_remote_plugin_call_request_initial_sync ( GSignondDbusRemotePlugin *proxy, GVariant *arg_sessionData, + GVariant *arg_identityMethodCache, const gchar *arg_mechanism, GCancellable *cancellable, GError **error) @@ -1214,8 +1238,9 @@ gsignond_dbus_remote_plugin_call_request_initial_sync ( GVariant *_ret; _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), "requestInitial", - g_variant_new ("(@a{sv}s)", + g_variant_new ("(@a{sv}@a{sv}s)", arg_sessionData, + arg_identityMethodCache, arg_mechanism), G_DBUS_CALL_FLAGS_NONE, -1, @@ -1804,7 +1829,7 @@ gsignond_dbus_remote_plugin_proxy_g_signal (GDBusProxy *proxy, guint num_params; guint n; guint signal_id; - info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_gsignond_dbus_remote_plugin_interface_info, signal_name); + info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_gsignond_dbus_remote_plugin_interface_info.parent_struct, signal_name); if (info == NULL) return; num_params = g_variant_n_children (parameters); @@ -1846,7 +1871,7 @@ gsignond_dbus_remote_plugin_proxy_g_properties_changed (GDBusProxy *_proxy, g_variant_get (changed_properties, "a{sv}", &iter); while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) { - info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_remote_plugin_interface_info, key); + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_remote_plugin_interface_info.parent_struct, key); g_datalist_remove_data (&proxy->priv->qdata, key); if (info != NULL) g_object_notify (G_OBJECT (proxy), info->hyphen_name); @@ -1854,7 +1879,7 @@ gsignond_dbus_remote_plugin_proxy_g_properties_changed (GDBusProxy *_proxy, g_variant_iter_free (iter); for (n = 0; invalidated_properties[n] != NULL; n++) { - info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_remote_plugin_interface_info, invalidated_properties[n]); + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_remote_plugin_interface_info.parent_struct, invalidated_properties[n]); g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]); if (info != NULL) g_object_notify (G_OBJECT (proxy), info->hyphen_name); @@ -2176,7 +2201,7 @@ _gsignond_dbus_remote_plugin_skeleton_handle_get_property ( _ExtendedGDBusPropertyInfo *info; GVariant *ret; ret = NULL; - info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_remote_plugin_interface_info, property_name); + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_remote_plugin_interface_info.parent_struct, property_name); g_assert (info != NULL); pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); if (pspec == NULL) @@ -2210,7 +2235,7 @@ _gsignond_dbus_remote_plugin_skeleton_handle_set_property ( _ExtendedGDBusPropertyInfo *info; gboolean ret; ret = FALSE; - info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_remote_plugin_interface_info, property_name); + info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_gsignond_dbus_remote_plugin_interface_info.parent_struct, property_name); g_assert (info != NULL); pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name); if (pspec == NULL) diff --git a/src/daemon/dbus/gsignond-dbus-remote-plugin-gen.h b/src/daemon/dbus/gsignond-dbus-remote-plugin-gen.h index f704b0a..5732dea 100644 --- a/src/daemon/dbus/gsignond-dbus-remote-plugin-gen.h +++ b/src/daemon/dbus/gsignond-dbus-remote-plugin-gen.h @@ -1,5 +1,5 @@ /* - * Generated by gdbus-codegen 2.32.3. DO NOT EDIT. + * Generated by gdbus-codegen 2.34.1. DO NOT EDIT. * * The license of this code is the same as for the source it was derived from. */ @@ -51,6 +51,7 @@ struct _GSignondDbusRemotePluginIface GSignondDbusRemotePlugin *object, GDBusMethodInvocation *invocation, GVariant *arg_sessionData, + GVariant *arg_identityMethodCache, const gchar *arg_mechanism); gboolean (*handle_user_action_finished) ( @@ -176,6 +177,7 @@ gboolean gsignond_dbus_remote_plugin_call_cancel_sync ( void gsignond_dbus_remote_plugin_call_request_initial ( GSignondDbusRemotePlugin *proxy, GVariant *arg_sessionData, + GVariant *arg_identityMethodCache, const gchar *arg_mechanism, GCancellable *cancellable, GAsyncReadyCallback callback, @@ -189,6 +191,7 @@ gboolean gsignond_dbus_remote_plugin_call_request_initial_finish ( gboolean gsignond_dbus_remote_plugin_call_request_initial_sync ( GSignondDbusRemotePlugin *proxy, GVariant *arg_sessionData, + GVariant *arg_identityMethodCache, const gchar *arg_mechanism, GCancellable *cancellable, GError **error); diff --git a/src/daemon/dbus/gsignond-dbus-signonui-adapter.c b/src/daemon/dbus/gsignond-dbus-signonui-adapter.c index 155348c..74b887b 100644 --- a/src/daemon/dbus/gsignond-dbus-signonui-adapter.c +++ b/src/daemon/dbus/gsignond-dbus-signonui-adapter.c @@ -232,9 +232,13 @@ _on_query_dialog_ready (GObject *proxy, GAsyncResult *res, gpointer user_data) if (info) { if (info->cb) { - GVariant *out_params = NULL; g_variant_get (reply, "(@a{sv})", &out_params); + GVariant *out_params = NULL; + + if (!error) { + g_variant_get (reply, "(@a{sv})", &out_params); + } ((GSignondDbusSignonuiQueryDialogCb)info->cb) (out_params, error, info->data); - g_variant_unref (out_params); + if(out_params) g_variant_unref (out_params); } g_object_unref (info->adapter); g_slice_free (_SignonuiDbusInfo, info); @@ -265,7 +269,7 @@ gsignond_dbus_signonui_adapter_query_dialog (GSignondDbusSignonuiAdapter *adapte info->data = user_data; g_dbus_proxy_call (adapter->priv->proxy, "queryDialog", - g_variant_new ("(a{sv})", params), G_DBUS_CALL_FLAGS_NONE, -1, NULL, + g_variant_new ("(@a{sv})", params), G_DBUS_CALL_FLAGS_NONE, G_MAXINT, NULL, _on_query_dialog_ready, (gpointer)info); return TRUE; diff --git a/src/daemon/dbus/interfaces/com.google.code.AccountsSSO.gSingleSignOn.RemotePlugin.xml b/src/daemon/dbus/interfaces/com.google.code.AccountsSSO.gSingleSignOn.RemotePlugin.xml index a7b97d2..ef09de0 100644 --- a/src/daemon/dbus/interfaces/com.google.code.AccountsSSO.gSingleSignOn.RemotePlugin.xml +++ b/src/daemon/dbus/interfaces/com.google.code.AccountsSSO.gSingleSignOn.RemotePlugin.xml @@ -5,6 +5,7 @@ + diff --git a/src/daemon/gsignond-auth-session.c b/src/daemon/gsignond-auth-session.c index 45dd640..f165a26 100644 --- a/src/daemon/gsignond-auth-session.c +++ b/src/daemon/gsignond-auth-session.c @@ -27,7 +27,6 @@ #include "gsignond/gsignond-error.h" #include "gsignond/gsignond-log.h" #include "gsignond/gsignond-session-data.h" -#include "gsignond/gsignond-identity-info.h" #include "plugins/gsignond-plugin-proxy-factory.h" #include "gsignond-daemon.h" @@ -44,6 +43,7 @@ enum { SIG_PROCESS_STORE, SIG_PROCESS_USER_ACTION_REQUIRED, SIG_PROCESS_REFRESHED, + SIG_PROCESS_CANCELED, SIG_MAX }; @@ -145,12 +145,13 @@ _create_mechanism_cache (GSignondAuthSession *self) (gpointer) *iter, _sort_cmp, NULL); - DBG (" allow: '%s'", *iter); - if (pos) + if (pos) { + DBG (" allow: '%s'", *iter); g_sequence_insert_sorted (priv->available_mechanisms, (gpointer) *iter, _sort_cmp, NULL); + } } } if (allowed_mechanisms) @@ -207,7 +208,7 @@ gsignond_auth_session_process (GSignondAuthSession *self, GError **error) { if (!self || !GSIGNOND_IS_AUTH_SESSION (self)) { - WARN ("assertion (seöf && GSIGNOND_IS_AUTH_SESSION (self))failed"); + WARN ("assertion (self && GSIGNOND_IS_AUTH_SESSION (self)) failed"); if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN, "Unknown error"); return FALSE; } @@ -224,21 +225,19 @@ gsignond_auth_session_process (GSignondAuthSession *self, } if (session_data && - !gsignond_session_data_get_username (session_data) - && self->priv->identity_info) { - const gchar *username = gsignond_identity_info_get_username (self->priv->identity_info); - - if (username) { - gsignond_session_data_set_username (session_data, username); + self->priv->identity_info) { + if (!gsignond_session_data_get_username (session_data)) { + const gchar *username = + gsignond_identity_info_get_username (self->priv->identity_info); + if (username) + gsignond_session_data_set_username (session_data, username); + } + if (!gsignond_session_data_get_secret (session_data)) { + const gchar *secret = + gsignond_identity_info_get_secret (self->priv->identity_info); + if (secret) + gsignond_session_data_set_secret (session_data, secret); } - } - - /* pass token data to session data */ - if (self->priv->token_data) { - GVariant *token_data = gsignond_dictionary_to_variant (self->priv->token_data); - /* FIXME: better add API GSignondSessionData to support(set/get) token data. - That will be the cleaner solution */ - gsignond_dictionary_set (session_data, "Token", token_data); } _ProcessData * data = g_slice_new0 (_ProcessData); @@ -247,6 +246,7 @@ gsignond_auth_session_process (GSignondAuthSession *self, data->state_change_cb = state_change_cb; data->userdata = userdata; gsignond_plugin_proxy_process(self->priv->proxy, self, session_data, + self->priv->token_data, mechanism, data); return TRUE; @@ -265,6 +265,7 @@ gsignond_auth_session_cancel (GSignondAuthSession *self, VALIDATE_READ_ACCESS (self->priv->identity_info, ctx, FALSE); gsignond_plugin_proxy_cancel(self->priv->proxy, self); + g_signal_emit (self, signals[SIG_PROCESS_CANCELED], 0, NULL); return TRUE; } @@ -275,6 +276,7 @@ gsignond_auth_session_abort_process (GSignondAuthSession *self) g_return_if_fail (self && GSIGNOND_IS_AUTH_SESSION (self)); gsignond_plugin_proxy_cancel (self->priv->proxy, self); + g_signal_emit (self, signals[SIG_PROCESS_CANCELED], 0, NULL); } void @@ -436,6 +438,18 @@ gsignond_auth_session_class_init (GSignondAuthSessionClass *klass) G_TYPE_NONE, 1, GSIGNOND_TYPE_SIGNONUI_DATA); + + signals[SIG_PROCESS_CANCELED] = g_signal_new ("process-canceled", + GSIGNOND_TYPE_AUTH_SESSION, + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + NULL, + G_TYPE_NONE, + 0, + G_TYPE_NONE); + } /** @@ -519,8 +533,7 @@ gsignond_auth_session_notify_store (GSignondAuthSession *self, /* cache token data */ if (self->priv->token_data) gsignond_dictionary_unref (self->priv->token_data); - self->priv->token_data = token_data; - gsignond_dictionary_ref (self->priv->token_data); + self->priv->token_data = gsignond_dictionary_ref (token_data); g_signal_emit (self, signals[SIG_PROCESS_STORE], 0, token_data); } @@ -566,7 +579,8 @@ gsignond_auth_session_new (GSignondIdentityInfo *info, const gchar *method, GSig "method", method, NULL); auth_session->priv->proxy = proxy; auth_session->priv->identity_info = g_hash_table_ref ((GHashTable *)info); - auth_session->priv->token_data = token_data; + auth_session->priv->token_data = token_data ? gsignond_dictionary_ref(token_data) + : gsignond_dictionary_new(); return auth_session; } diff --git a/src/daemon/gsignond-auth-session.h b/src/daemon/gsignond-auth-session.h index 300da28..d59a3d2 100644 --- a/src/daemon/gsignond-auth-session.h +++ b/src/daemon/gsignond-auth-session.h @@ -30,7 +30,7 @@ #include "gsignond-types.h" #include -#include +#include "common/gsignond-identity-info.h" #include #include #include diff --git a/src/daemon/gsignond-daemon.c b/src/daemon/gsignond-daemon.c index ef4177b..735e6e4 100644 --- a/src/daemon/gsignond-daemon.c +++ b/src/daemon/gsignond-daemon.c @@ -181,6 +181,29 @@ _init_extension (GSignondDaemon *self) return TRUE; } +static void +_on_extension_dispose (gpointer data, GObject *object) +{ + if (data) *(GSignondExtension **)data = NULL; +} + +static GSignondExtension * _default_extension_init () +{ + static GSignondExtension *default_extension = NULL; + + if (!default_extension) { + default_extension = + g_object_new (GSIGNOND_TYPE_EXTENSION, NULL); + + g_object_weak_ref (G_OBJECT (default_extension), + _on_extension_dispose, + &default_extension); + } + + return default_extension; +} + + static gboolean _init_extensions (GSignondDaemon *self) { @@ -191,7 +214,7 @@ _init_extensions (GSignondDaemon *self) gchar *mod_name; gchar *mod_filename; gchar *initf_name; - GSignondExtensionInit ext_init; + GSignondExtension* (*ext_init) (void); ext_path = gsignond_config_get_string (self->priv->config, GSIGNOND_CONFIG_GENERAL_EXTENSIONS_DIR); @@ -223,7 +246,7 @@ _init_extensions (GSignondDaemon *self) return FALSE; } } else { - ext_init = default_extension_init; + ext_init = _default_extension_init; } self->priv->extension = ext_init (); g_return_val_if_fail (self->priv->extension && @@ -660,11 +683,6 @@ gsignond_daemon_clear (GSignondDaemon *self, WARN ("gsignond_storage_manager_delete_storage() failed"); retval = FALSE; } - if (!gsignond_wipe_directory (gsignond_config_get_string (priv->config, - GSIGNOND_CONFIG_GENERAL_STORAGE_PATH))) { - WARN ("gsignond_wipe_directory() failed"); - retval = FALSE; - } DBG ("re-create storage"); if (!_init_storage (self)) { diff --git a/src/daemon/gsignond-daemon.h b/src/daemon/gsignond-daemon.h index 2dd8fa5..de77d28 100644 --- a/src/daemon/gsignond-daemon.h +++ b/src/daemon/gsignond-daemon.h @@ -30,7 +30,7 @@ #include "gsignond-types.h" #include -#include +#include "common/gsignond-identity-info.h" #include "gsignond-signonui-proxy.h" #include "plugins/gsignond-plugin-proxy-factory.h" diff --git a/src/daemon/gsignond-identity-enum-types.c b/src/daemon/gsignond-identity-enum-types.c index 0307956..a1a3b81 100644 --- a/src/daemon/gsignond-identity-enum-types.c +++ b/src/daemon/gsignond-identity-enum-types.c @@ -2,8 +2,8 @@ /* Generated data (by glib-mkenums) */ #include "gsignond-identity-enum-types.h" -/* enumerations from "gsignond-identity.h" */ -#include "gsignond-identity.h" +/* enumerations from "./gsignond-identity.h" */ +#include "./gsignond-identity.h" GType gsignond_identity_change_type_get_type (void) diff --git a/src/daemon/gsignond-identity-enum-types.h b/src/daemon/gsignond-identity-enum-types.h index f1a002a..82c3c92 100644 --- a/src/daemon/gsignond-identity-enum-types.h +++ b/src/daemon/gsignond-identity-enum-types.h @@ -7,7 +7,7 @@ #include G_BEGIN_DECLS -/* Enumeration from "gsignond-identity.h" */ +/* Enumeration from "./gsignond-identity.h" */ #define GSIGNOND_TYPE_IDENTITY_CHANGE_TYPE (gsignond_identity_change_type_get_type()) GType gsignond_identity_change_type_get_type (void) G_GNUC_CONST; diff --git a/src/daemon/gsignond-identity.c b/src/daemon/gsignond-identity.c index 145b68c..cb36fa1 100644 --- a/src/daemon/gsignond-identity.c +++ b/src/daemon/gsignond-identity.c @@ -33,7 +33,6 @@ #include "gsignond-identity-enum-types.h" #include "gsignond-auth-session.h" #include "gsignond/gsignond-config-dbus.h" -#include "gsignond/gsignond-signonui.h" #include "common/gsignond-identity-info-internal.h" #include "plugins/gsignond-plugin-proxy-factory.h" @@ -72,8 +71,11 @@ typedef struct _GSignondIdentityCbData G_DEFINE_TYPE (GSignondIdentity, gsignond_identity, G_TYPE_OBJECT); -static void _on_session_close (gpointer data, GObject *session); +static void _on_session_dead (gpointer data, GObject *session); static void _on_refresh_dialog (GSignondAuthSession *session, GSignondSignonuiData *ui_data, gpointer userdata); +static void _on_process_canceled (GSignondAuthSession *session, GSignondIdentityCbData *cb_data); +static void _on_user_action_required (GSignondAuthSession *session, GSignondSignonuiData *ui_data, gpointer userdata); +static void _on_store_token (GSignondAuthSession *session, GSignondDictionary *token_data, gpointer userdata); #define GSIGNOND_IDENTITY_PRIV(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), GSIGNOND_TYPE_IDENTITY, GSignondIdentityPrivate) @@ -163,7 +165,10 @@ _set_property (GObject *object, guint property_id, const GValue *value, static void _release_weak_ref_on_session (gpointer key, gpointer value, gpointer data) { - g_object_weak_unref (G_OBJECT (value), _on_session_close, data); + GObject *session = G_OBJECT (value); + g_signal_handlers_disconnect_by_func (session, G_CALLBACK (_on_user_action_required), data); + g_signal_handlers_disconnect_by_func (session, G_CALLBACK (_on_store_token), data); + g_object_weak_unref (session, _on_session_dead, data); } static void @@ -334,8 +339,10 @@ _on_refresh_dialog (GSignondAuthSession *session, GSignondSignonuiData *ui_data, { GSignondIdentityCbData *cb_data = (GSignondIdentityCbData *) userdata; - gsignond_daemon_refresh_dialog (GSIGNOND_DAEMON (cb_data->identity->priv->owner), - G_OBJECT (cb_data->session), ui_data, _on_dialog_refreshed, userdata); + if (!gsignond_daemon_refresh_dialog (GSIGNOND_DAEMON (cb_data->identity->priv->owner), + G_OBJECT (cb_data->session), ui_data, _on_dialog_refreshed, userdata)) { + WARN ("Dialog Refresh Failed"); + } } static void @@ -355,21 +362,31 @@ _on_user_action_completed (GSignondSignonuiData *reply, GError *error, gpointer GSignondIdentityPrivate *priv = GSIGNOND_IDENTITY_PRIV (cb_data->identity); GSignondSignonuiError ui_error = SIGNONUI_ERROR_NONE; + g_return_if_fail (cb_data && GSIGNOND_IS_AUTH_SESSION (cb_data->session)); + g_signal_handlers_disconnect_by_func(cb_data->session, _on_refresh_dialog, user_data); + g_signal_handlers_disconnect_by_func(cb_data->session, _on_process_canceled, user_data); if (error) { WARN ("UI-Error: %s on identity %d", error->message, gsignond_identity_info_get_id (priv->info)); + if (cb_data->session) { + GSignondSignonuiData *reply = gsignond_dictionary_new(); + gsignond_signonui_data_set_query_error (reply, SIGNONUI_ERROR_GENERAL); + gsignond_auth_session_user_action_finished (cb_data->session, reply); + gsignond_dictionary_unref(reply); + } g_error_free (error); g_slice_free (GSignondIdentityCbData, cb_data); return; } - if (!gsignond_signonui_data_get_query_error (reply, &ui_error)) + if (gsignond_signonui_data_get_query_error (reply, &ui_error) + && ui_error != SIGNONUI_ERROR_NONE) { WARN ("signonui error %d for identity %d", - ui_error, - gsignond_identity_info_get_id (priv->info)); + ui_error, gsignond_identity_info_get_id (priv->info)); + } if (!gsignond_identity_info_get_validated (priv->info) && ui_error == SIGNONUI_ERROR_NONE) { @@ -407,12 +424,27 @@ _on_user_action_completed (GSignondSignonuiData *reply, GError *error, gpointer if (cb_data->session) { gsignond_auth_session_user_action_finished (cb_data->session, reply); } - else if (reply) gsignond_signonui_data_unref (reply); g_slice_free (GSignondIdentityCbData, cb_data); } static void +_on_process_canceled (GSignondAuthSession *session, GSignondIdentityCbData *cb_data) +{ + g_signal_handlers_disconnect_by_func(session, G_CALLBACK(_on_process_canceled), cb_data); + + if (!cb_data) { + WARN ("assert (cb_data)"); + return; + } + if (!gsignond_daemon_cancel_dialog ( + cb_data->identity->priv->owner, G_OBJECT(session), NULL, NULL)) { + WARN ("Fail to cancel dialog"); + } + g_slice_free (GSignondIdentityCbData, cb_data); +} + +static void _on_user_action_required (GSignondAuthSession *session, GSignondSignonuiData *ui_data, gpointer userdata) { GSignondIdentity *identity = GSIGNOND_IDENTITY (userdata); @@ -422,7 +454,9 @@ _on_user_action_required (GSignondAuthSession *session, GSignondSignonuiData *ui cb_data->session = session; gsignond_daemon_show_dialog (GSIGNOND_DAEMON (identity->priv->owner), G_OBJECT(session), - ui_data, _on_user_action_completed, _on_refresh_requested_by_ui, userdata); + ui_data, _on_user_action_completed, _on_refresh_requested_by_ui, cb_data); + + g_signal_connect (session, "process-canceled", G_CALLBACK(_on_process_canceled), cb_data); } static void @@ -448,7 +482,7 @@ _compare_session_by_pointer (gpointer key, gpointer value, gpointer dead_object) } static void -_on_session_close (gpointer data, GObject *session) +_on_session_dead (gpointer data, GObject *session) { GSignondIdentity *identity = GSIGNOND_IDENTITY (data); @@ -524,6 +558,7 @@ gsignond_identity_get_auth_session (GSignondIdentity *identity, GSIGNOND_IDENTITY_INFO_NEW_IDENTITY) { token_data = gsignond_daemon_load_identity_data (identity->priv->owner, identity_id, method); } + if (!token_data) token_data = gsignond_dictionary_new(); session = gsignond_auth_session_new (identity->priv->info, method, token_data); @@ -539,7 +574,7 @@ gsignond_identity_get_auth_session (GSignondIdentity *identity, g_signal_connect (session, "process-store", G_CALLBACK (_on_store_token), identity); g_hash_table_insert (identity->priv->auth_sessions, g_strdup (method), session); - g_object_weak_ref (G_OBJECT (session), _on_session_close, identity); + g_object_weak_ref (G_OBJECT (session), _on_session_dead, identity); DBG ("session %p creation for method '%s' complete", session, method); @@ -547,52 +582,55 @@ gsignond_identity_get_auth_session (GSignondIdentity *identity, } static void -_on_query_dialog_done (GSignondSignonuiData *reply, GError *error, gpointer user_data) +_on_credentials_updated (GSignondSignonuiData *reply, GError *error, gpointer user_data) { GSignondIdentity *identity = GSIGNOND_IDENTITY (user_data); guint32 id = 0; GError *err = NULL; - GSignondSignonuiError err_id = 0; if (error) { - WARN ("failed to verfiy user : %s", error->message); + WARN ("failed to verify user : %s", error->message); g_error_free (error); - err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_IDENTITY_OPERATION_CANCELED, "Operation cancled"); + err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_IDENTITY_OPERATION_CANCELED, "Operation canceled"); } + else + { + GSignondSignonuiError err_id = SIGNONUI_ERROR_NONE; + gboolean res = gsignond_signonui_data_get_query_error (reply, &err_id); + + if (!res) { + DBG ("No error code set by UI daemon, treating as ERROR_NONE"); + } - gboolean res = gsignond_signonui_data_get_query_error (reply, &err_id); - g_assert (res == TRUE); - - if (err_id != SIGNONUI_ERROR_NONE) { - switch (err_id) { - case SIGNONUI_ERROR_CANCELED: - err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_IDENTITY_OPERATION_CANCELED, - "Operation cancled"); - break; - default: - err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_INTERNAL_SERVER, + if (err_id != SIGNONUI_ERROR_NONE) { + switch (err_id) { + case SIGNONUI_ERROR_CANCELED: + err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_IDENTITY_OPERATION_CANCELED, + "Operation canceled"); + break; + default: + err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_INTERNAL_SERVER, "signon ui returned with error : %d", err_id); - break; + break; + } } - } - else { - const gchar *secret = gsignond_signonui_data_get_password (reply); + else { + const gchar *secret = gsignond_signonui_data_get_password (reply); - if (!secret) { - err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_INTERNAL_SERVER, + if (!secret) { + err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_INTERNAL_SERVER, "Server internal error occured"); - } else if (identity->priv->info) { - gsignond_identity_info_set_secret (identity->priv->info, secret) ; + } else if (identity->priv->info) { + gsignond_identity_info_set_secret (identity->priv->info, secret) ; - /* Save new secret in db */ - id = gsignond_daemon_store_identity (identity->priv->owner, identity); - if (!id) err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_STORE_FAILED, "Failed to store secret"); + /* Save new secret in db */ + id = gsignond_daemon_store_identity (identity->priv->owner, identity); + if (!id) err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_STORE_FAILED, "Failed to store secret"); + } } } - gsignond_signonui_data_unref (reply); - g_signal_emit (identity, signals[SIG_CREDENTIALS_UPDATED], 0 , id, err); if (err) g_error_free (err); @@ -625,69 +663,70 @@ gsignond_identity_request_credentials_update (GSignondIdentity *identity, return FALSE; } - ui_data = gsignond_signonui_data_new (); + ui_data = gsignond_dictionary_new (); - gsignond_signonui_data_set_query_username (ui_data, TRUE); + gsignond_signonui_data_set_query_password (ui_data, TRUE); gsignond_signonui_data_set_username (ui_data, gsignond_identity_info_get_username (identity->priv->info)); gsignond_signonui_data_set_caption (ui_data, gsignond_identity_info_get_caption (identity->priv->info)); gsignond_signonui_data_set_message (ui_data, message); gsignond_daemon_show_dialog (GSIGNOND_DAEMON (identity->priv->owner), G_OBJECT(identity), - ui_data, _on_query_dialog_done, NULL, identity); + ui_data, _on_credentials_updated, NULL, identity); - gsignond_signonui_data_unref (ui_data); + gsignond_dictionary_unref (ui_data); return TRUE; } static void -_on_user_verfied (GSignondSignonuiData *reply, GError *error, gpointer user_data) +_on_user_verified (GSignondSignonuiData *reply, GError *error, gpointer user_data) { GSignondIdentity *identity = GSIGNOND_IDENTITY (user_data); gboolean res = FALSE; GError *err = NULL; - GSignondSignonuiError err_id = 0; if (error) { - WARN ("failed to verfiy user : %s", error->message); + WARN ("failed to verify user : %s", error->message); g_error_free (error); - err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_IDENTITY_OPERATION_CANCELED, "Operation cancled"); + err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_IDENTITY_OPERATION_CANCELED, "Operation canceled"); } - - gboolean query_res = gsignond_signonui_data_get_query_error (reply, &err_id); - g_assert (query_res == TRUE); - - if (err_id != SIGNONUI_ERROR_NONE) { - switch (err_id) { - case SIGNONUI_ERROR_CANCELED: - err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_IDENTITY_OPERATION_CANCELED, - "Operation cancled"); - break; - case SIGNONUI_ERROR_FORGOT_PASSWORD: - err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_FORGOT_PASSWORD, "Forgot password"); - break; - default: - err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_INTERNAL_SERVER, + else + { + GSignondSignonuiError err_id = SIGNONUI_ERROR_NONE; + gboolean res = gsignond_signonui_data_get_query_error (reply, &err_id); + if (!res) { + DBG ("No error code set by UI daemon, treating as ERROR_NONE"); + } + if (err_id != SIGNONUI_ERROR_NONE) { + switch (err_id) { + case SIGNONUI_ERROR_CANCELED: + err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_IDENTITY_OPERATION_CANCELED, + "Operation canceled"); + break; + case SIGNONUI_ERROR_FORGOT_PASSWORD: + err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_FORGOT_PASSWORD, "Forgot password"); + break; + default: + err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_INTERNAL_SERVER, "signon ui returned error : %d", err_id); - break; + break; + } } - } - else { - const gchar *secret = gsignond_signonui_data_get_password (reply); + else { + const gchar *secret = gsignond_signonui_data_get_password (reply); - if (!secret) { - err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_INTERNAL_SERVER, + if (!secret) { + err = gsignond_get_gerror_for_id (GSIGNOND_ERROR_INTERNAL_SERVER, "Server internal error occured"); - } else if (identity->priv->info) { - res = g_strcmp0 (secret, gsignond_identity_info_get_secret + } else if (identity->priv->info) { + res = g_strcmp0 (secret, gsignond_identity_info_get_secret (identity->priv->info)) == 0; + } } } - gsignond_signonui_data_unref (reply); - - g_signal_emit (identity, signals[SIG_USER_VERIFIED], 0, res, error); + g_signal_emit (identity, signals[SIG_USER_VERIFIED], 0, res, err); if (err) g_error_free (err); } @@ -722,15 +761,15 @@ gsignond_identity_verify_user (GSignondIdentity *identity, return FALSE; } - ui_data = gsignond_signonui_data_new_from_variant (params); + ui_data = gsignond_dictionary_new_from_variant (params); gsignond_signonui_data_set_query_password (ui_data, TRUE); gsignond_signonui_data_set_username (ui_data, gsignond_identity_info_get_username (identity->priv->info)); gsignond_signonui_data_set_caption (ui_data, gsignond_identity_info_get_caption (identity->priv->info)); - + gsignond_daemon_show_dialog (GSIGNOND_DAEMON (identity->priv->owner), G_OBJECT (identity), - ui_data, _on_user_verfied, NULL, identity); + ui_data, _on_user_verified, NULL, identity); - gsignond_signonui_data_unref (ui_data); + gsignond_dictionary_unref (ui_data); return TRUE; } diff --git a/src/daemon/gsignond-identity.h b/src/daemon/gsignond-identity.h index b356d83..11b7654 100644 --- a/src/daemon/gsignond-identity.h +++ b/src/daemon/gsignond-identity.h @@ -30,7 +30,7 @@ #include #include "gsignond-types.h" -#include +#include "common/gsignond-identity-info.h" #include G_BEGIN_DECLS @@ -48,8 +48,7 @@ typedef enum { GSIGNOND_IDENTITY_DATA_UPDATED = 0, GSIGNOND_IDENTITY_REMOVED, GSIGNOND_IDENTITY_SIGNED_OUT -} IdentityChangeType; -typedef IdentityChangeType GSignondIdentityChangeType; +} GSignondIdentityChangeType; struct _GSignondIdentity { diff --git a/src/daemon/gsignond-signonui-proxy.c b/src/daemon/gsignond-signonui-proxy.c index ec79fca..6002049 100644 --- a/src/daemon/gsignond-signonui-proxy.c +++ b/src/daemon/gsignond-signonui-proxy.c @@ -25,7 +25,6 @@ #include "gsignond-signonui-proxy.h" #include -#include #include "dbus/gsignond-dbus-signonui-adapter.h" static void _process_next_request (GSignondSignonuiProxy *proxy); @@ -53,6 +52,7 @@ typedef struct { struct _GSignondSignonuiProxyPrivate { GSignondDbusSignonuiAdapter *signonui; + guint signonui_timer_id; _UIQueryRequest *active_request; /* Active dialog */ GQueue *request_queue; /* request queue */ gboolean is_idle; @@ -71,7 +71,7 @@ _ui_query_request_new (GObject *caller, _UIQueryRequest *req = g_new0(_UIQueryRequest, 1); req->caller = caller; - req->ui_data = gsignond_signonui_data_ref (ui_data); + req->ui_data = gsignond_dictionary_ref (ui_data); req->cb = cb; req->refresh_cb = refresh_cb; req->userdata = userdata; @@ -105,7 +105,7 @@ static void _ui_query_request_free (_UIQueryRequest *req) { if (!req) return; - if (req->ui_data) gsignond_signonui_data_unref (req->ui_data); + if (req->ui_data) gsignond_dictionary_unref (req->ui_data); g_free (req); } @@ -114,6 +114,10 @@ _dispose (GObject *object) { GSignondSignonuiProxy *self = GSIGNOND_SIGNONUI_PROXY (object); + if (self->priv->signonui_timer_id) { + g_source_remove (self->priv->signonui_timer_id); + self->priv->signonui_timer_id = 0; + } if (self->priv->signonui) { g_object_unref (self->priv->signonui); self->priv->signonui = NULL; @@ -151,10 +155,7 @@ gsignond_signonui_proxy_init (GSignondSignonuiProxy *proxy) { proxy->priv = GSIGNOND_SIGNONUI_PROXY_GET_PRIV (proxy); - proxy->priv->signonui = gsignond_dbus_signonui_adapter_new (); - - if (proxy->priv->signonui) - g_signal_connect_swapped (proxy->priv->signonui, "refresh", G_CALLBACK(_on_refresh_request), proxy); + proxy->priv->signonui = NULL; proxy->priv->active_request = NULL; proxy->priv->request_queue = g_queue_new (); proxy->priv->is_idle = TRUE; @@ -174,43 +175,92 @@ _on_refresh_request (GSignondSignonuiProxy *proxy, gchar *request_id, gpointer u } static void -_query_dialog_cb (GVariant *reply, GError *error, gpointer user_data) +_query_dialog_cb_internal (GSignondSignonuiProxy *proxy, GSignondSignonuiData *ui_data, GError *error) { - GSignondSignonuiProxy *proxy = GSIGNOND_SIGNONUI_PROXY (user_data); - _UIQueryRequest *req = proxy->priv->active_request; - if (req && req->cb) - req->cb (gsignond_signonui_data_new_from_variant (reply), error, req->userdata); + proxy->priv->active_request = NULL; + if (req && req->cb && G_OBJECT(req->caller)) { + req->cb (ui_data, error, req->userdata); + } else if (error) { WARN ("UI-Error: %s", error->message); g_error_free (error); } - _ui_query_request_free (req); - - proxy->priv->active_request = NULL; + if (req) _ui_query_request_free (req); + if (ui_data) gsignond_dictionary_unref (ui_data); _process_next_request (proxy); } static void +_query_dialog_cb (GVariant *reply, GError *error, gpointer user_data) +{ + GSignondSignonuiProxy *proxy = GSIGNOND_SIGNONUI_PROXY (user_data); + GSignondSignonuiData *ui_data = reply ? gsignond_dictionary_new_from_variant (reply) : NULL; + + _query_dialog_cb_internal (proxy, ui_data, error); +} + +static gboolean +_close_ui_connection (gpointer data) +{ + GSignondSignonuiProxy *proxy = GSIGNOND_SIGNONUI_PROXY(data); + g_return_val_if_fail (proxy, FALSE); + + proxy->priv->signonui_timer_id = 0; + + g_clear_object (&proxy->priv->signonui); + + return FALSE; +} + +static void _process_next_request (GSignondSignonuiProxy *proxy) { _UIQueryRequest *req = g_queue_pop_head (proxy->priv->request_queue); + GVariant *params = NULL; if (!req) { proxy->priv->is_idle = TRUE; proxy->priv->active_request = NULL; + proxy->priv->signonui_timer_id = + g_timeout_add_seconds (10, (GSourceFunc)_close_ui_connection, proxy); return; } + else { + proxy->priv->active_request = req; + + if (proxy->priv->signonui_timer_id) { + g_source_remove (proxy->priv->signonui_timer_id); + proxy->priv->signonui_timer_id = 0; + } + if (!proxy->priv->signonui) + proxy->priv->signonui = gsignond_dbus_signonui_adapter_new (); + if (proxy->priv->signonui) + g_signal_connect_swapped (proxy->priv->signonui, "refresh", + G_CALLBACK(_on_refresh_request), proxy); + else { + GSignondSignonuiData *reply = gsignond_dictionary_new (); + gsignond_signonui_data_set_query_error(reply, SIGNONUI_ERROR_NO_SIGNONUI); + _query_dialog_cb_internal (proxy, reply, NULL); + return; + } + } - proxy->priv->active_request = req; /* update request id */ gsignond_signonui_data_set_request_id (req->ui_data, G_OBJECT_TYPE_NAME(req->caller)); - gsignond_dbus_signonui_adapter_query_dialog (proxy->priv->signonui, - gsignond_signonui_data_to_variant(req->ui_data), _query_dialog_cb, proxy); + params = gsignond_dictionary_to_variant(req->ui_data) ; + if (!gsignond_dbus_signonui_adapter_query_dialog (proxy->priv->signonui, + params, _query_dialog_cb, proxy)) { + GSignondSignonuiData *reply = gsignond_dictionary_new (); + gsignond_signonui_data_set_query_error(reply, SIGNONUI_ERROR_GENERAL); + _query_dialog_cb_internal (proxy, reply, NULL); + g_variant_unref (params); + return; + } proxy->priv->is_idle = FALSE; } @@ -257,13 +307,15 @@ gsignond_signonui_proxy_refresh_dialog (GSignondSignonuiProxy *proxy, if (proxy->priv->active_request && proxy->priv->active_request->caller == caller) { _UIRefreshRequest *req = _ui_refresh_request_new (cb, userdata); + GVariant *var_uidata = gsignond_dictionary_to_variant (ui_data); - /* FIXME: Is it required to set refresh id for refresh data */ gsignond_signonui_data_set_request_id (ui_data, G_OBJECT_TYPE_NAME(caller)); - gsignond_dbus_signonui_adapter_refresh_dialog (proxy->priv->signonui, - gsignond_signonui_data_to_variant (ui_data), _refresh_dialog_cb, req); - - return TRUE; + if (gsignond_dbus_signonui_adapter_refresh_dialog (proxy->priv->signonui, + var_uidata, _refresh_dialog_cb, req)) { + return TRUE; + } + g_variant_unref (var_uidata); + g_free (req); } return FALSE; @@ -306,23 +358,32 @@ gsignond_signonui_proxy_cancel_request (GSignondSignonuiProxy *proxy, /* cancel active request */ if (proxy->priv->active_request->caller == caller) { _UICancelRequest *req = _ui_cancel_request_new (cb, userdata); - gsignond_dbus_signonui_adapter_cancel_request (proxy->priv->signonui, - G_OBJECT_TYPE_NAME (caller), _cancel_request_cb, req); + if (!gsignond_dbus_signonui_adapter_cancel_request (proxy->priv->signonui, + G_OBJECT_TYPE_NAME (caller), _cancel_request_cb, req)) { + g_free (req); + return FALSE; + } + _ui_query_request_free (proxy->priv->active_request); + proxy->priv->active_request = NULL; return TRUE; } /* cancel pending request */ element = g_queue_find_custom (proxy->priv->request_queue, caller, _find_request_by_caller); - if (!element) return FALSE; + req = element->data; - if (req->cb) { - gsignond_signonui_data_ref (req->ui_data); - gsignond_signonui_data_set_query_error(req->ui_data, SIGNONUI_ERROR_CANCELED); + g_queue_delete_link (proxy->priv->request_queue, element); - req->cb (req->ui_data, NULL, req->userdata); + if (req && req->cb) { + GSignondSignonuiData *reply = gsignond_dictionary_new (); + gsignond_signonui_data_set_query_error(reply, SIGNONUI_ERROR_CANCELED); + + req->cb (reply, NULL, req->userdata); + gsignond_dictionary_unref (reply); } + _ui_query_request_free (req); if (cb) cb(NULL, userdata); diff --git a/src/daemon/main.c b/src/daemon/main.c index 065ac7f..64a871a 100644 --- a/src/daemon/main.c +++ b/src/daemon/main.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -111,16 +112,23 @@ int main (int argc, char **argv) GOptionEntry opt_entries[] = { {NULL } }; + gid_t daemon_gid; + struct group *daemon_group; - DBG ("before: real uid %d effective uid %d", getuid (), geteuid ()); - if (setreuid (-1, getuid())) - WARN ("setreuid() failed"); - DBG ("after: real uid %d effective uid %d", getuid (), geteuid ()); DBG ("before: real gid %d effective gid %d", getgid (), getegid ()); - if (setregid (-1, getgid())) - WARN ("setregid() failed"); + daemon_gid = getgid (); + daemon_group = getgrnam ("gsignond"); + if (daemon_group) + daemon_gid = daemon_group->gr_gid; + if (setegid (daemon_gid)) + WARN ("setegid() failed"); DBG ("after: real gid %d effective gid %d", getgid (), getegid ()); + DBG ("before: real uid %d effective uid %d", getuid (), geteuid ()); + if (seteuid (getuid ())) + WARN ("seteuid() failed"); + DBG ("after: real uid %d effective uid %d", getuid (), geteuid ()); + #if !GLIB_CHECK_VERSION (2, 36, 0) g_type_init (); #endif diff --git a/src/daemon/plugins/Makefile.am b/src/daemon/plugins/Makefile.am index 1892a6a..796bea6 100644 --- a/src/daemon/plugins/Makefile.am +++ b/src/daemon/plugins/Makefile.am @@ -1,6 +1,6 @@ SUBDIRS = plugind -lib_LTLIBRARIES = libgsignond-plugins.la +noinst_LTLIBRARIES = libgsignond-plugins.la libgsignond_plugins_la_CPPFLAGS = \ -I$(top_builddir) \ diff --git a/src/daemon/plugins/Makefile.in b/src/daemon/plugins/Makefile.in index 9ecd358..1780ba2 100644 --- a/src/daemon/plugins/Makefile.in +++ b/src/daemon/plugins/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -16,6 +16,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -38,44 +55,17 @@ subdir = src/daemon/plugins DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = -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 = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(libdir)" -LTLIBRARIES = $(lib_LTLIBRARIES) +LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = libgsignond_plugins_la_DEPENDENCIES = \ $(top_builddir)/src/common/libgsignond-common.la \ @@ -124,6 +114,11 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ @@ -297,7 +292,7 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = plugind -lib_LTLIBRARIES = libgsignond-plugins.la +noinst_LTLIBRARIES = libgsignond-plugins.la libgsignond_plugins_la_CPPFLAGS = \ -I$(top_builddir) \ -I$(top_srcdir)/src \ @@ -354,39 +349,17 @@ $(top_srcdir)/configure: $(am__configure_deps) $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ - } - -uninstall-libLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ - done -clean-libLTLIBRARIES: - -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgsignond-plugins.la: $(libgsignond_plugins_la_OBJECTS) $(libgsignond_plugins_la_DEPENDENCIES) $(EXTRA_libgsignond_plugins_la_DEPENDENCIES) - $(AM_V_CCLD)$(LINK) -rpath $(libdir) $(libgsignond_plugins_la_OBJECTS) $(libgsignond_plugins_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libgsignond_plugins_la_OBJECTS) $(libgsignond_plugins_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -616,13 +589,10 @@ distdir: $(DISTFILES) done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ @@ -647,9 +617,6 @@ check: check-recursive all-am: Makefile $(LTLIBRARIES) installdirs: installdirs-recursive installdirs-am: - for dir in "$(DESTDIR)$(libdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive @@ -683,7 +650,7 @@ maintainer-clean-generic: @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive -clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-recursive @@ -710,7 +677,7 @@ install-dvi: install-dvi-recursive install-dvi-am: -install-exec-am: install-libLTLIBRARIES +install-exec-am: install-html: install-html-recursive @@ -750,26 +717,25 @@ ps: ps-recursive ps-am: -uninstall-am: uninstall-libLTLIBRARIES +uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am check check-am clean clean-generic \ - clean-libLTLIBRARIES clean-libtool ctags ctags-recursive \ - distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-libLTLIBRARIES install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs installdirs-am \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ - uninstall-libLTLIBRARIES + all all-am check check-am clean clean-generic clean-libtool \ + clean-noinstLTLIBRARIES ctags ctags-recursive distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/src/daemon/plugins/gsignond-plugin-proxy.c b/src/daemon/plugins/gsignond-plugin-proxy.c index cfb3638..7e2e225 100644 --- a/src/daemon/plugins/gsignond-plugin-proxy.c +++ b/src/daemon/plugins/gsignond-plugin-proxy.c @@ -61,6 +61,7 @@ struct _GSignondPluginProxyPrivate typedef struct { GSignondAuthSession* auth_session; GSignondSessionData* session_data; + GSignondDictionary* identity_method_cache; gchar* mechanism; gpointer userdata; } GSignondProcessData; @@ -73,12 +74,15 @@ static GSignondProcessData* gsignond_process_data_new ( GSignondAuthSession* auth_session, GSignondSessionData *session_data, + GSignondDictionary *identity_method_cache, const gchar* mechanism, gpointer userdata) { GSignondProcessData* data = g_slice_new0 (GSignondProcessData); data->auth_session = g_object_ref (auth_session); data->session_data = gsignond_dictionary_copy (session_data); + if (identity_method_cache) + data->identity_method_cache = gsignond_dictionary_copy (identity_method_cache); data->mechanism = g_strdup (mechanism); data->userdata = userdata; return data; @@ -90,6 +94,8 @@ gsignond_process_data_free ( { g_object_unref (data->auth_session); gsignond_dictionary_unref (data->session_data); + if (data->identity_method_cache) + gsignond_dictionary_unref (data->identity_method_cache); g_free (data->mechanism); g_slice_free (GSignondProcessData, data); } @@ -113,6 +119,7 @@ gsignond_plugin_proxy_process_queue ( priv->active_process_userdata); gsignond_plugin_request_initial (priv->plugin, next_data->session_data, + next_data->identity_method_cache, next_data->mechanism); gsignond_process_data_free (next_data); } @@ -255,6 +262,18 @@ gsignond_plugin_proxy_status_changed_callback ( priv->active_process_userdata); } +static void +_on_remote_plugin_dead (gpointer data, GObject *dead_obj) +{ +DBG("{"); + GSignondPluginProxy *proxy = NULL; + if (data && (proxy = GSIGNOND_PLUGIN_PROXY(data))) { + proxy->priv->plugin = NULL; + g_object_unref (G_OBJECT(data)); + } +DBG("}"); +} + static GObject * gsignond_plugin_proxy_constructor ( GType gtype, @@ -302,6 +321,8 @@ gsignond_plugin_proxy_constructor ( } g_free (type); + g_object_weak_ref (G_OBJECT(priv->plugin), _on_remote_plugin_dead, obj); + } return obj; } @@ -372,6 +393,7 @@ gsignond_plugin_proxy_dispose ( priv->active_session = NULL; } if (priv->plugin) { + g_object_weak_unref (G_OBJECT(priv->plugin), _on_remote_plugin_dead, self); g_object_unref (priv->plugin); priv->plugin = NULL; } @@ -500,6 +522,7 @@ gsignond_plugin_proxy_process ( GSignondPluginProxy *self, GSignondAuthSession *session, GSignondSessionData *session_data, + GSignondDictionary *identity_method_cache, const gchar *mechanism, gpointer userdata) { @@ -510,14 +533,15 @@ gsignond_plugin_proxy_process ( if (session == priv->active_session && priv->expecting_request == TRUE) { priv->expecting_request = FALSE; - // mechanism is discarded if this is not an initial request + // mechanism and identity_method_cache are discarded if this is not an initial request gsignond_plugin_request (priv->plugin, session_data); return; } g_queue_push_tail (priv->session_queue, gsignond_process_data_new (session, - session_data, + session_data, + identity_method_cache, mechanism, userdata)); gsignond_auth_session_notify_state_changed ( session, GSIGNOND_PLUGIN_STATE_PROCESS_PENDING, diff --git a/src/daemon/plugins/gsignond-plugin-proxy.h b/src/daemon/plugins/gsignond-plugin-proxy.h index 089e125..d5b5bc1 100644 --- a/src/daemon/plugins/gsignond-plugin-proxy.h +++ b/src/daemon/plugins/gsignond-plugin-proxy.h @@ -83,6 +83,7 @@ gsignond_plugin_proxy_process ( GSignondPluginProxy *self, GSignondAuthSession* session, GSignondSessionData *session_data, + GSignondDictionary *identity_method_cache, const gchar *mechanism, gpointer userdata); void diff --git a/src/daemon/plugins/gsignond-plugin-remote.c b/src/daemon/plugins/gsignond-plugin-remote.c index 6953057..7d6291a 100644 --- a/src/daemon/plugins/gsignond-plugin-remote.c +++ b/src/daemon/plugins/gsignond-plugin-remote.c @@ -444,6 +444,7 @@ static void gsignond_plugin_remote_request_initial ( GSignondPlugin *plugin, GSignondSessionData *session_data, + GSignondDictionary *identity_method_cache, const gchar *mechanism) { g_return_if_fail (session_data && plugin && @@ -451,8 +452,16 @@ gsignond_plugin_remote_request_initial ( GSignondPluginRemote *self = GSIGNOND_PLUGIN_REMOTE (plugin); GVariant *data = gsignond_dictionary_to_variant (session_data); + GVariant *cache; + if (identity_method_cache) + cache = gsignond_dictionary_to_variant (identity_method_cache); + else { + GSignondDictionary* empty_cache = gsignond_dictionary_new(); + cache = gsignond_dictionary_to_variant (empty_cache); + gsignond_dictionary_unref(empty_cache); + } gsignond_dbus_remote_plugin_call_request_initial ( - self->priv->dbus_plugin_proxy, data, mechanism, NULL, + self->priv->dbus_plugin_proxy, data, cache, mechanism, NULL, _request_initial_async_cb, self); } @@ -514,7 +523,7 @@ gsignond_plugin_remote_user_action_finished ( GSIGNOND_IS_PLUGIN_REMOTE (plugin)); GSignondPluginRemote *self = GSIGNOND_PLUGIN_REMOTE (plugin); - GVariant *data = gsignond_signonui_data_to_variant (signonui_data); + GVariant *data = gsignond_dictionary_to_variant (signonui_data); gsignond_dbus_remote_plugin_call_user_action_finished ( self->priv->dbus_plugin_proxy, data, NULL, _user_action_finished_async_cb, self); @@ -546,7 +555,7 @@ gsignond_plugin_remote_refresh ( GSIGNOND_IS_PLUGIN_REMOTE (plugin)); GSignondPluginRemote *self = GSIGNOND_PLUGIN_REMOTE (plugin); - GVariant *data = gsignond_signonui_data_to_variant (signonui_data); + GVariant *data = gsignond_dictionary_to_variant (signonui_data); gsignond_dbus_remote_plugin_call_refresh ( self->priv->dbus_plugin_proxy, data, NULL, _refresh_async_cb, self); } @@ -624,9 +633,9 @@ _user_action_required_cb ( g_return_if_fail (self && GSIGNOND_IS_PLUGIN_REMOTE (self)); GSignondSignonuiData *data = (GSignondSignonuiData *) - gsignond_signonui_data_new_from_variant (ui_data); + gsignond_dictionary_new_from_variant (ui_data); gsignond_plugin_user_action_required (GSIGNOND_PLUGIN(self), data); - gsignond_signonui_data_unref (data); + gsignond_dictionary_unref (data); } static void @@ -638,9 +647,9 @@ _refreshed_cb( g_return_if_fail (self && GSIGNOND_IS_PLUGIN_REMOTE (self)); GSignondSignonuiData *data = (GSignondSignonuiData *) - gsignond_signonui_data_new_from_variant (ui_data); + gsignond_dictionary_new_from_variant (ui_data); gsignond_plugin_refreshed (GSIGNOND_PLUGIN(self), data); - gsignond_signonui_data_unref (data); + gsignond_dictionary_unref (data); } static void diff --git a/src/daemon/plugins/plugind/Makefile.am b/src/daemon/plugins/plugind/Makefile.am index c48eb15..0ee89ff 100644 --- a/src/daemon/plugins/plugind/Makefile.am +++ b/src/daemon/plugins/plugind/Makefile.am @@ -1,7 +1,7 @@ SUBDIRS= NULL= -lib_LTLIBRARIES = libgsignond-plugind-daemon.la +noinst_LTLIBRARIES = libgsignond-plugind-daemon.la libgsignond_plugind_daemon_la_CPPFLAGS = \ -I$(top_builddir) \ diff --git a/src/daemon/plugins/plugind/Makefile.in b/src/daemon/plugins/plugind/Makefile.in index 53bd9fe..97fb425 100644 --- a/src/daemon/plugins/plugind/Makefile.in +++ b/src/daemon/plugins/plugind/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -17,6 +17,23 @@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -40,44 +57,17 @@ subdir = src/daemon/plugins/plugind DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = -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 = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" -LTLIBRARIES = $(lib_LTLIBRARIES) +LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = libgsignond_plugind_daemon_la_DEPENDENCIES = \ $(top_builddir)/src/common/libgsignond-common.la \ @@ -90,6 +80,7 @@ libgsignond_plugind_daemon_la_OBJECTS = \ AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent +am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__objects_1 = am_gsignond_plugind_OBJECTS = gsignond_plugind-main.$(OBJEXT) \ @@ -138,6 +129,11 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ @@ -312,7 +308,7 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = NULL = -lib_LTLIBRARIES = libgsignond-plugind-daemon.la +noinst_LTLIBRARIES = libgsignond-plugind-daemon.la libgsignond_plugind_daemon_la_CPPFLAGS = \ -I$(top_builddir) \ -I$(top_srcdir)/src \ @@ -379,43 +375,24 @@ $(top_srcdir)/configure: $(am__configure_deps) $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ - } -uninstall-libLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ - done - -clean-libLTLIBRARIES: - -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgsignond-plugind-daemon.la: $(libgsignond_plugind_daemon_la_OBJECTS) $(libgsignond_plugind_daemon_la_DEPENDENCIES) $(EXTRA_libgsignond_plugind_daemon_la_DEPENDENCIES) - $(AM_V_CCLD)$(LINK) -rpath $(libdir) $(libgsignond_plugind_daemon_la_OBJECTS) $(libgsignond_plugind_daemon_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libgsignond_plugind_daemon_la_OBJECTS) $(libgsignond_plugind_daemon_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ @@ -686,13 +663,10 @@ distdir: $(DISTFILES) done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ @@ -715,11 +689,9 @@ distdir: $(DISTFILES) check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) all-local -install-binPROGRAMS: install-libLTLIBRARIES - installdirs: installdirs-recursive installdirs-am: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)"; do \ + for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive @@ -754,8 +726,8 @@ maintainer-clean-generic: @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive -clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ - clean-libtool mostlyclean-am +clean-am: clean-binPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) @@ -781,7 +753,7 @@ install-dvi: install-dvi-recursive install-dvi-am: -install-exec-am: install-binPROGRAMS install-libLTLIBRARIES +install-exec-am: install-binPROGRAMS install-html: install-html-recursive @@ -821,27 +793,26 @@ ps: ps-recursive ps-am: -uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES +uninstall-am: uninstall-binPROGRAMS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am all-local check check-am clean clean-binPROGRAMS \ - clean-generic clean-libLTLIBRARIES clean-libtool ctags \ + clean-generic clean-libtool clean-noinstLTLIBRARIES ctags \ ctags-recursive distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-libLTLIBRARIES \ - install-man install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags tags-recursive uninstall uninstall-am \ - uninstall-binPROGRAMS uninstall-libLTLIBRARIES + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ + uninstall-binPROGRAMS all-local: slink diff --git a/src/daemon/plugins/plugind/gsignond-plugin-daemon.c b/src/daemon/plugins/plugind/gsignond-plugin-daemon.c index 641eeca..11e6fc7 100644 --- a/src/daemon/plugins/plugind/gsignond-plugin-daemon.c +++ b/src/daemon/plugins/plugind/gsignond-plugin-daemon.c @@ -175,6 +175,7 @@ _handle_request_initial_from_dbus ( GSignondPluginDaemon *self, GDBusMethodInvocation *invocation, const GVariant *session_data, + const GVariant *identity_method_cache, const gchar *mechanism, gpointer user_data) { @@ -186,8 +187,11 @@ _handle_request_initial_from_dbus ( GSignondSessionData *data = (GSignondSessionData *) gsignond_dictionary_new_from_variant ((GVariant *)session_data); - gsignond_plugin_request_initial (self->priv->plugin, data, mechanism); + GSignondSessionData *cache = + gsignond_dictionary_new_from_variant ((GVariant *)identity_method_cache); + gsignond_plugin_request_initial (self->priv->plugin, data, cache, mechanism); gsignond_dictionary_unref (data); + gsignond_dictionary_unref (cache); return TRUE; } @@ -206,9 +210,9 @@ _handle_user_action_finished_from_dbus ( self->priv->dbus_remote_plugin, invocation); GSignondSignonuiData *data = (GSignondSignonuiData *) - gsignond_signonui_data_new_from_variant ((GVariant *)ui_data); + gsignond_dictionary_new_from_variant ((GVariant *)ui_data); gsignond_plugin_user_action_finished (self->priv->plugin, data); - gsignond_signonui_data_unref (data); + gsignond_dictionary_unref (data); return TRUE; } @@ -226,9 +230,9 @@ _handle_refresh_from_dbus ( self->priv->dbus_remote_plugin, invocation); GSignondSignonuiData *data = (GSignondSignonuiData *) - gsignond_signonui_data_new_from_variant ((GVariant *)ui_data); + gsignond_dictionary_new_from_variant ((GVariant *)ui_data); gsignond_plugin_refresh (self->priv->plugin, data); - gsignond_signonui_data_unref (data); + gsignond_dictionary_unref (data); return TRUE; } @@ -321,7 +325,7 @@ _handle_user_action_required_from_plugin ( DBG (""); g_return_if_fail (self && GSIGNOND_IS_PLUGIN_DAEMON (self)); - GVariant *data = gsignond_signonui_data_to_variant (ui_data); + GVariant *data = gsignond_dictionary_to_variant (ui_data); gsignond_dbus_remote_plugin_emit_user_action_required ( self->priv->dbus_remote_plugin, data); } @@ -335,7 +339,7 @@ _handle_refreshed_from_plugin( DBG (""); g_return_if_fail (self && GSIGNOND_IS_PLUGIN_DAEMON (self)); - GVariant *data = gsignond_signonui_data_to_variant (ui_data); + GVariant *data = gsignond_dictionary_to_variant (ui_data); gsignond_dbus_remote_plugin_emit_refreshed (self->priv->dbus_remote_plugin, data); } diff --git a/src/extensions/Makefile.in b/src/extensions/Makefile.in index b776865..30929b4 100644 --- a/src/extensions/Makefile.in +++ b/src/extensions/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -15,6 +15,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -38,9 +55,10 @@ subdir = src/extensions DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -62,6 +80,11 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ @@ -442,13 +465,10 @@ distdir: $(DISTFILES) done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ diff --git a/src/extensions/test/Makefile.am b/src/extensions/test/Makefile.am index 16ac00d..99612aa 100644 --- a/src/extensions/test/Makefile.am +++ b/src/extensions/test/Makefile.am @@ -6,8 +6,10 @@ libextension_test_la_CPPFLAGS = \ -I$(top_srcdir)/include \ $(GSIGNOND_CFLAGS) -libextension_test_la_LIBS = \ - $(GSIGNOND_LIBS) +libextension_test_la_LIBADD = \ + $(top_builddir)/src/common/libgsignond-common.la \ + $(GSIGNOND_LIBS) \ + $(NULL) libextension_test_la_SOURCES = \ test-access-control-manager.h \ diff --git a/src/extensions/test/Makefile.in b/src/extensions/test/Makefile.in index 381134f..b8e93c5 100644 --- a/src/extensions/test/Makefile.in +++ b/src/extensions/test/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -16,6 +16,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -39,9 +56,10 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ subdir = src/extensions/test ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -77,7 +95,10 @@ am__uninstall_files_from_dir = { \ } am__installdirs = "$(DESTDIR)$(extensionsdir)" LTLIBRARIES = $(extensions_LTLIBRARIES) -libextension_test_la_LIBADD = +am__DEPENDENCIES_1 = +libextension_test_la_DEPENDENCIES = \ + $(top_builddir)/src/common/libgsignond-common.la \ + $(am__DEPENDENCIES_1) am_libextension_test_la_OBJECTS = \ libextension_test_la-test-access-control-manager.lo \ libextension_test_la-test-extension.lo \ @@ -115,6 +136,11 @@ am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libextension_test_la_SOURCES) DIST_SOURCES = $(libextension_test_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -264,8 +290,10 @@ libextension_test_la_CPPFLAGS = \ -I$(top_srcdir)/include \ $(GSIGNOND_CFLAGS) -libextension_test_la_LIBS = \ - $(GSIGNOND_LIBS) +libextension_test_la_LIBADD = \ + $(top_builddir)/src/common/libgsignond-common.la \ + $(GSIGNOND_LIBS) \ + $(NULL) libextension_test_la_SOURCES = \ test-access-control-manager.h \ @@ -314,7 +342,6 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): install-extensionsLTLIBRARIES: $(extensions_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(extensionsdir)" || $(MKDIR_P) "$(DESTDIR)$(extensionsdir)" @list='$(extensions_LTLIBRARIES)'; test -n "$(extensionsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ @@ -322,6 +349,8 @@ install-extensionsLTLIBRARIES: $(extensions_LTLIBRARIES) else :; fi; \ done; \ test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(extensionsdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(extensionsdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(extensionsdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(extensionsdir)"; \ } diff --git a/src/extensions/tizen/Makefile.am b/src/extensions/tizen/Makefile.am index bab7a13..b7301bf 100644 --- a/src/extensions/tizen/Makefile.am +++ b/src/extensions/tizen/Makefile.am @@ -9,6 +9,7 @@ libextension_tizen_la_CPPFLAGS = \ $(LIBECRYPTFS_CFLAGS) libextension_tizen_la_LIBADD = \ + $(top_builddir)/src/common/libgsignond-common.la \ $(GSIGNOND_LIBS) \ $(LIBSMACK_LIBS) \ $(LIBECRYPTFS_LIBS) diff --git a/src/extensions/tizen/Makefile.in b/src/extensions/tizen/Makefile.in index 82335fe..147fd88 100644 --- a/src/extensions/tizen/Makefile.in +++ b/src/extensions/tizen/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -16,6 +16,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -39,9 +56,10 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ subdir = src/extensions/tizen ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -78,8 +96,10 @@ am__uninstall_files_from_dir = { \ am__installdirs = "$(DESTDIR)$(extensionsdir)" LTLIBRARIES = $(extensions_LTLIBRARIES) am__DEPENDENCIES_1 = -libextension_tizen_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +libextension_tizen_la_DEPENDENCIES = \ + $(top_builddir)/src/common/libgsignond-common.la \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) am_libextension_tizen_la_OBJECTS = \ libextension_tizen_la-tizen-access-control-manager.lo \ libextension_tizen_la-tizen-extension.lo \ @@ -117,6 +137,11 @@ am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libextension_tizen_la_SOURCES) DIST_SOURCES = $(libextension_tizen_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -269,6 +294,7 @@ libextension_tizen_la_CPPFLAGS = \ $(LIBECRYPTFS_CFLAGS) libextension_tizen_la_LIBADD = \ + $(top_builddir)/src/common/libgsignond-common.la \ $(GSIGNOND_LIBS) \ $(LIBSMACK_LIBS) \ $(LIBECRYPTFS_LIBS) @@ -320,7 +346,6 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): install-extensionsLTLIBRARIES: $(extensions_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(extensionsdir)" || $(MKDIR_P) "$(DESTDIR)$(extensionsdir)" @list='$(extensions_LTLIBRARIES)'; test -n "$(extensionsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ @@ -328,6 +353,8 @@ install-extensionsLTLIBRARIES: $(extensions_LTLIBRARIES) else :; fi; \ done; \ test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(extensionsdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(extensionsdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(extensionsdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(extensionsdir)"; \ } diff --git a/src/extensions/tizen/tizen-storage-manager.c b/src/extensions/tizen/tizen-storage-manager.c index 2ee01d4..d098e9e 100644 --- a/src/extensions/tizen/tizen-storage-manager.c +++ b/src/extensions/tizen/tizen-storage-manager.c @@ -77,12 +77,19 @@ _set_config (ExtensionTizenStorageManager *self, GSignondConfig *config) g_assert (self->priv->cdir == NULL); parent->config = config; - parent->location = g_strdup (gsignond_config_get_string (config, - GSIGNOND_CONFIG_GENERAL_SECURE_DIR)); - if (!parent->location) - parent->location = g_build_filename (g_get_user_data_dir (), - "gsignond", NULL); - + gchar *user_dir = g_strdup_printf ("gsignond.%s", g_get_user_name ()); + const gchar *storage_path = gsignond_config_get_string ( + config, + GSIGNOND_CONFIG_GENERAL_STORAGE_PATH); + if (storage_path) + parent->location = g_build_filename (storage_path, + user_dir, + NULL); + else + parent->location = g_build_filename ("/var/db", + user_dir, + NULL); + g_free (user_dir); self->priv->cdir = g_strdup_printf ("%s.efs", parent->location); DBG ("location %s encryption point %s", parent->location, self->priv->cdir); } @@ -165,16 +172,41 @@ _initialize_storage (GSignondStorageManager *parent) ExtensionTizenStorageManagerPrivate *priv = self->priv; g_return_val_if_fail (parent->location, FALSE); + g_return_val_if_fail (priv->cdir, FALSE); + + if (g_access (parent->location, R_OK) == 0 && + g_access (priv->cdir, R_OK) == 0) + return TRUE; + + gboolean res = FALSE; + + uid_t uid = getuid (); + if (seteuid (0)) + WARN ("seteuid() failed"); + DBG ("create mount point %s", parent->location); - if (g_mkdir_with_parents (parent->location, S_IRWXU)) - return FALSE; + if (g_mkdir_with_parents (parent->location, S_IRWXU | S_IRWXG)) + goto init_exit; - g_return_val_if_fail (priv->cdir, FALSE); DBG ("create storage point %s", priv->cdir); - if (g_mkdir_with_parents (priv->cdir, S_IRWXU)) - return FALSE; - - return TRUE; + if (g_mkdir_with_parents (priv->cdir, S_IRWXU | S_IRWXG)) + goto init_exit; + + if (chown (parent->location, 0, getegid ())) + WARN ("chown() failed"); + if (chmod (parent->location, S_IRWXU | S_IRWXG)) + WARN ("chmod() failed"); + if (chown (priv->cdir, 0, getegid ())) + WARN ("chown() failed"); + if (chmod (priv->cdir, S_IRWXU | S_IRWXG)) + WARN ("chmod() failed"); + res = TRUE; + +init_exit: + if (seteuid (uid)) + WARN ("seteuid() failed"); + + return res; } static gboolean @@ -216,11 +248,8 @@ _mount_filesystem (GSignondStorageManager *parent) priv->ksig); DBG ("mount options: %s", mntopts); uid_t uid = getuid (); - gid_t gid = getgid (); - if (setreuid (-1, 0)) - WARN ("setreuid() failed"); - if (setregid (-1, 0)) - WARN ("setregid() failed"); + if (seteuid (0)) + WARN ("seteuid() failed"); DBG ("perform mount %s -> %s", priv->cdir, parent->location); if (mount (priv->cdir, parent->location, "ecryptfs", MS_NOSUID | MS_NODEV, mntopts)) { @@ -233,10 +262,8 @@ _mount_filesystem (GSignondStorageManager *parent) _mount_exit: g_free (mntopts); - if (setreuid (-1, uid)) - WARN ("setreuid() failed"); - if (setregid (-1, gid)) - WARN ("setregid() failed"); + if (seteuid (uid)) + WARN ("seteuid() failed"); return retval; } @@ -247,12 +274,11 @@ _unmount_filesystem (GSignondStorageManager *parent) g_return_val_if_fail (parent != NULL, FALSE); uid_t uid = getuid (); - gid_t gid = getgid (); - setreuid (-1, 0); - setregid (-1, 0); + if (seteuid (0)) + WARN ("seteuid() failed"); umount (parent->location); - setreuid (-1, uid); - setregid (-1, gid); + if (seteuid (uid)) + WARN ("seteuid() failed"); return TRUE; } diff --git a/src/plugins/Makefile.in b/src/plugins/Makefile.in index 4a1e118..375f050 100644 --- a/src/plugins/Makefile.in +++ b/src/plugins/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -15,6 +15,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -37,9 +54,10 @@ subdir = src/plugins DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -61,6 +79,11 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ @@ -441,13 +464,10 @@ distdir: $(DISTFILES) done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ diff --git a/src/plugins/digest/Makefile.in b/src/plugins/digest/Makefile.in index e29047d..65ce0b7 100644 --- a/src/plugins/digest/Makefile.in +++ b/src/plugins/digest/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -16,6 +16,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -39,9 +56,10 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ subdir = src/plugins/digest ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -116,6 +134,11 @@ am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libdigest_la_SOURCES) DIST_SOURCES = $(libdigest_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -315,7 +338,6 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): install-pluginsLTLIBRARIES: $(plugins_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(pluginsdir)" || $(MKDIR_P) "$(DESTDIR)$(pluginsdir)" @list='$(plugins_LTLIBRARIES)'; test -n "$(pluginsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ @@ -323,6 +345,8 @@ install-pluginsLTLIBRARIES: $(plugins_LTLIBRARIES) else :; fi; \ done; \ test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(pluginsdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pluginsdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pluginsdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pluginsdir)"; \ } diff --git a/src/plugins/digest/gsignond-digest-plugin.c b/src/plugins/digest/gsignond-digest-plugin.c index cd091ea..325f93b 100644 --- a/src/plugins/digest/gsignond-digest-plugin.c +++ b/src/plugins/digest/gsignond-digest-plugin.c @@ -30,6 +30,47 @@ #include "gsignond-digest-plugin.h" #include #include +#include + +/** + * SECTION:gsignond-digest-plugin + * @short_description: a plugin that performs HTTP Digest authentication + * @include: gsignond/gsignond-digest-plugin.h + * + * #GSignondDigestPlugin performs HTTP Digest authentication without exposing + * the password to the application. Digest authentication is described in + * RFC 2617. + * + * gsignond_plugin_request_initial() @session_data parameter should include + * the following string items, whose meaning is described in the RFC: + * - username and secret. If they are absent, they are requested from the user + * via gSSO UI. + * - realm, "Algo", "Nonce", "Method", "DigestUri" - mandatory items. + * - "NonceCount", "Qop", "HEntity". "NonceCount" must be present if "Qop" is + * present, "HEntity" must be present if "Qop" is present and set to "auth-int". + * + * If the plugin has all the data to calculate the digest, it issues + * #GSignondPlugin::response-final signal. @session_data in that signal contains + * the username, "CNonce" item and the digest value under the "Response" key. + * + * If some of the data is incorrect or not available, #GSignondPlugin::error + * signal is issued instead. + * + * #GSignondPlugin:type property is set to "digest", and #GSignondPlugin:mechanisms + * property contains a single entry "digest". + */ +/** + * GSignondDigestPlugin: + * + * Opaque #GSignondDigestPlugin data structure. + */ +/** + * GSignondDigestPluginClass: + * @parent_class: the parent class structure + * + * Opaque #GSignondDigestPluginClass data structure. + */ + static void gsignond_plugin_interface_init (GSignondPluginInterface *iface); @@ -51,12 +92,7 @@ G_DEFINE_TYPE_WITH_CODE (GSignondDigestPlugin, gsignond_digest_plugin, struct _GSignondDigestPluginPrivate { - gboolean initialized; GSignondSessionData *session_data; - GRand *rand; - guint32 serial; - guchar key[32]; - guchar entropy[16]; }; static gchar * @@ -130,29 +166,6 @@ _gsignond_digest_plugin_compute_md5_digest ( return hresponse; } -static gchar * -_gsignond_digest_plugin_generate_nonce (GSignondDigestPluginPrivate *priv) -{ - GHmac *hmac; - gchar *nonce = NULL; - guint32 randint; - struct timespec ts; - - hmac = g_hmac_new (G_CHECKSUM_SHA1, priv->key, sizeof (priv->key)); - g_hmac_update (hmac, priv->entropy, sizeof (priv->entropy)); - priv->serial++; - g_hmac_update (hmac, - (const guchar *) &priv->serial, sizeof (priv->serial)); - if (clock_gettime (CLOCK_MONOTONIC, &ts) == 0) - g_hmac_update (hmac, (const guchar *) &ts, sizeof (ts)); - memset (&ts, 0x00, sizeof(ts)); - randint = g_rand_int (priv->rand); - g_hmac_update (hmac, (const guchar *) &randint, sizeof (randint)); - nonce = g_strdup (g_hmac_get_string (hmac)); - g_hmac_unref (hmac); - return nonce; -} - static void gsignond_digest_plugin_cancel (GSignondPlugin *self) { @@ -171,66 +184,83 @@ gsignond_digest_plugin_request ( } static void -gsignond_digest_plugin_request_initial ( - GSignondPlugin *plugin, - GSignondSessionData *session_data, - const gchar *mechanism) +_gsignond_digest_plugin_return_digest(GSignondPlugin *plugin, + const gchar *username, + const gchar *secret, + GSignondDictionary *session_data) { g_return_if_fail (plugin != NULL); g_return_if_fail (GSIGNOND_IS_DIGEST_PLUGIN (plugin)); - GSignondDigestPlugin *self = GSIGNOND_DIGEST_PLUGIN (plugin); - GSignondDigestPluginPrivate *priv = self->priv; - - g_return_if_fail (priv != NULL); - - if (!priv->initialized) { - GError *error = g_error_new (GSIGNOND_ERROR, GSIGNOND_ERROR_OPERATION_FAILED, "Method initialization failed"); + GSignondSessionData *response = NULL; + const gchar* realm = gsignond_session_data_get_realm (session_data); + const gchar* algo = gsignond_dictionary_get_string (session_data, + "Algo"); + const gchar* nonce = gsignond_dictionary_get_string (session_data, + "Nonce"); + const gchar* nonce_count = gsignond_dictionary_get_string (session_data, + "NonceCount"); + const gchar* qop = gsignond_dictionary_get_string (session_data, + "Qop"); + const gchar* method = gsignond_dictionary_get_string (session_data, + "Method"); + const gchar* digest_uri = gsignond_dictionary_get_string (session_data, + "DigestUri"); + const gchar* hentity = gsignond_dictionary_get_string (session_data, + "HEntity"); + gchar *cnonce = gsignond_generate_nonce (); + if (!cnonce) { + GError* error = g_error_new (GSIGNOND_ERROR, + GSIGNOND_ERROR_MISSING_DATA, "Error in generating nonce"); gsignond_plugin_error (plugin, error); g_error_free (error); return; } - const gchar *username = gsignond_session_data_get_username(session_data); - const gchar *secret = gsignond_session_data_get_secret(session_data); - const gchar *realm = gsignond_session_data_get_realm (session_data); - const gchar *algo = gsignond_dictionary_get_string (session_data, "Algo"); - const gchar *nonce = gsignond_dictionary_get_string (session_data, - "Nonce"); - const gchar *nonce_count = gsignond_dictionary_get_string (session_data, - "NonceCount"); - const gchar *qop = gsignond_dictionary_get_string (session_data, - "Qop"); - const gchar *method = gsignond_dictionary_get_string (session_data, - "Method"); - const gchar *digest_uri = gsignond_dictionary_get_string (session_data, - "DigestUri"); - const gchar *hentity = gsignond_dictionary_get_string (session_data, - "HEntity"); - if ((!realm || !algo || !nonce || !method || !digest_uri) || (qop && g_strcmp0 (qop, "auth-int") == 0 && !hentity) || (qop && !nonce_count)) { - GError* error = g_error_new (GSIGNOND_ERROR, GSIGNOND_ERROR_MISSING_DATA, - "Missing Session Data"); + GError* error = g_error_new (GSIGNOND_ERROR, + GSIGNOND_ERROR_MISSING_DATA, "Missing Session Data"); gsignond_plugin_error (plugin, error); g_error_free (error); return; } + gchar *digest = _gsignond_digest_plugin_compute_md5_digest(algo, + username,realm, secret, nonce, nonce_count, cnonce, qop, method, + digest_uri, hentity); + + response = gsignond_dictionary_new(); + gsignond_session_data_set_username(response, username); + gsignond_dictionary_set_string(response, "CNonce", cnonce); + g_free (cnonce); + gsignond_dictionary_set_string(response, "Response", digest); + g_free(digest); + + gsignond_plugin_response_final(plugin, response); + gsignond_dictionary_unref(response); +} +static void +gsignond_digest_plugin_request_initial ( + GSignondPlugin *plugin, + GSignondSessionData *session_data, + GSignondDictionary *identity_method_cache, + const gchar *mechanism) +{ + g_return_if_fail (plugin != NULL); + g_return_if_fail (GSIGNOND_IS_DIGEST_PLUGIN (plugin)); + + GSignondDigestPlugin *self = GSIGNOND_DIGEST_PLUGIN (plugin); + GSignondDigestPluginPrivate *priv = self->priv; + + g_return_if_fail (priv != NULL); + + const gchar *username = gsignond_session_data_get_username(session_data); + const gchar *secret = gsignond_session_data_get_secret(session_data); + if (username != NULL && secret != NULL) { - gchar *cnonce = _gsignond_digest_plugin_generate_nonce (priv); - GSignondSessionData *response = gsignond_dictionary_new (); - gsignond_session_data_set_username (response, username); - gsignond_dictionary_set_string (response, "CNonce", cnonce); - gchar *digest = _gsignond_digest_plugin_compute_md5_digest (algo, - username,realm, secret, nonce, nonce_count, cnonce, qop, method, - digest_uri, hentity); - g_free (cnonce); - gsignond_dictionary_set_string (response, "Response", digest); - g_free (digest); - gsignond_plugin_response_final (plugin, response); - gsignond_dictionary_unref (response); + _gsignond_digest_plugin_return_digest(plugin, username, secret, session_data); return; } @@ -241,9 +271,11 @@ gsignond_digest_plugin_request_initial ( gsignond_dictionary_ref (session_data); priv->session_data = session_data; - GSignondSignonuiData *user_action_data = gsignond_signonui_data_new (); - DATA_SET_VALUE (user_action_data, "Realm", realm); - DATA_SET_VALUE (user_action_data, "DigestUri", digest_uri); + GSignondSignonuiData *user_action_data = gsignond_dictionary_new (); + DATA_SET_VALUE (user_action_data, "Realm", + gsignond_session_data_get_realm (session_data)); + DATA_SET_VALUE (user_action_data, "DigestUri", + gsignond_dictionary_get_string (session_data, "DigestUri")); gsignond_signonui_data_set_query_username (user_action_data, TRUE); gsignond_signonui_data_set_query_password (user_action_data, TRUE); gsignond_plugin_user_action_required (plugin, user_action_data); @@ -283,47 +315,7 @@ gsignond_digest_plugin_user_action_finished ( username != NULL && secret != NULL && session_data != NULL) { - GSignondSessionData *response = NULL; - const gchar* realm = gsignond_session_data_get_realm (session_data); - const gchar* algo = gsignond_dictionary_get_string (session_data, - "Algo"); - const gchar* nonce = gsignond_dictionary_get_string (session_data, - "Nonce"); - const gchar* nonce_count = gsignond_dictionary_get_string (session_data, - "NonceCount"); - const gchar* qop = gsignond_dictionary_get_string (session_data, - "Qop"); - const gchar* method = gsignond_dictionary_get_string (session_data, - "Method"); - const gchar* digest_uri = gsignond_dictionary_get_string (session_data, - "DigestUri"); - const gchar* hentity = gsignond_dictionary_get_string (session_data, - "HEntity"); - gchar *cnonce = _gsignond_digest_plugin_generate_nonce (priv); - - if ((!realm || !algo || !nonce || !method || !digest_uri) - || (qop && g_strcmp0 (qop, "auth-int") == 0 && !hentity) - || (qop && !nonce_count)) { - GError* error = g_error_new (GSIGNOND_ERROR, - GSIGNOND_ERROR_MISSING_DATA, "Missing Session Data"); - gsignond_plugin_error (plugin, error); - g_error_free (error); - return; - } - gchar *digest = _gsignond_digest_plugin_compute_md5_digest(algo, - username,realm, secret, nonce, nonce_count, cnonce, qop, method, - digest_uri, hentity); - - response = gsignond_dictionary_new(); - gsignond_session_data_set_username(response, username); - gsignond_dictionary_set_string(response, "CNonce", cnonce); - g_free (cnonce); - gsignond_dictionary_set_string(response, "Response", digest); - g_free(digest); - - gsignond_plugin_response_final(plugin, response); - gsignond_dictionary_unref(response); - return; + _gsignond_digest_plugin_return_digest(plugin, username, secret, session_data); } else if (query_error == SIGNONUI_ERROR_CANCELED) { gsignond_digest_plugin_cancel (plugin); } else { @@ -360,27 +352,8 @@ gsignond_digest_plugin_init (GSignondDigestPlugin *self) GSIGNOND_DIGEST_PLUGIN_GET_PRIVATE (self); self->priv = priv; - priv->initialized = FALSE; priv->session_data = NULL; - int fd; - - fd = open ("/dev/urandom", O_RDONLY); - if (fd < 0) - return; - if (read (fd, priv->key, sizeof (priv->key)) != sizeof (priv->key)) - goto init_exit; - if (read (fd, priv->entropy, sizeof(priv->entropy)) != - sizeof (priv->entropy)) - goto init_exit; - - priv->rand = g_rand_new (); - priv->serial = 0; - - priv->initialized = TRUE; - -init_exit: - close (fd); } enum @@ -442,15 +415,6 @@ gsignond_digest_plugin_dispose (GObject *gobject) self->priv->session_data = NULL; } - if (self->priv->rand) { - g_rand_free (self->priv->rand); - self->priv->rand = NULL; - } - - memset (self->priv->key, 0x00, sizeof (self->priv->key)); - memset (self->priv->entropy, 0x00, sizeof (self->priv->entropy)); - self->priv->serial = 0; - /* Chain up to the parent class */ G_OBJECT_CLASS (gsignond_digest_plugin_parent_class)->dispose ( gobject); diff --git a/src/plugins/password/Makefile.in b/src/plugins/password/Makefile.in index a5d5fba..74d6c6b 100644 --- a/src/plugins/password/Makefile.in +++ b/src/plugins/password/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -16,6 +16,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -39,9 +56,10 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ subdir = src/plugins/password ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -116,6 +134,11 @@ am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libpassword_la_SOURCES) DIST_SOURCES = $(libpassword_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -315,7 +338,6 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): install-pluginsLTLIBRARIES: $(plugins_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(pluginsdir)" || $(MKDIR_P) "$(DESTDIR)$(pluginsdir)" @list='$(plugins_LTLIBRARIES)'; test -n "$(pluginsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ @@ -323,6 +345,8 @@ install-pluginsLTLIBRARIES: $(plugins_LTLIBRARIES) else :; fi; \ done; \ test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(pluginsdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pluginsdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pluginsdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pluginsdir)"; \ } diff --git a/src/plugins/password/gsignond-password-plugin.c b/src/plugins/password/gsignond-password-plugin.c index 90bf757..d00975c 100644 --- a/src/plugins/password/gsignond-password-plugin.c +++ b/src/plugins/password/gsignond-password-plugin.c @@ -27,6 +27,36 @@ #include "gsignond-password-plugin.h" #include +/** + * SECTION:gsignond-password-plugin + * @short_description: a plugin for retrieving the username/password + * @include: gsignond/gsignond-password-plugin.h + * + * #GSignondPasswordPlugin is used in login/password based authentication protocols. + * It returns to the applications the username and password associated with an + * identity. The plugin first checks if the daemon has placed them in + * gsignond_plugin_request_initial() @session_data parameter + * (that means they're already stored in gSSO secure database), and if not, + * the user is asked for the username and password via gSSO UI. + * + * The plugin returns the username and password via #GSignondPlugin::response-final + * if it was able to obtain them, and issues #GSignondPlugin::error otherwise. + * + * #GSignondPlugin:type property is set to "password", and #GSignondPlugin:mechanisms + * property contains a single entry "password". + */ +/** + * GSignondPasswordPlugin: + * + * Opaque #GSignondPasswordPlugin data structure. + */ +/** + * GSignondPasswordPluginClass: + * @parent_class: the parent class structure + * + * Opaque #GSignondPasswordPluginClass data structure. + */ + static void gsignond_plugin_interface_init (GSignondPluginInterface *iface); G_DEFINE_TYPE_WITH_CODE (GSignondPasswordPlugin, gsignond_password_plugin, @@ -51,14 +81,15 @@ static void gsignond_password_plugin_request ( static void gsignond_password_plugin_request_initial ( GSignondPlugin *self, GSignondSessionData *session_data, + GSignondDictionary* identity_method_cache, const gchar *mechanism) { const gchar* username = gsignond_session_data_get_username(session_data); const gchar* secret = gsignond_session_data_get_secret(session_data); - if (secret != NULL) { + if (secret && secret[0]) { GSignondSessionData *response = gsignond_dictionary_new(); - if (username != NULL) + if (username && username[0]) gsignond_session_data_set_username(response, username); gsignond_session_data_set_secret(response, secret); gsignond_plugin_response_final(self, response); @@ -66,8 +97,8 @@ static void gsignond_password_plugin_request_initial ( return; } - GSignondSignonuiData *user_action_data = gsignond_signonui_data_new(); - if (username == NULL) + GSignondSignonuiData *user_action_data = gsignond_dictionary_new(); + if (!username || !username[0]) gsignond_signonui_data_set_query_username(user_action_data, TRUE); else { gsignond_signonui_data_set_query_username(user_action_data, FALSE); diff --git a/src/plugins/ssotest/Makefile.in b/src/plugins/ssotest/Makefile.in index 8020ba7..8696001 100644 --- a/src/plugins/ssotest/Makefile.in +++ b/src/plugins/ssotest/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -16,6 +16,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -39,9 +56,10 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ subdir = src/plugins/ssotest ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -116,6 +134,11 @@ am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libssotest_la_SOURCES) DIST_SOURCES = $(libssotest_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -315,7 +338,6 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): install-pluginsLTLIBRARIES: $(plugins_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(pluginsdir)" || $(MKDIR_P) "$(DESTDIR)$(pluginsdir)" @list='$(plugins_LTLIBRARIES)'; test -n "$(pluginsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ @@ -323,6 +345,8 @@ install-pluginsLTLIBRARIES: $(plugins_LTLIBRARIES) else :; fi; \ done; \ test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(pluginsdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pluginsdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pluginsdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pluginsdir)"; \ } diff --git a/src/plugins/ssotest/gsignond-ssotest-plugin.c b/src/plugins/ssotest/gsignond-ssotest-plugin.c index 32c6cad..f414577 100644 --- a/src/plugins/ssotest/gsignond-ssotest-plugin.c +++ b/src/plugins/ssotest/gsignond-ssotest-plugin.c @@ -29,6 +29,26 @@ #include "gsignond-ssotest-plugin.h" +/** + * SECTION:gsignond-ssotest-plugin + * @short_description: a plugin that is used internally in gsignond unit test + * @include: gsignond/gsignond-ssotest-plugin.h + * + * #GSignondSsoTestPlugin is used by gsignond unit tests. It should not be used + * by applications. + */ +/** + * GSignondSsoTestPlugin: + * + * Opaque #GSignondSsoTestPlugin data structure. + */ +/** + * GSignondSsoTestPluginClass: + * @parent_class: the parent class structure + * + * Opaque #GSignondSsoTestPluginClass data structure. + */ + #define GSIGNOND_SSOTEST_PLUGIN_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \ GSIGNOND_TYPE_SSOTEST_PLUGIN, \ @@ -65,6 +85,7 @@ static void gsignond_ssotest_plugin_cancel (GSignondPlugin *plugin) static void gsignond_ssotest_plugin_request_initial ( GSignondPlugin *plugin, GSignondSessionData *session_data, + GSignondDictionary* identity_method_cache, const gchar *mechanism) { gint i; @@ -121,14 +142,14 @@ static void gsignond_ssotest_plugin_request_initial ( if (g_strcmp0 (mechanism, "mech2") == 0) { const gchar* username = gsignond_session_data_get_username (session_data); - GSignondSignonuiData *user_action_data = gsignond_signonui_data_new(); + GSignondSignonuiData *user_action_data = gsignond_dictionary_new(); if (username == NULL) gsignond_signonui_data_set_query_username (user_action_data, TRUE); else gsignond_signonui_data_set_username (user_action_data, username); gsignond_signonui_data_set_query_password (user_action_data, TRUE); gsignond_plugin_user_action_required (plugin, user_action_data); - gsignond_signonui_data_unref (user_action_data); + gsignond_dictionary_unref (user_action_data); gsignond_dictionary_unref (response); INFO ("mechanism 'mech2' responded'"); return; diff --git a/test/Makefile.am b/test/Makefile.am index efbc92a..7a4a95e 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,4 +1,12 @@ +if HAVE_DEBUG SUBDIRS = common daemon db plugins +else +SUBDIRS = + +check-local: + @echo "ERROR: tests are enabled only if ./configure is run with --enable-debug" + @exit 1 +endif VALGRIND_TESTS_DISABLE = valgrind: $(SUBDIRS) @@ -8,4 +16,4 @@ valgrind: $(SUBDIRS) EXTRA_DIST = \ valgrind.supp \ - valgrind_common.mk \ No newline at end of file + valgrind_common.mk diff --git a/test/Makefile.in b/test/Makefile.in index 353ea0e..b61d289 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -15,6 +15,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -37,9 +54,10 @@ subdir = test DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -61,6 +79,11 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ @@ -68,7 +91,7 @@ AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ distdir ETAGS = etags CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) +DIST_SUBDIRS = common daemon db plugins DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ @@ -233,7 +256,8 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUBDIRS = common daemon db plugins +@HAVE_DEBUG_FALSE@SUBDIRS = +@HAVE_DEBUG_TRUE@SUBDIRS = common daemon db plugins VALGRIND_TESTS_DISABLE = EXTRA_DIST = \ valgrind.supp \ @@ -446,13 +470,10 @@ distdir: $(DISTFILES) done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ @@ -472,7 +493,9 @@ distdir: $(DISTFILES) || exit 1; \ fi; \ done +@HAVE_DEBUG_TRUE@check-local: check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local check: check-recursive all-am: Makefile installdirs: installdirs-recursive @@ -573,23 +596,27 @@ ps-am: uninstall-am: -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ - install-am install-strip tags-recursive +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \ + ctags-recursive install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am check check-am clean clean-generic clean-libtool \ - ctags ctags-recursive distclean distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am - + all all-am check check-am check-local clean clean-generic \ + clean-libtool ctags ctags-recursive distclean \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am + + +@HAVE_DEBUG_FALSE@check-local: +@HAVE_DEBUG_FALSE@ @echo "ERROR: tests are enabled only if ./configure is run with --enable-debug" +@HAVE_DEBUG_FALSE@ @exit 1 valgrind: $(SUBDIRS) for t in $(filter-out $(VALGRIND_TESTS_DISABLE),$(SUBDIRS)); do \ cd $$t; $(MAKE) valgrind; cd ..;\ diff --git a/test/common/Makefile.am b/test/common/Makefile.am index a6c6885..a43367c 100644 --- a/test/common/Makefile.am +++ b/test/common/Makefile.am @@ -2,7 +2,6 @@ TESTS = commontest TESTS_ENVIRONMENT= SSO_PLUGINS_DIR=$(top_builddir)/src/plugins/.libs \ SSO_BIN_DIR=$(top_builddir)/src/daemon/.libs \ SSO_STORAGE_PATH=/tmp/gsignond \ - SSO_SECRET_PATH=/tmp/gsignond \ LD_LIBRARY_PATH="$(top_builddir)/src/daemon/plugins/plugind/.libs:$(top_builddir)/src/common/.libs:$(top_builddir)/src/common/db/.libs:$(top_builddir)/src/daemon/.libs:$(top_builddir)/src/daemon/db/.libs:$(top_builddir)/src/daemon/dbus/.libs:$(top_builddir)/src/daemon/plugins/.libs" VALGRIND_TESTS_DISABLE= diff --git a/test/common/Makefile.in b/test/common/Makefile.in index e0b10e0..296ce48 100644 --- a/test/common/Makefile.in +++ b/test/common/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -15,6 +15,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -40,9 +57,10 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ subdir = test/common ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -89,6 +107,11 @@ am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(commontest_SOURCES) DIST_SOURCES = $(commontest_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac ETAGS = etags CTAGS = ctags am__tty_colors = \ @@ -235,7 +258,6 @@ top_srcdir = @top_srcdir@ TESTS_ENVIRONMENT = SSO_PLUGINS_DIR=$(top_builddir)/src/plugins/.libs \ SSO_BIN_DIR=$(top_builddir)/src/daemon/.libs \ SSO_STORAGE_PATH=/tmp/gsignond \ - SSO_SECRET_PATH=/tmp/gsignond \ LD_LIBRARY_PATH="$(top_builddir)/src/daemon/plugins/plugind/.libs:$(top_builddir)/src/common/.libs:$(top_builddir)/src/common/db/.libs:$(top_builddir)/src/daemon/.libs:$(top_builddir)/src/daemon/db/.libs:$(top_builddir)/src/daemon/dbus/.libs:$(top_builddir)/src/daemon/plugins/.libs" VALGRIND_TESTS_DISABLE = @@ -654,14 +676,15 @@ uninstall-am: %.valgrind: % @$(TESTS_ENVIRONMENT) \ + RUNNING_VALGRIND=yes \ CK_FORK=no \ - CK_DEFAULT_TIMEOUT=120 \ + CK_TIMEOUT_MULTIPLIER=10 \ G_SLICE=always-malloc \ $(LIBTOOL) --mode=execute \ valgrind -q \ $(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \ --tool=memcheck --leak-check=full --trace-children=yes \ - --leak-resolution=high --num-callers=20 \ + --leak-resolution=high --num-callers=30 \ --error-exitcode=1 \ ./$* diff --git a/test/daemon/Makefile.in b/test/daemon/Makefile.in index 459c065..eae6ce5 100644 --- a/test/daemon/Makefile.in +++ b/test/daemon/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -15,6 +15,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -44,9 +61,10 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ subdir = test/daemon ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -94,6 +112,11 @@ am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(daemontest_SOURCES) DIST_SOURCES = $(daemontest_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac ETAGS = etags CTAGS = ctags am__tty_colors = \ @@ -656,14 +679,15 @@ uninstall-am: %.valgrind: % @$(TESTS_ENVIRONMENT) \ + RUNNING_VALGRIND=yes \ CK_FORK=no \ - CK_DEFAULT_TIMEOUT=120 \ + CK_TIMEOUT_MULTIPLIER=10 \ G_SLICE=always-malloc \ $(LIBTOOL) --mode=execute \ valgrind -q \ $(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \ --tool=memcheck --leak-check=full --trace-children=yes \ - --leak-resolution=high --num-callers=20 \ + --leak-resolution=high --num-callers=30 \ --error-exitcode=1 \ ./$* diff --git a/test/daemon/daemon-test.c b/test/daemon/daemon-test.c index 51ae1f4..2f4e470 100644 --- a/test/daemon/daemon-test.c +++ b/test/daemon/daemon-test.c @@ -37,7 +37,7 @@ #include "daemon/dbus/gsignond-dbus-auth-service-gen.h" #include "daemon/dbus/gsignond-dbus-identity-gen.h" #include "daemon/dbus/gsignond-dbus-auth-session-gen.h" -#include "gsignond/gsignond-identity-info.h" +#include "common/gsignond-identity-info.h" #include "gsignond/gsignond-log.h" #ifdef USE_P2P @@ -57,7 +57,6 @@ struct IdentityData { { "Secret", "s", "test_pass" }, { "StoreSecret", "b", (void *)TRUE} }; -gchar *exe_name = 0; #if HAVE_GTESTDBUS GTestDBus *dbus = NULL; @@ -65,19 +64,44 @@ GTestDBus *dbus = NULL; GPid daemon_pid = 0; #endif +static gchar* _get_executable_name() +{ + gchar *procfname; + char *path; + ssize_t res; + pid_t pid = getpid(); + + //valgrind does some magic with tasks, so we read the executable name of + //the 'main' task, instead of the current task + procfname = g_strdup_printf ("/proc/%d/task/%d/exe", pid, pid); + path = g_malloc0 (PATH_MAX + 1); + res = readlink (procfname, path, PATH_MAX); + g_free (procfname); + + if (res <= 0) { + WARN ("failed to follow link for pid %d", pid); + g_free (path); + return NULL; + } + return path; +} + static void setup_daemon (void) { + gchar* exe_name = _get_executable_name(); + fail_if(exe_name == NULL); + fail_if (g_setenv ("G_MESSAGES_DEBUG", "all", TRUE) == FALSE); fail_if (g_setenv ("SSO_IDENTITY_TIMEOUT", "5", TRUE) == FALSE); fail_if (g_setenv ("SSO_DAEMON_TIMEOUT", "5", TRUE) == FALSE); fail_if (g_setenv ("SSO_AUTH_SESSION_TIMEOUT", "5", TRUE) == FALSE); fail_if (g_setenv ("SSO_STORAGE_PATH", "/tmp/gsignond", TRUE) == FALSE); - fail_if (g_setenv ("SSO_SECRET_PATH", "/tmp/gsignond", TRUE) == FALSE); fail_if (g_setenv ("SSO_KEYCHAIN_SYSCTX", exe_name, TRUE) == FALSE); fail_if (g_setenv ("SSO_PLUGIN_TIMEOUT", "5", TRUE) == FALSE); - DBG ("Programe name : %s\n", exe_name); + DBG ("Programe pid %d, name : %s\n", getpid(), exe_name); + free(exe_name); if (system("rm -rf /tmp/gsignond") != 0) { DBG("Failed to clean db path : %s\n", strerror(errno)); @@ -182,7 +206,6 @@ teardown_daemon (void) g_unsetenv ("SSO_DAEMON_TIMEOUT"); g_unsetenv ("SSO_AUTH_SESSION_TIMEOUT"); g_unsetenv ("SSO_STORAGE_PATH"); - g_unsetenv ("SSO_SECRET_PATH"); g_unsetenv ("SSO_KEYCHAIN_SYSCTX"); } @@ -768,8 +791,6 @@ int main (int argc, char *argv[]) g_type_init (); #endif - exe_name = argv[0]; - s = daemon_suite(); sr = srunner_create(s); diff --git a/test/db/Makefile.am b/test/db/Makefile.am index 94574f2..5301171 100644 --- a/test/db/Makefile.am +++ b/test/db/Makefile.am @@ -1,6 +1,5 @@ TESTS = dbtest -TESTS_ENVIRONMENT= SSO_STORAGE_PATH=/tmp/gsignond \ - SSO_SECRET_PATH=/tmp/gsignond +TESTS_ENVIRONMENT= SSO_STORAGE_PATH=/tmp/gsignond VALGRIND_TESTS_DISABLE= diff --git a/test/db/Makefile.in b/test/db/Makefile.in index 7eaa9eb..6805be4 100644 --- a/test/db/Makefile.in +++ b/test/db/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -15,6 +15,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -40,9 +57,10 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ subdir = test/db ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -90,6 +108,11 @@ am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(dbtest_SOURCES) DIST_SOURCES = $(dbtest_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac ETAGS = etags CTAGS = ctags am__tty_colors = \ @@ -233,9 +256,7 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -TESTS_ENVIRONMENT = SSO_STORAGE_PATH=/tmp/gsignond \ - SSO_SECRET_PATH=/tmp/gsignond - +TESTS_ENVIRONMENT = SSO_STORAGE_PATH=/tmp/gsignond VALGRIND_TESTS_DISABLE = SUPPRESSIONS = $(top_srcdir)/test/valgrind.supp dbtest_SOURCES = dbtest.c @@ -653,14 +674,15 @@ uninstall-am: %.valgrind: % @$(TESTS_ENVIRONMENT) \ + RUNNING_VALGRIND=yes \ CK_FORK=no \ - CK_DEFAULT_TIMEOUT=120 \ + CK_TIMEOUT_MULTIPLIER=10 \ G_SLICE=always-malloc \ $(LIBTOOL) --mode=execute \ valgrind -q \ $(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \ --tool=memcheck --leak-check=full --trace-children=yes \ - --leak-resolution=high --num-callers=20 \ + --leak-resolution=high --num-callers=30 \ --error-exitcode=1 \ ./$* diff --git a/test/db/dbtest.c b/test/db/dbtest.c index c5156c9..72d830a 100644 --- a/test/db/dbtest.c +++ b/test/db/dbtest.c @@ -61,10 +61,11 @@ _compare_key_value( { GVariant *value2 = (GVariant *)g_hash_table_lookup (user_data->table, key); - if (value2 && g_variant_get_size (value2) == g_variant_get_size (value2) - && memcmp (g_variant_get_data (value2), + if (value2 && g_variant_get_size (value) == g_variant_get_size (value2) + && memcmp (g_variant_get_data(value2), g_variant_get_data(value), - g_variant_get_size(value2)) == 0) { + g_variant_get_size(value2)) == 0 + && g_variant_is_of_type(value2, g_variant_get_type (value))) { return; } user_data->status = 0; @@ -399,7 +400,6 @@ _gsignond_query_read_string ( START_TEST (test_sql_database) { GSignondDbSecretDatabase *database = NULL; - GSignondConfig *config = NULL; gchar *filename = NULL; const gchar *dir = NULL; GSignondCredentials *creds = NULL; @@ -435,12 +435,7 @@ START_TEST (test_sql_database) fail_unless (gsignond_db_secret_database_remove_data ( database, 1, 2) == FALSE); - config = gsignond_config_new (); - dir = gsignond_config_get_string (config, - GSIGNOND_CONFIG_GENERAL_STORAGE_PATH); - if (!dir) { - dir = g_get_user_data_dir (); - } + dir = "/tmp/gsignond"; g_mkdir_with_parents (dir, S_IRWXU); filename = g_build_filename (dir, "sql_db_test.db", NULL); fail_unless (gsignond_db_sql_database_open (sqldb, filename, @@ -449,7 +444,6 @@ START_TEST (test_sql_database) fail_unless (gsignond_db_sql_database_open (sqldb, filename, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE) == TRUE); g_free (filename); - g_object_unref(config); creds = gsignond_credentials_new (); fail_if (creds == NULL); @@ -476,10 +470,15 @@ START_TEST (test_sql_database) (GDestroyNotify)g_variant_unref); fail_if (data == NULL); - g_hash_table_insert (data,"key1",g_variant_new_string ("string_value")); - g_hash_table_insert (data,"key2",g_variant_new_double (12223.4223)); - g_hash_table_insert (data,"key3",g_variant_new_uint16(20)); - g_hash_table_insert (data,"key4",g_variant_new("^ay", "byte_value")); + GVariantBuilder builder; + g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT); + g_variant_builder_add (&builder, "{sv}", "key1", g_variant_new_string ("string_value")); + g_variant_builder_add (&builder, "{sv}", "key2",g_variant_new_double (12223.4223)); + g_variant_builder_add (&builder, "{sv}", "key3",g_variant_new_uint16(20)); + g_variant_builder_add (&builder, "{sv}", "key4",g_variant_new("^ay", "byte_value")); + + g_hash_table_insert (data, "dummy_client_id", g_variant_builder_end (&builder)); + fail_unless (gsignond_db_secret_database_update_data ( database, id, method, data) == TRUE); data2 = gsignond_db_secret_database_load_data (database, id, method); @@ -610,6 +609,8 @@ START_TEST (test_secret_storage) const gchar *dir = NULL; config = gsignond_config_new (); + gsignond_config_set_string (config, GSIGNOND_CONFIG_GENERAL_SECURE_DIR, "/tmp/gsignond"); + /* Secret Storage */ storage = g_object_new (GSIGNOND_TYPE_SECRET_STORAGE, "config", config, NULL); @@ -713,6 +714,7 @@ START_TEST (test_metadata_database) GSignondSecurityContext *owner = NULL; config = gsignond_config_new (); + gsignond_config_set_string (config, GSIGNOND_CONFIG_GENERAL_SECURE_DIR, "/tmp/gsignond"); GSignondDbMetadataDatabase* metadata_db = NULL; metadata_db = gsignond_db_metadata_database_new (config); g_object_unref(config); @@ -887,6 +889,7 @@ START_TEST (test_credentials_database) GSignondDictionary *no_cap_filter = NULL; config = gsignond_config_new (); + gsignond_config_set_string (config, GSIGNOND_CONFIG_GENERAL_SECURE_DIR, "/tmp/gsignond"); storage = g_object_new (GSIGNOND_TYPE_SECRET_STORAGE, "config", config, NULL); g_object_unref(config); diff --git a/test/plugins/Makefile.am b/test/plugins/Makefile.am index 90b02ea..4b77125 100644 --- a/test/plugins/Makefile.am +++ b/test/plugins/Makefile.am @@ -3,7 +3,6 @@ TESTS = digestplugintest passwordplugintest pluginproxytest pluginremotetest TESTS_ENVIRONMENT= SSO_PLUGINS_DIR=$(top_builddir)/src/plugins/.libs \ SSO_BIN_DIR=$(top_builddir)/src/daemon/.libs \ SSO_STORAGE_PATH=/tmp/gsignond \ - SSO_SECRET_PATH=/tmp/gsignond \ LD_LIBRARY_PATH="$(top_builddir)/src/daemon/plugins/plugind/.libs:$(top_builddir)/src/common/.libs:$(top_builddir)/src/common/db/.libs:$(top_builddir)/src/daemon/.libs:$(top_builddir)/src/daemon/db/.libs:$(top_builddir)/src/daemon/dbus/.libs:$(top_builddir)/src/daemon/plugins/.libs" VALGRIND_TESTS_DISABLE = diff --git a/test/plugins/Makefile.in b/test/plugins/Makefile.in index e8a3604..f4bcbd8 100644 --- a/test/plugins/Makefile.in +++ b/test/plugins/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11.3 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -15,6 +15,23 @@ @SET_MAKE@ VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -42,9 +59,10 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ subdir = test/plugins ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_gnu_make.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -131,6 +149,11 @@ SOURCES = $(digestplugintest_SOURCES) $(passwordplugintest_SOURCES) \ DIST_SOURCES = $(digestplugintest_SOURCES) \ $(passwordplugintest_SOURCES) $(pluginproxytest_SOURCES) \ $(pluginremotetest_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac ETAGS = etags CTAGS = ctags am__tty_colors = \ @@ -277,7 +300,6 @@ top_srcdir = @top_srcdir@ TESTS_ENVIRONMENT = SSO_PLUGINS_DIR=$(top_builddir)/src/plugins/.libs \ SSO_BIN_DIR=$(top_builddir)/src/daemon/.libs \ SSO_STORAGE_PATH=/tmp/gsignond \ - SSO_SECRET_PATH=/tmp/gsignond \ LD_LIBRARY_PATH="$(top_builddir)/src/daemon/plugins/plugind/.libs:$(top_builddir)/src/common/.libs:$(top_builddir)/src/common/db/.libs:$(top_builddir)/src/daemon/.libs:$(top_builddir)/src/daemon/db/.libs:$(top_builddir)/src/daemon/dbus/.libs:$(top_builddir)/src/daemon/plugins/.libs" VALGRIND_TESTS_DISABLE = @@ -799,14 +821,15 @@ uninstall-am: %.valgrind: % @$(TESTS_ENVIRONMENT) \ + RUNNING_VALGRIND=yes \ CK_FORK=no \ - CK_DEFAULT_TIMEOUT=120 \ + CK_TIMEOUT_MULTIPLIER=10 \ G_SLICE=always-malloc \ $(LIBTOOL) --mode=execute \ valgrind -q \ $(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \ --tool=memcheck --leak-check=full --trace-children=yes \ - --leak-resolution=high --num-callers=20 \ + --leak-resolution=high --num-callers=30 \ --error-exitcode=1 \ ./$* diff --git a/test/plugins/digestplugintest.c b/test/plugins/digestplugintest.c index 953eefd..4dfe3c6 100644 --- a/test/plugins/digestplugintest.c +++ b/test/plugins/digestplugintest.c @@ -117,7 +117,7 @@ START_TEST (test_digestplugin_request) gsignond_session_data_set_username(data, "user1"); gsignond_session_data_set_secret(data, "password1"); - gsignond_plugin_request_initial(plugin, data, "digest"); + gsignond_plugin_request_initial(plugin, data, NULL, "digest"); fail_if(result != NULL); fail_if(ui_action != NULL); fail_if(error == NULL); @@ -134,7 +134,7 @@ START_TEST (test_digestplugin_request) gsignond_dictionary_set_string(data, "Method", "GET"); gsignond_dictionary_set_string(data, "DigestUri", "/test/index.html"); - gsignond_plugin_request_initial(plugin, data, "digest"); + gsignond_plugin_request_initial(plugin, data, NULL, "digest"); fail_if(result == NULL); fail_if(ui_action != NULL); fail_if(error != NULL); @@ -147,7 +147,7 @@ START_TEST (test_digestplugin_request) //remove secret so that ui action is required gsignond_dictionary_remove (data, "Secret"); - gsignond_plugin_request_initial(plugin, data, "digest"); + gsignond_plugin_request_initial(plugin, data, NULL, "digest"); fail_if(result != NULL); fail_if(ui_action == NULL); fail_if(error != NULL); @@ -186,7 +186,7 @@ START_TEST (test_digestplugin_user_action_finished) G_CALLBACK(user_action_required_callback), &ui_action); g_signal_connect(plugin, "error", G_CALLBACK(error_callback), &error); - ui_data = gsignond_signonui_data_new(); + ui_data = gsignond_dictionary_new(); gsignond_signonui_data_set_query_error(ui_data, SIGNONUI_ERROR_NONE); //empty data @@ -243,7 +243,7 @@ START_TEST (test_digestplugin_user_action_finished) "abg10b1234ee1f0e8b11d0f600bfb0c093"); gsignond_dictionary_set_string (data, "Method", "GET"); gsignond_dictionary_set_string (data, "DigestUri", "/test/index.html"); - gsignond_plugin_request_initial (plugin, data, "digest"); + gsignond_plugin_request_initial (plugin, data, NULL, "digest"); gsignond_dictionary_unref (data); data = NULL; gsignond_plugin_user_action_finished (plugin, ui_data); diff --git a/test/plugins/passwordplugintest.c b/test/plugins/passwordplugintest.c index b7b3eab..5c7670a 100644 --- a/test/plugins/passwordplugintest.c +++ b/test/plugins/passwordplugintest.c @@ -105,7 +105,7 @@ START_TEST (test_passwordplugin_request) // username empty, password not empty gsignond_session_data_set_secret(data, "megapassword"); - gsignond_plugin_request_initial(plugin, data, "password"); + gsignond_plugin_request_initial(plugin, data, NULL, "password"); fail_if(result == NULL); fail_if(ui_action != NULL); fail_if(error != NULL); @@ -117,7 +117,7 @@ START_TEST (test_passwordplugin_request) // username and password not empty gsignond_session_data_set_username(data, "megauser"); - gsignond_plugin_request_initial(plugin, data, "password"); + gsignond_plugin_request_initial(plugin, data, NULL, "password"); fail_if(result == NULL); fail_if(ui_action != NULL); fail_if(error != NULL); @@ -131,7 +131,7 @@ START_TEST (test_passwordplugin_request) //username and password empty gsignond_dictionary_unref(data); data = gsignond_dictionary_new(); - gsignond_plugin_request_initial(plugin, data, "password"); + gsignond_plugin_request_initial(plugin, data, NULL, "password"); fail_if(result != NULL); fail_if(ui_action == NULL); fail_if(error != NULL); @@ -144,7 +144,7 @@ START_TEST (test_passwordplugin_request) //username not empty, password empty gsignond_session_data_set_username(data, "megauser"); - gsignond_plugin_request_initial(plugin, data, "password"); + gsignond_plugin_request_initial(plugin, data, NULL, "password"); fail_if(result != NULL); fail_if(ui_action == NULL); fail_if(error != NULL); diff --git a/test/plugins/pluginproxytest.c b/test/plugins/pluginproxytest.c index 998abfe..811b541 100644 --- a/test/plugins/pluginproxytest.c +++ b/test/plugins/pluginproxytest.c @@ -134,10 +134,10 @@ gsignond_auth_session_notify_process_result ( gsignond_session_data_set_username(data, "megauser"); gsignond_session_data_set_secret(data, "megapassword"); - gsignond_plugin_proxy_process(proxy, iface, data, "password", + gsignond_plugin_proxy_process(proxy, iface, data, NULL, "password", proxy); - gsignond_plugin_proxy_process(proxy, iface, data, "password", + gsignond_plugin_proxy_process(proxy, iface, data, NULL, "password", proxy); gsignond_dictionary_unref(data); @@ -154,7 +154,7 @@ gsignond_auth_session_notify_process_result ( fail_if(data == NULL); for (i = 0; i < 9; i++) { - gsignond_plugin_proxy_process(proxy, iface, data, "mech1", + gsignond_plugin_proxy_process(proxy, iface, data, NULL, "mech1", proxy); } gsignond_dictionary_unref(data); @@ -303,7 +303,7 @@ START_TEST (test_pluginproxy_process) testing_proxy_process = TRUE; - gsignond_plugin_proxy_process(proxy, test_auth_session, data, "password", + gsignond_plugin_proxy_process(proxy, test_auth_session, data, NULL, "password", proxy); _run_mainloop (); @@ -335,7 +335,7 @@ START_TEST (test_pluginproxy_process_cancel) testing_proxy_process_cancel = TRUE; - gsignond_plugin_proxy_process(proxy, test_auth_session, data, "mech1", + gsignond_plugin_proxy_process(proxy, test_auth_session, data, NULL, "mech1", proxy); _run_mainloop (); @@ -369,7 +369,7 @@ START_TEST (test_pluginproxy_process_queue) testing_proxy_process_queue = TRUE; - gsignond_plugin_proxy_process(proxy, test_auth_session, data, "password", + gsignond_plugin_proxy_process(proxy, test_auth_session, data, NULL, "password", proxy); _run_mainloop (); @@ -399,7 +399,7 @@ START_TEST (test_pluginproxy_process_queue_cancel) testing_proxy_process_queue_cancel = TRUE; - gsignond_plugin_proxy_process(proxy, test_auth_session, data, "mech1", + gsignond_plugin_proxy_process(proxy, test_auth_session, data, NULL, "mech1", proxy); _run_mainloop (); @@ -498,7 +498,8 @@ START_TEST (test_pluginproxyfactory_add) fail_if(gsignond_plugin_proxy_factory_add_plugin(factory, proxy) == TRUE); fail_if(gsignond_plugin_proxy_factory_get_plugin(factory, "password") != proxy); - + g_object_unref(proxy); + g_object_unref(proxy); g_object_unref(factory); g_object_unref(config); diff --git a/test/plugins/pluginremotetest.c b/test/plugins/pluginremotetest.c index 32fc2cb..18d1475 100644 --- a/test/plugins/pluginremotetest.c +++ b/test/plugins/pluginremotetest.c @@ -340,7 +340,7 @@ START_TEST (test_pluginremote_request) // username empty, password not empty gsignond_session_data_set_secret(data, "megapassword"); - gsignond_plugin_request_initial(plugin, data, "password"); + gsignond_plugin_request_initial(plugin, data, NULL, "password"); _run_mainloop (); fail_if(result == NULL); @@ -354,7 +354,7 @@ START_TEST (test_pluginremote_request) // username and password not empty gsignond_session_data_set_username(data, "megauser"); - gsignond_plugin_request_initial(plugin, data, "password"); + gsignond_plugin_request_initial(plugin, data, NULL, "password"); _run_mainloop (); fail_if(result == NULL); @@ -370,7 +370,7 @@ START_TEST (test_pluginremote_request) //username and password empty gsignond_dictionary_unref(data); data = gsignond_dictionary_new(); - gsignond_plugin_request_initial(plugin, data, "password"); + gsignond_plugin_request_initial(plugin, data, NULL, "password"); _run_mainloop (); fail_if(result != NULL); @@ -387,7 +387,7 @@ START_TEST (test_pluginremote_request) //username not empty, password empty gsignond_session_data_set_username(data, "megauser"); - gsignond_plugin_request_initial(plugin, data, "password"); + gsignond_plugin_request_initial(plugin, data, NULL, "password"); _run_mainloop (); fail_if(result != NULL); diff --git a/test/valgrind.supp b/test/valgrind.supp index e791e62..6155af4 100644 --- a/test/valgrind.supp +++ b/test/valgrind.supp @@ -52,5 +52,21 @@ Memcheck:Leak ... fun:g_resolver_lookup_by_name_async } - - +{ + + Memcheck:Leak + ... + fun:_dl_allocate_tls +} +{ + + Memcheck:Leak + ... + fun:gdbus_shared_thread_func +} +{ + + Memcheck:Leak + ... + fun:g_get_user_data_dir +} diff --git a/test/valgrind_common.mk b/test/valgrind_common.mk index 4b0cc5b..358fe3f 100644 --- a/test/valgrind_common.mk +++ b/test/valgrind_common.mk @@ -2,14 +2,15 @@ SUPPRESSIONS = $(top_srcdir)/test/valgrind.supp %.valgrind: % @$(TESTS_ENVIRONMENT) \ + RUNNING_VALGRIND=yes \ CK_FORK=no \ - CK_DEFAULT_TIMEOUT=120 \ + CK_TIMEOUT_MULTIPLIER=10 \ G_SLICE=always-malloc \ $(LIBTOOL) --mode=execute \ valgrind -q \ $(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \ --tool=memcheck --leak-check=full --trace-children=yes \ - --leak-resolution=high --num-callers=20 \ + --leak-resolution=high --num-callers=30 \ --error-exitcode=1 \ ./$* diff --git a/tools/archive.sh b/tools/archive.sh index b28d24f..8d053c5 100755 --- a/tools/archive.sh +++ b/tools/archive.sh @@ -1,6 +1,6 @@ #!/bin/sh # -git archive --format=tar --prefix=gsignond-0.0.0/ -o ../gsignond-0.0.0.tar daemon -bzip2 ../gsignond-0.0.0.tar -mv ../gsignond-0.0.0.tar.bz2 ~/rpmbuild/SOURCES/ +git archive --format=tar --prefix=gsignond-0.0.2/ -o ../gsignond-0.0.2.tar daemon +bzip2 ../gsignond-0.0.2.tar +mv ../gsignond-0.0.2.tar.bz2 ~/rpmbuild/SOURCES/ diff --git a/tools/prepare-tizen.sh b/tools/prepare-tizen.sh index d4329b2..7c4f4e2 100755 --- a/tools/prepare-tizen.sh +++ b/tools/prepare-tizen.sh @@ -9,14 +9,15 @@ if [ $# -ne 2 -o -z "$1" -o -z "$2" ]; then exit fi -currdir = `pwd`; +currdir=`pwd`; echo "CURR dir = $currdir" mkdir -p $2 && \ -tar -xzvf $1 -C $2 --strip-components 1 && \ cd $2 && \ +git rm -r * && \ +tar -xzvf $currdir/$1 -C $2 --strip-components 1 && \ mkdir -p packaging && \ cd packaging && \ -cp -f ../dists/rpm/gsignond-tizen.spec gsignond.spec && -cp -f ../dists/rpm/gsignond-tizen.changes gsignond.changes; - +cp -f ../dists/rpm/gsignond-tizen.spec gsignond.spec && \ +cp -f ../dists/rpm/gsignond-tizen.changes gsignond.changes && \ +cd .. && git add *; diff --git a/tools/run-tests.sh b/tools/run-tests.sh index 0d271d4..6ed0257 100755 --- a/tools/run-tests.sh +++ b/tools/run-tests.sh @@ -1,7 +1,6 @@ #Environment variables for the tests export G_MESSAGES_DEBUG=all export SSO_STORAGE_PATH=/tmp/gsignond -export SSO_SECRET_PATH=/tmp/gsignond rm -rf "$SSO_STORAGE_PATH" diff --git a/tools/setup-and-start-daemon.sh b/tools/setup-and-start-daemon.sh index a7ecd8b..62dc071 100755 --- a/tools/setup-and-start-daemon.sh +++ b/tools/setup-and-start-daemon.sh @@ -16,7 +16,6 @@ fi killall gsignond -export SSO_SECRET_PATH="/tmp/gsignond" export SSO_STORAGE_PATH="/tmp/gsignond" if [ -f "$SRC_HOME/test/daemon/.libs/lt-daemontest" ] ; then export SSO_KEYCHAIN_SYSCTX="$SRC_HOME/test/daemon/.libs/lt-daemontest" -- 2.7.4