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

" . $fm->localise("LIST_ADD") . "

")); if ( scalar @lists == 0 ) { print $q->Tr($q->td( '

' . $fm->localise("NO_LIST_CREATED") . '

')); } else { print $q->start_table({-CLASS => "sme-border"}),"\n"; print "" . $fm->localise("LIST") . " " . $fm->localise('DESCRIPTION') . "" . $fm->localise('ACTION') . ""; foreach my $list ( @lists ) { my $name = $list->key; print "" . "" . $name . "" . "" . $list->prop('Description') . "" . "" . $fm->localise("MODIFY") . "" . "" . $fm->localise("REMOVE") . "" . ""; } 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"; }