#!/usr/bin/perl

# VHCS(tm) - Virtual Hosting Control System
# Copyright (c) 2001-2004 by moleSoftware GmbH
# http://www.molesoftware.com
#
#
# License:
#    This program is free software; you can redistribute it and/or
#    modify it under the terms of the MPL Mozilla Public License
#    as published by the Free Software Foundation; either version 1.1    
#    of the License, or (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
#    MPL Mozilla Public License for more details.
#    
#    You may have received a copy of the MPL Mozilla Public License
#    along with this program.
#    
#    An on-line copy of the MPL Mozilla Public License can be found
#    http://www.mozilla.org/MPL/MPL-1.1.html
#
#
# The VHCS Home Page is at:
#
#    http://www.vhcs.net


use FindBin;
use lib "$FindBin::Bin/";
require 'vhcs2_common_code.pl';

use strict;

use warnings;

$main::mail_task_id = undef;

sub get_mta_hash_value {
    
    my ($hfile, $key) = @_;
    
    push_el(\@main::el, 'get_mta_hash_value()', 'Starting...');
    
    if (
        !defined($hfile) || $hfile eq '' ||
        !defined($key) || $key eq ''
       ) {
        
        push_el(\@main::el, 'get_mta_hash_value()', 'ERROR: Undefined Input Data...');
        
        return (-1, '');
        
    }
    
    my ($rs, $rdata) = (undef, undef);
    
    ($rs, $rdata) = get_file($hfile);
    
    return $rs if ($rs != 0);
    
    $rdata =~ /^$key\t+([^\n]+)\n/gim; $rdata = $1;
    
    if (!defined($rdata)) { $rdata = ''; }
    
    push_el(\@main::el, 'get_mta_hash_value()', 'Ending...');
    
    return (0, $rdata);
}

sub del_mta_hash_value {
    
    my ($hfile, $key) = @_;
    
    push_el(\@main::el, 'del_mta_hash_value()', 'Starting...');
    
    if (
        !defined($hfile) || $hfile eq '' ||
        !defined($key) || $key eq ''
       ) {
        
        push_el(\@main::el, 'del_mta_hash_value()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my ($rs, $rdata) = (undef, undef);
    
    ($rs, $rdata) = get_mta_hash_value($hfile, $key);
    
    return 0 if ($rdata eq '');

    ($rs, $rdata) = get_file($hfile);

    return $rs if ($rs != 0);
    
    $rdata =~ s/^$key\t+([^\n]+)\n//gim;
    
    $rs = store_file($hfile, $rdata, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'del_mta_hash_value()', 'Ending...');
    
    return 0;
}

sub set_mta_hash_value {
    
    my ($hfile, $key, $value) = @_;
    
    push_el(\@main::el, 'set_mta_hash_value()', 'Starting...');
    
    if (
        !defined($hfile) || $hfile eq '' ||
        !defined($key) || $key eq '' ||
        !defined($value) || $value eq ''
       ) {
        
        push_el(\@main::el, 'set_mta_hash_value()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my ($rs, $rdata, $fdata) = (undef, undef, undef);
    
    ($rs, $rdata) = get_mta_hash_value($hfile, $key);
    
    return $rs if ($rs != 0);
    
    ($rs, $fdata) = get_file($hfile);

    return $rs if ($rs != 0);
    
    $fdata =~ s/^$key\t+([^\n]+)\n//gim if ($rdata ne '');
    
    $fdata .= "$key\t$value\n";
    
    $rs = store_file($hfile, $fdata, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'set_mta_hash_value()', 'Ending...');
    
    return 0;
}

sub mbox_mngr_start_up {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'mbox_mngr_start_up()', 'Starting...');
    
    # checking for master process;
    
    $rs = check_master();
    
    return $rs if ($rs != 0);
    
    # Let's clear Execution Logs, if any.
    
    if (-e $main::vhcs2_mbox_mngr_el) {
        
        $rs = del_file($main::vhcs2_mbox_mngr_el);
        
        return $rs if ($rs != 0);
        
    }
    
    # config check;
    
    $rs = get_conf();
    
    return $rs if ($rs != 0);
    
    # sql check;
    
    #
    # getting initial data also must be done here;
    #
    
    my $sql = "select * from mail_users;";
    
    ($rs, $rdata) = doSQL($sql);
    
    return $rs if ($rs != 0);
    
    $rs = get_domain_ids();
    
    return $rs if ($rs != 0);
    
    $rs = get_subdom_ids();
    
    return $rs if ($rs != 0);
    
    $rs = get_alias_ids();
    
    return $rs if ($rs != 0);
    
    
    $main::mail_task_id = $ARGV[0];
    
    
    push_el(\@main::el, 'mbox_mngr_start_up()', 'Ending...');
    
    return 0;
    
}

sub mbox_mngr_shut_down {
    
    my $rs = undef;
    
    push_el(\@main::el, 'mbox_mngr_shut_down()', 'Starting...');
    
    push_el(\@main::el, 'mbox_mngr_shut_down()', 'Ending...');
    
    return 0;
    
}

#
#
#

sub mbox_add_mta_cfg_autorespond_data {
    
    my ($mbox_data) = @_;
    
    push_el(\@main::el, 'mbox_add_mta_cfg_autorespond_data()', 'Starting...');
    
    if (!defined($mbox_data) || $mbox_data eq '') {
        
        push_el(\@main::el, 'mbox_add_mta_cfg_autorespond_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my ($rs, $rdata) = (undef, undef);
    
    my $mail_id = @$mbox_data[0];
    
    my $mail_acc = @$mbox_data[1];
    
    my $mail_forward = @$mbox_data[3];
    
    my $mail_dmn_id = @$mbox_data[4];
    
    my $mail_type = @$mbox_data[5];
    
    my $mail_sub_id = @$mbox_data[6];
    
    my $mail_autorespond = @$mbox_data[8];
    
    
    my $conf_dir = $main::cfg{'CONF_DIR'};
    
    my $cmd_postmap = $main::cfg{'CMD_POSTMAP'};
    
    my $working_dir = "$conf_dir/postfix/working";
    
    my $backup_dir = "$conf_dir/postfix/backup";
    
    my $timestamp = time;
    
    my ($sys, $working) = (undef, undef);
    
    my $aliases_cfg = "/etc/postfix/vhcs2/aliases";
 
    my $aliases_working_cfg = "$working_dir/aliases";
 
    my $aliases_backup_cfg = "$backup_dir/aliases.$timestamp";
    
    my $transport_cfg = "/etc/postfix/vhcs2/transport";
 
    my $transport_working_cfg = "$working_dir/transport";
 
    my $transport_backup_cfg = "$backup_dir/transport.$timestamp";
    
    
    ($rs, $sys) = get_file($aliases_cfg);
        
    return $rs if ($rs != 0);
        
    $rs = store_file($aliases_backup_cfg, $sys, 'root', 'root', 0644);
        
    return $rs if ($rs != 0);
    
    ($rs, $sys) = get_file($transport_cfg);
        
    return $rs if ($rs != 0);
        
    $rs = store_file($transport_backup_cfg, $sys, 'root', 'root', 0644);
        
    return $rs if ($rs != 0);
    
    
    do {

        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $hash_key = "$mail_acc\@$dmn_name";
        
        my $hash_value = "$mail_acc\@$dmn_name,$mail_acc\@vhcs2-arpl.$dmn_name";
        
		$rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
        
		return $rs if ($rs != 0);
            
        $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        $hash_key = "vhcs2-arpl.$dmn_name";
        
        $hash_value = "vhcs2-arpl:";
        
        $rs = set_mta_hash_value($transport_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($transport_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($transport_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'normal_mail');
    
    do {

        my $dmn_name = $main::als_id_name{$mail_sub_id};
        
        my $hash_key = "$mail_acc\@$dmn_name";
        
        my $hash_value = "$mail_acc\@$dmn_name,$mail_acc\@vhcs2-arpl.$dmn_name";
        
		$rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
        
		return $rs if ($rs != 0);
            
        $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        $hash_key = "vhcs2-arpl.$dmn_name";
        
        $hash_value = "vhcs2-arpl:";
        
        $rs = set_mta_hash_value($transport_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($transport_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($transport_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'alias_mail');
    
    do {

        my $sub_pref = $main::sub_id_name{$mail_sub_id};
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $sub_name = "$sub_pref.$dmn_name";
        
        my $hash_key = "$mail_acc\@$sub_name";
        
        my $hash_value = "$mail_acc\@$sub_name,$mail_acc\@vhcs2-arpl.$sub_name";
        
		$rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
        
		return $rs if ($rs != 0);
            
        $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        $hash_key = "vhcs2-arpl.$sub_name";
        
        $hash_value = "vhcs2-arpl:";
        
        $rs = set_mta_hash_value($transport_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($transport_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($transport_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'subdom_mail');
    
    do {

        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $hash_key = "$mail_acc\@$dmn_name";
        
        my $hash_value = undef;
        
        ($rs, $rdata) = get_mta_hash_value($aliases_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        if ($rdata eq '') {
            
            $hash_value = "$mail_acc\@$dmn_name,$mail_acc\@vhcs2-arpl.$dmn_name";
            
        } else {
            
            $hash_value = $rdata.",$mail_acc\@vhcs2-arpl.$dmn_name";
            
        }
        
        $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        $hash_key = "vhcs2-arpl.$dmn_name";
        
        $hash_value = "vhcs2-arpl:";
        
        $rs = set_mta_hash_value($transport_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($transport_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($transport_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'normal_forward');
    
    do {

        my $dmn_name = $main::als_id_name{$mail_sub_id};
        
        my $hash_key = "$mail_acc\@$dmn_name";
        
        my $hash_value = undef;
        
        ($rs, $rdata) = get_mta_hash_value($aliases_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        if ($rdata eq '') {
            
            $hash_value = "$mail_acc\@$dmn_name,$mail_acc\@vhcs2-arpl.$dmn_name";
            
        } else {
            
            $hash_value = $rdata.",$mail_acc\@vhcs2-arpl.$dmn_name";
            
        }
        
        $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        $hash_key = "vhcs2-arpl.$dmn_name";
        
        $hash_value = "vhcs2-arpl:";
        
        $rs = set_mta_hash_value($transport_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($transport_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($transport_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'alias_forward');
    
    do {
        my $sub_pref = $main::sub_id_name{$mail_sub_id};
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $sub_name = "$sub_pref.$dmn_name";

        my $hash_key = "$mail_acc\@$sub_name";
        
        my $hash_value = undef;
        
        ($rs, $rdata) = get_mta_hash_value($aliases_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        if ($rdata eq '') {
            
            $hash_value = "$mail_acc\@$sub_name,$mail_acc\@vhcs2-arpl.$sub_name";
            
        } else {
            
            $hash_value = $rdata.",$mail_acc\@vhcs2-arpl.$sub_name";
            
        }
        
        $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        $hash_key = "vhcs2-arpl.$sub_name";
        
        $hash_value = "vhcs2-arpl:";
        
        $rs = set_mta_hash_value($transport_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($transport_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($transport_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'subdom_forward');
    
    $rs = sys_command("$cmd_postmap $transport_cfg");
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'mbox_add_mta_cfg_autorespond_data()', 'Ending...');
    
    return 0;
    
}

sub mbox_check_last_transport_entry {
    
    my ($mbox_data) = @_;
    
    push_el(\@main::el, 'mbox_check_last_transport_entry()', 'Starting...');
    
    if (!defined($mbox_data) || $mbox_data eq '') {
        
        push_el(\@main::el, 'mbox_check_last_transport_entry()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my ($rs, $rows, $sql) = (undef, undef, undef);
    
    my $mail_dmn_id = @$mbox_data[4];
    
    my $mail_sub_id = @$mbox_data[6];
    
    my $mail_type = @$mbox_data[5];
    
    if ($mail_type eq 'alias_mail' || $mail_type eq 'alias_forward') {
        
        $sql = "select count(mail_id) as cnt from mail_users where (status = 'ok' or status = 'change') and mail_auto_respond != '_no_' and domain_id = $mail_dmn_id and sub_id = $mail_sub_id and mail_type != 'normal_catchall' and mail_type != 'alias_catchall';";    
        
    } else {
        
        $sql = "select count(mail_id) as cnt from mail_users where (status = 'ok' or status = 'change') and mail_auto_respond != '_no_' and domain_id = $mail_dmn_id and mail_type != 'normal_catchall' and mail_type != 'alias_catchall';";    
        
    }
    
    ($rs, $rows) = doSQL($sql);
    
    return $rs if ($rs != 0);
    
    $rs = @$rows[0];
    
    push_el(\@main::el, 'mbox_check_last_transport_entry()', 'Ending...');
    
    return @$rs[0];
    
}

sub mbox_del_last_transport_entry {
    
    my ($mbox_data) = @_;
    
    push_el(\@main::el, 'mbox_del_last_transport_entry()', 'Starting...');
    
    if (!defined($mbox_data) || $mbox_data eq '') {
        
        push_el(\@main::el, 'mbox_del_last_transport_entry()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my ($rs, $rdata) = (undef, undef);
    
    
    my $mail_dmn_id = @$mbox_data[4];
    
    my $mail_sub_id = @$mbox_data[6];
    
    my $mail_type = @$mbox_data[5];
    
    my $dmn_name = $main::domain_id_name{$mail_dmn_id};
    
    
    my $conf_dir = $main::cfg{'CONF_DIR'};
    
    my $working_dir = "$conf_dir/postfix/working";
 
    my $transport_working_cfg = "$working_dir/transport";
    
    
    my $hash_key = "vhcs2-arpl.$dmn_name";
    
    if ($mail_type eq 'alias_mail' || $mail_type eq 'alias_forward') {
        
        my $als_name = $main::als_id_name{$mail_sub_id};
        
        $hash_key = "vhcs2-arpl.$als_name";
        
    }
    
    
    $rs = del_mta_hash_value($transport_working_cfg, $hash_key);
    
    return $rs if ($rs != 0);
    
    
    if ($mail_type ne 'alias_mail' && $mail_type ne 'alias_forward') {
    
        my ($sub_key, $sub_value) = (undef, undef);
        
        foreach $sub_key (keys %main::sub_id_parentid) {
            
            $sub_value = $main::sub_id_parentid{$sub_key};
            
            if ($sub_value == $mail_dmn_id) {
                
                # We've got one ;). It must be removed;
                
                my $sub_pref = $main::sub_id_name{$sub_key};
                
                my $sub_name = "$sub_pref.$dmn_name";
                
                $hash_key = "vhcs2-arpl.$sub_name";
                
                $rs = del_mta_hash_value($transport_working_cfg, $hash_key);
        
                return $rs if ($rs != 0);
                
            }
            
        }
        
    }
    
    push_el(\@main::el, 'mbox_del_last_transport_entry()', 'Ending...');
    
    return 0;
    
}

sub mbox_del_mta_cfg_autorespond_data {
    
    my ($mbox_data) = @_;
    
    push_el(\@main::el, 'mbox_del_mta_cfg_autorespond_data()', 'Starting...');
    
    if (!defined($mbox_data) || $mbox_data eq '') {
        
        push_el(\@main::el, 'mbox_del_mta_cfg_autorespond_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my ($rs, $rdata) = (undef, undef);
    
    my $mail_id = @$mbox_data[0];
    
    my $mail_acc = @$mbox_data[1];
    
    my $mail_forward = @$mbox_data[3];
    
    my $mail_dmn_id = @$mbox_data[4];
    
    my $mail_type = @$mbox_data[5];
    
    my $mail_sub_id = @$mbox_data[6];
    
    my $mail_autorespond = @$mbox_data[8];
    
    
    my $conf_dir = $main::cfg{'CONF_DIR'};
    
    my $cmd_postmap = $main::cfg{'CMD_POSTMAP'};
    
    my $working_dir = "$conf_dir/postfix/working";
    
    my $backup_dir = "$conf_dir/postfix/backup";
    
    my $timestamp = time;
    
    my ($sys, $working) = (undef, undef);
    
    my $aliases_cfg = "/etc/postfix/vhcs2/aliases";
 
    my $aliases_working_cfg = "$working_dir/aliases";
 
    my $aliases_backup_cfg = "$backup_dir/aliases.$timestamp";
    
    my $transport_cfg = "/etc/postfix/vhcs2/transport";
 
    my $transport_working_cfg = "$working_dir/transport";
 
    my $transport_backup_cfg = "$backup_dir/transport.$timestamp";
    
    
    ($rs, $sys) = get_file($aliases_cfg);
        
    return $rs if ($rs != 0);
        
    $rs = store_file($aliases_backup_cfg, $sys, 'root', 'root', 0644);
        
    return $rs if ($rs != 0);
    
    ($rs, $sys) = get_file($transport_cfg);
        
    return $rs if ($rs != 0);
        
    $rs = store_file($transport_backup_cfg, $sys, 'root', 'root', 0644);
        
    return $rs if ($rs != 0);
    
    
    do {

        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $hash_key = "$mail_acc\@$dmn_name";
        
        $rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        $rs = mbox_check_last_transport_entry($mbox_data);
        
        if ($rs == 0) {
            
            $rs = mbox_del_last_transport_entry($mbox_data);
            
            return $rs if ($rs != 0);
            
        } elsif ($rs == -1) {
            
            return $rs;
            
        }
        
        
        ($rs, $working) = get_file($transport_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($transport_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'normal_mail');
    
    do {

        my $dmn_name = $main::als_id_name{$mail_sub_id};
        
        my $hash_key = "$mail_acc\@$dmn_name";
        
        $rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        $rs = mbox_check_last_transport_entry($mbox_data);
        
        if ($rs == 0) {
            
            $rs = mbox_del_last_transport_entry($mbox_data);
            
            return $rs if ($rs != 0);
            
        } elsif ($rs == -1) {
            
            return $rs;
            
        }
        
        
        ($rs, $working) = get_file($transport_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($transport_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'alias_mail');
    
    do {
        
        my $sub_pref = $main::sub_id_name{$mail_sub_id};
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $sub_name = "$sub_pref.$dmn_name";
        
        my $hash_key = "$mail_acc\@$sub_name";
        
        
        $rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        $rs = mbox_check_last_transport_entry($mbox_data);
        
        if ($rs == 0) {
            
            $rs = mbox_del_last_transport_entry($mbox_data);
            
            return $rs if ($rs != 0);
            
        } elsif ($rs == -1) {
            
            return $rs;
            
        }
        
        
        ($rs, $working) = get_file($transport_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($transport_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'subdom_mail');
    
    do {

        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $hash_key = "$mail_acc\@$dmn_name";
        
        
        ($rs, $rdata) = get_mta_hash_value($aliases_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        
        if ($rdata ne '') {
            
            $rdata =~ s/\,$mail_acc\@vhcs2-arpl\.$dmn_name//gi;
            
            $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $rdata);
            
            return $rs if ($rs != 0);
            
        }
        
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        $rs = mbox_check_last_transport_entry($mbox_data);
        
        if ($rs == 0) {
            
            $rs = mbox_del_last_transport_entry($mbox_data);
            
            return $rs if ($rs != 0);
            
        } elsif ($rs == -1) {
            
            return $rs;
            
        }
        
        
        ($rs, $working) = get_file($transport_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($transport_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'normal_forward');
    
    do {

        my $dmn_name = $main::als_id_name{$mail_sub_id};
        
        my $hash_key = "$mail_acc\@$dmn_name";
        
        
        ($rs, $rdata) = get_mta_hash_value($aliases_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        
        if ($rdata ne '') {
            
            $rdata =~ s/\,$mail_acc\@vhcs2-arpl\.$dmn_name//gi;
            
            $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $rdata);
            
            return $rs if ($rs != 0);
            
        }
        
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        $rs = mbox_check_last_transport_entry($mbox_data);
        
        if ($rs == 0) {
            
            $rs = mbox_del_last_transport_entry($mbox_data);
            
            return $rs if ($rs != 0);
            
        } elsif ($rs == -1) {
            
            return $rs;
            
        }
        
        
        ($rs, $working) = get_file($transport_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($transport_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'alias_forward');
    
    do {

        my $sub_pref = $main::sub_id_name{$mail_sub_id};
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $sub_name = "$sub_pref.$dmn_name";
        
        my $hash_key = "$mail_acc\@$sub_name";
        
        
        ($rs, $rdata) = get_mta_hash_value($aliases_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        
        if ($rdata ne '') {
            
            $rdata =~ s/\,$mail_acc\@vhcs2-arpl\.$sub_name//gi;
            
            $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $rdata);
        
            return $rs if ($rs != 0);
            
        }
        
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        $rs = mbox_check_last_transport_entry($mbox_data);
        
        if ($rs == 0) {
            
            $rs = mbox_del_last_transport_entry($mbox_data);
            
            return $rs if ($rs != 0);
            
        } elsif ($rs == -1) {
            
            return $rs;
            
        }
        
        
        ($rs, $working) = get_file($transport_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($transport_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'subdom_forward');
    
    
    $rs = sys_command("$cmd_postmap $transport_cfg");
    
    return $rs if ($rs != 0);
    
    
    push_el(\@main::el, 'mbox_del_mta_cfg_autorespond_data()', 'Ending...');
    
    return 0;
    
}

sub mbox_add_mta_cfg_data {
    
    my ($mbox_data) = @_;
    
    push_el(\@main::el, 'mbox_add_mta_cfg_data()', 'Starting...');
    
    if (!defined($mbox_data) || $mbox_data eq '') {
        
        push_el(\@main::el, 'mbox_add_mta_cfg_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my ($rs, $rdata) = (undef, undef);
    
    
    my $mail_id = @$mbox_data[0];
    
    my $mail_acc = @$mbox_data[1];
    
    my $mail_forward = @$mbox_data[3];
    
    my $mail_dmn_id = @$mbox_data[4];
    
    my $mail_type = @$mbox_data[5];
    
    my $mail_sub_id = @$mbox_data[6];
    
    my $mail_autorespond = @$mbox_data[8];
    
    
    my $conf_dir = $main::cfg{'CONF_DIR'};
    
    my $cmd_postmap = $main::cfg{'CMD_POSTMAP'};
    
    
    my $tpl_dir = "$conf_dir/postfix/parts";
    
    my $working_dir = "$conf_dir/postfix/working";
    
    my $backup_dir = "$conf_dir/postfix/backup";
    
    my $timestamp = time;
    
    my ($sys, $working) = (undef, undef);
    
    my $mailboxes_cfg = "/etc/postfix/vhcs2/mailboxes";

    my $mailboxes_working_cfg = "$working_dir/mailboxes";

    my $mailboxes_backup_cfg = "$backup_dir/mailboxes.$timestamp";
    
    my $aliases_cfg = "/etc/postfix/vhcs2/aliases";

    my $aliases_working_cfg = "$working_dir/aliases";

    my $aliases_backup_cfg = "$backup_dir/aliases.$timestamp";
    
    
    ($rs, $sys) = get_file($mailboxes_cfg);
        
    return $rs if ($rs != 0);
        
    $rs = store_file($mailboxes_backup_cfg, $sys, 'root', 'root', 0644);
        
    return $rs if ($rs != 0);
    
    ($rs, $sys) = get_file($aliases_cfg);
        
    return $rs if ($rs != 0);
        
    $rs = store_file($aliases_backup_cfg, $sys, 'root', 'root', 0644);
        
    return $rs if ($rs != 0);
    
    
    do {

        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $hash_key = "$mail_acc\@$dmn_name";
        
        my $hash_value = "$dmn_name/$mail_acc/";
        
        $rs = set_mta_hash_value($mailboxes_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($mailboxes_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($mailboxes_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        if ($mail_autorespond ne '_no_') {

            $rs = mbox_add_mta_cfg_autorespond_data($mbox_data);
            
            return $rs if ($rs != 0);
            
        } else {
            
            $rs = mbox_del_mta_cfg_autorespond_data($mbox_data);
            
            return $rs if ($rs != 0);

	        $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_key);
        
    	    return $rs if ($rs != 0);
       
        	($rs, $working) = get_file($aliases_working_cfg);
        
	        return $rs if ($rs != 0);
        
    	    $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        	return $rs if ($rs != 0);
            
        }
        
    } if ($mail_type eq 'normal_mail');
    
    do {

        my $dmn_name = $main::als_id_name{$mail_sub_id};
        
        my $hash_key = "$mail_acc\@$dmn_name";
        
        my $hash_value = "$dmn_name/$mail_acc/";
        
        $rs = set_mta_hash_value($mailboxes_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($mailboxes_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($mailboxes_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        if ($mail_autorespond ne '_no_') {
            
            $rs = mbox_add_mta_cfg_autorespond_data($mbox_data);
            
            return $rs if ($rs != 0);
            
        } else {
            
            $rs = mbox_del_mta_cfg_autorespond_data($mbox_data);
            
            return $rs if ($rs != 0);
            
	        $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_key);
        
    	    return $rs if ($rs != 0);
       
        	($rs, $working) = get_file($aliases_working_cfg);
        
	        return $rs if ($rs != 0);
        
    	    $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        	return $rs if ($rs != 0);
            
        }
        
    } if ($mail_type eq 'alias_mail');
    
    do {
        
        my $sub_pref = $main::sub_id_name{$mail_sub_id};
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $sub_name = "$sub_pref.$dmn_name";
        
        push_el(\@main::el, 'mbox_add_mta_cfg_data()', "dbg: sub_pref: $sub_pref, dmn_name: $dmn_name, sub_name: $sub_name");
        
        my $hash_key = "$mail_acc\@$sub_name";
        
        my $hash_value = "$sub_name/$mail_acc/";
        
        $rs = set_mta_hash_value($mailboxes_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($mailboxes_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($mailboxes_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        if ($mail_autorespond ne '_no_') {
            
            $rs = mbox_add_mta_cfg_autorespond_data($mbox_data);
            
            return $rs if ($rs != 0);
            
        } else {
            
            $rs = mbox_del_mta_cfg_autorespond_data($mbox_data);
            
            return $rs if ($rs != 0);
            
	        $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_key);
        
    	    return $rs if ($rs != 0);
       
        	($rs, $working) = get_file($aliases_working_cfg);
        
	        return $rs if ($rs != 0);
        
    	    $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        	return $rs if ($rs != 0);
            
        }
        
    } if ($mail_type eq 'subdom_mail');
    
    do {
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $hash_key = "$mail_acc\@$dmn_name";
        
        my $hash_value = "$dmn_name/$mail_acc/";
        
        $rs = set_mta_hash_value($mailboxes_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($mailboxes_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($mailboxes_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        $hash_value = '';
        
        $mail_forward = "$mail_forward\n";
        
        while ($mail_forward =~ /([^\n]+)\n/g) {

            my $address_entry = $1;
            
            $address_entry =~ s/\r//g; $address_entry =~ s/\n//g;
            
            if ($address_entry ne '') {
            
                if ($hash_value eq '') {

                    $hash_value = "$address_entry";

                } else {

                    $hash_value .= ",$address_entry";

                }
            }
            
        }
        
        #$hash_value = "$mail_acc\@$dmn_name,".$hash_value;
        
        $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        if ($mail_autorespond ne '_no_') {
            
            $rs = mbox_add_mta_cfg_autorespond_data($mbox_data);
            
            return $rs if ($rs != 0);
            
        } else {
            
            $rs = mbox_del_mta_cfg_autorespond_data($mbox_data);
            
            return $rs if ($rs != 0);
            
        }
        
    } if ($mail_type eq 'normal_forward');
    
    do {
        
        my $dmn_name = $main::als_id_name{$mail_sub_id};
        
        my $hash_key = "$mail_acc\@$dmn_name";
        
        my $hash_value = "$dmn_name/$mail_acc/";
        
        $rs = set_mta_hash_value($mailboxes_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($mailboxes_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($mailboxes_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        $hash_value = '';
        
        $mail_forward = "$mail_forward\n";
        
        while ($mail_forward =~ /([^\n]+)\n/g) {

            my $address_entry = $1;
            
            $address_entry =~ s/\r//g; $address_entry =~ s/\n//g;
            
            if ($address_entry ne '') {
            
                if ($hash_value eq '') {

                    $hash_value = "$address_entry";

                } else {

                    $hash_value .= ",$address_entry";

                }
            }
            
        }
        
        #$hash_value = "$mail_acc\@$dmn_name,".$hash_value;
        
        $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        if ($mail_autorespond ne '_no_') {
            
            $rs = mbox_add_mta_cfg_autorespond_data($mbox_data);
            
            return $rs if ($rs != 0);
            
        } else {
            
            $rs = mbox_del_mta_cfg_autorespond_data($mbox_data);
            
            return $rs if ($rs != 0);
            
        }
        
    } if ($mail_type eq 'alias_forward');
    
    do {
        
        my $sub_pref = $main::sub_id_name{$mail_sub_id};
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $sub_name = "$sub_pref.$dmn_name";
        
        my $hash_key = "$mail_acc\@$sub_name";
        
        my $hash_value = "$sub_name/$mail_acc/";
        
        $rs = set_mta_hash_value($mailboxes_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($mailboxes_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($mailboxes_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        $hash_value = '';
        
        $mail_forward = "$mail_forward\n";
        
        while ($mail_forward =~ /([^\n]+)\n/g) {

            my $address_entry = $1;            

            $address_entry =~ s/\r//g; $address_entry =~ s/\n//g;
            
            if ($address_entry ne '') {
            
                if ($hash_value eq '') {

                    $hash_value = "$address_entry";

                } else {

                    $hash_value .= ",$address_entry";

                }
            }
            
        }
        
        #$hash_value = "$mail_acc\@$sub_name,".$hash_value;
        
        $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        if ($mail_autorespond ne '_no_') {

            $rs = mbox_add_mta_cfg_autorespond_data($mbox_data);

            return $rs if ($rs != 0);

        } else {
            
            $rs = mbox_del_mta_cfg_autorespond_data($mbox_data);
            
            return $rs if ($rs != 0);
            
        }
        
    } if ($mail_type eq 'subdom_forward');
    
    do {

        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $hash_key = "\@$dmn_name";
        
        my $hash_value = undef;
        
       
        # Let's first remove old catchall accounts (if any);
       
        
        $rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        my ($sub_key, $sub_value) = (undef, undef);
        
        foreach $sub_key (keys %main::sub_id_parentid) {
            
            $sub_value = $main::sub_id_parentid{$sub_key};
            
            if ($sub_value == $mail_dmn_id) {
                
               
                # We've got one ;)
               
                
                my $sub_pref = $main::sub_id_name{$sub_key};
                
                my $sub_name = "$sub_pref.$dmn_name";
                
                $hash_key = "\@$sub_name";
                
                $rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
        
                return $rs if ($rs != 0);
                
            }
            
        }
        
        $rdata = "$mail_acc\n";
        
        $rdata =~ /^([^\@]+)\@([^\n]+)\n$/i;
        
        my ($catch_all_usr, $catch_all_dmn) = ($1, $2);
        
        $hash_key = "\@$dmn_name";
        
        $hash_value = "$mail_acc";
        
        $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        ($sub_key, $sub_value) = (undef, undef);
        
        foreach $sub_key (keys %main::sub_id_parentid) {
           
            $sub_value = $main::sub_id_parentid{$sub_key};
           
            if ($sub_value == $mail_dmn_id) {
              
                # We've got one ;)
               
                my $sub_pref = $main::sub_id_name{$sub_key};
                
                my $sub_name = "$sub_pref.$dmn_name";
               
                $hash_key = "\@$sub_name";
               
                $hash_value = "$mail_acc";
               
                $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_value);
        
                return $rs if ($rs != 0);
               
            }
           
        }        
       
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'normal_catchall');
    
    do {

        my $dmn_name = $main::als_id_name{$mail_sub_id};
        
        my $hash_key = "\@$dmn_name";
        
        my $hash_value = undef;
        
       
        # Let's first remove old catchall accounts (if any);
       
        
        $rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        $rdata = "$mail_acc\n";
        
        $rdata =~ /^([^\@]+)\@([^\n]+)\n$/i;
        
        my ($catch_all_usr, $catch_all_dmn) = ($1, $2);
        
        $hash_key = "\@$dmn_name";
        
        $hash_value = "$mail_acc";
        
        $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
       
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'alias_catchall');
    
    $rs = sys_command("$cmd_postmap $mailboxes_cfg");
    
    return $rs if ($rs != 0);
    
    $rs = sys_command("$cmd_postmap $aliases_cfg");
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'mbox_add_mta_cfg_data()', 'Ending...');
    
    return 0;
    
}

sub mbox_del_mta_cfg_data {
    
    my ($mbox_data) = @_;
    
    push_el(\@main::el, 'mbox_del_mta_cfg_data()', 'Starting...');
    
    if (!defined($mbox_data) || $mbox_data eq '') {
        
        push_el(\@main::el, 'mbox_del_mta_cfg_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my ($rs, $rdata) = (undef, undef);
    
    
    my $mail_id = @$mbox_data[0];
    
    my $mail_acc = @$mbox_data[1];
    
    my $mail_forward = @$mbox_data[3];
    
    my $mail_dmn_id = @$mbox_data[4];
    
    my $mail_type = @$mbox_data[5];
    
    my $mail_sub_id = @$mbox_data[6];
    
    my $mail_autorespond = @$mbox_data[8];
    
    
    my $conf_dir = $main::cfg{'CONF_DIR'};
    
    my $cmd_postmap = $main::cfg{'CMD_POSTMAP'};
    
    
    my $tpl_dir = "$conf_dir/postfix/parts";
    
    my $working_dir = "$conf_dir/postfix/working";
    
    my $backup_dir = "$conf_dir/postfix/backup";
    
    my $timestamp = time;
    
    my ($sys, $working) = (undef, undef);
    
    my $mailboxes_cfg = "/etc/postfix/vhcs2/mailboxes";

    my $mailboxes_working_cfg = "$working_dir/mailboxes";

    my $mailboxes_backup_cfg = "$backup_dir/mailboxes.$timestamp";
    
    my $aliases_cfg = "/etc/postfix/vhcs2/aliases";

    my $aliases_working_cfg = "$working_dir/aliases";

    my $aliases_backup_cfg = "$backup_dir/aliases.$timestamp";
    
    
    ($rs, $sys) = get_file($mailboxes_cfg);
        
    return $rs if ($rs != 0);
        
    $rs = store_file($mailboxes_backup_cfg, $sys, 'root', 'root', 0644);
        
    return $rs if ($rs != 0);
    
    ($rs, $sys) = get_file($aliases_cfg);
        
    return $rs if ($rs != 0);
        
    $rs = store_file($aliases_backup_cfg, $sys, 'root', 'root', 0644);
        
    return $rs if ($rs != 0);
    
    
    do {

        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $hash_key = "$mail_acc\@$dmn_name";
        
        $rs = del_mta_hash_value($mailboxes_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($mailboxes_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($mailboxes_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        if ($mail_autorespond ne '_no_') {
            
            $rs = mbox_del_mta_cfg_autorespond_data($mbox_data);
            
            return $rs if ($rs != 0);
            
        }
        
    } if ($mail_type eq 'normal_mail');
    
    do {

        my $dmn_name = $main::als_id_name{$mail_sub_id};
        
        my $hash_key = "$mail_acc\@$dmn_name";
        
        $rs = del_mta_hash_value($mailboxes_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($mailboxes_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($mailboxes_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        if ($mail_autorespond ne '_no_') {
            
            $rs = mbox_del_mta_cfg_autorespond_data($mbox_data);
            
            return $rs if ($rs != 0);
            
        }
        
    } if ($mail_type eq 'alias_mail');
    
    do {
        
        my $sub_pref = $main::sub_id_name{$mail_sub_id};
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $sub_name = "$sub_pref.$dmn_name";

        my $hash_key = "$mail_acc\@$sub_name";
        
        
        $rs = del_mta_hash_value($mailboxes_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        ($rs, $working) = get_file($mailboxes_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($mailboxes_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        if ($mail_autorespond ne '_no_') {
            
            $rs = mbox_del_mta_cfg_autorespond_data($mbox_data);
            
            return $rs if ($rs != 0);
            
        }
        
    } if ($mail_type eq 'subdom_mail');
    
    do {
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $hash_key = "$mail_acc\@$dmn_name";
        
        
        $rs = del_mta_hash_value($mailboxes_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        
        ($rs, $working) = get_file($mailboxes_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($mailboxes_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        $rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        if ($mail_autorespond ne '_no_') {
            
            $rs = mbox_del_mta_cfg_autorespond_data($mbox_data);
            
            return $rs if ($rs != 0);
            
        }
        
    } if ($mail_type eq 'normal_forward');
    
    do {
        
        my $dmn_name = $main::als_id_name{$mail_sub_id};
        
        my $hash_key = "$mail_acc\@$dmn_name";
        
        
        $rs = del_mta_hash_value($mailboxes_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        
        ($rs, $working) = get_file($mailboxes_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($mailboxes_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        $rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        if ($mail_autorespond ne '_no_') {
            
            $rs = mbox_del_mta_cfg_autorespond_data($mbox_data);
            
            return $rs if ($rs != 0);
            
        }
        
    } if ($mail_type eq 'alias_forward');
    
    do {
        
        my $sub_pref = $main::sub_id_name{$mail_sub_id};
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $sub_name = "$sub_pref.$dmn_name";
        
        my $hash_key = "$mail_acc\@$sub_name";
        
        
        $rs = del_mta_hash_value($mailboxes_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        
        ($rs, $working) = get_file($mailboxes_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($mailboxes_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        $rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        
        if ($mail_autorespond ne '_no_') {

            $rs = mbox_del_mta_cfg_autorespond_data($mbox_data);

            return $rs if ($rs != 0);

        }
        
    } if ($mail_type eq 'subdom_forward');
    
    do {

        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $hash_key = "\@$dmn_name";
        
        my $hash_value = undef;
        
       
        # Let's first remove old catchall accounts (if any);
       
        
        $rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        my ($sub_key, $sub_value) = (undef, undef);
        
        foreach $sub_key (keys %main::sub_id_parentid) {
            
            $sub_value = $main::sub_id_parentid{$sub_key};
            
            if ($sub_value == $mail_dmn_id) {
                
               
                # We've got one ;)
               
                
                my $sub_pref = $main::sub_id_name{$sub_key};
                
                my $sub_name = "$sub_pref.$dmn_name";
                
                $hash_key = "\@$sub_name";
                
                $rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
        
                return $rs if ($rs != 0);
                
            }
            
        }
       
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'normal_catchall');
    
    do {

        my $dmn_name = $main::als_id_name{$mail_sub_id};
        
        my $hash_key = "\@$dmn_name";
        
        my $hash_value = undef;
       
        # Let's first remove old catchall accounts (if any);
        
        $rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
       
        ($rs, $working) = get_file($aliases_working_cfg);
        
        return $rs if ($rs != 0);
        
        $rs = store_file($aliases_cfg, $working, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'alias_catchall');
    
    $rs = sys_command("$cmd_postmap $mailboxes_cfg");
    
    return $rs if ($rs != 0);
    
    $rs = sys_command("$cmd_postmap $aliases_cfg");
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'mbox_del_mta_cfg_data()', 'Ending...');
    
    return 0;
    
}

sub mbox_add_mta_file_data {
    
    my ($mbox_data) = @_;
    
    push_el(\@main::el, 'mbox_add_mta_file_data()', 'Starting...');
    
    if (!defined($mbox_data) || $mbox_data eq '') {
        
        push_el(\@main::el, 'mbox_add_mta_file_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my ($rs, $rdata) = (undef, undef);
    
    my $mail_id = @$mbox_data[0];
    
    my $mail_acc = @$mbox_data[1];
    
    my $mail_forward = @$mbox_data[3];
    
    my $mail_dmn_id = @$mbox_data[4];
    
    my $mail_type = @$mbox_data[5];
    
    my $mail_sub_id = @$mbox_data[6];
    
    my $mail_autorespond = @$mbox_data[8];
    
    my $virtual_mail_dir = $main::cfg{'MTA_VIRTUAL_MAIL_DIR'};
    
    my $mailbox_uid_name = $main::cfg{'MTA_MAILBOX_UID_NAME'};
    
    my $mailbox_gid_name = $main::cfg{'MTA_MAILBOX_GID_NAME'};
    
    do {
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $dir_name = "$virtual_mail_dir/$dmn_name/$mail_acc";
        
        $rs = make_dir($dir_name, $mailbox_uid_name, $mailbox_gid_name, 0755);
        
        return $rs if ($rs != 0);
        
        $dir_name = "$virtual_mail_dir/$dmn_name/$mail_acc/cur";
        
        $rs = make_dir($dir_name, $mailbox_uid_name, $mailbox_gid_name, 0700);
        
        return $rs if ($rs != 0);
        
        $dir_name = "$virtual_mail_dir/$dmn_name/$mail_acc/tmp";
        
        $rs = make_dir($dir_name, $mailbox_uid_name, $mailbox_gid_name, 0700);
                                                                           
        return $rs if ($rs != 0);
        
        $dir_name = "$virtual_mail_dir/$dmn_name/$mail_acc/new";
        
        $rs = make_dir($dir_name, $mailbox_uid_name, $mailbox_gid_name, 0700);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'normal_mail' || $mail_type eq 'normal_forward');
    
    do {
        
        my $dmn_name = $main::als_id_name{$mail_sub_id};
        
        my $dir_name = "$virtual_mail_dir/$dmn_name/$mail_acc";
        
        $rs = make_dir($dir_name, $mailbox_uid_name, $mailbox_gid_name, 0755);
        
        return $rs if ($rs != 0);
        
        $dir_name = "$virtual_mail_dir/$dmn_name/$mail_acc/cur";
        
        $rs = make_dir($dir_name, $mailbox_uid_name, $mailbox_gid_name, 0700);
        
        return $rs if ($rs != 0);
        
        $dir_name = "$virtual_mail_dir/$dmn_name/$mail_acc/tmp";
        
        $rs = make_dir($dir_name, $mailbox_uid_name, $mailbox_gid_name, 0700);
                                                                           
        return $rs if ($rs != 0);
        
        $dir_name = "$virtual_mail_dir/$dmn_name/$mail_acc/new";
        
        $rs = make_dir($dir_name, $mailbox_uid_name, $mailbox_gid_name, 0700);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'alias_mail' || $mail_type eq 'alias_forward');
    
    do {
        
        my $sub_pref = $main::sub_id_name{$mail_sub_id};
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $sub_name = "$sub_pref.$dmn_name";
        
        my $dir_name = "$virtual_mail_dir/$sub_name/$mail_acc";
        
        $rs = make_dir($dir_name, $mailbox_uid_name, $mailbox_gid_name, 0755);
        
        return $rs if ($rs != 0);
        
        $dir_name = "$virtual_mail_dir/$sub_name/$mail_acc/cur";
        
        $rs = make_dir($dir_name, $mailbox_uid_name, $mailbox_gid_name, 0700);
        
        return $rs if ($rs != 0);
        
        $dir_name = "$virtual_mail_dir/$sub_name/$mail_acc/tmp";
        
        $rs = make_dir($dir_name, $mailbox_uid_name, $mailbox_gid_name, 0700);
        
        return $rs if ($rs != 0);
        
        $dir_name = "$virtual_mail_dir/$sub_name/$mail_acc/new";
        
        $rs = make_dir($dir_name, $mailbox_uid_name, $mailbox_gid_name, 0700);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'subdom_mail' || $mail_type eq 'subdom_forward');
   
    push_el(\@main::el, 'mbox_add_mta_file_data()', 'Ending...');
    
    return 0;
    
}

sub mbox_del_mta_file_data {
    
    my ($mbox_data) = @_;
    
    push_el(\@main::el, 'mbox_del_mta_file_data()', 'Starting...');
    
    if (!defined($mbox_data) || $mbox_data eq '') {
        
        push_el(\@main::el, 'mbox_del_mta_file_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my ($rs, $rdata) = (undef, undef);
    
    my $mail_id = @$mbox_data[0];
    
    my $mail_acc = @$mbox_data[1];
    
    my $mail_forward = @$mbox_data[3];
    
    my $mail_dmn_id = @$mbox_data[4];
    
    my $mail_type = @$mbox_data[5];
    
    my $mail_sub_id = @$mbox_data[6];
    
    my $mail_autorespond = @$mbox_data[8];
    
    my $virtual_mail_dir = $main::cfg{'MTA_VIRTUAL_MAIL_DIR'};
    
    my $mailbox_uid_name = $main::cfg{'MTA_MAILBOX_UID_NAME'};
    
    my $mailbox_gid_name = $main::cfg{'MTA_MAILBOX_GID_NAME'};
    
    do {
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $dir_name = "$virtual_mail_dir/$dmn_name/$mail_acc";
        
        $rs = del_dir($dir_name);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'normal_mail' || $mail_type eq 'normal_forward');
    
    do {
        
        my $dmn_name = $main::als_id_name{$mail_sub_id};
        
        my $dir_name = "$virtual_mail_dir/$dmn_name/$mail_acc";
        
        $rs = del_dir($dir_name);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'alias_mail' || $mail_type eq 'alias_forward');
    
    do {
        
        my $sub_pref = $main::sub_id_name{$mail_sub_id};
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $sub_name = "$sub_pref.$dmn_name";
        
        my $dir_name = "$virtual_mail_dir/$sub_name/$mail_acc";
        
        $rs = del_dir($dir_name);
        
        return $rs if ($rs != 0);
        
    } if ($mail_type eq 'subdom_mail' || $mail_type eq 'subdom_forward');
   
    push_el(\@main::el, 'mbox_del_mta_file_data()', 'Ending...');
    
    return 0;
    
}

sub mbox_add_po_data {
    
    my ($mbox_data) = @_;
    
    push_el(\@main::el, 'mbox_add_po_data()', 'Starting...');
    
    if (!defined($mbox_data) || $mbox_data eq '') {
        
        push_el(\@main::el, 'mbox_add_po_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my ($rs, $rdata) = (undef, undef);
    
    my $mail_id = @$mbox_data[0];
    
    my $mail_acc = @$mbox_data[1];
    
    my $mail_pass = @$mbox_data[2];
    
    my $mail_forward = @$mbox_data[3];
    
    my $mail_dmn_id = @$mbox_data[4];
    
    my $mail_type = @$mbox_data[5];
    
    my $mail_sub_id = @$mbox_data[6];
    
    my $mail_autorespond = @$mbox_data[8];
    
    
    my $virtual_mail_dir = $main::cfg{'MTA_VIRTUAL_MAIL_DIR'};
    
    my $mbox_uid = $main::cfg{'MTA_MAILBOX_UID'};
    
    my $mbox_gid = $main::cfg{'MTA_MAILBOX_GID'};
    
    
    my $conf_dir = $main::cfg{'CONF_DIR'};

	my $authlib_dir = undef;

    if (exists $main::cfg{'AUTHLIB_CONF_DIR'} && $main::cfg{'AUTHLIB_CONF_DIR'}) {

	    $authlib_dir = $main::cfg{'AUTHLIB_CONF_DIR'};    
    }

    my $courier_dir = $main::cfg{'COURIER_CONF_DIR'};

    my $cmd_makeuserdb = $main::cfg{'CMD_MAKEUSERDB'};
    
    
    my $working_dir = "$conf_dir/courier/working";
    
    my $backup_dir = "$conf_dir/courier/backup";
    
    my $timestamp = time;
    
    my ($sys, $working, $userdb_cfg) = (undef, undef, undef);
    
    if (exists $main::cfg{'AUTHLIB_CONF_DIR'} && $main::cfg{'AUTHLIB_CONF_DIR'}) {

	    $userdb_cfg = "$authlib_dir/userdb";

    } else {

    	$userdb_cfg = "$courier_dir/userdb";

    }

    my $userdb_working_cfg = "$working_dir/userdb";

    my $userdb_backup_cfg = "$backup_dir/userdb.$timestamp";
    
    ($rs, $sys) = get_file($userdb_cfg);
        
    return $rs if ($rs != 0);
        
    $rs = store_file($userdb_backup_cfg, $sys, 'root', 'root', 0644);
        
    return $rs if ($rs != 0);
    
    my ($hash_key, $hash_value) = (undef, undef);
    
    do {
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        ($rs, $rdata) = crypt_md5_data($mail_pass);
        
        return $rs if ($rs != 0);
        
        $hash_key = "$mail_acc\@$dmn_name";
        
        $hash_value = "uid=$mbox_uid|gid=$mbox_gid|home=$virtual_mail_dir|shell=/bin/false|systempw=$rdata|mail=$virtual_mail_dir/$dmn_name/$mail_acc";
        
        $rs = set_mta_hash_value($userdb_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        
    } if ($mail_type eq 'normal_mail');
    
    do {
        
        my $dmn_name = $main::als_id_name{$mail_sub_id};
        
        ($rs, $rdata) = crypt_md5_data($mail_pass);
        
        return $rs if ($rs != 0);
        
        $hash_key = "$mail_acc\@$dmn_name";
        
        $hash_value = "uid=$mbox_uid|gid=$mbox_gid|home=$virtual_mail_dir|shell=/bin/false|systempw=$rdata|mail=$virtual_mail_dir/$dmn_name/$mail_acc";
        
        $rs = set_mta_hash_value($userdb_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        
    } if ($mail_type eq 'alias_mail');
    
    do {
        
        my $sub_pref = $main::sub_id_name{$mail_sub_id};
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $sub_name = "$sub_pref.$dmn_name";
        
        ($rs, $rdata) = crypt_md5_data($mail_pass);
        
        return $rs if ($rs != 0);
        
        $hash_key = "$mail_acc\@$sub_name";
        
        $hash_value = "uid=$mbox_uid|gid=$mbox_gid|home=$virtual_mail_dir|shell=/bin/false|systempw=$rdata|mail=$virtual_mail_dir/$sub_name/$mail_acc";
        
        $rs = set_mta_hash_value($userdb_working_cfg, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        
    } if ($mail_type eq 'subdom_mail');
    
    ($rs, $working) = get_file($userdb_working_cfg);
        
    return $rs if ($rs != 0);

    $rs = store_file($userdb_cfg, $working, 'root', 'root', 0600);

    return $rs if ($rs != 0);
    
    $rs = sys_command($cmd_makeuserdb);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'mbox_add_po_data()', 'Ending...');
    
    return 0;
    
}


sub mbox_del_po_data {
    
    my ($mbox_data) = @_;
    
    push_el(\@main::el, 'mbox_del_po_data()', 'Starting...');
    
    if (!defined($mbox_data) || $mbox_data eq '') {
        
        push_el(\@main::el, 'mbox_del_po_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my ($rs, $rdata) = (undef, undef);
    
    my $mail_id = @$mbox_data[0];
    
    my $mail_acc = @$mbox_data[1];
    
    my $mail_pass = @$mbox_data[2];
    
    my $mail_forward = @$mbox_data[3];
    
    my $mail_dmn_id = @$mbox_data[4];
    
    my $mail_type = @$mbox_data[5];
    
    my $mail_sub_id = @$mbox_data[6];
    
    my $mail_autorespond = @$mbox_data[8];
    
    
    my $virtual_mail_dir = $main::cfg{'MTA_VIRTUAL_MAIL_DIR'};
    
    my $mbox_uid = $main::cfg{'MTA_MAILBOX_UID'};
    
    my $mbox_gid = $main::cfg{'MTA_MAILBOX_GID'};
    
    
    my $conf_dir = $main::cfg{'CONF_DIR'};

	my $authlib_dir = undef;

    if (exists $main::cfg{'AUTHLIB_CONF_DIR'} && $main::cfg{'AUTHLIB_CONF_DIR'}) {

	    $authlib_dir = $main::cfg{'AUTHLIB_CONF_DIR'};    
    }

    my $courier_dir = $main::cfg{'COURIER_CONF_DIR'};
    
    my $cmd_makeuserdb = $main::cfg{'CMD_MAKEUSERDB'};
    
    
    my $working_dir = "$conf_dir/courier/working";
    
    my $backup_dir = "$conf_dir/courier/backup";
    
    my $timestamp = time;
    
    my ($sys, $working, $userdb_cfg) = (undef, undef, undef);
   
    if (exists $main::cfg{'AUTHLIB_CONF_DIR'} && $main::cfg{'AUTHLIB_CONF_DIR'}) {

	    $userdb_cfg = "$authlib_dir/userdb";

    } else {

    	$userdb_cfg = "$courier_dir/userdb";

    }

    my $userdb_working_cfg = "$working_dir/userdb";

    my $userdb_backup_cfg = "$backup_dir/userdb.$timestamp";
    
    ($rs, $sys) = get_file($userdb_cfg);
        
    return $rs if ($rs != 0);
        
    $rs = store_file($userdb_backup_cfg, $sys, 'root', 'root', 0644);
        
    return $rs if ($rs != 0);
    
    my $hash_key = undef;
    
    do {
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        $hash_key = "$mail_acc\@$dmn_name";
        
        $rs = del_mta_hash_value($userdb_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        
    } if ($mail_type eq 'normal_mail');
    
    do {
        
        my $dmn_name = $main::als_id_name{$mail_sub_id};
        
        $hash_key = "$mail_acc\@$dmn_name";
        
        $rs = del_mta_hash_value($userdb_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        
    } if ($mail_type eq 'alias_mail');
    
    do {
        
        my $sub_pref = $main::sub_id_name{$mail_sub_id};
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $sub_name = "$sub_pref.$dmn_name";
        
        $hash_key = "$mail_acc\@$sub_name";
        
        $rs = del_mta_hash_value($userdb_working_cfg, $hash_key);
        
        return $rs if ($rs != 0);
        
        
    } if ($mail_type eq 'subdom_mail');
    
    ($rs, $working) = get_file($userdb_working_cfg);
        
    return $rs if ($rs != 0);

    $rs = store_file($userdb_cfg, $working, 'root', 'root', 0600);

    return $rs if ($rs != 0);
    
    $rs = sys_command($cmd_makeuserdb);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'mbox_del_po_data()', 'Ending...');
    
    return 0;
    
}

sub mbox_check_sasl_user {
    
    my ($uname) = @_;
    
    push_el(\@main::el, 'mbox_check_sasl_user()', 'Starting...');
    
    my $cmd = undef;
    
    my $rs = undef;
    
    my $rdata = undef;
    
    my $check_file = "/tmp/vhcs2-mbox-check-sasl-user";
    
    $cmd = "$main::cfg{'CMD_SASLDB_LISTUSERS2'} -f $main::cfg{'MTA_SASLDB_FILE'} | $main::cfg{'CMD_GREP'} '$uname' &> $check_file";
    
    sys_command_rs($cmd);
    
    if (-z $check_file) {
        
        $rdata = 0;
        
    } else {
        
        $rdata = 1;
    }
    
    $rs = del_file($check_file);
    
    #return ($rs, '') if ($rs != 0);
    
    push_el(\@main::el, 'mbox_check_sasl_user()', 'Starting...');
    
    return (0, $rdata);
    
}

sub mbox_add_sasl_data {
    
    my ($mbox_data) = @_;
    
    push_el(\@main::el, 'mbox_add_sasl_data()', 'Starting...');
    
    if (!defined($mbox_data) || $mbox_data eq '') {
        
        push_el(\@main::el, 'mbox_add_sasl_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my ($rs, $rdata) = (undef, undef);
    
    my $mail_id = @$mbox_data[0];
    
    my $mail_acc = @$mbox_data[1];
    
    my $mail_pass = @$mbox_data[2];
    
    my $mail_forward = @$mbox_data[3];
    
    my $mail_dmn_id = @$mbox_data[4];
    
    my $mail_type = @$mbox_data[5];
    
    my $mail_sub_id = @$mbox_data[6];
    
    my $mail_autorespond = @$mbox_data[8];
    
    my $dmn_name = $main::domain_id_name{$mail_dmn_id};
    
    my $mta_sasldb_local_domain = $main::cfg{'MTA_SASLDB_LOCAL_DOMAIN'};
    
    my $mta_sasldb_file = $main::cfg{'MTA_SASLDB_FILE'};

	my $etc_sasldb_file = $main::cfg{'ETC_SASLDB_FILE'};
    
    my $cmd_sasldb_passwd2 = $main::cfg{'CMD_SASLDB_PASSWD2'};

	my $cmd_cp = $main::cfg{'CMD_CP'};
    
    my $cmd_echo = $main::cfg{'CMD_ECHO'};
    
    my $cmd_del_user = undef; 
    
    my $cmd_add_user = undef; 
    
    my $hash_key = undef;
    
    my $hash_value = undef;
    
    my $cmd_postmap = $main::cfg{'CMD_POSTMAP'};
    
    my $check_user = undef;
    
    do {
        
       
        # Old SASL mamangment;
       
        #$check_user = "$mail_acc:$dmn_name";
       
        #$cmd_del_user = "$cmd_sasldb_passwd2 -d -f $etc_sasldb_file -u $mta_sasldb_local_domain $mail_acc:$dmn_name";
       
        #$cmd_add_user = "$cmd_echo \"$mail_pass\" | $cmd_sasldb_passwd2 -p -c -f $etc_sasldb_file -u $mta_sasldb_local_domain $mail_acc:$dmn_name";
       
        
        $check_user = "$mail_acc\@$dmn_name";
        
        $cmd_del_user = "$cmd_sasldb_passwd2 -d -f $etc_sasldb_file -u $dmn_name $mail_acc";
		$cmd_del_user .= " && $cmd_cp $etc_sasldb_file $mta_sasldb_file";
		
		$cmd_add_user = "$cmd_echo \"$mail_pass\" | $cmd_sasldb_passwd2 -p -c -f $etc_sasldb_file -u $dmn_name $mail_acc";
        $cmd_add_user .= " && $cmd_cp $etc_sasldb_file $mta_sasldb_file";
        
        $hash_key = "$mail_acc\@$dmn_name";
        
        $hash_value = "OK";
        
    } if ($mail_type eq 'normal_mail');
    
    do {
        
       
        # Old SASL mamangment;
       
        #$check_user = "$mail_acc:$dmn_name";
       
        #$cmd_del_user = "$cmd_sasldb_passwd2 -d -f $etc_sasldb_file -u $mta_sasldb_local_domain $mail_acc:$dmn_name";
       
        #$cmd_add_user = "$cmd_echo \"$mail_pass\" | $cmd_sasldb_passwd2 -p -c -f $etc_sasldb_file -u $mta_sasldb_local_domain $mail_acc:$dmn_name";
        
        $dmn_name = $main::als_id_name{$mail_sub_id};
        
        $check_user = "$mail_acc\@$dmn_name";
        
        $cmd_del_user = "$cmd_sasldb_passwd2 -d -f $etc_sasldb_file -u $dmn_name $mail_acc";
		$cmd_del_user .= " && $cmd_cp $etc_sasldb_file $mta_sasldb_file";

        $cmd_add_user = "$cmd_echo \"$mail_pass\" | $cmd_sasldb_passwd2 -p -c -f $etc_sasldb_file -u $dmn_name $mail_acc";
		$cmd_add_user .= " && $cmd_cp $etc_sasldb_file $mta_sasldb_file";

        $hash_key = "$mail_acc\@$dmn_name";
        
        $hash_value = "OK";
        
    } if ($mail_type eq 'alias_mail');
    
    do {
        
        my $sub_pref = $main::sub_id_name{$mail_sub_id};
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $sub_name = "$sub_pref.$dmn_name";
        
       
        # Old SASL managment;
       
        #$check_user = "$mail_acc:$sub_name";
       
        #$cmd_del_user = "$cmd_sasldb_passwd2 -d -f $etc_sasldb_file -u $mta_sasldb_local_domain $mail_acc:$sub_name";
       
        #$cmd_add_user = "$cmd_echo \"$mail_pass\" | $cmd_sasldb_passwd2 -p -c -f $etc_sasldb_file -u $mta_sasldb_local_domain $mail_acc:$sub_name";
       
        
        $check_user = "$mail_acc\@$sub_name";
        
        $cmd_del_user = "$cmd_sasldb_passwd2 -d -f $etc_sasldb_file -u $sub_name $mail_acc";
		$cmd_del_user .= " && $cmd_cp $etc_sasldb_file $mta_sasldb_file";
    
        $cmd_add_user = "$cmd_echo \"$mail_pass\" | $cmd_sasldb_passwd2 -p -c -f $etc_sasldb_file -u $sub_name $mail_acc";
		$cmd_add_user .= " && $cmd_cp $etc_sasldb_file $mta_sasldb_file";
        
        $hash_key = "$mail_acc\@$sub_name";
        
        $hash_value = "OK";
        
    } if ($mail_type eq 'subdom_mail');
    
    if ($mail_type eq 'normal_mail' || $mail_type eq 'subdom_mail' || $mail_type eq 'alias_mail') {
        
        
        ($rs, $rdata) = mbox_check_sasl_user($check_user);
        
        return $rs if ($rs != 0);
        
        
        if ($rdata) {
            
            sys_command_rs($cmd_del_user);
            
            #$rs = sys_command($cmd_del_user);
        
            #return $rs if ($rs != 0);
            
        }
        
        
        $rs = sys_command($cmd_add_user);
        
        return $rs if ($rs != 0);
        
        
        $rs = setfmode($mta_sasldb_file, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
            
        
        $rs = set_mta_hash_value($main::cfg{'MTA_SENDER_ACCESS_HASH'}, $hash_key, $hash_value);
        
        return $rs if ($rs != 0);
        
        
        my $sa_file = $main::cfg{'MTA_SENDER_ACCESS_HASH'};
        
        $rs = sys_command("$cmd_postmap $sa_file");
        
        return $rs if ($rs != 0);
        
        
    }
    
    push_el(\@main::el, 'mbox_add_sasl_data()', 'Ending...');
    
    return 0;

}

sub mbox_del_sasl_data {
    
    my ($mbox_data) = @_;
    
    push_el(\@main::el, 'mbox_del_sasl_data()', 'Starting...');
    
    if (!defined($mbox_data) || $mbox_data eq '') {
        
        push_el(\@main::el, 'mbox_del_sasl_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my ($rs, $rdata) = (undef, undef);
    
    my $mail_id = @$mbox_data[0];
    
    my $mail_acc = @$mbox_data[1];
    
    my $mail_pass = @$mbox_data[2];
    
    my $mail_forward = @$mbox_data[3];
    
    my $mail_dmn_id = @$mbox_data[4];
    
    my $mail_type = @$mbox_data[5];
    
    my $mail_sub_id = @$mbox_data[6];
    
    my $mail_autorespond = @$mbox_data[8];
    
    my $dmn_name = $main::domain_id_name{$mail_dmn_id};
    
    my $mta_sasldb_local_domain = $main::cfg{'MTA_SASLDB_LOCAL_DOMAIN'};
    
    my $mta_sasldb_file = $main::cfg{'MTA_SASLDB_FILE'};

	my $etc_sasldb_file = $main::cfg{'ETC_SASLDB_FILE'};
    
    my $cmd_sasldb_passwd2 = $main::cfg{'CMD_SASLDB_PASSWD2'};

	my $cmd_cp = $main::cfg{'CMD_CP'};
    
    my $cmd_echo = $main::cfg{'CMD_ECHO'};
    
    my $cmd_del_user = undef; 
    
    my $cmd_add_user = undef; 
    
    my $hash_key = undef;
    
    my $hash_value = undef;
    
    my $cmd_postmap = $main::cfg{'CMD_POSTMAP'};
    
    my $check_user = undef;

    do {
        
       
        # Old SASL managment;
       
        #$check_user = "$mail_acc:$dmn_name";
       
        #$cmd_del_user = "$cmd_sasldb_passwd2 -d -f $etc_sasldb_file -u $mta_sasldb_local_domain $mail_acc:$dmn_name";
       
        #$cmd_add_user = "$cmd_echo \"$mail_pass\" | $cmd_sasldb_passwd2 -p -c -f $etc_sasldb_file -u $mta_sasldb_local_domain $mail_acc:$dmn_name";
       
        
        $check_user = "$mail_acc\@$dmn_name";
        
        $cmd_del_user = "$cmd_sasldb_passwd2 -d -f $etc_sasldb_file -u $dmn_name $mail_acc";
		$cmd_del_user .= " && $cmd_cp $etc_sasldb_file $mta_sasldb_file";
    
        $cmd_add_user = "$cmd_echo \"$mail_pass\" | $cmd_sasldb_passwd2 -p -c -f $etc_sasldb_file -u $dmn_name $mail_acc";
		$cmd_add_user .= " && $cmd_cp $etc_sasldb_file $mta_sasldb_file";
        
        $hash_key = "$mail_acc\@$dmn_name";
        
        $hash_value = "OK";
        
    } if ($mail_type eq 'normal_mail');
    
    do {
        
       
        # Old SASL managment;
       
        #$check_user = "$mail_acc:$dmn_name";
       
        #$cmd_del_user = "$cmd_sasldb_passwd2 -d -f $etc_sasldb_file -u $mta_sasldb_local_domain $mail_acc:$dmn_name";
       
        #$cmd_add_user = "$cmd_echo \"$mail_pass\" | $cmd_sasldb_passwd2 -p -c -f $etc_sasldb_file -u $mta_sasldb_local_domain $mail_acc:$dmn_name";
        
        $dmn_name = $main::als_id_name{$mail_sub_id};
        
        $check_user = "$mail_acc\@$dmn_name";
        
        $cmd_del_user = "$cmd_sasldb_passwd2 -d -f $etc_sasldb_file -u $dmn_name $mail_acc";
		$cmd_del_user .= " && $cmd_cp $etc_sasldb_file $mta_sasldb_file";
    
        $cmd_add_user = "$cmd_echo \"$mail_pass\" | $cmd_sasldb_passwd2 -p -c -f $etc_sasldb_file -u $dmn_name $mail_acc";
		$cmd_add_user .= " && $cmd_cp $etc_sasldb_file $mta_sasldb_file";
        
        $hash_key = "$mail_acc\@$dmn_name";
        
        $hash_value = "OK";
        
    } if ($mail_type eq 'alias_mail');
    
    do {
        
        my $sub_pref = $main::sub_id_name{$mail_sub_id};
        
        my $dmn_name = $main::domain_id_name{$mail_dmn_id};
        
        my $sub_name = "$sub_pref.$dmn_name";
       
        # Old SASL mangment;
       
        #$check_user = "$mail_acc:$sub_name";
       
        #$cmd_del_user = "$cmd_sasldb_passwd2 -d -f $etc_sasldb_file -u $mta_sasldb_local_domain $mail_acc:$sub_name";
       
        #$cmd_add_user = "$cmd_echo \"$mail_pass\" | $cmd_sasldb_passwd2 -p -c -f $etc_sasldb_file -u $mta_sasldb_local_domain $mail_acc:$sub_name";
       
        
        $check_user = "$mail_acc\@$sub_name";
        
        $cmd_del_user = "$cmd_sasldb_passwd2 -d -f $etc_sasldb_file -u $sub_name $mail_acc";
		$cmd_del_user .= " && $cmd_cp $etc_sasldb_file $mta_sasldb_file";
		
        $cmd_add_user = "$cmd_echo \"$mail_pass\" | $cmd_sasldb_passwd2 -p -c -f $etc_sasldb_file -u $sub_name $mail_acc";
		$cmd_add_user .= " && $cmd_cp $etc_sasldb_file $mta_sasldb_file";
		
        $hash_key = "$mail_acc\@$sub_name";
        
        $hash_value = "OK";
        
    } if ($mail_type eq 'subdom_mail');
    
    if ($mail_type eq 'normal_mail' || $mail_type eq 'subdom_mail' || $mail_type eq 'alias_mail') {
    
        ($rs, $rdata) = mbox_check_sasl_user($check_user);
        
        return $rs if ($rs != 0);
        
        
        if ($rdata) {
    
            sys_command_rs($cmd_del_user);
        
            #return $rs if ($rs != 0);
            
            #$rs = sys_command($cmd_del_user);
        
            #return $rs if ($rs != 0);
            
        }
    
        $rs = setfmode($mta_sasldb_file, 'root', 'root', 0644);
    
        return $rs if ($rs != 0);
    
        $rs = del_mta_hash_value($main::cfg{'MTA_SENDER_ACCESS_HASH'}, $hash_key, $hash_value);
    
        return $rs if ($rs != 0);
    
        my $sa_file = $main::cfg{'MTA_SENDER_ACCESS_HASH'};
    
        $rs = sys_command("$cmd_postmap $sa_file");
    
        return $rs if ($rs != 0);
        
    }
    
    push_el(\@main::el, 'mbox_del_sasl_data()', 'Ending...');
    
    return 0;

}

sub mbox_add_data {
    
    my ($mbox_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'mbox_add_data()', 'Starting...');
    
    if (!defined($mbox_data) || $mbox_data eq '') {
        
        push_el(\@main::el, 'mbox_add_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    $rs = mbox_add_mta_cfg_data($mbox_data);
    
    return $rs if ($rs != 0);
    
    $rs = mbox_add_mta_file_data($mbox_data);
    
    return $rs if ($rs != 0);
    
    $rs = mbox_add_po_data($mbox_data);
    
    return $rs if ($rs != 0);
    
    $rs = mbox_add_sasl_data($mbox_data);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'mbox_add_data()', 'Ending...');
    
    return 0;
    
}



sub mbox_change_data {
    
    my ($mbox_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'mbox_change_data()', 'Starting...');
    
    if (!defined($mbox_data) || $mbox_data eq '') {
        
        push_el(\@main::el, 'mbox_change_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    $rs = mbox_add_data($mbox_data);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'mbox_change_data()', 'Ending...');
    
    return 0;
    
}



sub mbox_del_data {
    
    my ($mbox_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'mbox_del_data()', 'Starting...');
    
    if (!defined($mbox_data) || $mbox_data eq '') {
        
        push_el(\@main::el, 'mbox_del_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    $rs = mbox_del_mta_cfg_data($mbox_data);
    
    return $rs if ($rs != 0);
    
    $rs = mbox_del_mta_file_data($mbox_data);
    
    return $rs if ($rs != 0);
    
    $rs = mbox_del_po_data($mbox_data);
    
    return $rs if ($rs != 0);
    
    $rs = mbox_del_sasl_data($mbox_data);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'mbox_del_data()', 'Ending...');
    
    return 0;
    
}



sub mbox_mngr_engine {
    
    my ($rs, $rows, $rdata) = (undef, undef, undef);
    
    push_el(\@main::el, 'mbox_mngr_engine()', 'Starting...');
    
    
    my $sql = "select * from mail_users where mail_id = $main::mail_task_id";
    
    ($rs, $rows) = doSQL($sql);
    
    return $rs if ($rs != 0);
    
    
    my $entry = @$rows[0];
    
    my ($mbox_status, $mbox_id) = (@$entry[7], @$entry[0]);
    
    
    my $timestamp = undef;
    
    
    if ($mbox_status eq 'toadd') {
        
        $rs = mbox_add_data($entry);
        
        $timestamp = time();
        
        if ($rs == 0) {
            
            $sql = "update mail_users set status='ok' where mail_id = $mbox_id;";
            
        } else {
            
            my ($sub_name, $msg) = split(/$main::el_sep/, pop_el(\@main::el));
            
            $msg =~ s/\'/\\\'/g;
            
            $sql = "update mail_users set status='$sub_name | $msg' where mail_id = $mbox_id;";
            
        }
        
        ($rs, $rdata) = doSQL($sql);

        return $rs if ($rs != 0);
        
    } elsif ($mbox_status eq 'change') {
        
        $rs = mbox_change_data($entry);
        
        $timestamp = time();
        
        if ($rs == 0) {
            
            $sql = "update mail_users set status='ok' where mail_id = $mbox_id;";
            
        } else {
            
            my ($sub_name, $msg) = split(/$main::el_sep/, pop_el(\@main::el));
            
            $msg =~ s/\'/\\\'/g;
            
            $sql = "update mail_users set status='$sub_name | $msg' where mail_id = $mbox_id;";
            
        }
        
        ($rs, $rdata) = doSQL($sql);

        return $rs if ($rs != 0);
        
    } elsif ($mbox_status eq 'delete') {
        
        $rs = mbox_del_data($entry);
        
        $timestamp = time();
        
        if ($rs == 0) {
            
            $sql = "delete from mail_users where mail_id = $mbox_id;";
            
        } else {
            
            my ($sub_name, $msg) = split(/$main::el_sep/, pop_el(\@main::el));
            
            $msg =~ s/\'/\\\'/g;
            
            $sql = "update mail_users set status='$sub_name | $msg' where mail_id = $mbox_id;";
            
        }
        
        ($rs, $rdata) = doSQL($sql);

        return $rs if ($rs != 0);
        
    }
    
    # We'll wait a little, to build full backup history;
    
    sleep(1);
    
    push_el(\@main::el, 'mbox_mngr_engine()', 'Ending...');
    
    return 0;
    
}

my $rs = undef;

$rs = mbox_mngr_start_up();

if ($rs != 0) {
    
    dump_el(\@main::el, $main::vhcs2_mbox_mngr_el);
    
    mbox_mngr_shut_down();
    
    exit 1;
    
}


$rs = mbox_mngr_engine();

if ($rs != 0) {
    
    dump_el(\@main::el, $main::vhcs2_mbox_mngr_el);
    
    mbox_mngr_shut_down();
    
    exit 1;
    
}

$rs = mbox_mngr_shut_down();

if ($rs != 0) {
    
    dump_el(\@main::el, $main::vhcs2_mbox_mngr_el);
    
    exit 1;
    
}

exit 0;
