smeserver-minilist/root/usr/lib/perl5/site_perl/esmith/FormMagick/Panel/minilist.pm

211 lines
5.8 KiB
Perl

#!/usr/bin/perl -w
package esmith::FormMagick::Panel::minilist;
use strict;
use esmith::FormMagick;
use esmith::ConfigDB;
use esmith::AccountsDB;
use File::Basename;
use Exporter;
use Carp;
our @ISA = qw(esmith::FormMagick Exporter);
our @EXPORT = qw(
new
get_accounts_prop
get_members
get_html_members
get_description
show_initial
create_list
modify_list
delete_list
validate_list_name
validate_list_description
validate_list_members
);
our $a = esmith::AccountsDB->open() || die "Couldn't open accounts";
our $db = esmith::ConfigDB->open || die "Couldn't open config db";
sub new {
shift;
my $self = esmith::FormMagick->new();
$self->{calling_package} = (caller)[0];
bless $self;
return $self;
}
# return the value of a prop from an account object
sub get_accounts_prop {
my $fm = shift;
my $item = shift;
my $prop = shift;
my $record = $a->get($item);
if ($record) {
return $record->prop($prop);
}
else {
return '';
}
}
# Return the members of a list
sub get_members {
my $fm = shift;
my $q = $fm->{cgi};
my $list = $q->param('listName') || '';
my @members = split /[;,]/, get_accounts_prop($fm,$list,'Members');
my $members = join "\n", @members;
return $members;
}
# return the members of a list
# to display in HTML
sub get_html_members {
my $fm = shift;
my $q = $fm->{cgi};
my $list = $q->param('listName') || '';
my $members = get_members($fm,$list);
$members =~ s/\n/<br>/g;
return $members;
}
# return the description of a list
sub get_description {
my $fm = shift;
my $q = $fm->{cgi};
my $list = $q->param('listName') || '';
return get_accounts_prop($fm,$list,'Description');
}
# Print a table with the actual list and a button to create new ones
sub show_initial () {
my $fm = shift;
my $q = $fm->{cgi};
my @lists = $a->get_all_by_prop(type=>'minilist');
print $q->Tr($q->td(
"<p><a class=\"button-like\" href=\"minilist?page_stack=;page=0;&wherenext=CreateList\">"
. $fm->localise("LIST_ADD")
. "</a></p>"));
if ( scalar @lists == 0 ) {
print $q->Tr($q->td(
'<p><b>' . $fm->localise("NO_LIST_CREATED") . '</p></b>'));
}
else {
print $q->start_table({-CLASS => "sme-border"}),"\n";
print "<tr><th class=\"sme-border\">"
. $fm->localise("LIST")
. "</th> <th class=\"sme-border\">"
. $fm->localise('DESCRIPTION')
. "</th><th class=\"sme-border\" colspan=\"2\">"
. $fm->localise('ACTION')
. "</th></tr>";
foreach my $list ( @lists ) {
my $name = $list->key;
print "<tr>" . "<td class=\"sme-border\">"
. $name . "</td>" . "<td class=\"sme-border\">"
. $list->prop('Description') . "</td>"
. "<td class=\"sme-border\"><a href=\"minilist?page_stack=;page=0;&listName=$name&wherenext=Modify\">"
. $fm->localise("MODIFY") . "</a></td>"
. "<td class=\"sme-border\"><a href=\"minilist?page_stack=;page=0;&listName=$name&wherenext=Delete\">"
. $fm->localise("REMOVE") . "</a>" . "</td></tr>";
}
print $q->end_table,"\n";
}
return;
}
# Create a new list
sub create_list {
my $fm =shift;
my $q = $fm->{cgi};
my $name =$q->param('listName') || '';
my @members = split /\r?\n/, ($q->param('members') || '');
my $members = join ",", @members;
my %props = (
'type', 'minilist', 'Description',
$q->param('listDesc'), 'Members', $members
);
$a->new_record( $name, \%props );
($name) = ($name =~ /^([a-z0-9][\-\_\.a-z0-9]*)$/);
return system("/sbin/e-smith/signal-event", "list-create", "$name") ?
$fm->error('CREATE_ERROR') : $fm->success('CREATE_SUCCESS');
}
# modify an existinbg list
sub modify_list {
my $fm =shift;
my $q = $fm->{cgi};
my $name =$q->param('listName') || '';
my @members = split /\r?\n/, ($q->param('members') || '');
my $members = join ",", @members;
$a->set_prop($name,'Description',$q->param('listDesc'));
$a->set_prop($name,'Members',$members);
($name) = ($name =~ /^([a-z0-9][\-\_\.a-z0-9]*)$/);
return system("/sbin/e-smith/signal-event", "list-modify", "$name") ?
$fm->error('MODIFY_ERROR') : $fm->success('MODIFY_SUCCESS');
}
# delete a list (after confirmation)
sub delete_list {
my $fm =shift;
my $q = $fm->{cgi};
my $name =$q->param('listName') || '';
return $fm->error('DELETE_ERROR') unless $a->get($name)->delete;
($name) = ($name =~ /^([a-z0-9][\-\_\.a-z0-9]*)$/);
return system("/sbin/e-smith/signal-event", "list-delete", "$name") ?
$fm->error('DELETE_ERROR') : $fm->success('DELETE_SUCCESS');
}
# Validate list name
sub validate_list_name {
my $fm = shift;
my $name = shift;
unless ($name =~ /^([a-zA-Z0-9][\_\.\-a-zA-Z0-9]*)$/){
return $fm->localise('INVALID_CHARS',{string => $name});
}
if ($a->get($name)){
return $fm->localise('ACCOUNT_CLASH',{string => $name});
}
return "OK";
}
# Validate list description
sub validate_list_description {
my $fm = shift;
my $desc = shift;
unless ($desc =~ /^([a-zA-Z0-9][\s\w\.\-]*)$/){
return $fm->localise('INVALID_CHARS',{string => $desc});
}
return "OK";
}
# Validate memebrs of a list
sub validate_list_members {
my $fm = shift;
my $members = shift;
foreach my $member (split /\r?\n/, $members) {
my $acc = $a->get($member);
if ($acc){
my $type = $acc->prop('type') || 'none';
next if ($type eq 'user');
}
unless ($member =~ /^[a-zA-Z0-9][\w\.\-]*\@([a-zA-Z0-9\._\-]+\.[a-zA-Z0-9\._\-]+)$/){
return $fm->localise('INVALID_CHARS',{string => $member});
}
}
return "OK";
}