initial commit of file from CVS for smeserver-mailsorting on Sat Sep 7 19:56:19 AEST 2024

This commit is contained in:
Trevor Batley
2024-09-07 19:56:19 +10:00
parent 37ac171721
commit 747f415ed0
59 changed files with 6609 additions and 2 deletions

0
root/usr/lib/.gitignore vendored Normal file
View File

View File

@@ -0,0 +1,439 @@
#----------------------------------------------------------------------
# mailsorting.pm
# support@dungog.net
#----------------------------------------------------------------------
package esmith::FormMagick::Panel::mailsort;
use strict;
use warnings;
use esmith::util;
use esmith::FormMagick;
use esmith::AccountsDB;
use esmith::ConfigDB;
use Unicode::IMAPUtf7;
use Unicode::String qw(utf8 latin1);
use Exporter;
use Carp qw(verbose);
use HTML::Tabulate;
our @ISA = qw(esmith::FormMagick Exporter);
our @EXPORT = qw();
our $db = esmith::ConfigDB->open();
our $adb = esmith::AccountsDB->open();
our $pdb = esmith::ConfigDB->open('processmail') or die "Could not open processmail DB\n";
our $PanelUser = $ENV{'REMOTE_USER'} ||'';
$PanelUser = $1 if ($PanelUser =~ /^([a-z][\.\-a-z0-9]*)$/);
sub get_panel_user
{
return $PanelUser;
}
sub get_full_name
{
return $adb->get_prop($PanelUser, "FirstName") . " " .
$adb->get_prop($PanelUser, "LastName");
}
sub new {
shift;
my $self = esmith::FormMagick->new();
$self->{calling_package} = (caller)[0];
bless $self;
return $self;
}
sub print_rules_table
{
my $self = shift;
my $q = $self->{cgi};
my @rules = $pdb->get_all_by_prop(type => "$PanelUser");
return $self->localise("NO_RULES") if (@rules == 0);
my $rules_table =
{
title => $self->localise("CURRENT_RULES"),
stripe => "#D4D0C8",
fields => [ qw(b1 criterion b2 criterion2 action deliver copy deliver2 Modify Remove) ],
labels => 1,
field_attr => {
b1 => { label => $self->localise("BASIS") },
criterion => { label => $self->localise("CRITERION") },
b2 => { label => $self->localise("2ND_BASIS") },
criterion2 => { label => $self->localise("2ND_CRITERION") },
action => { label => $self->localise("ACTION") },
deliver => { label => $self->localise("DESTINATION") },
copy => { label => $self->localise("COPY") },
deliver2 => { label => $self->localise("DESTINATION") },
Modify => {
label => $self->localise("MODIFY"),
link => \&modify_link
},
Remove => {
label => $self->localise("REMOVE"),
link => \&remove_link
},
}
};
my @data = ();
my $a = $self->localise('ACTION');
my $b = $self->localise('BASIS');
my $c = $self->localise('CRITERION');
foreach my $rule (@rules)
{
my $key = $rule->key;
my $basis = $rule->prop("basis") || '';
my $basis2 = $rule->prop("basis2") || '';
my $deliver = $rule->prop("deliver") || '';
my $deliver2 = $rule->prop("deliver2") || '';
my $action = $rule->prop("action") || '';
my $action2 = $rule->prop("action2") || '';
my $folder = ("$action" eq "sort" )? $deliver : '';
$folder = "INBOX" if "$folder" eq "" && "$action" eq "sort";
my $copy = $rule->prop("copy") || '';
my $oldpmRule = '';
for ($basis, $basis2)
{
if ($_ eq '<')
{ $_ = 'sizelt'; }
elsif ($_ eq '>')
{ $_ = 'sizegt'; }
}
my $b1 = $self->localise($basis);
my $b2 = $self->localise($basis2);
my $copyto = $rule->prop("deliver2") || '';# useless
if (($copy eq 'yes') && ($action2 eq 'inbox'))
{ $deliver2 = ""; $copyto = 'inbox'; } # copyto is useless
$deliver = GetDisplayName($deliver);
$deliver2 = GetDisplayName($deliver2);
push @data,
{
key => $rule->key,
basis => $basis,
basis2 => $basis2,
criterion => $rule->prop("criterion") || '',
criterion2 => $rule->prop("criterion2") || '',
deliver => $deliver,
deliver2 => $deliver2,
folder => $folder,
action => $action,
action2 => $action2,
copy => $copy,
Modify => $self->localise('MODIFY'),
Remove => $self->localise('REMOVE'),
b1 => $b1,
b2 => $b2,
a => $a,
b => $b,
c => $c,
}
}
my $t = HTML::Tabulate->new($rules_table);
$t->render(\@data, $rules_table);
}
sub modify_or_create_description
{
my $self = shift;
my $q = $self->{cgi};
my $key = $q->param('key');
if ($key eq 'new')
{ return $self->localise('CREATE_RULE_DESCRIPTION'); }
else
{ return $self->localise('MODIFY_RULE_DESCRIPTION'); }
}
sub priority
{
my $self = shift;
my $q = $self->{cgi};
my $key = $q->param('key');
if ($key eq 'new')
{ return ''; }
else
{
my $start = ' <tr>
<td class="sme-noborders-label">' . $self->localise('PRIORITY') . '
<td class="sme-noborders-content"><INPUT VALUE="' . $key . '" NAME="key" TYPE="text" SIZE="40"></td>
</tr> ';
return $start;
}
}
sub filter_status
{
my $self = shift;
my $q = $self->{cgi};
my $FilterType = $db->get_prop('qmail', "FilterType") || 'Disabled';
if ($FilterType eq 'Disabled')
{
my $start = '<tr><td colspan="2"><p>' .
$self->localise('FILTERTYPE_DISABLED') .
'</p></td></tr> ';
}
else
{ return ''; }
}
sub user_status
{
my $self = shift;
my $q = $self->{cgi};
my $MailFilter = $adb->get_prop($PanelUser, "MailFilter") || '';
if ($MailFilter eq 'bypass')
{
my $start = '<tr><td colspan="2"><p>' .
$self->localise('USER_DISABLED') .
' </p></td></tr> ';
}
else
{ return ''; }
}
sub modify_link
{
my ($data_item, $row, $field) = @_;
#avoid duplicate data if we sort we use folder field
my $deliver = $row->{deliver};
$deliver="" if $row->{action} eq "sort";
return "userpanel-mailsort?" .
join("&",
"page=0",
"page_stack=",
"Next=Next",
"key=" . $row->{key},
"oldkey=" . $row->{key},
"basis=" . $row->{basis},
"basis2=" . $row->{basis2},
"criterion=" . $row->{criterion},
"criterion2=" . $row->{criterion2},
"deliver=" . $deliver,
"deliver2=" . $row->{deliver2},
"folder=" . $row->{folder},
"action=" . $row->{action},
"action2=" . $row->{action2},
"copy=" . $row->{copy},
"wherenext=RULE_MODIFY");
}
sub remove_link
{
my ($data_item, $row, $field) = @_;
return "userpanel-mailsort?" .
join("&",
"page=0",
"page_stack=",
"Next=Next",
"key=" . $row->{key},
"desc=" . $row->{b} .' = '. $row->{basis} . '<br>' .
$row->{c} .' = '. $row->{criterion} . '<br>' .
$row->{a} .' = '. $row->{action},
"wherenext=RULE_REMOVE");
}
sub remove_rule
{
my $self = shift;
my $q = $self->{cgi};
my $rule = $q->param('key');
my $rec = $pdb->get($rule);
$rec->delete;
unless ( system ("/sbin/e-smith/signal-event mailsorting-conf $PanelUser") == 0 )
{ return $self->error('ERROR_UPDATING'); }
return $self->success("SUCCESS");
}
sub save_rule
{
my $self = shift;
my $q = $self->{cgi};
my $rule = $q->param ('key') || '';
if (($rule eq '') || ($rule eq 'new'))
{
my $random = int(rand(999999));
$rule = $PanelUser.$random;
$pdb->new_record($rule, { type => "$PanelUser" });
}
my %filtered;
$filtered{criterion} .= $q->param ('criterion') || '';
$filtered{criterion2} .= $q->param ('criterion2') || '';
$filtered{basis} .= $q->param ('basis') || '';
$filtered{basis2} .= $q->param ('basis2') || '';
$filtered{action} .= $q->param ('action') || '';
$filtered{action2} .= $q->param ('action2') || '';
$filtered{deliver} .= $q->param ('deliver') || '';
$filtered{deliver2} .= $q->param ('deliver2') || '';
$filtered{folder} .= $q->param ('folder') || '';
$filtered{copy} .= $q->param ('copy') || '';
$filtered{oldkey} .= $q->param ('oldkey') || '';
if ($filtered{basis} eq 'sizelt') { $filtered{basis} = '<'; }
if ($filtered{basis} eq 'sizegt') { $filtered{basis} = '>'; }
if ($filtered{basis2} eq 'sizelt') { $filtered{basis2} = '<'; }
if ($filtered{basis2} eq 'sizegt') { $filtered{basis2} = '>'; }
# we use the folder drop box selection if asked to sort
$filtered{folder} = "" if $filtered{folder} eq "INBOX";
$filtered{deliver} = $filtered{folder} if $filtered{action} eq "sort";
if ($filtered{copy} eq 'no') { $filtered{deliver2} = ''; $filtered{action2} = ''; }
if ($filtered{copy} eq 'yes' && $filtered{action2} eq 'inbox') { $filtered{deliver2} = ''; }
# keys are different but rule at least has part of users name so is likely changed
if (($filtered{oldkey} ne $rule) && ($filtered{oldkey} =~ /$PanelUser/))
{
$pdb->new_record($rule, { type => "$PanelUser" });
my $rec = $pdb->get($filtered{oldkey});
$rec->delete;
}
foreach ("criterion","criterion2","action","action2","copy","basis","basis2","deliver","deliver2" )
{ $pdb->set_prop($rule, "$_", $filtered{$_}); }
unless ( system ("/sbin/e-smith/signal-event mailsorting-conf $PanelUser") == 0 )
{ return $self->error('ERROR_UPDATING'); }
return $self->success("SUCCESS");
}
sub GetDisplayName ($)
{
my $s = shift;
my $t = Unicode::IMAPUtf7->new();
$s =~ s/(.*)//; # untaint it
my $u = utf8($t->decode($1));
return $u->utf8;#$u->latin1;
}
sub listfolders
{
use File::Find::Rule;
my $root="/home/e-smith/files/users/$PanelUser/Maildir";
$root="/home/e-smith/Maildir" if "$PanelUser" eq "admin" ;
my @dirs = File::Find::Rule->new
->extras({ untaint => 1 , untaint_pattern => qr|^([-+@\w&. /]+)$| })
->directory
->maxdepth(1)
->in($root);
my %out_dir;
$out_dir{"INBOX"} .= "INBOX";
$out_dir{""} .= "";
for (sort @dirs) {
s/$root\/?\.?//;
my @exclu =("cur", "tmp", "new" , "INBOX" );
next if $_ ~~ @exclu;
$out_dir{$_} .= GetDisplayName(join('/',split('\.', $_)));
}
return \%out_dir;
}
sub nonblankWithForward
{
my $self = shift;
my $q = $self->{cgi};
my $action = $q->param ('action') || '';
my $deliver = $q->param ('deliver') || '';
if ( $action eq 'sort')
{
return "ERROR_SHOULD_BE_EMPTY" unless not $deliver;
return "OK";
}
elsif ( $action ne 'delete')
{
if (not $deliver)
{ return "ERROR_FORWARD_NO_EMAIL"; }
elsif ( $deliver =~ /^\s+$/ )
{ return "ERROR_FORWARD_NO_EMAIL"; }
else
{ return "OK"; }
}
else { return "OK"; }
}
sub nonblankWithForward2
{
my $self = shift;
my $q = $self->{cgi};
my $copy = $q->param ('copy') || '';
my $action = $q->param ('action2') || '';
my $deliver = $q->param ('deliver2') || '';
if (( $action eq 'forward') && ( $copy eq 'yes'))
{
if (not $deliver)
{ return "ERROR_FORWARD_NO_EMAIL"; }
elsif ( $deliver =~ /^\s+$/ )
{ return "ERROR_FORWARD_NO_EMAIL"; }
else
{ return "OK"; }
}
else { return "OK"; }
}
sub nonblankWithSort
{
my $self = shift;
my $q = $self->{cgi};
my $action = $q->param ('action') || '';
my $folder = $q->param ('folder') || '';
if ( $action eq 'sort')
{
return "ERROR_SORT_NO_FOLDER" if not $folder;
return "OK";
}
else { return "OK"; }
}
1;