Handle hostnames with upper-case letters
[webmin.git] / servers / save_serv.cgi
1 #!/usr/local/bin/perl
2 # save_serv.cgi
3 # Save or delete a server
4
5 use strict;
6 use warnings;
7 require './servers-lib.pl';
8 our (%in, %access, %text);
9 &ReadParse();
10 $access{'edit'} || &error($text{'edit_ecannot'});
11 &error_setup($text{'save_err'});
12
13 my $serv;
14 if ($in{'id'}) {
15         $serv = &get_server($in{'id'});
16         &can_use_server($serv) || &error($text{'edit_ecannot'});
17         }
18 else {
19         $access{'add'} || &error($text{'edit_ecannot'});
20         $serv = { 'id' => time() };
21         }
22
23 if ($in{'delete'}) {
24         # delete the server
25         &delete_server($in{'id'});
26         &webmin_log("delete", "server", $serv->{'host'}, $serv); 
27         }
28 else {
29         # validate inputs
30         $in{'host'} =~ /^\S+$/ || &error($text{'save_ehost'});
31         if ($in{'port_def'}) {
32                 $in{'mode'} == 0 || &error($text{'save_eport2'});
33                 }
34         else {
35                 $in{'port'} =~ /^\d+$/ || &error($text{'save_eport'});
36                 }
37         if ($in{'mode'} == 1) {
38                 &to_ipaddress($in{'host'}) || &to_ip6address($in{'host'}) ||
39                         &error($text{'save_ehost2'});
40                 $in{'wuser'} =~ /\S/ || &error($text{'save_euser'});
41                 $in{'wpass'} =~ /\S/ || &error($text{'save_epass'});
42                 }
43         if ($in{'fast'} == 2 && $in{'mode'} == 1) {
44                 # Does the server have fastrpc.cgi ?
45                 my $con = &make_http_connection($in{'host'}, $in{'port'},
46                                            $in{'ssl'}, "GET", "/fastrpc.cgi");
47                 $in{'fast'} = 0;
48                 if (ref($con)) {
49                         &write_http_connection($con,
50                                         "Host: $serv->{'host'}\r\n");
51                         &write_http_connection($con,
52                                         "User-agent: Webmin\r\n");
53                         my $auth = &encode_base64("$in{'wuser'}:$in{'wpass'}");
54                         $auth =~ s/\n//g;
55                         &write_http_connection($con,
56                                         "Authorization: basic $auth\r\n");
57                         &write_http_connection($con, "\r\n");
58                         my $line = &read_http_connection($con);
59                         if ($line =~ /^HTTP\/1\..\s+401\s+/) {
60                                 &error($text{'save_elogin'});
61                                 }
62                         elsif ($line =~ /^HTTP\/1\..\s+200\s+/) {
63                                 # It does .. tell the fastrpc.cgi process to die
64                                 do {
65                                         $line = &read_http_connection($con);
66                                         $line =~ s/\r|\n//g;
67                                         } while($line);
68                                 $line = &read_http_connection($con);
69                                 if ($line =~ /^1\s+(\S+)\s+(\S+)/) {
70                                         my ($port, $sid, $error) = ($1, $2);
71                                         &open_socket($in{'host'}, $port,
72                                                      $sid, \$error);
73                                         if (!$error) {
74                                                 close($sid);
75                                                 $in{'fast'} = 1;
76                                                 }
77                                         }
78                                 }
79                         &close_http_connection($con);
80                         }
81                 }
82         elsif ($in{'fast'} == 2) {
83                 # No login provided, so we cannot say for now ..
84                 }
85
86         # save the server
87         my @groups = split(/\0/, $in{'group'});
88         if ($in{'newgroup'}) {
89                 $in{'newgroup'} =~ /^\S+$/ || &error($text{'save_egroup2'});
90                 push(@groups, $in{'newgroup'});
91                 }
92         $serv->{'host'} = $in{'host'};
93         $serv->{'port'} = $in{'port_def'} ? undef : $in{'port'};
94         $serv->{'type'} = $in{'type'};
95         $serv->{'ssl'} = $in{'ssl'};
96         $serv->{'desc'} = $in{'desc_def'} ? undef : $in{'desc'};
97         $serv->{'group'} = join("\t", @groups);
98         $serv->{'fast'} = $in{'fast'};
99         delete($serv->{'user'});
100         delete($serv->{'pass'});
101         delete($serv->{'autouser'});
102         delete($serv->{'sameuser'});
103         if ($in{'mode'} == 1) {
104                 $serv->{'user'} = $in{'wuser'};
105                 $serv->{'pass'} = $in{'wpass'};
106                 }
107         elsif ($in{'mode'} == 2) {
108                 $serv->{'autouser'} = 1;
109                 }
110         elsif ($in{'mode'} == 3) {
111                 $serv->{'user'} = 'same';
112                 $serv->{'sameuser'} = 1;
113                 }
114         &save_server($serv);
115         delete($serv->{'pass'});
116         &webmin_log($in{'new'} ? 'create' : 'modify', 'server',
117                     $serv->{'host'}, $serv);
118         }
119 &redirect("");
120