Handle hostnames with upper-case letters
[webmin.git] / majordomo / create_list.cgi
1 #!/usr/local/bin/perl
2 # create_list.cgi
3 # Create a new mailing list
4
5 require './majordomo-lib.pl';
6 require 'ctime.pl';
7 %access = &get_module_acl();
8 $access{'create'} || &error($text{'create_ecannot'});
9 &ReadParse();
10 $conf = &get_config();
11 $ldir = &perl_var_replace(&find_value("listdir", $conf), $conf);
12 $program_dir = $config{'smrsh_program_dir'} || $config{'program_dir'};
13 $wrapper_path = $config{'wrapper_path'} || "$program_dir/wrapper";
14 $wrapper_program_path = $config{'wrapper_path'} || "$config{'program_dir'}/wrapper";
15 &error_setup($text{'create_err'});
16
17 # Validate inputs
18 $in{'name'} =~ /^\S+$/ ||
19         &error($text{'create_ename'});
20 $in{'name'} = lc($in{'name'});
21 if (&get_list($in{'name'}, $conf)) {
22         &error(&text('create_eexists', $in{'name'}));
23         }
24 $aliases_files = &get_aliases_file();
25 @aliases = &foreign_call($aliases_module, "list_aliases", $aliases_files);
26 foreach $a (@aliases) {
27         if ($a->{'enabled'} && lc($a->{'name'}) eq lc($in{'name'})) {
28                 &error(&text('create_ealias', $in{'name'}));
29                 }
30         }
31 $in{'owner'} =~ /^\S+$/ ||
32         &error($text{'create_eowner'});
33 $in{'password'} =~ /^\S+$/ ||
34         &error($text{'create_epassword'});
35 $in{'moderator_def'} || $in{'moderator'} =~ /^\S+$/ ||
36         &error($text{'create_emoderator'});
37 $in{'info'} =~ s/\r//g;
38 $in{'footer'} =~ s/\r//g;
39
40 # Create list members file
41 &lock_file("$ldir/$in{'name'}");
42 &open_tempfile(MEMS, ">$ldir/$in{'name'}");
43 &close_tempfile(MEMS);
44 &set_permissions("$ldir/$in{'name'}");
45 &unlock_file("$ldir/$in{'name'}");
46
47 # Have majordomo create the new config file, by fooling the wrapper
48 # into thinking it has received an email with a resend command
49 $lfile = "$ldir/$in{'name'}.config";
50 $cmd = "$wrapper_program_path resend -l $in{'name'} nobody";
51 open(WRAPPER, "|$cmd nobody >/dev/null 2>&1");
52 print WRAPPER "config $in{'name'} $in{'password'}\n\n";
53 close(WRAPPER);
54 &additional_log("exec", $cmd);
55 sleep(3);
56
57 # create the .info file
58 &lock_file($lfile);
59 $list = &get_list_config($lfile);
60 chop($ctime = ctime(time()));
61 $updated = "[Last updated on: $ctime]\n";
62 &lock_file("$ldir/$in{'name'}.info");
63 &open_tempfile(INFO, ">$ldir/$in{'name'}.info");
64 if (&find_value("date_info", $list) eq "yes") {
65         &print_tempfile(INFO, $updated);
66         }
67 &print_tempfile(INFO, $in{'info'});
68 &close_tempfile(INFO);
69 &set_permissions("$ldir/$in{'name'}.info");
70 &unlock_file("$ldir/$in{'name'}.info");
71
72 # create the archive directory
73 $adir = &perl_var_replace(&find_value("filedir", $conf), $conf);
74 $aext = &perl_var_replace(&find_value("filedir_suffix", $conf), $conf);
75 if ($adir && $aext) {
76         &lock_file("$adir/$in{'name'}$aext");
77         mkdir("$adir/$in{'name'}$aext", 0755);
78         &set_permissions("$adir/$in{'name'}$aext");
79         &unlock_file("$adir/$in{'name'}$aext");
80         $arch = "$adir/$in{'name'}$aext/archive";
81         }
82 elsif ($in{'archive'}) {
83         &lock_file("$ldir/$in{'name'}.archive");
84         mkdir("$ldir/$in{'name'}.archive", 0755);
85         &set_permissions("$ldir/$in{'name'}.archive");
86         &unlock_file("$ldir/$in{'name'}.archive");
87         $arch = "$ldir/$in{'name'}.archive/archive";
88         }
89
90 # Create aliases for the new list
91 &foreign_call($aliases_module, "lock_alias_files", $aliases_files);
92 $lname = $config{'dynamic'} ? time()+$$ : "$in{'name'}-list";
93 if ($in{'archive'}) {
94         &newlist_alias($in{'name'}, "|$wrapper_path resend ".
95                                     "-l $in{'name'} $lname", 0,
96                                     $in{'name'}."-archive");
97         &newlist_alias($in{'name'}."-archive", "|$wrapper_path archive2.pl -f $arch -$in{'archive'} -a");
98         }
99 else {
100         &newlist_alias($in{'name'}, "|$wrapper_path resend ".
101                                     "-l $in{'name'} $lname");
102         }
103 &newlist_alias($lname, ":include:$ldir/$in{'name'}");
104 &newlist_alias("owner-".$in{'name'}, $in{'owner'});
105 &newlist_alias($in{'name'}."-owner", $in{'owner'});
106 &newlist_alias($in{'name'}."-approval", $in{'owner'});
107 &newlist_alias($in{'name'}."-request", "|$wrapper_path ".
108                                        "majordomo -l $in{'name'}", 1);
109 &foreign_call($aliases_module, "unlock_alias_files", $aliases_files);
110
111 # Update the new config file
112 &save_list_directive($list, $lfile, "description", $in{'desc'});
113 &save_list_directive($list, $lfile, "admin_passwd", $in{'password'});
114 &save_list_directive($list, $lfile, "approve_passwd", $in{'password'});
115 &save_list_directive($list, $lfile, "message_footer", $in{'footer'}, 1)
116         if ($in{'footer'});
117 &save_list_directive($list, $lfile, "moderate", $in{'moderate'});
118 &save_list_directive($list, $lfile, "moderator",
119                      $in{'moderator_def'} ? "" : $in{'moderator'});
120 &flush_file_lines();
121 &unlock_file($lfile);
122 &webmin_log("create", "list", $in{'name'}, \%in);
123
124 # add to this user's ACL
125 if ($access{'lists'} ne '*') {
126         $access{'lists'} .= " $in{'name'}";
127         &save_module_acl(\%access);
128         }
129 &redirect("edit_list.cgi?name=$in{'name'}");
130
131 # newlist_alias(name, value, last, othervalue)
132 sub newlist_alias
133 {
134 local @v = ( $_[1] );
135 push(@v, $_[3]) if ($_[3]);
136 local $al = { 'name' => $_[0],
137               'values' => \@v,
138               'enabled' => 1 };
139 &foreign_call($aliases_module, "create_alias", $al, $aliases_files, !$_[2]);
140 }
141