Handle hostnames with upper-case letters
[webmin.git] / apache / mod_alias.pl
1 # mod_alias.pl
2 # Defines editors for alias module directives
3
4 sub mod_alias_directives
5 {
6 $rv = [ [ 'Alias', 1, 10, 'virtual' ],
7         [ 'AliasMatch', 1, 10, 'virtual', 1.3 ],
8         [ 'Redirect', 1, 10, 'virtual directory htaccess', 1.2 ],
9         [ 'Redirect', 1, 10, 'virtual', '-1.2' ],
10         [ 'RedirectMatch', 1, 10, 'virtual', 1.3 ],
11         [ 'RedirectTemp', 1, 10, 'virtual directory htaccess', 1.2 ],
12         [ 'RedirectPermanent', 1, 10, 'virtual directory htaccess', 1.2 ],
13         [ 'ScriptAlias', 1, 11, 'virtual', undef, 10 ],
14         [ 'ScriptAliasMatch', 1, 11, 'virtual', 1.3, 10 ] ];
15 return &make_directives($rv, $_[0], "mod_alias");
16 }
17
18 # alias_input(array, name, title)
19 sub alias_input
20 {
21 local($rv, $len, $i, $from, $to);
22 $rv = "<table border>\n".
23       "<tr $tb> <td><b>$text{'mod_alias_from'}</b></td> <td><b>$text{'mod_alias_to'}</b></td> </tr>\n";
24 $len = @{$_[0]} + 1;
25 for($i=0; $i<$len; $i++) {
26         $from = $_[0]->[$i]->{'words'}->[0];
27         $to = $_[0]->[$i]->{'words'}->[1];
28         $rv .= "<tr $cb>\n";
29         $rv .= "<td><input name=$_[1]_from_$i size=20 value=\"$from\"></td>\n";
30         $rv .= "<td><input name=$_[1]_to_$i size=40 value=\"$to\"></td>\n";
31         $rv .= "</tr>\n";
32         $rv .= &ui_hidden("$_[1]_old_to_$i", $to);
33         }
34 $rv .= "</table>\n";
35 return (2, $_[2], $rv);
36 }
37
38 %alias_statmap = ("permanent", 301,  "temp", 302,
39                   "seeother", 303,   "gone", 410);
40 $url_regexp = '^(http:\/\/|ftp:\/\/|gopher:|https:\/\/|mailto:|telnet:)(\S+)$';
41
42 # alias_status_input(array, name, title)
43 sub alias_status_input
44 {
45 local($rv, $len, $i, $from, $to, $stat);
46 $rv = "<table border>\n".
47       "<tr $tb> <td><b>$text{'mod_alias_from'}</b></td> <td><b>$text{'mod_alias_status'}</b></td> <td><b>$text{'mod_alias_to'}</b></td> </tr>\n";
48 $len = @{$_[0]} + 1;
49 for($i=0; $i<$len; $i++) {
50         if ($_[0]->[$i]->{'words'}->[0] =~ /^(permanent|temp|seeother|gone|\d+)$/) {
51                 $stat = $_[0]->[$i]->{'words'}->[0];
52                 $from = $_[0]->[$i]->{'words'}->[1];
53                 $to = $_[0]->[$i]->{'words'}->[2];
54                 if ($alias_statmap{$stat}) { $stat = $alias_statmap{$stat}; }
55                 }
56         else {
57                 $stat = "";
58                 $from = $_[0]->[$i]->{'words'}->[0];
59                 $to = $_[0]->[$i]->{'words'}->[1];
60                 }
61         $rv .= "<tr $cb>\n";
62         $rv .= "<td><input name=$_[1]_from_$i size=20 value=\"$from\"></td>\n";
63         $rv .= "<td><input name=$_[1]_stat_$i size=4 value=\"$stat\"></td>\n";
64         $rv .= "<td><input name=$_[1]_to_$i size=40 value=\"$to\"></td>\n";
65         $rv .= "</tr>\n";
66         $rv .= &ui_hidden("$_[1]_old_to_$i", $to);
67         }
68 $rv .= "</table>\n";
69 return (2, $_[2], $rv);
70 }
71
72 # parse_alias(name, title, regexp)
73 sub parse_alias
74 {
75 local($re, @rv, $i, $from, $to);
76 $re = $_[2];
77 for($i=0; defined($in{"$_[0]_from_$i"}); $i++) {
78         $from = $in{"$_[0]_from_$i"};
79         $to = $in{"$_[0]_to_$i"};
80         $old_to = $in{"$_[0]_old_to_$i"};
81         if ($from !~ /\S/ && $to !~ /\S/) { next; }
82         if ($from !~ /^\S+$/) { &error(&text('mod_alias_efrom', $from, $_[1])); }
83         if ($to !~ /$re/) { &error(&text('mod_alias_edest', $to, $_[1])); }
84         &allowed_doc_dir($to) ||
85             $old_to && !&allowed_doc_dir($old_to) ||
86                 &error(&text('mod_alias_edest2', $to, $_[1]));
87         push(@rv, "$from \"$to\"");
88         }
89 return ( \@rv );
90 }
91
92 # parse_alias_status(name, title, regexp)
93 sub parse_alias_status
94 {
95 local($re, @rv, $i, $from, $to, $stat);
96 $re = $_[2];
97 for($i=0; defined($in{"$_[0]_from_$i"}); $i++) {
98         $from = $in{"$_[0]_from_$i"};
99         $to = $in{"$_[0]_to_$i"};
100         $old_to = $in{"$_[0]_old_to_$i"};
101         $stat = $in{"$_[0]_stat_$i"};
102         if ($from !~ /\S/ && $to !~ /\S/) { next; }
103         if ($from !~ /^\S+$/) { &error(&text('mod_alias_efrom', $from, $_[1])); }
104         if ($stat !~ /^(\d*)$/) { &error(&text('mod_alias_estatus', $stat)); }
105         if (!$stat || $stat >= 300 && $stat <= 399) {
106                 if ($to !~ /$re/) {
107                         &error(&text('mod_alias_edest', $to, $_[1]));
108                         }
109                 &allowed_doc_dir($to) ||
110                     $old_to && !&allowed_doc_dir($old_to) ||
111                         &error(&text('mod_alias_edest2', $to, $_[1]));
112                 }
113         else { $to = ""; }
114         $to = "\"$to\"" if ($to);
115         if ($stat) { push(@rv, "$stat $from $to"); }
116         else { push(@rv, "$from $to"); }
117         }
118 return ( \@rv );
119 }
120
121 sub edit_Alias
122 {
123 return &alias_input($_[0], "Alias", $text{'mod_alias_alias'});
124 }
125 sub save_Alias
126 {
127 return &parse_alias("Alias", $text{'mod_alias_alias2'}, '\S');
128 }
129
130 sub edit_AliasMatch
131 {
132 return &alias_input($_[0], "AliasMatch", $text{'mod_alias_regexp'});
133 }
134 sub save_AliasMatch
135 {
136 return &parse_alias("AliasMatch", $text{'mod_alias_regexp2'}, '\S');
137 }
138
139 sub edit_Redirect
140 {
141 if ($_[1]->{'version'} >= 1.2) {
142         return &alias_status_input($_[0], "Redirect", $text{'mod_alias_redir'});
143         }
144 else { return &alias_input($_[0], "Redirect", $text{'mod_alias_redir'}); }
145 }
146 sub save_Redirect
147 {
148 if ($_[0]->{'version'} >= 1.2) {
149         return &parse_alias_status("Redirect", $text{'mod_alias_redir2'}, $url_regexp);
150         }
151 else { return &parse_alias("Redirect", $text{'mod_alias_redir2'}, $url_regexp); }
152 }
153
154 sub edit_RedirectMatch
155 {
156 return &alias_status_input($_[0], "RedirectMatch", $text{'mod_alias_rredir'});
157 }
158 sub save_RedirectMatch
159 {
160 return &parse_alias_status("RedirectMatch", $text{'mod_alias_rredir2'}, $url_regexp);
161 }
162
163 sub edit_RedirectTemp
164 {
165 return &alias_input($_[0], "RedirectTemp", $text{'mod_alias_tredir'});
166 }
167 sub save_RedirectTemp
168 {
169 return &parse_alias("RedirectTemp", $text{'mod_alias_tredir2'}, $url_regexp);
170 }
171
172 sub edit_RedirectPermanent
173 {
174 return &alias_input($_[0], "RedirectPermanent", $text{'mod_alias_predir'});
175 }
176 sub save_RedirectPermanent
177 {
178 return &parse_alias("RedirectPermanent", $text{'mod_alias_predir2'}, $url_regexp);
179 }
180
181 sub edit_ScriptAlias
182 {
183 return &alias_input($_[0], "ScriptAlias", $text{'mod_alias_cgi'});
184 }
185 sub save_ScriptAlias
186 {
187 return &parse_alias("ScriptAlias", $text{'mod_alias_cgi2'}, '^\S+$');
188 }
189
190 sub edit_ScriptAliasMatch
191 {
192 return &alias_input($_[0], "ScriptAliasMatch", $text{'mod_alias_rcgi'});
193 }
194 sub save_ScriptAliasMatch
195 {
196 return &parse_alias("ScriptAliasMatch", $text{'mod_alias_rcgi2'}, '^\S+$');
197 }
198
199 1;