Handle hostnames with upper-case letters
[webmin.git] / fetchmail / save_poll.cgi
1 #!/usr/local/bin/perl
2 # save_poll.cgi
3 # Update, create or delete a server to poll
4
5 require './fetchmail-lib.pl';
6 &ReadParse();
7 &error_setup($text{'poll_err'});
8 if ($config{'config_file'}) {
9         $file = $config{'config_file'};
10         }
11 else {
12         &can_edit_user($in{'user'}) || &error($text{'poll_ecannot'});
13         @uinfo = getpwnam($in{'user'});
14         $file = "$uinfo[7]/.fetchmailrc";
15         }
16 @conf = &parse_config_file($file);
17 if (!$in{'new'}) {
18         $poll = $conf[$in{'idx'}];
19         }
20
21 &lock_file($file);
22 if ($in{'adduser'}) {
23         # Go back to the edit form
24         &redirect("edit_poll.cgi?file=$file&idx=$in{'idx'}&adduser=1&user=$in{'user'}");
25         exit;
26         }
27 elsif ($in{'check'}) {
28         # Go to the mail checking CGI
29         &redirect("check.cgi?file=$file&idx=$in{'idx'}&adduser=1&user=$in{'user'}");
30         exit;
31         }
32 elsif ($in{'delete'}) {
33         # Just delete the poll
34         &delete_poll($poll, $file);
35         }
36 else {
37         # Validate poll inputs
38         $in{'poll'} =~ /^\S+$/ || &error($text{'poll_epoll'});
39         $in{'via_def'} || &check_host($in{'via'}) ||
40                 &error($text{'poll_evia'});
41         !$in{'via_def'} || &check_host($in{'poll'}) ||
42                 &error($text{'poll_epoll'});
43         $in{'port_def'} || $in{'port'} =~ /^\d+$/ ||
44                 &error($text{'poll_eport'});
45         if (!$in{'interface_def'}) {
46                 $in{'interface'} =~ /^\S+$/ || &error($text{'poll_einterface'});
47                 &check_ipaddress($in{'interface_net'}) ||
48                         &error($text{'poll_enet'});
49                 &check_ipaddress($in{'interface_mask'}) ||
50                     !$in{'interface_mask'} ||
51                         &error($text{'poll_emask'});
52                 }
53
54         # Create the poll structure
55         $poll->{'poll'} = $in{'poll'};
56         $poll->{'skip'} = $in{'skip'};
57         $poll->{'via'} = $in{'via_def'} ? undef : $in{'via'};
58         $poll->{'proto'} = $in{'proto'};
59         $poll->{'auth'} = $in{'auth'};
60         $poll->{'port'} = $in{'port_def'} ? undef : $in{'port'};
61         if ($in{'interface_def'}) {
62                 delete($poll->{'interface'});
63                 }
64         else {
65                 local @interface = ( $in{'interface'}, $in{'interface_net'} );
66                 push(@interface, $in{'interface_mask'})
67                         if ($in{'interface_mask'});
68                 $poll->{'interface'} = join("/", @interface);
69                 }
70
71         # Validate user inputs
72         for($i=0; defined($in{"user_$i"}); $i++) {
73                 $user = $poll->{'users'}->[$i];
74                 next if (!$in{"user_$i"});
75                 $in{"user_$i"} =~ /^\S*$/ || &error($text{'poll_euser'});
76                 $user->{'user'} = $in{"user_$i"};
77                 $user->{'pass'} = $in{"pass_$i"};
78                 local @is = split(/\s+/, $in{"is_$i"});
79                 $user->{'is'} = \@is;
80                 $user->{'keep'} = $in{"keep_$i"};
81                 $user->{'fetchall'} = $in{"fetchall_$i"};
82                 if ($in{"keep_$i"} == 1 && $in{"fetchall_$i"} == 1) {
83                         &error($text{'poll_eboth'});
84                         }
85                 $user->{'ssl'} = $in{"ssl_$i"};
86                 $user->{'preconnect'} = $in{"preconnect_$i"};
87                 $user->{'postconnect'} = $in{"postconnect_$i"};
88                 push(@users, $user);
89                 }
90         $poll->{'users'} = \@users;
91
92         if ($in{'new'}) {
93                 &create_poll($poll, $file);
94                 if ($in{'user'} && $< == 0) {
95                         local @uinfo = getpwnam($in{'user'});
96                         &system_logged("chown $uinfo[2]:$uinfo[3] $file");
97                         }
98                 &system_logged("chmod 700 $file");
99                 }
100         else {
101                 &modify_poll($poll, $file);
102                 }
103         }
104
105 &unlock_file($file);
106 &webmin_log($in{'new'} ? 'create' : $in{'delete'} ? 'delete' : 'modify',
107             'poll', $poll->{'poll'},
108             $config{'config_file'} ? { 'file' => $file }
109                                    : { 'user' => $in{'user'} } );
110 &redirect(!$fetchmail_config && $config{'view_mode'} ?
111         "edit_user.cgi?user=$in{'user'}" : "");
112
113 sub check_host
114 {
115 return 1 if (&to_ipaddress($_[0]) || &to_ip6address($_[0]));
116 return 0 if (&to_ipaddress("www.webmin.com"));  # only fail if we are online
117 return 1;
118 }
119