mirror of
https://github.com/webmin/webmin.git
synced 2025-07-21 23:40:34 +00:00
128 lines
3.5 KiB
Perl
Executable File
128 lines
3.5 KiB
Perl
Executable File
#!/usr/local/bin/perl
|
|
# save_poll.cgi
|
|
# Update, create or delete a server to poll
|
|
|
|
require './fetchmail-lib.pl';
|
|
&ReadParse();
|
|
&error_setup($text{'poll_err'});
|
|
if ($config{'config_file'}) {
|
|
$file = $config{'config_file'};
|
|
}
|
|
else {
|
|
&can_edit_user($in{'user'}) || &error($text{'poll_ecannot'});
|
|
@uinfo = getpwnam($in{'user'});
|
|
$file = "$uinfo[7]/.fetchmailrc";
|
|
}
|
|
@conf = &parse_config_file($file);
|
|
if (!$in{'new'}) {
|
|
$poll = $conf[$in{'idx'}];
|
|
}
|
|
|
|
&lock_file($file);
|
|
if ($in{'adduser'}) {
|
|
# Go back to the edit form
|
|
&redirect("edit_poll.cgi?file=$file&idx=$in{'idx'}&adduser=1&user=$in{'user'}");
|
|
exit;
|
|
}
|
|
elsif ($in{'check'}) {
|
|
# Go to the mail checking CGI
|
|
&redirect("check.cgi?file=$file&idx=$in{'idx'}&adduser=1&user=$in{'user'}");
|
|
exit;
|
|
}
|
|
elsif ($in{'delete'}) {
|
|
# Just delete the poll
|
|
&delete_poll($poll, $file);
|
|
}
|
|
else {
|
|
# Validate poll inputs
|
|
$in{'poll'} =~ /^\S+$/ || &error($text{'poll_epoll'});
|
|
$in{'via_def'} || &check_host($in{'via'}) ||
|
|
&error($text{'poll_evia'});
|
|
!$in{'via_def'} || &check_host($in{'poll'}) ||
|
|
&error($text{'poll_epoll'});
|
|
$in{'port_def'} || $in{'port'} =~ /^\d+$/ ||
|
|
&error($text{'poll_eport'});
|
|
if (!$in{'interface_def'}) {
|
|
$in{'interface'} =~ /^\S+$/ || &error($text{'poll_einterface'});
|
|
&check_ipaddress($in{'interface_net'}) ||
|
|
&error($text{'poll_enet'});
|
|
&check_ipaddress($in{'interface_mask'}) ||
|
|
!$in{'interface_mask'} ||
|
|
&error($text{'poll_emask'});
|
|
}
|
|
|
|
# Create the poll structure
|
|
$poll->{'poll'} = $in{'poll'};
|
|
$poll->{'skip'} = $in{'skip'};
|
|
$poll->{'via'} = $in{'via_def'} ? undef : $in{'via'};
|
|
$poll->{'proto'} = $in{'proto'};
|
|
$poll->{'auth'} = $in{'auth'};
|
|
$poll->{'port'} = $in{'port_def'} ? undef : $in{'port'};
|
|
if ($in{'interface_def'}) {
|
|
delete($poll->{'interface'});
|
|
}
|
|
else {
|
|
local @interface = ( $in{'interface'}, $in{'interface_net'} );
|
|
push(@interface, $in{'interface_mask'})
|
|
if ($in{'interface_mask'});
|
|
$poll->{'interface'} = join("/", @interface);
|
|
}
|
|
|
|
# Validate user inputs
|
|
for($i=0; defined($in{"user_$i"}); $i++) {
|
|
$user = $poll->{'users'}->[$i];
|
|
next if (!$in{"user_$i"});
|
|
$in{"user_$i"} =~ /^\S*$/ || &error($text{'poll_euser'});
|
|
$user->{'user'} = $in{"user_$i"};
|
|
$user->{'pass'} = $in{"pass_$i"};
|
|
local @is = split(/\s+/, $in{"is_$i"});
|
|
$user->{'is'} = \@is;
|
|
if ($in{"folder_${i}_def"}) {
|
|
delete($user->{'folder'});
|
|
}
|
|
else {
|
|
$in{"folder_$i"} =~ /\S/ ||
|
|
&error($text{'poll_efolder'});
|
|
$user->{'folder'} = $in{"folder_$i"};
|
|
}
|
|
$user->{'keep'} = $in{"keep_$i"};
|
|
$user->{'fetchall'} = $in{"fetchall_$i"};
|
|
if ($in{"keep_$i"} == 1 && $in{"fetchall_$i"} == 1) {
|
|
&error($text{'poll_eboth'});
|
|
}
|
|
$user->{'ssl'} = $in{"ssl_$i"};
|
|
$user->{'preconnect'} = $in{"preconnect_$i"};
|
|
$user->{'postconnect'} = $in{"postconnect_$i"};
|
|
push(@users, $user);
|
|
}
|
|
$poll->{'users'} = \@users;
|
|
|
|
if ($in{'new'}) {
|
|
&create_poll($poll, $file);
|
|
if ($in{'user'} && $< == 0) {
|
|
local @uinfo = getpwnam($in{'user'});
|
|
&system_logged("chown $uinfo[2]:$uinfo[3] $file");
|
|
}
|
|
&system_logged("chmod 700 $file");
|
|
}
|
|
else {
|
|
&modify_poll($poll, $file);
|
|
}
|
|
}
|
|
|
|
&unlock_file($file);
|
|
&webmin_log($in{'new'} ? 'create' : $in{'delete'} ? 'delete' : 'modify',
|
|
'poll', $poll->{'poll'},
|
|
$config{'config_file'} ? { 'file' => $file }
|
|
: { 'user' => $in{'user'} } );
|
|
&redirect(!$fetchmail_config && $config{'view_mode'} ?
|
|
"edit_user.cgi?user=$in{'user'}" : "");
|
|
|
|
sub check_host
|
|
{
|
|
return 1 if (&to_ipaddress($_[0]) || &to_ip6address($_[0]));
|
|
return 0 if (&to_ipaddress("www.webmin.com")); # only fail if we are online
|
|
return 1;
|
|
}
|
|
|