Handle hostnames with upper-case letters
[webmin.git] / ppp-client / save.cgi
1 #!/usr/local/bin/perl
2 # save_dialer.cgi
3 # Save, create or delete a dialer configuration
4
5 require './ppp-client-lib.pl';
6 &ReadParse();
7 $conf = &get_config();
8 $dialer = $conf->[$in{'idx'}] if (!$in{'new'});
9
10 &lock_file($config{'file'});
11 if ($in{'delete'}) {
12         # Check for any dependencies?
13         &error_setup($text{'save_err2'});
14         foreach $c (@$conf) {
15                 if (lc($c->{'values'}->{'inherits'}) eq lc($dialer->{'name'})) {
16                         &error(&text('save_einherits',
17                                      &dialer_name($c->{'name'})));
18                         }
19                 }
20
21         # Just delete this dialer
22         &delete_dialer($dialer);
23         }
24 else {
25         # Validate and store basic inputs
26         &error_setup($text{'save_err'});
27         if (defined($in{'dialer'})) {
28                 $in{'dialer'} =~ /^[^\[\]]+$/ || &error($text{'save_ename'});
29                 $dialer->{'name'} = "Dialer $in{'dialer'}";
30                 }
31         elsif (defined($in{'name'})) {
32                 $in{'name'} =~ /^[^\[\]]+$/ || &error($text{'save_ename'});
33                 $dialer->{'name'} = $in{'name'};
34                 }
35         local ($clash) = grep { lc($_->{'name'}) eq
36                                 lc($dialer->{'name'}) } @$conf;
37         if ($clash && $clash ne $dialer) {
38                 &error($text{'save_eclash'});
39                 }
40         &parse_opt("Phone", \&check_phone, $text{'save_ephone'});
41         &parse_opt("Username");
42         &parse_opt("Password");
43         &parse_opt("Dial Prefix", \&check_phone, $text{'save_eprefix'});
44         &parse_yes_no("Stupid Mode");
45         for($i=1; $i<=4; $i++) {
46                 local $other = $in{"other_$i"};
47                 if ($other eq '') {
48                         &set_config("Phone$i");
49                         }
50                 else {
51                         &check_phone($other) || &error(&text('save_eother',$i));
52                         &set_config("Phone$i", $other);
53                         }
54                 }
55         &set_config("Inherits", $in{'inherits_def'} ? undef : $in{'inherits'});
56
57         # Validate and store modem options
58         if ($in{'modem'} eq '*') {
59                 -r $in{'otherm'} || &error($text{'save_eotherm'});
60                 &set_config("Modem", $in{'otherm'});
61                 }
62         elsif ($in{'modem'} eq '') {
63                 &set_config("Modem");
64                 }
65         else {
66                 &set_config("Modem", $in{'modem'});
67                 }
68         &parse_opt("Baud", \&check_number, $text{'save_ebaud'});
69         for($i=1; $i<=9; $i++) {
70                 if ($in{"init_$i"} eq '') {
71                         &set_config("Init$i");
72                         }
73                 else {
74                         &set_config("Init$i", $in{"init_$i"});
75                         }
76                 }
77         &parse_yes_no("Carrier Check");
78         &parse_yes_no("Abort on Busy");
79         &parse_opt("Dial Attempts", \&check_number, $text{'save_edial'});
80         &parse_yes_no("Abort on No Dialtone");
81
82         # Store networking options
83         &parse_yes_no("Auto DNS");
84         &parse_yes_no("Auto Reconnect");
85         &parse_opt("Idle Seconds", \&check_number, $text{'save_eidle'});
86
87         # Create or update the dialer
88         if ($in{'new'}) {
89                 &create_dialer($dialer);
90                 }
91         else {
92                 &update_dialer($dialer);
93                 }
94         }
95 &unlock_file($config{'file'});
96 delete($dialer->{'values'}->{'password'});
97 &webmin_log($in{'new'} ? "create" : $in{'delete'} ? "delete" : "update",
98             "dialer", $dialer->{'name'}, $dialer->{'values'});
99 &redirect("");
100
101 # parse_opt(name, [checker, error])
102 sub parse_opt
103 {
104 local $n = lc("$_[0]");
105 if ($in{$n."_def"}) {
106         &set_config($_[0]);
107         }
108 else {
109         local $func = $_[1];
110         !$func || &$func($in{$n}) || &error($_[2]);
111         &set_config($_[0], $in{$n});
112         }
113 }
114
115 # parse_yes_no(name)
116 sub parse_yes_no
117 {
118 local $n = lc("$_[0]");
119 if ($in{$n} == 1) {
120         &set_config($_[0], "on");
121         }
122 elsif ($in{$n} == 0) {
123         &set_config($_[0], "off");
124         }
125 else {
126         &set_config($_[0]);
127         }
128 }
129
130 # set_config(name, [value])
131 sub set_config
132 {
133 local $n = lc("$_[0]");
134 if (defined($_[1])) {
135         $dialer->{'values'}->{$n} = $_[1];
136         $dialer->{'onames'}->{$n} = $_[0];
137         }
138 else {
139         delete($dialer->{'values'}->{$n});
140         delete(dialer->{'onames'}->{$n});
141         }
142 }
143
144 sub check_phone
145 {
146 return $_[0] =~ /^[0-9 \+\*\#A-Z]+$/;
147 }
148
149 sub check_number
150 {
151 return $_[0] =~ /^\d+$/;
152 }
153