Handle hostnames with upper-case letters
[webmin.git] / inetd / save_rpc.cgi
1 #!/usr/local/bin/perl
2 # save_rpc.cgi
3
4 require './inetd-lib.pl';
5 &error_setup($text{'error_saverpc'});
6 &ReadParse();
7
8 # Check inputs
9 $in{name} =~ /^[A-z][A-z0-9\_\-]+$/ ||
10         &error(&text('error_invalidprgname', $in{name}));
11 $in{number} =~ /^[0-9]+$/ ||
12         &error(&text('error_prgnum', $in{number}));
13 if ($in{'act'}) {
14         $in{vfrom} =~ /^[0-9]+$/ ||
15                 &error("$in{vfrom} ");
16         if ($in{vto} eq "") { $in{vto} = $in{vfrom}; }
17         $in{vto} =~ /^[0-9]+$/ ||
18                 &error(&text('error_invalidver', $in{vto}));
19         if ($in{vto} < $in{vfrom}) {
20                 $tmp = $in{vfrom}; $in{vfrom} = $in{vto}; $in{vto} = $tmp;
21                 }
22         if ($in{protocols} eq "") {
23                 &error(&text('error_noprotocol'));
24                 }
25         if ((!$in{internal}) | ($config{'no_internal'})) {
26                 $in{program} =~ /^\/.*/ ||
27                         &error(&text('error_invalidname', $in{program}));
28                 if ($in{'act'} == 2) {
29                         if (!$in{'qm'}) {
30                                 -r $in{program} ||
31                                         &error(&text('error_notexist', $in{program}));
32                                 -x $in{program} ||
33                                         &error(&text('error_ntexecutable',$in{program}));
34                                 }
35                         }
36                 $in{args} =~ /^\S+/ ||
37                         &error(&text('error_invalidcmd', $in{args}));
38                 }
39         $in{'user'} || &error(&text('error_nouser'));
40         }
41
42 @rargs = ($in{'name'}, $in{'number'}, $in{'aliases'});
43 $vers = ($in{vfrom} == $in{vto} ? $in{vfrom} : "$in{vfrom}-$in{vto}");
44 $prots = join(',', split(/\0/, $in{protocols}));
45 @iargs = ($in{'act'} == 2, "$in{name}/$vers", $in{type}, "rpc/$prots");
46 if ($config{extended_inetd}) {
47         push(@iargs, ($in{permin_def} ? $in{wait} : "$in{wait}.$in{permin}"));
48         push(@iargs, ($in{group} ? "$in{user}.$in{group}" : $in{user}));
49         }
50 else {
51         push(@iargs, $in{wait});
52         push(@iargs, $in{user});
53         }
54 if ((!$config{'no_internal'}) & ($in{internal})) {
55         push(@iargs, "internal", undef);
56         }
57 elsif (($config{'no_internal'}) & ($in{internal})) {
58         &error(&text('error_invalidcmd', $in{args}));
59         }
60 else {
61         push(@iargs, ($in{'qm'} ? "?" : "").$in{program});
62         push(@iargs, $in{args});
63         }
64
65 &lock_inetd_files();
66 @rpcs = &list_rpcs();
67 @inets = &list_inets();
68 foreach $r (@rpcs) {
69         if ($r->[1] eq $rargs[0]) { $same_name = $r; }
70         if ($r->[2] == $rargs[1]) { $same_prog = $r; }
71         }
72
73 if ($in{'rpos'} =~ /\d/) {
74         # Changing a program (and maybe inetd entry)
75         @old_rpc = @{$rpcs[$in{'rpos'}]};
76         if ($in{'ipos'} =~ /\d/) {
77                 @old_inet = @{$inets[$in{'ipos'}]};
78                 }
79         if ($same_name && $old_rpc[1] ne $rargs[0]) {
80                 &error(&text('error_prgexist', $rargs[0]));
81                 }
82         if ($same_prog && $old_rpc[2] ne $rargs[1]) {
83                 &error(&text('error_prginuse', $rargs[1]));
84                 }
85         &modify_rpc($old_rpc[0], @rargs);
86         if ($in{'act'} && @old_inet) {
87                 # modify inetd
88                 &modify_inet($old_inet[0], @iargs, $old_inet[10]);
89                 }
90         elsif ($in{'act'} && !@old_inet) {
91                 # add to inetd
92                 &create_inet(@iargs);
93                 }
94         elsif (!$in{'act'} && @old_inet) {
95                 # remove from inetd
96                 &delete_inet($old_inet[0], $old_inet[10]);
97                 }
98         &unlock_inetd_files();
99         &webmin_log("modify", "rpc", $rargs[0],
100                     { 'name' => $rargs[0], 'number' => $rargs[1],
101                       'active' => $iargs[0],
102                       'user' => $iargs[5], 'wait' => $iargs[4],
103                       'prog' => $in{'act'} ? join(" ", @iargs[6..@iargs-1])
104                                            : undef } );
105         }
106 else {
107         # Creating a new program
108         if ($same_name) {
109                 &error(&text('error_prgexist', $rargs[0]));
110                 }
111         if ($same_prog) {
112                 &error(&text('error_prginuse', $rargs[1]));
113                 }
114         if ($in{'act'}) {
115                 foreach $i (@inets) {
116                         if ($i->[2] && $i->[3] eq $rargs[0]) {
117                                 &error(&text('error_prgexist', $rargs[0]));
118                                 }
119                         }
120                 }
121         &create_rpc(@rargs);
122         if ($in{'act'}) { &create_inet(@iargs); }
123         &unlock_inetd_files();
124         &webmin_log("create", "rpc", $rargs[0],
125                     { 'name' => $rargs[0], 'number' => $rargs[1],
126                       'active' => $iargs[0],
127                       'user' => $iargs[5], 'wait' => $iargs[4],
128                       'prog' => $in{'act'} ? join(" ", @iargs[6..@iargs-1])
129                                            : undef } );
130         }
131 &redirect("");
132