Handle hostnames with upper-case letters
[webmin.git] / ipsec / save.cgi
1 #!/usr/local/bin/perl
2 # save.cgi
3 # Save, create or delete an ipsec connection
4
5 require './ipsec-lib.pl';
6 &ReadParse();
7 if ($in{'export'}) {
8         # Just redirect to export form
9         &redirect("export_form.cgi?idx=$in{'idx'}");
10         exit;
11         }
12 @conf = &get_config();
13 if ($in{'new'}) {
14         $conn = { 'name' => 'conn',
15                   'values' => { } };
16         $conn->{'value'} = '%default' if ($in{'new'} == 2);
17         }
18 else {
19         $conn = $conf[$in{'idx'}];
20         }
21 &error_setup($text{'save_err'});
22
23 $file = $conn->{'file'} || $config{'file'};
24 &lock_file($file);
25 if ($in{'delete'}) {
26         # Just remove this connection
27         &delete_conn($conn);
28         }
29 else {
30         # Validate and store general inputs
31         if ($conn->{'value'} ne '%default') {
32                 $in{'name'} =~ /^\S+$/ || &error($text{'save_ename'});
33                 $conn->{'value'} = $in{'name'};
34                 }
35         if ($in{'auto'}) {
36                 $conn->{'values'}->{'auto'} = $in{'auto'};
37                 }
38         else {
39                 delete($conn->{'values'}->{'auto'});
40                 }
41         if ($in{'comp'}) {
42                 $conn->{'values'}->{'compress'} = $in{'comp'};
43                 }
44         else {
45                 delete($conn->{'values'}->{'compress'});
46                 }
47         if ($in{'pfs'}) {
48                 $conn->{'values'}->{'pfs'} = $in{'pfs'};
49                 }
50         else {
51                 delete($conn->{'values'}->{'pfs'});
52                 }
53         if ($in{'type'}) {
54                 $conn->{'values'}->{'type'} = $in{'type'};
55                 }
56         else {
57                 delete($conn->{'values'}->{'type'});
58                 }
59         if ($in{'authby'}) {
60                 $conn->{'values'}->{'authby'} = $in{'authby'};
61                 }
62         else {
63                 delete($conn->{'values'}->{'authby'});
64                 }
65         if ($in{'keying_def'}) {
66                 delete($conn->{'values'}->{'keyingtries'});
67                 }
68         else {
69                 $in{'keying'} =~ /^\d+$/ || &error($text{'save_ekeying'});
70                 $conn->{'values'}->{'keyingtries'} = $in{'keying'};
71                 }
72         if ($in{'auth'}) {
73                 $conn->{'values'}->{'auth'} = $in{'auth'};
74                 }
75         else {
76                 delete($conn->{'values'}->{'auth'});
77                 }
78
79         if ($in{'esp'}) {
80                 $conn->{'values'}->{'esp'} = $in{'esp'}.$in{'esp_only'};
81                 }
82         else {
83                 delete($conn->{'values'}->{'esp'});
84                 }
85
86         if ($in{'keylife_def'}) {
87                 delete($conn->{'values'}->{'keylife'});
88                 }
89         else {
90                 $in{'keylife'} =~ /^[0-9\.]+$/ ||
91                         &error($text{'save_ekeylife'});
92                 $conn->{'values'}->{'keylife'} =
93                         $in{'keylife'}.$in{'keylife_units'};
94                 }
95
96         if ($in{'ikelifetime_def'}) {
97                 delete($conn->{'values'}->{'ikelifetime'});
98                 }
99         else {
100                 $in{'ikelifetime'} =~ /^[0-9\.]+$/ ||
101                         &error($text{'save_eikelifetime'});
102                 $conn->{'values'}->{'ikelifetime'} =
103                         $in{'ikelifetime'}.$in{'ikelifetime_units'};
104                 }
105
106         # Validate and store left/right inputs
107         foreach $d ('left', 'right') {
108                 # left/right
109                 if ($in{"${d}_mode"} == -1) {
110                         delete($conn->{'values'}->{$d});
111                         }
112                 elsif ($in{"${d}_mode"} == 0) {
113                         $conn->{'values'}->{$d} = '%defaultroute';
114                         }
115                 elsif ($in{"${d}_mode"} == 1) {
116                         $conn->{'values'}->{$d} = '%any';
117                         }
118                 elsif ($in{"${d}_mode"} == 2) {
119                         $conn->{'values'}->{$d} = '%opportunistic';
120                         }
121                 else {
122                         &to_ipaddress($in{$d}) || &error($text{"save_e${d}"});
123                         $conn->{'values'}->{$d} = $in{$d};
124                         }
125
126                 # leftid/rightid
127                 if ($in{"${d}_id_mode"} == 0) {
128                         delete($conn->{'values'}->{"${d}id"});
129                         }
130                 elsif ($in{"${d}_id_mode"} == 1) {
131                         &check_ipaddress($in{"${d}_id"}) ||
132                                 &error($text{"save_e${d}id1"});
133                         $conn->{'values'}->{"${d}id"} = $in{"${d}_id"};
134                         }
135                 else {
136                         $in{"${d}_id"} =~ /^[a-z0-9\.\-]+$/i ||
137                                 &error($text{"save_e${d}id2"});
138                         $conn->{'values'}->{"${d}id"} = "@".$in{"${d}_id"};
139                         }
140
141                 # leftsubnet/rightsubnet
142                 if ($in{"${d}_subnet_def"}) {
143                         delete($conn->{'values'}->{"${d}subnet"});
144                         }
145                 else {
146                         $in{"${d}_subnet"} =~ /^(\S+)\/(\d+)$/ &&
147                             &check_ipaddress("$1") && $2 <= 32 ||
148                                 &error($text{"save_e${d}subnet"});
149                         $conn->{'values'}->{"${d}subnet"} = $in{"${d}_subnet"};
150                         }
151
152                 # leftrsasigkey/rightrsasigkey
153                 if ($in{"${d}_key_mode"} == 0) {
154                         delete($conn->{'values'}->{"${d}rsasigkey"});
155                         }
156                 elsif ($in{"${d}_key_mode"} == 1) {
157                         $conn->{'values'}->{"${d}rsasigkey"} = '%dns';
158                         }
159                 else {
160                         $in{"${d}_key"} =~ s/\s//g;
161                         $in{"${d}_key"} || &error($text{"save_e${d}key"});
162                         $conn->{'values'}->{"${d}rsasigkey"} = $in{"${d}_key"};
163                         }
164
165                 # leftnexthop/rightnexthop
166                 if ($in{"${d}_hop_mode"} == 0) {
167                         delete($conn->{'values'}->{"${d}nexthop"});
168                         }
169                 elsif ($in{"${d}_hop_mode"} == 1) {
170                         $conn->{'values'}->{"${d}nexthop"} = '%direct';
171                         }
172                 elsif ($in{"${d}_hop_mode"} == 3) {
173                         $conn->{'values'}->{"${d}nexthop"} = '%defaultroute';
174                         }
175                 else {
176                         &check_ipaddress($in{"${d}_hop"}) ||
177                                 &error($text{"save_e${d}hop"});
178                         $conn->{'values'}->{"${d}nexthop"} = $in{"${d}_hop"};
179                         }
180
181                 # leftcert/rightcert
182                 if ($in{"${d}_cert_def"}) {
183                         delete($conn->{'values'}->{"${d}cert"});
184                         }
185                 else {
186                         $in{"${d}_cert"} =~ /^(\S+)$/ ||
187                                 &error($text{"save_e${d}cert"});
188                         $conn->{'values'}->{"${d}cert"} = $in{"${d}_cert"};
189                         }
190                 }
191
192         # Update or add
193         if ($in{'new'}) {
194                 &create_conn($conn);
195                 }
196         else {
197                 &modify_conn($conn);
198                 }
199         }
200 &unlock_file($file);
201 &webmin_log($in{'new'} ? "create" : $in{'delete'} ? "delete" : "modify",
202             "conn", $conn->{'value'}, $conn->{'values'});
203 &redirect("");
204