mirror of
https://github.com/webmin/webmin.git
synced 2025-07-21 23:40:34 +00:00
120 lines
2.6 KiB
Perl
Executable File
120 lines
2.6 KiB
Perl
Executable File
#!/usr/local/bin/perl
|
|
# save_recipe.cgi
|
|
# Create, update or delete a procmail recipe
|
|
|
|
require './procmail-lib.pl';
|
|
&ReadParse();
|
|
&lock_file($procmailrc);
|
|
@conf = &get_procmailrc();
|
|
$rec = $conf[$in{'idx'}] if (!$in{'new'});
|
|
|
|
if ($in{'delete'}) {
|
|
# Just delete the recipe
|
|
&delete_recipe($rec);
|
|
}
|
|
else {
|
|
# Validate inputs
|
|
&error_setup($text{'save_err'});
|
|
if ($in{'block'}) {
|
|
# Conditional code block
|
|
$in{'bdata'} =~ s/\r//g;
|
|
$rec->{'block'} = $in{'bdata'};
|
|
}
|
|
else {
|
|
# Normal action
|
|
$in{'action'} =~ /\S/ ||
|
|
&error($text{'save_eaction_'.$in{'amode'}});
|
|
delete($rec->{'type'});
|
|
if ($in{'amode'} == 0) {
|
|
$rec->{'action'} = $in{'action'};
|
|
}
|
|
elsif ($in{'amode'} == 1) {
|
|
$rec->{'action'} = $in{'action'}."/.";
|
|
}
|
|
elsif ($in{'amode'} == 2) {
|
|
$rec->{'action'} = $in{'action'}."/";
|
|
}
|
|
elsif ($in{'amode'} == 3) {
|
|
$rec->{'type'} = "!";
|
|
$rec->{'action'} = $in{'action'};
|
|
}
|
|
elsif ($in{'amode'} == 6) {
|
|
$rec->{'type'} = "=";
|
|
$in{'action'} =~ /^(\S+)=(.*)$/ ||
|
|
&error($text{'save_eactionvar'});
|
|
$rec->{'action'} = $in{'action'};
|
|
}
|
|
else {
|
|
$rec->{'type'} = "|";
|
|
$rec->{'action'} = $in{'action'};
|
|
}
|
|
}
|
|
|
|
map { $flag{$_}++ } split(/\0/, $in{'flag'});
|
|
@flags = @{$rec->{'flags'}};
|
|
foreach $f (@known_flags) {
|
|
if ($flag{$f}) {
|
|
push(@flags, $f);
|
|
}
|
|
else {
|
|
@flags = grep { $_ ne $f } @flags;
|
|
}
|
|
}
|
|
$rec->{'flags'} = [ &unique(@flags) ];
|
|
|
|
if ($in{'lockfile_def'} == 1) {
|
|
delete($rec->{'lockfile'});
|
|
}
|
|
elsif ($in{'lockfile_def'} == 2) {
|
|
$rec->{'lockfile'} = "";
|
|
}
|
|
else {
|
|
$in{'lockfile'} =~ /\S/ || &error($text{'save_elockfile'});
|
|
$rec->{'lockfile'} = $in{'lockfile'};
|
|
}
|
|
|
|
for($i=0; defined($m = $in{"cmode_$i"}); $i++) {
|
|
next if ($m eq '-');
|
|
$c = $in{"cond_$i"};
|
|
if ($m eq '<' || $m eq '>') {
|
|
$c =~ /^\d+$/ || &error(&text('save_esize', $i+1));
|
|
}
|
|
elsif ($m eq '$' || $m eq '?') {
|
|
$c =~ /\S/ || &error(&text('save_eshell', $i+1));
|
|
}
|
|
else {
|
|
$c =~ /\S/ || &error(&text('save_ere', $i+1));
|
|
}
|
|
push(@conds, [ $m, $c ]);
|
|
}
|
|
$rec->{'conds'} = \@conds;
|
|
|
|
# Save the receipe
|
|
if ($in{'new'}) {
|
|
if ($in{'before'} ne '') {
|
|
$before = $conf[$in{'before'}];
|
|
&create_recipe_before($rec, $before);
|
|
}
|
|
elsif ($in{'after'} ne '') {
|
|
if ($in{'after'} == @conf-1) {
|
|
&create_recipe($rec);
|
|
}
|
|
else {
|
|
$before = $conf[$in{'after'}+1];
|
|
&create_recipe_before($rec, $before);
|
|
}
|
|
}
|
|
else {
|
|
&create_recipe($rec);
|
|
}
|
|
}
|
|
else {
|
|
&modify_recipe($rec);
|
|
}
|
|
}
|
|
&unlock_file($procmailrc);
|
|
&webmin_log($in{'delete'} ? "delete" : $in{'new'} ? "create" : "modify",
|
|
"recipe", undef, $rec);
|
|
&redirect("");
|
|
|