SME Server's panel to create simple list. It works like groups email, except that you can enter raw (including external) email addresses instead of having to select existing user accounts
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

210 lines
5.8 KiB

#!/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";
}