package ISPMan::UserMan;

use strict;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $Config);

require Exporter;

@ISA = qw(Exporter AutoLoader);
@EXPORT = qw(
   newUser
   addUser
   editUser
   updateUser
   deleteUser
   getUsers
   createUser
);
$VERSION = '0.01';

use ISPMan::Config;
$Config=ISPMan::Config->new();






sub createUser {
   my $self=shift;
   my $r=shift;
   my $dn=$r->param("dn");
   my $template=$self->getTemplate("adduser.tmpl");
   print $template->fill_in(PACKAGE => "ISPMan");

}

sub newUser{
   my $self=shift;
   if ($self->addUser(@_)){
      print $self->refreshSignal();
      $self->editUser(@_);
   };
}





sub addUser{
   my $self=shift;
   my $r=shift;
   
   
   my $userid=$r->param("uid");
   $userid=lc($userid);
   $userid=~s/[^a-z]//g;
   $r->param("userid", $userid);

# lets  crypt the pass
   my $userpassword=$r->param("userpassword");
   if ($userpassword!~ /^\{crypt\}/) {
      $userpassword='{crypt}' . crypt($userpassword, join '', ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64]);
   }
   $r->param("userpassword", $userpassword);

   
   my $domain=$r->param("domain");

   my $_uid=join '_', ($r->param("uid"), $r->param("domain"));
   $_uid=~s/\./_/g;
   $r->param("uid", $_uid);
   
   my $dn="uid=$_uid, ou=users, domain=$domain, " . $self->{'Config'}{'ldapBaseDN'};
   
   $r->param("dn", $dn);
                    
   
   if  ($r->param("maildrophost")) {
      $self->{'imap'}->add($_uid, $r->param("maildrophost"));
   }
   return $self->{'ldap'}->AddUser($r);
}




sub editUser {
   my $self=shift;
   my $r=shift;
   my $dn=$r->param("dn");
   

   $self->{'user'}=$self->{'ldap'}->getEntryAsHashRef($r->param("dn"));

   my $template=$self->getTemplate("edituser.tmpl");
   print $template->fill_in(PACKAGE => "ISPMan");
}


sub deleteUser{
   my $self=shift;
   my $r=shift;
   
   my $uid=$r->param("uid");
   my $domain=$r->param("domain");

   $self->{'user'}=$self->{'ldap'}->getEntryAsHashRef($r->param("dn"));

   if ($self->{'user'}{"maildrophost"}=~/\S/) {
       $self->{'imap'}->delete($r->param("uid"),$r->param("maildrophost")) || die $!;
   }
   

   if ( $self->{'ldap'}->DeleteUser($r->param("dn"))){
      print $self->refreshSignal();
   }

}




sub updateUser {
   my $self=shift;
   my $r=shift;
   my $dn=$r->param("dn");
   my $userpassword=$r->param("userpassword");
   if ($userpassword!~ /^\{crypt\}/) {
      $userpassword='{crypt}' . crypt($userpassword, join '', ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64]);
   }
   
   $r->param("userpassword", $userpassword);
   $r->param("cn",  join ' ', ($r->param("givenname"), $r->param("sn")));

   my $mailacceptinggeneralid=[split(/\s+/, $r->param("mailacceptinggeneralid"))];
   $r->delete("mailacceptinggeneralid");
   $r->param("mailacceptinggeneralid", $mailacceptinggeneralid);

   my $maildrop=[split(/\s*\n\s*/, $r->param("maildrop"))];
   $r->delete("maildrop");

   $r->param("maildrop", $maildrop);
   $self->{'ldap'}->updateEntry($r);
}


sub getUsers{
   my $self=shift;
   my $dn=shift;
   my $userhash=$self->{'ldap'}->getEntriesAsHashRef($dn, "objectclass=person", ["cn", "uid"]);
   my $user;
   for (keys %$userhash) {
      ($userhash->{$_}{'cn'})?$user->{$userhash->{$_}{'cn'}}=$_:
      $user->{$userhash->{$_}{'uid'}}=$_;
   }
   return $user;

}

1;

__END__

