Handle hostnames with upper-case letters
[webmin.git] / majordomo / create_digest.cgi
1 #!/usr/local/bin/perl
2 # create_digest.cgi
3 # Create a new digest list
4
5 require './majordomo-lib.pl';
6 require 'ctime.pl';
7 %access = &get_module_acl();
8 $access{'create'} || &error($text{'digest_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{'smrsh_program_dir'}
13                                             : $config{'program_dir'};
14 $wrapper_path = $config{'wrapper_path'} ? $config{'wrapper_path'}
15                                         : "$program_dir/wrapper";
16 &error_setup($text{'digest_err'});
17
18 # Validate inputs
19 $in{'name'} =~ /^\S+$/ || &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{'mode'} != 0 || $in{'days'} =~ /^\d+$/ ||
36         &error("Invalid or missing number of days");
37 $in{'mode'} != 1 || $in{'lines'} =~ /^\d+$/ ||
38         &error("Invalid or missing number of lines");
39 $in{'info'} =~ s/\r//g;
40 $in{'footer'} =~ s/\r//g;
41
42 # Create list members file
43 &lock_file("$ldir/$in{'name'}");
44 &open_tempfile(MEMS, ">$ldir/$in{'name'}");
45 &close_tempfile(MEMS);
46 &set_permissions("$ldir/$in{'name'}");
47 &unlock_file("$ldir/$in{'name'}");
48
49 # Have majordomo create the new config file, by fooling the wrapper
50 # into thinking it has received an email with a config command
51 $lfile = "$ldir/$in{'name'}.config";
52 &lock_file($lfile);
53 open(WRAPPER, "|$wrapper_path majordomo >/dev/null 2>&1");
54 print WRAPPER "From: root\n\n";
55 print WRAPPER "config $in{'name'} $in{'password'}\n\n";
56 close(WRAPPER);
57 sleep(3);
58
59 # create the .info file
60 $list = &get_list_config($lfile);
61 chop($ctime = ctime(time()));
62 $updated = "[Last updated on: $ctime]\n";
63 &lock_file("$ldir/$in{'name'}.info");
64 &open_tempfile(INFO, ">$ldir/$in{'name'}.info");
65 if (&find_value("date_info", $list) eq "yes") {
66         &print_tempfile(INFO, $updated);
67         }
68 &print_tempfile(INFO, $in{'info'});
69 &close_tempfile(INFO);
70 &set_permissions("$ldir/$in{'name'}.info");
71 &unlock_file("$ldir/$in{'name'}.info");
72
73 # create the archive directory
74 $adir = &perl_var_replace(&find_value("filedir", $conf), $conf);
75 $aext = &perl_var_replace(&find_value("filedir_suffix", $conf), $conf);
76 if ($adir && $aext) {
77         &lock_file("$adir/$in{'name'}$aext");
78         mkdir("$adir/$in{'name'}$aext", 0755);
79         &set_permissions("$adir/$in{'name'}$aext");
80         &unlock_file("$adir/$in{'name'}$aext");
81         }
82
83 # Create the digest directories if needed
84 $ddir = &perl_var_replace(&find_value("digest_work_dir", $conf), $conf);
85 $fdir = &perl_var_replace(&find_value("filedir", $conf), $conf);
86 $fpfx = &perl_var_replace(&find_value("filedir_suffix", $conf), $conf);
87 &mkdir_heir("$ddir/$in{'name'}");
88 &mkdir_heir("$fdir/$in{'name'}$fpfx");
89
90 # Create aliases for the new list
91 &foreign_call($aliases_module, "lock_alias_files", $aliases_files);
92 &newlist_alias($in{'list'}."-digestify", "|$wrapper_path digest -r -C -l $in{'name'} $in{'name'}-outgoing");
93 &newlist_alias($in{'name'}, $in{'list'});
94 &newlist_alias($in{'name'}."-outgoing", ":include:$ldir/$in{'name'}");
95 &newlist_alias("owner-".$in{'name'}, $in{'owner'});
96 &newlist_alias("owner-".$in{'name'}."-outgoing", $in{'owner'});
97 &newlist_alias($in{'name'}."-owner", $in{'owner'});
98 &newlist_alias($in{'name'}."-approval", $in{'owner'});
99 &newlist_alias($in{'name'}."-request", "|$wrapper_path ".
100                                        "majordomo -l $in{'name'}", 1);
101
102 # Add the digestify alias for the source list
103 foreach $a (&foreign_call($aliases_module, "list_aliases", $aliases_files)) {
104         if ($a->{'name'} eq "$in{'list'}-list") {
105                 push(@{$a->{'values'}}, $in{'list'}."-digestify");
106                 &foreign_call($aliases_module, "modify_alias", $a, $a);
107                 }
108         }
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, "digest_name", $in{'desc'});
114 &save_list_directive($list, $lfile, "digest_issue", 1);
115 &save_list_directive($list, $lfile, "digest_volume", 1);
116 &save_list_directive($list, $lfile, "admin_passwd", $in{'password'});
117 &save_list_directive($list, $lfile, "approve_passwd", $in{'password'});
118 &save_list_directive($list, $lfile, "message_footer", $in{'footer'}, 1)
119         if ($in{'footer'});
120 if ($in{'mode'} == 0) {
121         &save_list_directive($list, $lfile, "digest_maxdays", $in{'days'});
122         &save_list_directive($list, $lfile, "digest_maxlines", "");
123         }
124 else {
125         &save_list_directive($list, $lfile, "digest_maxdays", "");
126         &save_list_directive($list, $lfile, "digest_maxlines", $in{'lines'});
127         }
128 &flush_file_lines();
129 &unlock_file($lfile);
130 &webmin_log("create", "digest", $in{'name'}, \%in);
131
132 # add to this user's ACL
133 if ($access{'lists'} ne '*') {
134         $access{'lists'} .= " $in{'name'}";
135         &save_module_acl(\%access);
136         }
137 &redirect("edit_list.cgi?name=$in{'name'}");
138
139 # newlist_alias(name, value, last)
140 sub newlist_alias
141 {
142 local $al = { 'name' => $_[0],
143               'values' => [ $_[1] ],
144               'enabled' => 1 };
145 &foreign_call($aliases_module, "create_alias", $al, $aliases_files, !$_[2]);
146 }
147
148 # mkdir_heir(dir)
149 sub mkdir_heir
150 {
151 if (!-d $_[0]) {
152         local $d = $_[0];
153         $d =~ s/\/[^\/]+$//;
154         &mkdir_heir($d);
155         mkdir($_[0], 0755);
156         &set_permissions($_[0]);
157         }
158 }