root/trunk/engine/ispcp-mbox-mngr

Revision 1412, 39.2 kB (checked in by scitech, 2 hours ago)

Fixed #1518: Virtual mail problem. Add support for alias subdomain mail (part I)

Line 
1 #!/usr/bin/perl
2
3 # ispCP ω (OMEGA) a Virtual Hosting Control Panel
4 # Copyright (c) 2001-2006 by moleSoftware GmbH
5 # http://www.molesoftware.com
6 # Copyright (c) 2006-2008 by isp Control Panel
7 # http://isp-control.net
8 #
9 #
10 # License:
11 #       This program is free software; you can redistribute it and/or
12 #       modify it under the terms of the MPL Mozilla Public License
13 #       as published by the Free Software Foundation; either version 1.1
14 #       of the License, or (at your option) any later version.
15 #
16 #       This program is distributed in the hope that it will be useful,
17 #       but WITHOUT ANY WARRANTY; without even the implied warranty of
18 #       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 #       MPL Mozilla Public License for more details.
20 #
21 #       You may have received a copy of the MPL Mozilla Public License
22 #       along with this program.
23 #
24 #       An on-line copy of the MPL Mozilla Public License can be found
25 #       http://www.mozilla.org/MPL/MPL-1.1.html
26 #
27 #
28 # The ISPCP ω Home Page is at:
29 #
30 #       http://isp-control.net
31 #
32
33 use FindBin;
34 use lib "$FindBin::Bin/";
35 require 'ispcp_common_code.pl';
36
37 use strict;
38
39 use warnings;
40
41 $main::mail_task_id = undef;
42 $main::sub_id_name = undef;
43 $main::alssub_id_name = undef;
44 $main::alssub_id_parentid =undef;
45
46 sub mbox_get_dmn_full_name{
47
48         my ($mbox_data) = @_;
49
50         push_el(\@main::el, 'mbox_get_dmn_full_name()', 'Starting...');
51
52         if (!defined($mbox_data) || $mbox_data eq '') {
53                 push_el(\@main::el, 'mbox_get_dmn_full_name()', 'ERROR: Undefined Input Data...');
54                 return (-1,'');
55         }
56
57         my $dmn_full =undef;
58
59         my $mail_dmn_id = @$mbox_data[4];
60         my $mail_type = @$mbox_data[5];
61         my $mail_sub_id = @$mbox_data[6];
62
63         if ($mail_type =~ /^normal_*/){
64
65                 $dmn_full = $main::domain_id_name{$mail_dmn_id};
66                 push_el(\@main::el, 'mbox_get_dmn_full_name()', "dbg: dmn_name: $dmn_full");
67
68         } elsif ($mail_type =~ /^alias_*/) {
69
70                 $dmn_full = $main::als_id_name{$mail_sub_id};
71                 push_el(\@main::el, 'mbox_get_dmn_full_name()', "dbg: als_name: $dmn_full");
72
73         } elsif ($mail_type =~ /^subdom_*/) {
74
75                 my $sub_pref = $main::sub_id_name{$mail_sub_id};
76                 my $dmn_name = $main::domain_id_name{$mail_dmn_id};
77
78                 $dmn_full = "$sub_pref.$dmn_name";
79                 push_el(\@main::el, 'mbox_get_dmn_full_name()', "dbg: sub_pref: $sub_pref, dmn_name: $dmn_name, sub_name: $dmn_full");
80
81         } elsif ($mail_type =~ /^alssub_*/) {
82
83                 my $sub_pref = $main::alssub_id_name{$mail_sub_id};
84                 my $dmn_name = $main::als_id_name{$main::alssub_id_parentid{$mail_sub_id}};
85
86                 $dmn_full = "$sub_pref.$dmn_name";
87                 push_el(\@main::el, 'mbox_get_dmn_full_name()', "dbg: als_sub_pref: $sub_pref, als_name: $dmn_name, als_sub_name: $dmn_full");
88
89         } else {
90
91                 push_el(\@main::el, 'mbox_get_dmn_full_name()', 'ERROR: Undefined mail type...');
92                 return (-1,'');
93
94         }
95
96         push_el(\@main::el, 'mbox_get_dmn_full_name()', 'Ending...');
97         return (0,$dmn_full);
98 }
99
100 sub get_mta_hash_value {
101
102         my ($hfile, $key) = @_;
103
104         push_el(\@main::el, 'get_mta_hash_value()', 'Starting...');
105
106         if (!defined($hfile) || $hfile eq '' || !defined($key) || $key eq '') {
107
108                 push_el(\@main::el, 'get_mta_hash_value()', 'ERROR: Undefined Input Data...');
109                 return (-1, '');
110
111         }
112
113         my ($rs, $rdata) = (undef, undef);
114
115         ($rs, $rdata) = get_file($hfile);
116         return $rs if ($rs != 0);
117
118         $rdata =~ /^$key\t+([^\n]+)\n/gim; $rdata = $1;
119
120         if (!defined($rdata)) { $rdata = ''; }
121
122         push_el(\@main::el, 'get_mta_hash_value()', 'Ending...');
123         return (0, $rdata);
124
125 }
126
127 sub del_mta_hash_value {
128
129         my ($hfile, $key) = @_;
130
131         push_el(\@main::el, 'del_mta_hash_value()', 'Starting...');
132
133         if (!defined($hfile) || $hfile eq '' || !defined($key) || $key eq '') {
134
135                 push_el(\@main::el, 'del_mta_hash_value()', 'ERROR: Undefined Input Data...');
136                 return -1;
137
138         }
139
140         my ($rs, $rdata) = (undef, undef);
141
142         ($rs, $rdata) = get_mta_hash_value($hfile, $key);
143         return 0 if ($rdata eq '');
144
145         ($rs, $rdata) = get_file($hfile);
146         return $rs if ($rs != 0);
147
148         $rdata =~ s/^$key\t+([^\n]+)\n//gim;
149
150         $rs = store_file($hfile, $rdata, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
151         return $rs if ($rs != 0);
152
153         push_el(\@main::el, 'del_mta_hash_value()', 'Ending...');
154         return 0;
155
156 }
157
158 sub set_mta_hash_value {
159
160         my ($hfile, $key, $value) = @_;
161
162         push_el(\@main::el, 'set_mta_hash_value()', 'Starting...');
163
164         if (!defined($hfile) || $hfile eq '' || !defined($key) || $key eq '' || !defined($value) || $value eq '') {
165
166                 push_el(\@main::el, 'set_mta_hash_value()', 'ERROR: Undefined Input Data...');
167                 return -1;
168
169         }
170
171         my ($rs, $rdata, $fdata) = (undef, undef, undef);
172
173         ($rs, $rdata) = get_mta_hash_value($hfile, $key);
174         return $rs if ($rs != 0);
175
176         ($rs, $fdata) = get_file($hfile);
177         return $rs if ($rs != 0);
178
179         $fdata =~ s/^$key\t+([^\n]+)\n//gim if ($rdata ne '');
180         $fdata .= "$key\t$value\n";
181
182         $rs = store_file($hfile, $fdata, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
183         return $rs if ($rs != 0);
184
185         push_el(\@main::el, 'set_mta_hash_value()', 'Ending...');
186         return 0;
187
188 }
189
190 sub mbox_mngr_start_up {
191
192         my ($rs, $rdata) = (undef, undef);
193
194         push_el(\@main::el, 'mbox_mngr_start_up()', 'Starting...');
195
196         # checking for master process;
197
198         $rs = check_master();
199         return $rs if ($rs != 0);
200
201         # Let's clear Execution Logs, if any.
202
203         if (-e $main::ispcp_mbox_mngr_el) {
204
205                 $rs = del_file($main::ispcp_mbox_mngr_el);
206                 return $rs if ($rs != 0);
207
208         }
209
210         # config check;
211
212         $rs = get_conf();
213         return $rs if ($rs != 0);
214
215         # sql check;
216
217         #
218         # getting initial data also must be done here;
219         #
220
221         my $sql = "
222                 SELECT
223                 mail_id,
224                 mail_acc,
225                 mail_pass,
226                 mail_forward,
227                 domain_id,
228                 mail_type,
229                 sub_id,
230                 status,
231                 mail_auto_respond,
232                 quota,
233                 mail_addr
234         FROM
235                 mail_users
236         ";
237
238         ($rs, $rdata) = doSQL($sql);
239         return $rs if ($rs != 0);
240
241         $rs = get_domain_ids();
242         return $rs if ($rs != 0);
243
244         $rs = get_subdom_ids();
245         return $rs if ($rs != 0);
246
247         $rs = get_alssub_ids();
248         return $rs if ($rs != 0);
249
250         $rs = get_alias_ids();
251         return $rs if ($rs != 0);
252
253         $main::mail_task_id = $ARGV[0];
254
255         push_el(\@main::el, 'mbox_mngr_start_up()', 'Ending...');
256         return 0;
257
258 }
259
260 sub mbox_mngr_shut_down {
261
262         my $rs = undef;
263
264         push_el(\@main::el, 'mbox_mngr_shut_down()', 'Starting...');
265         push_el(\@main::el, 'mbox_mngr_shut_down()', 'Ending...');
266         return 0;
267
268 }
269
270 sub mbox_check_sasl_user {
271
272         my ($uname) = @_;
273
274         push_el(\@main::el, 'mbox_check_sasl_user()', 'Starting...');
275
276         my ($rs, $rdata) = (undef, undef);
277         my $check_file = "/tmp/ispcp-mbox-check-sasl-user";
278         my $cmd = "$main::cfg{'CMD_SASLDB_LISTUSERS2'} -f $main::cfg{'MTA_SASLDB_FILE'} | $main::cfg{'CMD_GREP'} '$uname' &> $check_file";
279
280         sys_command_rs($cmd);
281
282         if (-z $check_file) {
283
284                 $rdata = 0;
285
286         } else {
287
288                 $rdata = 1;
289         }
290
291         $rs = del_file($check_file);
292
293         push_el(\@main::el, 'mbox_check_sasl_user()', 'Starting...');
294         return (0, $rdata);
295
296 }
297
298 sub mbox_add_sasl_data {
299
300         my ($mbox_data) = @_;
301
302         push_el(\@main::el, 'mbox_add_sasl_data()', 'Starting...');
303
304         if (!defined($mbox_data) || $mbox_data eq '') {
305
306                 push_el(\@main::el, 'mbox_add_sasl_data()', 'ERROR: Undefined Input Data...');
307                 return -1;
308
309         }
310
311         my ($rs, $rdata, $dmn_name) = (undef, undef, undef);
312         my ($cmd_add_user, $cmd_del_user) = (undef, undef);
313         my ($hash_key, $hash_value) = (undef, undef);
314         my $check_user = undef;
315
316         my $mail_id = @$mbox_data[0];
317         my $mail_acc = @$mbox_data[1];
318         my $mail_pass = @$mbox_data[2];
319         my $mail_forward = @$mbox_data[3];
320         my $mail_dmn_id = @$mbox_data[4];
321         my $mail_type = @$mbox_data[5];
322         my $mail_sub_id = @$mbox_data[6];
323         my $mail_autorespond = @$mbox_data[8];
324        
325         my $mta_sasldb_file = $main::cfg{'MTA_SASLDB_FILE'};
326         my $etc_sasldb_file = $main::cfg{'ETC_SASLDB_FILE'};
327         my $sa_file = $main::cfg{'MTA_SENDER_ACCESS_HASH'};
328         my $cmd_sasldb_passwd2 = $main::cfg{'CMD_SASLDB_PASSWD2'};
329         my $cmd_cp = $main::cfg{'CMD_CP'};
330         my $cmd_echo = $main::cfg{'CMD_ECHO'};
331         my $cmd_postmap = $main::cfg{'CMD_POSTMAP'};
332
333         do {
334
335                 ($rs, $dmn_name) = mbox_get_dmn_full_name($mbox_data);
336                 return $rs if ($rs != 0);
337
338                 $mail_pass=decrypt_db_password($mail_pass);
339                 $check_user = "$mail_acc\@$dmn_name";
340                 $cmd_del_user = "$cmd_sasldb_passwd2 -d -f $etc_sasldb_file -u $dmn_name $mail_acc";
341
342                 if($etc_sasldb_file ne $mta_sasldb_file) {
343                         $cmd_del_user .= " && $cmd_cp $etc_sasldb_file $mta_sasldb_file";
344                 }
345
346                 $cmd_add_user = "$cmd_echo \"$mail_pass\" | $cmd_sasldb_passwd2 -p -c -f $etc_sasldb_file -u $dmn_name $mail_acc";
347
348                 if($etc_sasldb_file ne $mta_sasldb_file) {
349                         $cmd_add_user .= " && $cmd_cp $etc_sasldb_file $mta_sasldb_file";
350                 }
351
352                 $hash_key = "$mail_acc\@$dmn_name";
353                 $hash_value = "OK";
354
355                 ($rs, $rdata) = mbox_check_sasl_user($check_user);
356                 return $rs if ($rs != 0);
357
358                 if ($rdata) {
359                         sys_command_rs($cmd_del_user);
360                 }
361
362                 $rs = sys_command($cmd_add_user);
363                 return $rs if ($rs != 0);
364
365                 $rs = setfmode($mta_sasldb_file, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
366                 return $rs if ($rs != 0);
367
368                 $rs = set_mta_hash_value($sa_file, $hash_key, $hash_value);
369                 return $rs if ($rs != 0);
370
371                 $rs = sys_command("$cmd_postmap $sa_file");
372                 return $rs if ($rs != 0);
373
374         }if ($mail_type =~ /^(normal|alias|subdom|alssub)_mail.*/);
375
376         push_el(\@main::el, 'mbox_add_sasl_data()', 'Ending...');
377         return 0;
378
379 }
380
381 sub mbox_add_po_data {
382
383         my ($mbox_data) = @_;
384
385         push_el(\@main::el, 'mbox_add_po_data()', 'Starting...');
386
387         if (!defined($mbox_data) || $mbox_data eq '') {
388
389                 push_el(\@main::el, 'mbox_add_po_data()', 'ERROR: Undefined Input Data...');
390                 return -1;
391
392         }
393
394         my ($rs, $rdata) = (undef, undef);
395         my ($sys, $working) = (undef, undef);
396
397         my $mail_id = @$mbox_data[0];
398         my $mail_acc = @$mbox_data[1];
399         my $mail_pass = @$mbox_data[2];
400         my $mail_forward = @$mbox_data[3];
401         my $mail_dmn_id = @$mbox_data[4];
402         my $mail_type = @$mbox_data[5];
403         my $mail_sub_id = @$mbox_data[6];
404         my $mail_autorespond = @$mbox_data[8];
405
406         my $virtual_mail_dir = $main::cfg{'MTA_VIRTUAL_MAIL_DIR'};
407         my $mbox_uid = $main::cfg{'MTA_MAILBOX_UID'};
408         my $mbox_gid = $main::cfg{'MTA_MAILBOX_GID'};
409         my $conf_dir = $main::cfg{'CONF_DIR'};
410         my $courier_dir = $main::cfg{'AUTHLIB_CONF_DIR'};
411         my $cmd_makeuserdb = $main::cfg{'CMD_MAKEUSERDB'};
412
413         my $working_dir = "$conf_dir/courier/working";
414         my $backup_dir = "$conf_dir/courier/backup";
415         my $timestamp = time;
416         my $userdb_cfg = "$courier_dir/userdb";
417         my $userdb_working_cfg = "$working_dir/userdb";
418         my $userdb_backup_cfg = "$backup_dir/userdb.$timestamp";
419
420         ($rs, $sys) = get_file($userdb_cfg);
421         return $rs if ($rs != 0);
422
423         $rs = store_file($userdb_backup_cfg, $sys, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
424         return $rs if ($rs != 0);
425
426         my ($hash_key, $hash_value) = (undef, undef);
427
428         do {
429
430                 $mail_pass=decrypt_db_password($mail_pass);
431
432                 my ($rs, $dmn_name) = mbox_get_dmn_full_name($mbox_data);
433                 return $rs if ($rs != 0);
434
435                 ($rs, $rdata) = crypt_md5_data($mail_pass);
436                 return $rs if ($rs != 0);
437
438                 $hash_key = "$mail_acc\@$dmn_name";
439                 $hash_value = "uid=$mbox_uid|gid=$mbox_gid|home=$virtual_mail_dir/$dmn_name/$mail_acc|shell=/bin/false|systempw=$rdata|mail=$virtual_mail_dir/$dmn_name/$mail_acc";
440
441                 $rs = set_mta_hash_value($userdb_working_cfg, $hash_key, $hash_value);
442                 return $rs if ($rs != 0);
443
444         }if ($mail_type =~ /^(normal|alias|subdom|alssub)_mail.*/);
445
446         ($rs, $working) = get_file($userdb_working_cfg);
447         return $rs if ($rs != 0);
448
449         $rs = store_file($userdb_cfg, $working, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0600);
450         return $rs if ($rs != 0);
451
452         $rs = sys_command($cmd_makeuserdb);
453         return $rs if ($rs != 0);
454
455         push_el(\@main::el, 'mbox_add_po_data()', 'Ending...');
456         return 0;
457
458 }
459
460 sub mbox_add_mta_file_data {
461
462         my ($mbox_data) = @_;
463
464         push_el(\@main::el, 'mbox_add_mta_file_data()', 'Starting...');
465
466         if (!defined($mbox_data) || $mbox_data eq '') {
467
468                 push_el(\@main::el, 'mbox_add_mta_file_data()', 'ERROR: Undefined Input Data...');
469                 return -1;
470
471         }
472
473         my ($rs, $rdata) = (undef, undef);
474
475         my $mail_id = @$mbox_data[0];
476         my $mail_acc = @$mbox_data[1];
477         my $mail_forward = @$mbox_data[3];
478         my $mail_dmn_id = @$mbox_data[4];
479         my $mail_type = @$mbox_data[5];
480         my $mail_sub_id = @$mbox_data[6];
481         my $mail_autorespond = @$mbox_data[8];
482
483         my $virtual_mail_dir = $main::cfg{'MTA_VIRTUAL_MAIL_DIR'};
484         my $mailbox_uid_name = $main::cfg{'MTA_MAILBOX_UID_NAME'};
485         my $mailbox_gid_name = $main::cfg{'MTA_MAILBOX_GID_NAME'};
486
487         do {
488
489                 my ($rs, $dmn_name) = mbox_get_dmn_full_name($mbox_data);
490                 return $rs if ($rs != 0);
491
492                 my $dir_name = "$virtual_mail_dir/$dmn_name/$mail_acc";
493                 $rs = make_dir($dir_name, $mailbox_uid_name, $mailbox_gid_name, 0755);
494                 return $rs if ($rs != 0);
495
496                 $dir_name = "$virtual_mail_dir/$dmn_name/$mail_acc/cur";
497                 $rs = make_dir($dir_name, $mailbox_uid_name, $mailbox_gid_name, 0700);
498                 return $rs if ($rs != 0);
499
500                 $dir_name = "$virtual_mail_dir/$dmn_name/$mail_acc/tmp";
501                 $rs = make_dir($dir_name, $mailbox_uid_name, $mailbox_gid_name, 0700);
502                 return $rs if ($rs != 0);
503
504                 $dir_name = "$virtual_mail_dir/$dmn_name/$mail_acc/new";
505                 $rs = make_dir($dir_name, $mailbox_uid_name, $mailbox_gid_name, 0700);
506                 return $rs if ($rs != 0);
507
508         } if ($mail_type =~ /^(normal|alias|subdom|alssub)(_mail|_forward).*/);
509
510         push_el(\@main::el, 'mbox_add_mta_file_data()', 'Ending...');
511         return 0;
512
513 }
514
515 sub mbox_add_mta_cfg_autorespond_data {
516
517         my ($mbox_data) = @_;
518
519         push_el(\@main::el, 'mbox_add_mta_cfg_autorespond_data()', 'Starting...');
520
521         if (!defined($mbox_data) || $mbox_data eq '') {
522
523                 push_el(\@main::el, 'mbox_add_mta_cfg_autorespond_data()', 'ERROR: Undefined Input Data...');
524                 return -1;
525
526         }
527
528         my ($rs, $rdata) = (undef, undef);
529         my ($sys, $working) = (undef, undef);
530         my ($hash_key, $hash_value, $dmn_name) = (undef, undef, undef);
531
532         my $mail_id = @$mbox_data[0];
533         my $mail_acc = @$mbox_data[1];
534         my $mail_forward = @$mbox_data[3];
535         my $mail_dmn_id = @$mbox_data[4];
536         my $mail_type = @$mbox_data[5];
537         my $mail_sub_id = @$mbox_data[6];
538         my $mail_autorespond = @$mbox_data[8];
539
540         my $conf_dir = $main::cfg{'CONF_DIR'};
541         my $cmd_postmap = $main::cfg{'CMD_POSTMAP'};
542         my $aliases_cfg = $main::cfg{'MTA_VIRTUAL_ALIAS_HASH'};
543         my $transport_cfg = $main::cfg{'MTA_TRANSPORT_HASH'};
544
545         my $timestamp = time;
546         my $mail_forward_list = '';
547         my $working_dir = "$conf_dir/postfix/working";
548         my $backup_dir = "$conf_dir/postfix/backup";
549         my $aliases_working_cfg = "$working_dir/aliases";
550         my $aliases_backup_cfg = "$backup_dir/aliases.$timestamp";
551         my $transport_working_cfg = "$working_dir/transport";
552         my $transport_backup_cfg = "$backup_dir/transport.$timestamp";
553
554         # create a mail forward list
555
556         if ($mail_forward ne '_no_') {
557
558                 $mail_forward_list = ',' . $mail_forward;
559
560         }
561
562
563         ($rs, $sys) = get_file($aliases_cfg);
564         return $rs if ($rs != 0);
565
566         $rs = store_file($aliases_backup_cfg, $sys, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
567         return $rs if ($rs != 0);
568
569         ($rs, $sys) = get_file($transport_cfg);
570         return $rs if ($rs != 0);
571
572         $rs = store_file($transport_backup_cfg, $sys, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
573         return $rs if ($rs != 0);
574
575         ($rs, $dmn_name) = mbox_get_dmn_full_name($mbox_data);
576         return $rs if ($rs != 0);
577
578         do {
579
580                 $hash_key = "$mail_acc\@$dmn_name";
581
582                 if ($mail_type =~ /.*_forward.*/){
583
584                         $hash_value = undef;
585
586                         ($rs, $rdata) = get_mta_hash_value($aliases_working_cfg, $hash_key);
587                         return $rs if ($rs != 0);
588        
589                         if ($rdata eq '') {
590
591                                 $hash_value = "$mail_acc\@$dmn_name,$mail_acc\@ispcp-arpl.$dmn_name";
592
593                         } else {
594
595                                 $hash_value = $rdata.",$mail_acc\@ispcp-arpl.$dmn_name";
596
597                         }
598                 } else {
599
600                         $hash_value = "$mail_acc\@$dmn_name$mail_forward_list,$mail_acc\@ispcp-arpl.$dmn_name";
601
602                         $rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
603                         return $rs if ($rs != 0);
604
605                 }
606
607                 $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_value);
608                 return $rs if ($rs != 0);
609
610                 ($rs, $working) = get_file($aliases_working_cfg);
611                 return $rs if ($rs != 0);
612
613                 $rs = store_file($aliases_cfg, $working, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
614                 return $rs if ($rs != 0);
615
616                 $hash_key = "ispcp-arpl.$dmn_name";
617                 $hash_value = "ispcp-arpl:";
618
619                 $rs = set_mta_hash_value($transport_working_cfg, $hash_key, $hash_value);
620                 return $rs if ($rs != 0);
621
622                 ($rs, $working) = get_file($transport_working_cfg);
623                 return $rs if ($rs != 0);
624
625                 $rs = store_file($transport_cfg, $working, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
626                 return $rs if ($rs != 0);
627
628         } if ($mail_type =~ /.*(normal|alias|subdom|alssub)(_mail|_forward).*/);
629
630         $rs = sys_command("$cmd_postmap $transport_cfg");
631         return $rs if ($rs != 0);
632
633         push_el(\@main::el, 'mbox_add_mta_cfg_autorespond_data()', 'Ending...');
634         return 0;
635
636 }
637
638 sub mbox_del_last_transport_entry {
639
640         my ($mbox_data) = @_;
641
642         push_el(\@main::el, 'mbox_del_last_transport_entry()', 'Starting...');
643
644         if (!defined($mbox_data) || $mbox_data eq '') {
645
646                 push_el(\@main::el, 'mbox_del_last_transport_entry()', 'ERROR: Undefined Input Data...');
647                 return -1;
648
649         }
650
651         my ($rs, $rdata, $dmn_name) = (undef, undef, undef);
652
653         my $mail_dmn_id = @$mbox_data[4];
654         my $mail_sub_id = @$mbox_data[6];
655         my $mail_type = @$mbox_data[5];
656
657         my $conf_dir = $main::cfg{'CONF_DIR'};
658
659         my $working_dir = "$conf_dir/postfix/working";
660         my $transport_working_cfg = "$working_dir/transport";
661        
662         ($rs, $dmn_name) = mbox_get_dmn_full_name($mbox_data);
663         return $rs if ($rs != 0);
664
665         my $hash_key = "ispcp-arpl.$dmn_name";
666
667         $rs = del_mta_hash_value($transport_working_cfg, $hash_key);
668         return $rs if ($rs != 0);
669
670         push_el(\@main::el, 'mbox_del_last_transport_entry()', 'Ending...');
671
672         return 0;
673
674 }
675
676 sub mbox_check_last_transport_entry {
677
678         my ($mbox_data) = @_;
679
680         push_el(\@main::el, 'mbox_check_last_transport_entry()', 'Starting...');
681
682         if (!defined($mbox_data) || $mbox_data eq '') {
683
684                 push_el(\@main::el, 'mbox_check_last_transport_entry()', 'ERROR: Undefined Input Data...');
685                 return -1;
686
687         }
688
689         my ($rs, $rows, $sql) = (undef, undef, undef);
690
691         my $mail_dmn_id = @$mbox_data[4];
692         my $mail_sub_id = @$mbox_data[6];
693         my $mail_type = @$mbox_data[5];
694
695         if ($mail_type =~ /^(alias_).*/) {
696
697                 $sql = "
698                         select count(mail_id) as cnt
699                         from mail_users
700                         where (status = 'ok' or status = 'change')
701                         and mail_auto_respond != '_no_'
702                         and domain_id = $mail_dmn_id
703                         and sub_id = $mail_sub_id
704                         and mail_type like 'alias_%';
705                 ";
706
707         } elsif ($mail_type =~ /^(subdom_).*/) {
708
709                 $sql = "
710                         select count(mail_id) as cnt
711                         from mail_users
712                         where (status = 'ok' or status = 'change')
713                         and mail_auto_respond != '_no_'
714                         and domain_id = $mail_dmn_id
715                         and sub_id = $mail_sub_id
716                         and mail_type like 'subdom_%';
717                 ";
718
719         }  elsif ($mail_type =~ /^(alssub_).*/) {
720
721                 $sql = "
722                         select count(mail_id) as cnt
723                         from mail_users
724                         where (status = 'ok' or status = 'change')
725                         and mail_auto_respond != '_no_'
726                         and domain_id = $mail_dmn_id
727                         and sub_id = $mail_sub_id
728                         and mail_type like 'alssub_%';
729                 ";
730
731         } else {
732
733                 $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 = 0 and mail_type != 'normal_catchall' and mail_type != 'alias_catchall';";
734
735         }
736 print "\n\n\$sql:$sql\n\n";
737         ($rs, $rows) = doSQL($sql);
738         return $rs if ($rs != 0);
739
740         $rs = @$rows[0];
741
742         push_el(\@main::el, 'mbox_check_last_transport_entry()', 'Ending...');
743         return @$rs[0];
744
745 }
746
747 sub mbox_del_mta_cfg_autorespond_data {
748
749         my ($mbox_data) = @_;
750
751         push_el(\@main::el, 'mbox_del_mta_cfg_autorespond_data()', 'Starting...');
752
753         if (!defined($mbox_data) || $mbox_data eq '') {
754
755                 push_el(\@main::el, 'mbox_del_mta_cfg_autorespond_data()', 'ERROR: Undefined Input Data...');
756                 return -1;
757
758         }
759
760         my ($rs, $rdata) = (undef, undef);
761         my ($hash_key, $hash_value, $dmn_name) = (undef, undef, undef);
762         my ($sys, $working) = (undef, undef);
763
764         my $mail_id = @$mbox_data[0];
765         my $mail_acc = @$mbox_data[1];
766         my $mail_forward = @$mbox_data[3];
767         my $mail_dmn_id = @$mbox_data[4];
768         my $mail_type = @$mbox_data[5];
769         my $mail_sub_id = @$mbox_data[6];
770         my $mail_autorespond = @$mbox_data[8];
771
772         my $conf_dir = $main::cfg{'CONF_DIR'};
773         my $cmd_postmap = $main::cfg{'CMD_POSTMAP'};
774         my $aliases_cfg = $main::cfg{'MTA_VIRTUAL_ALIAS_HASH'};
775         my $transport_cfg = $main::cfg{'MTA_TRANSPORT_HASH'};
776
777         my $timestamp = time;
778         my $working_dir = "$conf_dir/postfix/working";
779         my $backup_dir = "$conf_dir/postfix/backup";
780         my $aliases_working_cfg = "$working_dir/aliases";
781         my $aliases_backup_cfg = "$backup_dir/aliases.$timestamp";
782         my $transport_working_cfg = "$working_dir/transport";
783         my $transport_backup_cfg = "$backup_dir/transport.$timestamp";
784
785         ($rs, $sys) = get_file($aliases_cfg);
786         return $rs if ($rs != 0);
787
788         $rs = store_file($aliases_backup_cfg, $sys, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
789         return $rs if ($rs != 0);
790
791         ($rs, $sys) = get_file($transport_cfg);
792         return $rs if ($rs != 0);
793
794         $rs = store_file($transport_backup_cfg, $sys, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
795         return $rs if ($rs != 0);
796
797         ($rs, $dmn_name) = mbox_get_dmn_full_name($mbox_data);
798         return $rs if ($rs != 0);
799
800         do {
801
802                 $hash_key = "$mail_acc\@$dmn_name";
803
804                 if($mail_type =~ /.*_forward.*/){
805
806                         ($rs, $rdata) = get_mta_hash_value($aliases_working_cfg, $hash_key);
807                         return $rs if ($rs != 0);
808        
809                         if ($rdata ne '') {
810        
811                                 $rdata =~ s/\,$mail_acc\@ispcp-arpl\.$dmn_name//gi;
812        
813                                 $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $rdata);
814                                 return $rs if ($rs != 0);
815        
816                         }
817
818                 } else {
819                         $rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
820                         return $rs if ($rs != 0);
821                 }
822
823                 ($rs, $working) = get_file($aliases_working_cfg);
824                 return $rs if ($rs != 0);
825
826                 $rs = store_file($aliases_cfg, $working, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
827                 return $rs if ($rs != 0);
828
829                 $rs = mbox_check_last_transport_entry($mbox_data);
830
831                 if ($rs == 0) {
832
833                         $rs = mbox_del_last_transport_entry($mbox_data);
834                         return $rs if ($rs != 0);
835
836                 } elsif ($rs == -1) {
837
838                         return $rs;
839
840                 }
841
842                 ($rs, $working) = get_file($transport_working_cfg);
843                 return $rs if ($rs != 0);
844
845                 $rs = store_file($transport_cfg, $working, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
846                 return $rs if ($rs != 0);
847
848         } if ($mail_type =~ /^(normal|alias|subdom|alssub)(_mail|_forward).*/);
849
850         $rs = sys_command("$cmd_postmap $transport_cfg");
851         return $rs if ($rs != 0);
852
853         push_el(\@main::el, 'mbox_del_mta_cfg_autorespond_data()', 'Ending...');
854         return 0;
855
856 }
857
858 sub mbox_add_mta_cfg_data {
859
860         my ($mbox_data) = @_;
861
862         push_el(\@main::el, 'mbox_add_mta_cfg_data()', 'Starting...');
863
864         if (!defined($mbox_data) || $mbox_data eq '') {
865
866                 push_el(\@main::el, 'mbox_add_mta_cfg_data()', 'ERROR: Undefined Input Data...');
867                 return -1;
868
869         }
870
871         my ($rs, $rdata, $dmn_name) = (undef, undef, undef);
872         my ($sys, $working) = (undef, undef);
873         my ($hash_key, $hash_value) = (undef, undef);
874
875         my $mail_id = @$mbox_data[0];
876         my $mail_acc = @$mbox_data[1];
877         my $mail_forward = @$mbox_data[3];
878         my $mail_dmn_id = @$mbox_data[4];
879         my $mail_type = @$mbox_data[5];
880         my $mail_sub_id = @$mbox_data[6];
881         my $mail_autorespond = @$mbox_data[8];
882
883         my $conf_dir = $main::cfg{'CONF_DIR'};
884         my $cmd_postmap = $main::cfg{'CMD_POSTMAP'};
885         my $aliases_cfg = $main::cfg{'MTA_VIRTUAL_ALIAS_HASH'};
886         my $mailboxes_cfg = $main::cfg{'MTA_VIRTUAL_MAILBOX_HASH'};
887
888         my $timestamp = time;
889         my $tpl_dir = "$conf_dir/postfix/parts";
890         my $working_dir = "$conf_dir/postfix/working";
891         my $backup_dir = "$conf_dir/postfix/backup";
892         my $mailboxes_working_cfg = "$working_dir/mailboxes";
893         my $mailboxes_backup_cfg = "$backup_dir/mailboxes.$timestamp";
894         my $aliases_working_cfg = "$working_dir/aliases";
895         my $aliases_backup_cfg = "$backup_dir/aliases.$timestamp";
896
897         ($rs, $sys) = get_file($mailboxes_cfg);
898         return $rs if ($rs != 0);
899
900         $rs = store_file($mailboxes_backup_cfg, $sys, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
901         return $rs if ($rs != 0);
902
903         ($rs, $sys) = get_file($aliases_cfg);
904         return $rs if ($rs != 0);
905
906         $rs = store_file($aliases_backup_cfg, $sys, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
907         return $rs if ($rs != 0);
908
909         ($rs, $dmn_name) = mbox_get_dmn_full_name($mbox_data);
910         return $rs if ($rs != 0);
911
912         do {
913
914                 $hash_key = "$mail_acc\@$dmn_name";
915                 $hash_value = "$dmn_name/$mail_acc/";
916
917                 $rs = set_mta_hash_value($mailboxes_working_cfg, $hash_key, $hash_value);
918                 return $rs if ($rs != 0);
919
920                 ($rs, $working) = get_file($mailboxes_working_cfg);
921                 return $rs if ($rs != 0);
922
923                 $rs = store_file($mailboxes_cfg, $working, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
924                 return $rs if ($rs != 0);
925
926                 if ($mail_type =~ /.*_mail.*/){
927                         if($mail_type =~ /.*forward.*/){
928                                 $hash_value = $hash_key . ',' . $mail_forward;
929                         } else {
930                                 $hash_value = $hash_key;
931                         }
932                 } else {
933                         $hash_value = $mail_forward;
934                 }
935
936                 $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_value);
937                 return $rs if ($rs != 0);
938
939                 ($rs, $working) = get_file($aliases_working_cfg);
940                 return $rs if ($rs != 0);
941
942                 $rs = store_file($aliases_cfg, $working, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
943                 return $rs if ($rs != 0);
944
945                 if ($mail_autorespond != 0) {
946                         $rs = mbox_add_mta_cfg_autorespond_data($mbox_data);
947                         return $rs if ($rs != 0);
948                 } else {
949                         $rs = mbox_del_mta_cfg_autorespond_data($mbox_data);
950                         return $rs if ($rs != 0);
951                 }
952
953         } if ($mail_type =~ /^(normal|alias|subdom|alssub)(_mail|_forward).*/);
954
955         do {
956
957                 my $hash_key = "\@$dmn_name";
958                 my $hash_value = undef;
959
960                 # Let's first remove old catchall accounts (if any);
961                 $rs = del_mta_hash_value($aliases_working_cfg, $hash_key);
962                 return $rs if ($rs != 0);
963
964                 $rdata = "$mail_acc\n";
965                 $rdata =~ /^([^\@]+)\@([^\n]+)\n$/i;
966
967                 my ($catch_all_usr, $catch_all_dmn) = ($1, $2);
968
969                 $hash_key = "\@$dmn_name";
970                 $hash_value = "$mail_acc";
971
972                 $rs = set_mta_hash_value($aliases_working_cfg, $hash_key, $hash_value);
973                 return $rs if ($rs != 0);
974
975                 ($rs, $working) = get_file($aliases_working_cfg);
976                 return $rs if ($rs != 0);
977
978                 $rs = store_file($aliases_cfg, $working, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
979                 return $rs if ($rs != 0);
980
981         } if ($mail_type =~ /.*(normal|alias|subdom|alssub)_catchall.*/);
982
983         $rs = sys_command("$cmd_postmap $mailboxes_cfg");
984         return $rs if ($rs != 0);
985
986         $rs = sys_command("$cmd_postmap $aliases_cfg");
987         return $rs if ($rs != 0);
988
989         push_el(\@main::el, 'mbox_add_mta_cfg_data()', 'Ending...');
990         return 0;
991
992 }
993
994 sub mbox_change_data {
995
996         my ($mbox_data) = @_;
997
998         my $rs = undef;
999
1000         push_el(\@main::el, 'mbox_change_data()', 'Starting...');
1001
1002         if (!defined($mbox_data) || $mbox_data eq '') {
1003
1004                 push_el(\@main::el, 'mbox_change_data()', 'ERROR: Undefined Input Data...');
1005                 return -1;
1006
1007         }
1008
1009         $rs = mbox_add_data($mbox_data);
1010         return $rs if ($rs != 0);
1011
1012         push_el(\@main::el, 'mbox_change_data()', 'Ending...');
1013         return 0;
1014
1015 }
1016
1017 sub mbox_disable_data {
1018
1019         my ($mbox_data) = @_;
1020
1021         my $rs = undef;
1022
1023         push_el(\@main::el, 'mbox_disable_data()', 'Starting...');
1024
1025         if (!defined($mbox_data) || $mbox_data eq '') {
1026
1027                 push_el(\@main::el, 'mbox_disable_data()', 'ERROR: Undefined Input Data...');
1028                 return -1;
1029
1030         }
1031
1032         #
1033         # Remove all entries from the several config files
1034         #  but do not delete any file
1035         #
1036
1037         $rs = mbox_del_mta_cfg_data($mbox_data);
1038         return $rs if ($rs != 0);
1039
1040         $rs = mbox_del_po_data($mbox_data);
1041         return $rs if ($rs != 0);
1042
1043         $rs = mbox_del_sasl_data($mbox_data);
1044         return $rs if ($rs != 0);
1045
1046         push_el(\@main::el, 'mbox_disable_data()', 'Ending...');
1047         return 0;
1048
1049 }
1050
1051 sub mbox_del_sasl_data {
1052
1053         my ($mbox_data) = @_;
1054
1055         push_el(\@main::el, 'mbox_del_sasl_data()', 'Starting...');
1056
1057         if (!defined($mbox_data) || $mbox_data eq '') {
1058
1059                 push_el(\@main::el, 'mbox_del_sasl_data()', 'ERROR: Undefined Input Data...');
1060                 return -1;
1061
1062         }
1063
1064         my ($rs, $rdata, $dmn_name) = (undef, undef, undef);
1065         my ($cmd_del_user, $cmd_add_user) = (undef, undef);
1066         my ($hash_key, $hash_value) = (undef, undef);
1067         my $check_user = undef;
1068
1069         my $mail_id = @$mbox_data[0];
1070         my $mail_acc = @$mbox_data[1];
1071         my $mail_pass = @$mbox_data[2];
1072         my $mail_forward = @$mbox_data[3];
1073         my $mail_dmn_id = @$mbox_data[4];
1074         my $mail_type = @$mbox_data[5];
1075         my $mail_sub_id = @$mbox_data[6];
1076         my $mail_autorespond = @$mbox_data[8];
1077
1078         my $mta_sasldb_file = $main::cfg{'MTA_SASLDB_FILE'};
1079         my $etc_sasldb_file = $main::cfg{'ETC_SASLDB_FILE'};
1080         my $sa_file = $main::cfg{'MTA_SENDER_ACCESS_HASH'};
1081         my $cmd_sasldb_passwd2 = $main::cfg{'CMD_SASLDB_PASSWD2'};
1082         my $cmd_cp = $main::cfg{'CMD_CP'};
1083         my $cmd_echo = $main::cfg{'CMD_ECHO'};
1084         my $cmd_postmap = $main::cfg{'CMD_POSTMAP'};
1085
1086         ($rs, $dmn_name) = mbox_get_dmn_full_name($mbox_data);
1087         return $rs if ($rs != 0);
1088
1089
1090         if ($mail_type=~ /.*normal_mail.*/ || $mail_type=~ /.*subdom_mail.*/ || $mail_type=~ /.*alssub_mail.*/ || $mail_type=~ /.*alias_mail.*/){
1091
1092                 $mail_pass=decrypt_db_password($mail_pass);
1093
1094         }
1095
1096         do {
1097
1098                 $check_user = "$mail_acc\@$dmn_name";
1099
1100                 $cmd_del_user = "$cmd_sasldb_passwd2 -d -f $etc_sasldb_file -u $dmn_name $mail_acc";
1101                 if($etc_sasldb_file ne $mta_sasldb_file) {
1102                         $cmd_del_user .= " && $cmd_cp $etc_sasldb_file $mta_sasldb_file";
1103                 }
1104
1105                 $cmd_add_user = "$cmd_echo \