#!/usr/bin/perl

use strict;

# Usage:
# mail_drop_priv_before_exec=yes
# mail_executable = /usr/local/sbin/dovecot-post-login.pl /usr/libexec/dovecot/imap

my $SHAREDDIR= '/var/spool/mail/Shared';

# Note: if mail_drop_priv_before_exec is not set,
# user and group-ids have to be switched according to some variables:
# RESTRICT_SETUID
# RESTRICT_SETGID
# if RESTRICT_SETEXTRAGROUPS exists:
# set additional groups

if (! @ARGV) {
  exit 1;
}

&set_namespaces();

# for testing...
if ($ENV{USER} eq 'abergolth') {
  #  print "* OK [ALERT] Hello $ENV{'USER'}!\n";
  system("env |sort >> /tmp/dovecot-env-$$");
}

exec(@ARGV) or die "Unable to exec @ARGV: $!";


# NAMESPACE/S-SPAMREP/LIST=yes
# NAMESPACE/S-SPAMREP/LOCATION=maildir:/var/spool/mail/Shared/spamrep:INDEX=~/Maildir/index/Shared/spamrep
# NAMESPACE/S-SPAMREP/PREFIX=Shared/spamrep/
# NAMESPACE/S-SPAMREP/SEPARATOR=/
# NAMESPACE/S-SPAMREP/TYPE=public
# NAMESPACE/S-TESTSHARED/LIST=yes
# NAMESPACE/S-TESTSHARED/LOCATION=maildir:/var/spool/mail/Shared/testshared:INDEX=~/Maildir/index/Shared/testshared
# NAMESPACE/S-TESTSHARED/PREFIX=Shared/testshared/
# NAMESPACE/S-TESTSHARED/SEPARATOR=/
# NAMESPACE/S-TESTSHARED/TYPE=public
# NAMESPACE=s-testshared s-spamrep
# USERDB_KEYS=SYSTEM_GROUPS_USER UID GID HOME  NAMESPACE/S-SPAMREP/LIST NAMESPACE NAMESPACE/S-TESTSHARED/SEPARATOR NAMESPACE/S-TESTSHARED/TYPE NAMESPACE/S-TESTSHARED/PREFIX NAMESPACE/S-TESTSHARED/LIST NAMESPACE/S-TESTSHARED/LOCATION NAMESPACE/S-SPAMREP/SEPARATOR NAMESPACE/S-SPAMREP/TYPE NAMESPACE/S-SPAMREP/PREFIX NAMESPACE/S-SPAMREP/LOCATION


sub set_namespaces {
  my $mailbox;
  local *D;
  if (opendir(D, $SHAREDDIR)) {
    my $dir;
    my @namespaces = ();
    while ($mailbox= readdir(D)) {
      next if ($mailbox =~ /^\./);
      # &log("inspect ${SHAREDDIR}/${mailbox}");
      if (-r "${SHAREDDIR}/${mailbox}") {
	my $nsname = 'S-'.uc($mailbox);
	push(@namespaces, lc($nsname));
	&log("adding NAMESPACE/${nsname}/PREFIX ${SHAREDDIR}/${mailbox}");

	$ENV{"NAMESPACE/${nsname}/LOCATION"} =
	  "maildir:$SHAREDDIR/$mailbox:INDEX=~/Maildir/index/Shared/$mailbox";
	# control-files should be shared, otherwise keyword name mapping will be broken
	#  "maildir:$SHAREDDIR/$mailbox:CONTROL=~/Maildir/control/Shared/$mailbox:INDEX=~/Maildir/index/Shared/$mailbox";
	$ENV{"NAMESPACE/${nsname}/PREFIX"} = "Shared/$mailbox/";
	$ENV{"NAMESPACE/${nsname}/TYPE"}= "public";
	$ENV{"NAMESPACE/${nsname}/SEPARATOR"}= "/";
	$ENV{"NAMESPACE/${nsname}/LIST"}= "yes";
	# $ENV{"NAMESPACE/${nsname}/SUBSCRIPTIONS"} = "no"
      }
    }
    closedir D;
    if (@namespaces) {
      $ENV{"NAMESPACE"} = join(' ', @namespaces);
      my @userdb_keys;
      if ($ENV{'USERDB_KEYS'}) {
	push(@userdb_keys, $ENV{'USERDB_KEYS'});
      }
      push(@userdb_keys, grep(/^NAMESPACE/, keys(%ENV)));
      $ENV{'USERDB_KEYS'} = join(' ', @userdb_keys);
      # &log("USERDB_KEYS = ".$ENV{'USERDB_KEYS'});
    }
  }
}


sub log {
  print STDERR "@_\n";
}
