Imported upstream version 0.61.0
[hcoop/debian/courier-authlib.git] / README_authlib.html.in
index 9661970..26c8db3 100644 (file)
@@ -1,10 +1,10 @@
 <?xml version="1.0"?>
 <?xml version="1.0"?>
-<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>Courier Authentication Library</title><link rel="stylesheet" href="style.css" type="text/css"/><meta name="generator" content="DocBook XSL Stylesheets V1.72.0"/><link rel="start" href="#authlib" title="Courier Authentication Library"/><link rel="next" href="#authpwd" title="The authpwd authentication module"/><link xmlns="" rel="stylesheet" type="text/css" href="manpage.css"/><meta xmlns="" name="MSSmartTagsPreventParsing" content="TRUE"/><link xmlns="" rel="icon" href="icon.gif" type="image/gif"/><!--
+<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>Courier Authentication Library</title><link rel="stylesheet" href="style.css" type="text/css"/><meta name="generator" content="DocBook XSL Stylesheets V1.73.2"/><link rel="start" href="#authlib" title="Courier Authentication Library"/><link rel="next" href="#authpwd" title="The authpwd authentication module"/><link xmlns="" rel="stylesheet" type="text/css" href="manpage.css"/><meta xmlns="" name="MSSmartTagsPreventParsing" content="TRUE"/><link xmlns="" rel="icon" href="icon.gif" type="image/gif"/><!--
 
 Copyright 1998 - 2007 Double Precision, Inc.  See COPYING for distribution
 information.
 
 
 Copyright 1998 - 2007 Double Precision, Inc.  See COPYING for distribution
 information.
 
---></head><body><div class="chapter" lang="en" xml:lang="en"><div class="titlepage"><div><div><h1 class="title"><a id="authlib" shape="rect"> </a>Courier Authentication Library</h1></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#authpwd" shape="rect">The <code class="literal">authpwd</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authshadow" shape="rect">The <code class="literal">authshadow</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authpam" shape="rect">The <code class="literal">authpam</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authpipe" shape="rect">The <code class="literal">authpipe</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authpipeproto" shape="rect">The <code class="literal">authpipe</code> protocol</a></span></dt><dt><span class="sect1"><a href="#authuserdb" shape="rect">The <code class="literal">authuserdb</code> authentication module</a></span></dt><dd><dl><dt><span class="sect2"><a href="#userdbprimer" shape="rect">A brief <code class="literal">userdb</code> primer</a></span></dt><dt><span class="sect2"><a href="#userdbsimple" shape="rect">A simple userdb setup</a></span></dt><dt><span class="sect2"><a href="#userdbcomplex" shape="rect">Large virtual domain farm</a></span></dt><dt><span class="sect2"><a href="#moreuserdb" shape="rect">Beyond <code class="literal">userdb</code></a></span></dt></dl></dd><dt><span class="sect1"><a href="#authvchkpw" shape="rect">The <code class="literal">authvchkpw</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authmysql" shape="rect">The <code class="literal">authmysql</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authpgsql" shape="rect">The <code class="literal">authpgsql</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authldap" shape="rect">The <code class="literal">authldap</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authcustom" shape="rect"><code class="literal">authcustom</code></a></span></dt><dt><span class="sect1"><a href="#options" shape="rect">Account options</a></span></dt><dt><span class="sect1"><a href="#authtest" shape="rect">Running <span><strong class="command">authtest</strong></span></a></span></dt><dd><dl><dt><span class="sect2"><a href="#pwchange" shape="rect">Changing account passwords</a></span></dt></dl></dd><dt><span class="sect1"><a href="#internals" shape="rect">Authentication internals</a></span></dt><dt><span class="sect1"><a href="#files" shape="rect">FILES</a></span></dt><dt><span class="sect1"><a href="#seealso" shape="rect">SEE ALSO</a></span></dt></dl></div><p>
+--></head><body><div class="chapter" lang="en" xml:lang="en"><div class="titlepage"><div><div><h1 class="title"><a id="authlib" shape="rect"> </a>Courier Authentication Library</h1></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#authpwd" shape="rect">The <code class="literal">authpwd</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authshadow" shape="rect">The <code class="literal">authshadow</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authpam" shape="rect">The <code class="literal">authpam</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authpipe" shape="rect">The <code class="literal">authpipe</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authpipeproto" shape="rect">The <code class="literal">authpipe</code> protocol</a></span></dt><dt><span class="sect1"><a href="#authuserdb" shape="rect">The <code class="literal">authuserdb</code> authentication module</a></span></dt><dd><dl><dt><span class="sect2"><a href="#userdbprimer" shape="rect">A brief <code class="literal">userdb</code> primer</a></span></dt><dt><span class="sect2"><a href="#userdbsimple" shape="rect">A simple userdb setup</a></span></dt><dt><span class="sect2"><a href="#userdbcomplex" shape="rect">Large virtual domain farm</a></span></dt><dt><span class="sect2"><a href="#moreuserdb" shape="rect">Beyond <code class="literal">userdb</code></a></span></dt></dl></dd><dt><span class="sect1"><a href="#authmysql" shape="rect">The <code class="literal">authmysql</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authpgsql" shape="rect">The <code class="literal">authpgsql</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authldap" shape="rect">The <code class="literal">authldap</code> authentication module</a></span></dt><dt><span class="sect1"><a href="#authcustom" shape="rect"><code class="literal">authcustom</code></a></span></dt><dt><span class="sect1"><a href="#options" shape="rect">Account options</a></span></dt><dt><span class="sect1"><a href="#authtest" shape="rect">Running <span class="command"><strong>authtest</strong></span></a></span></dt><dd><dl><dt><span class="sect2"><a href="#pwchange" shape="rect">Changing account passwords</a></span></dt></dl></dd><dt><span class="sect1"><a href="#internals" shape="rect">Authentication internals</a></span></dt><dt><span class="sect1"><a href="#files" shape="rect">FILES</a></span></dt><dt><span class="sect1"><a href="#seealso" shape="rect">SEE ALSO</a></span></dt></dl></div><p>
 This library is used for two purposes:</p><p>
 1. Read the name of a mail account.
 Determine the local account's home directory, and system userid and
 This library is used for two purposes:</p><p>
 1. Read the name of a mail account.
 Determine the local account's home directory, and system userid and
@@ -209,7 +209,7 @@ request is a single line terminated by newline.
     </p></dd></dl></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authuserdb" shape="rect"> </a>The <code class="literal">authuserdb</code> authentication module</h2></div></div></div><p>
 This module
 uses a GDBM or a DB-based
     </p></dd></dl></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authuserdb" shape="rect"> </a>The <code class="literal">authuserdb</code> authentication module</h2></div></div></div><p>
 This module
 uses a GDBM or a DB-based
-<a href="userdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">userdb</span>(8)</span></a> database.
+<a class="ulink" href="userdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">userdb</span>(8)</span></a> database.
 This module also incorporates userdb-based challenge-response authentication
 implementation that was done by a separate <code class="literal">authcram</code> module
 in previous versions of the Courier authentication library.</p><p>
 This module also incorporates userdb-based challenge-response authentication
 implementation that was done by a separate <code class="literal">authcram</code> module
 in previous versions of the Courier authentication library.</p><p>
@@ -219,7 +219,7 @@ The file contains a list of account names, and their pertinent information.
 <code class="filename">@sysconfdir@/authlib/userdb</code> may alternatively be a
 directory containing plain text files, which are effectively concatenated
 together to form the actual list of accounts.
 <code class="filename">@sysconfdir@/authlib/userdb</code> may alternatively be a
 directory containing plain text files, which are effectively concatenated
 together to form the actual list of accounts.
-The <span><strong class="command">makeuserdb</strong></span> script compiles the account information
+The <span class="command"><strong>makeuserdb</strong></span> script compiles the account information
 into a GDBM or DB database file, which can be quickly looked up.</p><p>
 <code class="filename">@sysconfdir@/authlib/userdb</code> is loosely equivalent in
 function to <code class="filename">/etc/passwd</code> and
 into a GDBM or DB database file, which can be quickly looked up.</p><p>
 <code class="filename">@sysconfdir@/authlib/userdb</code> is loosely equivalent in
 function to <code class="filename">/etc/passwd</code> and
@@ -243,7 +243,7 @@ scan <code class="filename">/etc/passwd</code> in order to look up an account.
 Instead, a fast database lookup can retrieve the same information from the
 database file.
 Review the included manual pages, starting with
 Instead, a fast database lookup can retrieve the same information from the
 database file.
 Review the included manual pages, starting with
-<a href="userdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">userdb</span>(8)</span></a>, for more information.</p><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="userdbprimer" shape="rect"> </a>A brief <code class="literal">userdb</code> primer</h3></div></div></div><p>
+<a class="ulink" href="userdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">userdb</span>(8)</span></a>, for more information.</p><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="userdbprimer" shape="rect"> </a>A brief <code class="literal">userdb</code> primer</h3></div></div></div><p>
 <code class="literal">userdb</code> is a way to implement many virtual mailboxes - many
 mailboxes that do not have to have a separate system userid allocated for
 each one, and there is no system login associated with each mailbox.
 <code class="literal">userdb</code> is a way to implement many virtual mailboxes - many
 mailboxes that do not have to have a separate system userid allocated for
 each one, and there is no system login associated with each mailbox.
@@ -251,15 +251,15 @@ each one, and there is no system login associated with each mailbox.
 maildirs. It should be scalable to thousands of mailboxes. It can also be
 used to replace linear searches of <code class="filename">/etc/passwd</code> with a database
 lookup, see
 maildirs. It should be scalable to thousands of mailboxes. It can also be
 used to replace linear searches of <code class="filename">/etc/passwd</code> with a database
 lookup, see
-<a href="pw2userdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">pw2userdb</span>(8)</span></a>.</p><p>
+<a class="ulink" href="pw2userdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">pw2userdb</span>(8)</span></a>.</p><p>
 Note - you still MUST use some valid system userid and groupid that is
 shared by all virtual mailboxes. Instead of allocating a single userid and
 groupid per each mailbox, the same userid and groupid is used for all of
 them.</p><p>
 This is a rough overview of using userdb. For additional information, read
 Note - you still MUST use some valid system userid and groupid that is
 shared by all virtual mailboxes. Instead of allocating a single userid and
 groupid per each mailbox, the same userid and groupid is used for all of
 them.</p><p>
 This is a rough overview of using userdb. For additional information, read
-<a href="userdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">userdb</span>(8)</span></a>
+<a class="ulink" href="userdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">userdb</span>(8)</span></a>
 and
 and
-<a href="makeuserdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">makeuserdb</span>(8)</span></a>. All the scripts will
+<a class="ulink" href="makeuserdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">makeuserdb</span>(8)</span></a>. All the scripts will
 be installed in <code class="filename">@sbindir@</code>, so look for them there.</p><p>
 The best way to describe how <code class="literal">userdb</code> works is to try to create
 one virtual mail account. As mentioned before, virtual mailboxes still need
 be installed in <code class="filename">@sbindir@</code>, so look for them there.</p><p>
 The best way to describe how <code class="literal">userdb</code> works is to try to create
 one virtual mail account. As mentioned before, virtual mailboxes still need
@@ -272,7 +272,7 @@ virtual mailboxes.</p><p>Create an empty <code class="filename">@userdb@</code>
 # chmod 700 @userdb@</pre></div><p>
 <code class="filename">@userdb@</code> must have 700 permissions,
 since it will contain passwords.</p><p>
 # chmod 700 @userdb@</pre></div><p>
 <code class="filename">@userdb@</code> must have 700 permissions,
 since it will contain passwords.</p><p>
-Now, run the script <span><strong class="command">pw2userdb</strong></span>, as root.
+Now, run the script <span class="command"><strong>pw2userdb</strong></span>, as root.
 This script converts the
 contents of <code class="filename">/etc/passwd</code>
 to the <code class="filename">@userdb@</code> format
 This script converts the
 contents of <code class="filename">/etc/passwd</code>
 to the <code class="filename">@userdb@</code> format
@@ -287,17 +287,17 @@ use a fast
 of <code class="filename">/etc/passwd</code>
 in order to look up system accounts. However, you probably don't want to
 use this feature right now, so what you want to do is take the output
 of <code class="filename">/etc/passwd</code>
 in order to look up system accounts. However, you probably don't want to
 use this feature right now, so what you want to do is take the output
-of <span><strong class="command">pw2userdb</strong></span>, and find the entry for the vmail account
+of <span class="command"><strong>pw2userdb</strong></span>, and find the entry for the vmail account
 that you
 created earlier. Look for a line that starts with 'vmail' followed by tab,
 followed by familiar fields from <code class="filename">/etc/passwd</code>. Save the
 output of
 that you
 created earlier. Look for a line that starts with 'vmail' followed by tab,
 followed by familiar fields from <code class="filename">/etc/passwd</code>. Save the
 output of
-<span><strong class="command">pw2userdb</strong></span> in a temporary file, edit it, and remove
+<span class="command"><strong>pw2userdb</strong></span> in a temporary file, edit it, and remove
 everything
 except the line containing vmail, and the very next line, which is a special
 entry that maps vmail's userid back to the vmail record.</p><p>
 Here's what you might find in the output of
 everything
 except the line containing vmail, and the very next line, which is a special
 entry that maps vmail's userid back to the vmail record.</p><p>
 Here's what you might find in the output of
-<span><strong class="command">pw2userdb</strong></span>:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
+<span class="command"><strong>pw2userdb</strong></span>:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
 vmail   uid=1012|gid=1012|home=/home/vmail|systempw=*
 1012=   vmail</pre></div><p>
 The actual numerical values and the home directory location may vary.
 vmail   uid=1012|gid=1012|home=/home/vmail|systempw=*
 1012=   vmail</pre></div><p>
 The actual numerical values and the home directory location may vary.
@@ -315,7 +315,7 @@ $ maildirmake john-example/Maildir
 $ exit
 #
 </pre></div><p>
 $ exit
 #
 </pre></div><p>
-You may need to specify a full path to your <span><strong class="command">maildirmake</strong></span>
+You may need to specify a full path to your <span class="command"><strong>maildirmake</strong></span>
 program. The end result is that you created
 <code class="filename">$HOME/john-example</code> in vmail's account, which
 can be thought of as a “<span class="quote">virtual home directory</span>” for
 program. The end result is that you created
 <code class="filename">$HOME/john-example</code> in vmail's account, which
 can be thought of as a “<span class="quote">virtual home directory</span>” for
@@ -336,7 +336,7 @@ One more detail: we need to set the IMAP password for this
 mailbox:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
 # userdbpw | userdb "john@example.com" set imappw</pre></div><p>
 On most modern Linux and BSD distributions, you can specify the -md5
 mailbox:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
 # userdbpw | userdb "john@example.com" set imappw</pre></div><p>
 On most modern Linux and BSD distributions, you can specify the -md5
-option to <span><strong class="command">userdbpw</strong></span>, in order to use MD5 password hashes,
+option to <span class="command"><strong>userdbpw</strong></span>, in order to use MD5 password hashes,
 instead of crypt. The traditional password function allows passwords only
 up to 8 characters long; everything in excess is ignored.
 The newer MD5 passwords, now supported by most modern systems, allow
 instead of crypt. The traditional password function allows passwords only
 up to 8 characters long; everything in excess is ignored.
 The newer MD5 passwords, now supported by most modern systems, allow
@@ -361,7 +361,7 @@ Courier reads <code class="filename">@userdb@.dat</code> and
 <code class="filename">@userdb@shadow.dat</code> only. The plain text source,
 <code class="filename">@userdb@</code> is not read by Courier itself. Changes take
 effect
 <code class="filename">@userdb@shadow.dat</code> only. The plain text source,
 <code class="filename">@userdb@</code> is not read by Courier itself. Changes take
 effect
-only when <span><strong class="command">makeuserdb</strong></span> runs.</p></div><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="userdbcomplex" shape="rect"> </a>Large virtual domain farm</h3></div></div></div><p>
+only when <span class="command"><strong>makeuserdb</strong></span> runs.</p></div><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="userdbcomplex" shape="rect"> </a>Large virtual domain farm</h3></div></div></div><p>
 The previous approach used a single flat file, <code class="filename">@userdb@</code>.
 This
 will work for up to a couple of hundred accounts.
 The previous approach used a single flat file, <code class="filename">@userdb@</code>.
 This
 will work for up to a couple of hundred accounts.
@@ -394,7 +394,7 @@ $ userdb "example-com/john@example.com" set \
              home=/home/vmail/domains/example-com/john \
              uid=UUU gid=GGG</pre></div><p>
 This creates the file <code class="filename">@userdb@/example-com</code> (the first
              home=/home/vmail/domains/example-com/john \
              uid=UUU gid=GGG</pre></div><p>
 This creates the file <code class="filename">@userdb@/example-com</code> (the first
-parameter to the <span><strong class="command">userdb</strong></span> command), and appends a record named
+parameter to the <span class="command"><strong>userdb</strong></span> command), and appends a record named
 "john@example.com". You will store all <code class="literal">userdb</code> entries for
 <code class="literal">@example.com</code> in the file
 <code class="filename">@userdb@/example-com</code>. All
 "john@example.com". You will store all <code class="literal">userdb</code> entries for
 <code class="literal">@example.com</code> in the file
 <code class="filename">@userdb@/example-com</code>. All
@@ -414,9 +414,7 @@ such as
 <code class="literal">authpgsql</code>.
 Since <code class="literal">userdb</code> is maintained as plain text files that
 are easily parsed by a script, migrating data from userdb will not be
 <code class="literal">authpgsql</code>.
 Since <code class="literal">userdb</code> is maintained as plain text files that
 are easily parsed by a script, migrating data from userdb will not be
-difficult.</p></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authvchkpw" shape="rect"> </a>The <code class="literal">authvchkpw</code> authentication module</h2></div></div></div><p>
-This module uses
-the <code class="literal">vpopmail/vchkpw</code> library for authentication.</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authmysql" shape="rect"> </a>The <code class="literal">authmysql</code> authentication module</h2></div></div></div><p>
+difficult.</p></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authmysql" shape="rect"> </a>The <code class="literal">authmysql</code> authentication module</h2></div></div></div><p>
 This module reads
 the list of mail accounts and passwords from a table in a
 MySQL database.
 This module reads
 the list of mail accounts and passwords from a table in a
 MySQL database.
@@ -452,13 +450,13 @@ only available with
 modules. Individual account options are not supported with
 system-based authentication modules (password/shadow files, or PAM).</p><p>
 See the
 modules. Individual account options are not supported with
 system-based authentication modules (password/shadow files, or PAM).</p><p>
 See the
-<a href="auth_generic.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">auth_generic</span>(3)</span></a>
+<a class="ulink" href="auth_generic.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">auth_generic</span>(3)</span></a>
 for a description of option names used by various Courier packages.
 Other applications can make up names for their own settings, and
 use them in the same way.</p><p>
 Account options are specified via the authentication modules in the
 following manner:</p><div class="variablelist"><dl><dt><span class="term"><code class="literal">userdb</code></span></dt><dd><p>
 for a description of option names used by various Courier packages.
 Other applications can make up names for their own settings, and
 use them in the same way.</p><p>
 Account options are specified via the authentication modules in the
 following manner:</p><div class="variablelist"><dl><dt><span class="term"><code class="literal">userdb</code></span></dt><dd><p>
-Use the <span><strong class="command">userdb</strong></span> command to set a field called
+Use the <span class="command"><strong>userdb</strong></span> command to set a field called
 "<code class="literal">options</code>". Example:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
 userdb user1@example.com set options=disableimap=1,sharedgroup=44
 makeuserdb
 "<code class="literal">options</code>". Example:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
 userdb user1@example.com set options=disableimap=1,sharedgroup=44
 makeuserdb
@@ -503,31 +501,31 @@ suitable (albeit ugly) SQL fragment that combines them together into
 the expected option string. An example of such an SQL string is
 provided in the comments portion of the configuration file.</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
 When using the alternative custom query option, the option string
 the expected option string. An example of such an SQL string is
 provided in the comments portion of the configuration file.</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
 When using the alternative custom query option, the option string
-        is the last field that the custom SQL query should return.</p></div></dd></dl></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authtest" shape="rect"> </a>Running <span><strong class="command">authtest</strong></span></h2></div></div></div><p>
-The <span><strong class="command">authtest</strong></span> command may be used to verify that the
+        is the last field that the custom SQL query should return.</p></div></dd></dl></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authtest" shape="rect"> </a>Running <span class="command"><strong>authtest</strong></span></h2></div></div></div><p>
+The <span class="command"><strong>authtest</strong></span> command may be used to verify that the
 authentication library is working:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
 authtest userid
 authtest userid password
 authtest userid password newpassword
 authenumerate</pre></div><p>
 Running
 authentication library is working:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
 authtest userid
 authtest userid password
 authtest userid password newpassword
 authenumerate</pre></div><p>
 Running
-<span><strong class="command">authtest</strong></span>
+<span class="command"><strong>authtest</strong></span>
 with one argument should display the selected account's
 home directory, userid, groupid,
 and other related data.
 The second argument to
 with one argument should display the selected account's
 home directory, userid, groupid,
 and other related data.
 The second argument to
-<span><strong class="command">authtest</strong></span>,
+<span class="command"><strong>authtest</strong></span>,
 if supplied, specifies the account's password.
 The two argument form of
 if supplied, specifies the account's password.
 The two argument form of
-<span><strong class="command">authtest</strong></span>
+<span class="command"><strong>authtest</strong></span>
 validates the password, and displays an indication whether the given
 password is valid, or not.
 The three argument form of the
 validates the password, and displays an indication whether the given
 password is valid, or not.
 The three argument form of the
-<span><strong class="command">authtest</strong></span>
+<span class="command"><strong>authtest</strong></span>
 command attemps to change the account's password.
 The second argument is the old password, the third argument is the
 new password.</p><p>
 command attemps to change the account's password.
 The second argument is the old password, the third argument is the
 new password.</p><p>
-See <a href="README.authdebug.html" target="_top" shape="rect"><code class="filename">README.authdebug.html</code></a> for more information.</p><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="pwchange" shape="rect"> </a>Changing account passwords</h3></div></div></div><p>For the virtual domain modules (<code class="literal">authldap</code>,
+See <a class="ulink" href="README.authdebug.html" target="_top" shape="rect"><code class="filename">README.authdebug.html</code></a> for more information.</p><div class="sect2" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="pwchange" shape="rect"> </a>Changing account passwords</h3></div></div></div><p>For the virtual domain modules (<code class="literal">authldap</code>,
 <code class="literal">authmysql</code>, <code class="literal">authpgsql</code> and friends) changing the
 login is a no-brainer. The tricky situation is when SqWebMail uses system
 passwords to log in (the <code class="literal">authpwd</code>, <code class="literal">authshadow</code>, or
 <code class="literal">authmysql</code>, <code class="literal">authpgsql</code> and friends) changing the
 login is a no-brainer. The tricky situation is when SqWebMail uses system
 passwords to log in (the <code class="literal">authpwd</code>, <code class="literal">authshadow</code>, or
@@ -537,14 +535,14 @@ ways to keep login passwords. Many systems use the traditional
 use a binary database; other systems use NIS. And on some systems the
 password file lookup library is a wrapper that goes against an external LDAP
 directory, or a database. For maximum compatibility, SqWebMail changes login
 use a binary database; other systems use NIS. And on some systems the
 password file lookup library is a wrapper that goes against an external LDAP
 directory, or a database. For maximum compatibility, SqWebMail changes login
-passwords by running the <span><strong class="command">passwd</strong></span> command. This is the traditinal
-*nix command that changes login passwords. <span><strong class="command">passwd</strong></span> is an
+passwords by running the <span class="command"><strong>passwd</strong></span> command. This is the traditinal
+*nix command that changes login passwords. <span class="command"><strong>passwd</strong></span> is an
 interactive command. It's normally run from a terminal.
  SqWebMail uses an
 interactive command. It's normally run from a terminal.
  SqWebMail uses an
-<span><strong class="command">expect</strong></span> script - as mentioned in
+<span class="command"><strong>expect</strong></span> script - as mentioned in
 the introduction - to answer interactive
 the introduction - to answer interactive
-prompts from <span><strong class="command">passwd</strong></span>. The <span><strong class="command">expect</strong></span> script expects to
-get a plain, garden-variety, <span><strong class="command">passwd</strong></span> command, which acts
+prompts from <span class="command"><strong>passwd</strong></span>. The <span class="command"><strong>expect</strong></span> script expects to
+get a plain, garden-variety, <span class="command"><strong>passwd</strong></span> command, which acts
 something like this:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
      # passwd
      Changing password for luser
 something like this:</p><div class="informalexample"><pre class="programlisting" xml:space="preserve">
      # passwd
      Changing password for luser
@@ -554,21 +552,21 @@ something like this:</p><div class="informalexample"><pre class="programlisting"
      passwd: all authentication tokens updated successfully
      #
 </pre></div><p>
      passwd: all authentication tokens updated successfully
      #
 </pre></div><p>
-Systems that use a <span><strong class="command">passwd</strong></span> command with very different prompts
-may find that the default <span><strong class="command">expect</strong></span> script will fail. In which case
-it will be necessary to tweak the <span><strong class="command">expect</strong></span> script to match the
-prompts from the system's <span><strong class="command">passwd</strong></span> command.</p><p>
-Modern systems use a <span><strong class="command">passwd</strong></span> command that rejects "bad"
+Systems that use a <span class="command"><strong>passwd</strong></span> command with very different prompts
+may find that the default <span class="command"><strong>expect</strong></span> script will fail. In which case
+it will be necessary to tweak the <span class="command"><strong>expect</strong></span> script to match the
+prompts from the system's <span class="command"><strong>passwd</strong></span> command.</p><p>
+Modern systems use a <span class="command"><strong>passwd</strong></span> command that rejects "bad"
 passwords - passwords that are based on dictionary words, are too short, or
 are obvious for other reasons. When testing the ability to change
 system passwords be sure to use randomly-generated gibberish for the test
 passwords - passwords that are based on dictionary words, are too short, or
 are obvious for other reasons. When testing the ability to change
 system passwords be sure to use randomly-generated gibberish for the test
-passwords. Otherwise, the default <span><strong class="command">expect</strong></span> script will
+passwords. Otherwise, the default <span class="command"><strong>expect</strong></span> script will
 actually be
 working, but you won't be the wiser. For security reasons, the actual
 actually be
 working, but you won't be the wiser. For security reasons, the actual
-messages from <span><strong class="command">passwd</strong></span> will not be shown by.</p><p>
-The <span><strong class="command">expect</strong></span> script is installed as
+messages from <span class="command"><strong>passwd</strong></span> will not be shown by.</p><p>
+The <span class="command"><strong>expect</strong></span> script is installed as
 <code class="filename">/usr/local/libexec/courier-authlib/authsystem.passwd</code>
 <code class="filename">/usr/local/libexec/courier-authlib/authsystem.passwd</code>
-(assuming default options to the <span><strong class="command">configure</strong></span> script).</p></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="internals" shape="rect"> </a>Authentication internals</h2></div></div></div><p>
+(assuming default options to the <span class="command"><strong>configure</strong></span> script).</p></div></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="internals" shape="rect"> </a>Authentication internals</h2></div></div></div><p>
 The following structure describes an authentication module:</p><div class="blockquote"><blockquote class="blockquote"><div class="example"><a id="authstaticinfo" shape="rect"> </a><p class="title"><b>Example 1. struct authstaticinfo</b></p><div class="example-contents"><pre class="programlisting" xml:space="preserve">
 struct authstaticinfo {
        const char *auth_name;
 The following structure describes an authentication module:</p><div class="blockquote"><blockquote class="blockquote"><div class="example"><a id="authstaticinfo" shape="rect"> </a><p class="title"><b>Example 1. struct authstaticinfo</b></p><div class="example-contents"><pre class="programlisting" xml:space="preserve">
 struct authstaticinfo {
        const char *auth_name;
@@ -665,7 +663,7 @@ to the callback function as a second argument.
 The first argument is a pointer to the
 <span class="structname">authinfo</span> structure, which is described in detail
 in the
 The first argument is a pointer to the
 <span class="structname">authinfo</span> structure, which is described in detail
 in the
-<a href="auth_generic.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">auth_generic</span>(3)</span></a>
+<a class="ulink" href="auth_generic.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">auth_generic</span>(3)</span></a>
 manual page.
 The authentication module is responsible for allocating this structure.
 After the callback function returns this structure can be deallocated.
 manual page.
 The authentication module is responsible for allocating this structure.
 After the callback function returns this structure can be deallocated.
@@ -712,10 +710,10 @@ the callback function one last time, with a NULL pointer for the login ID,
 then returns.  If an error is encountered while enumerating the login IDs,
 <code class="function">auth_enumerate</code> terminates without invoking
 the callback function with a NULL login ID.</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="files" shape="rect"> </a>FILES</h2></div></div></div><p>
 then returns.  If an error is encountered while enumerating the login IDs,
 <code class="function">auth_enumerate</code> terminates without invoking
 the callback function with a NULL login ID.</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="files" shape="rect"> </a>FILES</h2></div></div></div><p>
-<code class="filename"> @authdaemonrc@</code> - <span><strong class="command">authdaemond</strong></span> configuration file</p><p>
-<code class="filename"> @authldaprc@</code> - <span><strong class="command">authldap</strong></span> configuration file</p><p>
-<code class="filename"> @authmysqlrc@</code> - <span><strong class="command">authmysql</strong></span> configuration file</p><p>
-<code class="filename"> @authpgsqlrc@</code> - <span><strong class="command">authpgsql</strong></span> configuration file</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="seealso" shape="rect"> </a>SEE ALSO</h2></div></div></div><p>
-<a href="courier.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">courier</span>(8)</span></a>,
+<code class="filename"> @authdaemonrc@</code> - <span class="command"><strong>authdaemond</strong></span> configuration file</p><p>
+<code class="filename"> @authldaprc@</code> - <span class="command"><strong>authldap</strong></span> configuration file</p><p>
+<code class="filename"> @authmysqlrc@</code> - <span class="command"><strong>authmysql</strong></span> configuration file</p><p>
+<code class="filename"> @authpgsqlrc@</code> - <span class="command"><strong>authpgsql</strong></span> configuration file</p></div><div class="sect1" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="seealso" shape="rect"> </a>SEE ALSO</h2></div></div></div><p>
+<a class="ulink" href="courier.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">courier</span>(8)</span></a>,
  
  
-<a href="userdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">userdb</span>(8)</span></a></p></div></div></body></html>
+<a class="ulink" href="userdb.html" target="_top" shape="rect"><span class="citerefentry"><span class="refentrytitle">userdb</span>(8)</span></a></p></div></div></body></html>