211 lines
5.8 KiB
Perl
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";
|
|
}
|