[tpop3d-discuss] Notes on auth-flat-file

Paul Makepeace beasts.org at paulm.com
Thu, 10 Oct 2002 04:24:50 +0100

Setting this up went relatively smoothly with one minor oddness. On
glibc it seems the passwd file scanner needs a uid and gid in each line,
rather than just username:crypted_passwd or some variation involving
more colons.

Here are some details on how I set this up - feel free to use, add to
the distro, examples, etc.

My tpop3d.conf looks like,

mailbox: bsd:/var/mail/$(domain)/$(local_part)
mailspool-index: /var/lib/tpop3d/index/$(escaped_name)
auth-flatfile-enable: yes
auth-flatfile-mail-group: mail
auth-flatfile-mail-user: mail
auth-flatfile-passwd-file: /etc/mail/passwd/$(domain)

My exim4.conf now has in its director section,

  driver = accept
  local_part_prefix = real-
  require_files = /var/mail/${domain}
  transport = local_delivery_vmail

  driver = accept
  require_files = /var/mail/${domain}
  transport = local_delivery_vmail

# In the transports section,

  driver = appendfile
  file = /var/mail/${domain}/${local_part}
  headers_add = Delivered-To: $local_part@$domain
  group = mail
  user = mail
  #mode = 0660

# end of exim.conf snippet

I created this script (sudo -u mail) to add users, set their passwords,
and create spool directories if necessary,

#!/usr/bin/perl -w
use strict;

# Paul Makepeace <http://paulm.com/>, 2002-10-10:
# vmail_passwd

use File::Spec::Functions qw(catfile);

my $passwd_root = q[/etc/mail/passwd];
my $spool_root = q[/var/mail];

sub randletter {
        chr int (rand (26)) + (int (rand (1) + .5) % 2 ? 65 : 97);

sub usage {
        use File::Basename; my $me = basename $0;
        die "Usage: $me username\@domain\n";

usage unless @ARGV == 1;
my ($username, $domain) = $ARGV[0] =~ /(\S+)\@(\S+)/;
usage unless defined $username and defined $domain;

my $salt = randletter() . randletter();
my ($plaintext, $confirm);
system "stty -echo";
for(;;) {
        print "Password: ";
        chomp($plaintext = <STDIN>);
        print "\nConfirm: ";
        chomp($confirm = <STDIN>);
        print "\n";
        if ($plaintext ne $confirm) {
                print "Passwords don't match. Try again.\n";
        } else {
system "stty echo";
my $password = crypt ($plaintext, $salt);
my $passwd_file = catfile($passwd_root, $domain);
my $spool_dir = catfile($spool_root, $domain);
unless (-d $spool_dir) {
        mkdir $spool_dir, 0775
                or die "Can't create spool directory '$spool_dir': $!\n";
        print "Created $spool_dir\n";
open P, '>>', $passwd_file or die "Can't append to '$passwd_file': $!\n";
print P qq{$username:$password:0:0:::\n}; # yeah, the :0:0 are needed..
close P;
print "Added $username to $passwd_file\n";


Suggestions, patches, welcome!


Paul Makepeace ....................................... http://paulm.com/

"If I pass the buck, will I get the help, then you can count on me!"
   -- http://paulm.com/toys/surrealism/