]> granicus.if.org Git - p11-kit/commitdiff
Support expanding $XDG_CONFIG_HOME in user config paths
authorStef Walter <stef@thewalter.net>
Wed, 17 Jul 2013 09:58:05 +0000 (11:58 +0200)
committerStef Walter <stef@thewalter.net>
Thu, 18 Jul 2013 11:04:35 +0000 (13:04 +0200)
If ~/.config is specified as a prefix to a configured path,
then it is expanded to the $XDG_CONFIG_HOME if that exists

Add --with-user-config ./configure option to configure a
different user config directory.

Interpolate the right directories into documentation.

.gitignore
common/path.c
common/tests/test-path.c
configure.ac
doc/manual/Makefile.am
doc/manual/p11-kit-config.xml
doc/manual/p11-kit-devel.xml
doc/manual/p11-kit-trust.xml
doc/manual/pkcs11.conf.xml
doc/manual/version.xml.in [deleted file]
p11-kit/pkcs11.conf.example.in

index a7dfe1101cf43a1f01087b386eafd3734d456235..df18e5f71cd25c8d884d6f29d24ecc35f62dc749 100644 (file)
@@ -80,6 +80,8 @@ x86_64-w64-mingw32
 /doc/manual/p11-kit.signals
 /doc/manual/p11-kit.types
 /doc/manual/tmpl/
+/doc/manual/sysdir.xml
+/doc/manual/userdir.xml
 /doc/manual/version.xml
 /doc/manual/xml/
 /doc/manual/*.5
index d807301b809efe877f266ce0bf299d3b281d429b..a22c2a604f6030c50e6d2ea68a26a86a2cb400ae 100644 (file)
@@ -91,19 +91,40 @@ p11_path_base (const char *path)
        return strndup (beg, end - beg);
 }
 
+static inline bool
+is_path_component_or_null (char ch)
+{
+       return (ch == '\0' || ch == '/'
+#ifdef OS_WIN32
+                       || ch == '\\'
+#endif
+               );
+}
+
 static char *
 expand_homedir (const char *remainder)
 {
        const char *env;
 
-       if (remainder[0] == '\0')
-               remainder = NULL;
-
        if (getauxval (AT_SECURE)) {
                errno = EPERM;
                return NULL;
        }
 
+       while (remainder[0] && is_path_component_or_null (remainder[0]))
+               remainder++;
+       if (remainder[0] == '\0')
+               remainder = NULL;
+
+       /* Expand $XDG_CONFIG_HOME */
+       if (remainder != NULL &&
+           strncmp (remainder, ".config", 7) == 0 &&
+           is_path_component_or_null (remainder[7])) {
+               env = getenv ("XDG_CONFIG_HOME");
+               if (env && env[0])
+                       return p11_path_build (env, remainder + 8, NULL);
+       }
+
        env = getenv ("HOME");
        if (env && env[0]) {
                return p11_path_build (env, remainder, NULL);
@@ -139,16 +160,6 @@ expand_homedir (const char *remainder)
        }
 }
 
-static inline bool
-is_path_component_or_null (char ch)
-{
-       return (ch == '\0' || ch == '/'
-#ifdef OS_WIN32
-                       || ch == '\\'
-#endif
-               );
-}
-
 char *
 p11_path_expand (const char *path)
 {
index 0077cd05507c89336ddab8818fc7845c3b27c67f..a6ba54d1b95ae585795c50cd9456275da7d0ea80 100644 (file)
@@ -117,6 +117,12 @@ test_expand (void)
                               p11_path_expand ("~/my/path"));
        check_equals_and_free ("/home/blah",
                               p11_path_expand ("~"));
+       putenv ("XDG_CONFIG_HOME=/my");
+       check_equals_and_free ("/my/path",
+                              p11_path_expand ("~/.config/path"));
+       putenv ("XDG_CONFIG_HOME=");
+       check_equals_and_free ("/home/blah/.config/path",
+                              p11_path_expand ("~/.config/path"));
 #else /* OS_WIN32 */
        putenv ("HOME=C:\\Users\\blah");
        check_equals_and_free ("C:\\Users\\blah\\path",
index 2f92b8c1990a1731d1984b0f1740e00cb1611ce0..445bd4fbe4a55a7a40a34b28127b77023e393170 100644 (file)
@@ -115,6 +115,11 @@ AC_ARG_WITH([system-config],
             [system_config_dir=$withval],
             [system_config_dir=$sysconfdir/pkcs11])
 
+AC_ARG_WITH([user-config],
+            [AS_HELP_STRING([--with-system-config], [Change PKCS#11 user config directory])],
+            [user_config_dir=$withval],
+            [user_config_dir="~/.pkcs11"])
+
 AC_ARG_WITH([module-path],
             [AS_HELP_STRING([--with-module-path], [Load modules with relative path names from here])],
             [module_path=$withval],
@@ -125,7 +130,7 @@ p11_system_config=$system_config_dir
 p11_system_config_file=$p11_system_config/pkcs11.conf
 p11_system_config_modules=$p11_system_config/modules
 p11_package_config_modules='${pkgdatadir}/modules'
-p11_user_config="~/.pkcs11"
+p11_user_config=$user_config_dir
 p11_user_config_file="$p11_user_config/pkcs11.conf"
 p11_user_config_modules="$p11_user_config/modules"
 p11_module_path="$module_path"
@@ -487,7 +492,6 @@ AC_CONFIG_FILES([Makefile
        common/tests/Makefile
        doc/Makefile
        doc/manual/Makefile
-       doc/manual/version.xml
        po/Makefile.in
        p11-kit/Makefile
        p11-kit/tests/Makefile
index ea6166ed150f3a2517db270b6a992e7b6fbaaa41..ab73373f7c211dd1f88045fbe63bc83c6c452a89 100644 (file)
@@ -83,7 +83,11 @@ content_files=p11-kit-config.xml p11-kit-sharing.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=
+expand_content_files= \
+       version.xml \
+       userdir.xml \
+       sysdir.xml \
+       $(NULL)
 
 # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
 # Only needed if you are using gtkdoc-scangobj to dynamically query widget
@@ -98,6 +102,14 @@ p11-kit-sections.txt: $(srcdir)/p11-kit-sections.txt
 p11-kit-overrides.txt: $(srcdir)/p11-kit-overrides.txt
        cp $(srcdir)/p11-kit-overrides.txt p11-kit-overrides.txt
 
+# Generate our files with variables
+sysdir.xml:
+       echo -n $(p11_system_config) > "$@"
+userdir.xml:
+       echo -n $(p11_user_config) > "$@"
+version.xml:
+       echo -n $(VERSION) > "$@"
+
 # This includes the standard gtk-doc make rules, copied by gtkdocize.
 include $(top_srcdir)/gtk-doc.make
 
@@ -140,6 +152,7 @@ CLEANFILES += \
 
 EXTRA_DIST += \
        $(MAN_IN_FILES) \
-       version.xml.in \
+       sysdir.xml \
+       userdir.xml \
        version.xml \
        $(NULL)
index 1df55b1ee335931c372bed6524eb93c165721e91..ec17b1ba86bd4d35e78d1bab4f375c2377777288 100644 (file)
@@ -1,6 +1,10 @@
 <?xml version="1.0"?>
 <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
-       "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+       "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
+[
+  <!ENTITY sysdir SYSTEM "sysdir.xml">
+  <!ENTITY userdir SYSTEM "userdir.xml">
+]>
 
 <chapter xml:id="config">
        <title>PKCS#11 Configuration</title>
                two modules called 'my-module' and 'nss'. The user settings override some
                aspects of the system settings.</para>
 
-<para>Global configuration file: <literal>/etc/pkcs11/pkcs11.conf</literal></para>
+<para>Global configuration file: <literal>&sysdir;/pkcs11.conf</literal></para>
 <programlisting>
 # This setting controls whether to load user configuration from the
-# ~/.pkcs11 directory. Possible values:
+# &userdir; directory. Possible values:
 #    none: No user configuration
 #    merge: Merge the user config over the system configuration (default)
 #    only: Only user configuration, ignore system configuration
 user-config: merge
 </programlisting>
 
-<para>One module configuration file per module: <literal>/etc/pkcs11/modules/my-module</literal></para>
+<para>One module configuration file per module: <literal>&sysdir;/modules/my-module</literal></para>
 <programlisting>
 # This setting controls the actual module library to load. This config file
 # might be installed by the package that installs this module library. This
@@ -52,19 +56,19 @@ module: my-pkcs11-module.so
 critical: no
 </programlisting>
 
-<para>User configuration file: <literal>~/.pkcs11/pkcs11.conf</literal></para>
+<para>User configuration file: <literal>&userdir;/pkcs11.conf</literal></para>
 <programlisting>
 # This is an empty file. Files that do not exist are treated as empty.
 </programlisting>
 
-<para>User configuration file: <literal>~/.pkcs11/modules/my-module</literal></para>
+<para>User configuration file: <literal>&userdir;/modules/my-module</literal></para>
 <programlisting>
 # Merge with the settings in the system my-module config file. In this case
 # a developer has overridden to load a different module for my-module instead.
 module: /home/user/src/custom-module/my-module.so
 </programlisting>
 
-<para>User configuration file: <literal>~/.pkcs11/modules/nss</literal></para>
+<para>User configuration file: <literal>&userdir;/modules/nss</literal></para>
 <programlisting>
 # Load the NSS libsoftokn.so.3 PKCS#11 library as a module. Note that we pass
 # some custom non-standard initialization arguments, as NSS expects.
index 5ffc32b96d5d7f247f5cd21f9051b25a2a8e2805..2ce3f0c27b585be572f0c0a642ff8fe79949101e 100644 (file)
@@ -230,6 +230,16 @@ $ make install
                                        <listitem><para>Specify the path to look for p11-kit config files. This
                                        usually defaults to something like <literal>/etc/pkcs11</literal></para></listitem>
                                </varlistentry>
+                               <varlistentry>
+                                       <term><option>--with-user-config</option></term>
+                                       <listitem><para>Specify the path to look for user specific p11-kit config files. If 
+                                       specify a path that begins with <literal>~/</literal> then this is expanded to the
+                                       home directory of the user running p11-kit. If you specify a path that begins with
+                                       <literal>~/.config/</literal> then this is expanded to the $XDG_CONFIG_HOME directory,
+                                       as outlined in the
+                                       <ulink url="http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html#variables">XDG Base Dir specification</ulink>.
+                                       This option defaults to <literal>~/.pkcs11</literal></para></listitem>
+                               </varlistentry>
                        </variablelist>
                        <para></para>
                </section>
index 999bfefd754bbb7d19f1cde381730212414d5061..4b3521a89f5f8a51b80195531b703a9f4243d07c 100644 (file)
@@ -1,6 +1,10 @@
 <?xml version="1.0"?>
 <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
-       "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+       "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
+[
+  <!ENTITY sysdir SYSTEM "sysdir.xml">
+  <!ENTITY userdir SYSTEM "userdir.xml">
+]>
 
 <chapter xml:id="trust">
 <title>Trust Policy Module</title>
@@ -106,12 +110,12 @@ $ pkg-config --variable p11_trust_paths p11-kit-1
                during the <link linkend="devel-building-configure">p11-kit
                build</link>.</para></listitem>
                <listitem><para>Disable loading trust policy information
-               from this module by adding a file to <literal>/etc/pkcs11/modules</literal>
+               from this module by adding a file to <literal>&sysdir;/modules</literal>
                called <literal>p11-kit-trust.module</literal> containing a
                <literal>trust-policy: no</literal> line.</para></listitem>
 
                <listitem><para>Disable this module completely by
-               adding a file to <literal>/etc/pkcs11/modules</literal>
+               adding a file to <literal>&sysdir;/modules</literal>
                called <literal>p11-kit-trust.module</literal> containing a
                <literal>enable-in:</literal> line (without a value).</para></listitem>
        </itemizedlist>
index cda02ee185513d012c557aae0e3fb5272114625f..14b1783ad8608d21c7b410872df09188d4693414 100644 (file)
@@ -1,6 +1,10 @@
 <?xml version='1.0'?>
 <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
-       "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+       "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
+[
+  <!ENTITY sysdir SYSTEM "sysdir.xml">
+  <!ENTITY userdir SYSTEM "userdir.xml">
+]>
 
 <refentry id="pkcs11.conf">
 
@@ -232,13 +236,13 @@ x-custom : text
        additional configuration or override the system configuration.</para>
 
        <para>The system global configuration file is usually in
-       <literal>/etc/pkcs11/pkcs11.conf</literal> and the user global
-       configuration file is in <literal>~/.pkcs11/pkcs11.conf</literal> in the
+       <literal>&sysdir;/pkcs11.conf</literal> and the user global
+       configuration file is in <literal>&userdir;/pkcs11.conf</literal> in the
        user's home directory.</para>
 
        <para>The module config files are usually located in the
-       <literal>/etc/pkcs11/modules</literal> directory, with one configuration
-       file per module. In addition the <literal>~/.pkcs11/modules</literal> directory
+       <literal>&sysdir;/modules</literal> directory, with one configuration
+       file per module. In addition the <literal>&userdir;/modules</literal> directory
        can be used for modules installed by the user.</para>
 
        <para>Note that user configuration files are not loaded from the home
diff --git a/doc/manual/version.xml.in b/doc/manual/version.xml.in
deleted file mode 100644 (file)
index 27323da..0000000
+++ /dev/null
@@ -1 +0,0 @@
-@VERSION@
\ No newline at end of file
index a148000cee3238b7c91d3302454e133ab91e844a..96d0a08ce9b12f0d45a9711b4cd58c244cffe08c 100644 (file)
@@ -2,7 +2,7 @@
 # place before use.
 
 # This setting controls whether to load user configuration from the
-# ~/.pkcs11 directory. Possible values:
+# @p11_user_config@ directory. Possible values:
 #    none: No user configuration
 #    merge: Merge the user config over the system configuration (default)
 #    only: Only user configuration, ignore system configuration