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
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-z0-9][\_\.\-a-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";
|
|
}
|
|
|