package Guestbook;
use base 'CGI::Application';
use strict;
# define all run modes here to allow different sets,
# the actual access control should then be enforced using
# multiple instance scripts, which in turn are placed in a
# secure area and only enable the desired set(s)
sub _RUN_MODES {
DEFAULT => {
view => 'view_entries',
sign => 'sign_guestbook'
},
RESTRICTED => {
delete => 'delete_entry'
}
}
sub enable_rm_set {
my $self = shift;
my %run_modes = _RUN_MODES;
foreach (@_) {
$self->run_modes( %{$run_modes{$_}} );
#ensure that info on loaded sets is avaible
$self->param($_ => '1');
}
}
sub setup {
my $self = shift;
$self->enable_rm_set('DEFAULT');
$self->start_mode('view');
}
sub view_entries {
my $self = shift;
my ($ip, $del_link);
# are we in "admin mode"?
if ($self->param('RESTRICTED')) {
$ip = "with IP's";
$del_link = '+ del option';
}
return "showing guesbook entries $ip";
}
sub sign_guestbook {
my $self = shift;
return "sign guestbook";
}
# restricted
sub delete_entry {
my $self = shift;
# bail out if authentification did not happen
# (of course this check should be during setup ;)
return _no_auth() unless defined($ENV{UserName});
return "delete entry";
}
sub _no_auth {
return "oops, authentification did not happen";
}
1;
####
use Guestbook;
my $gb = Guestbook->new();
# enable admin mode
$gb->enable_rm_set('RESTRICTED');
$gb->run();
####
use Guestbook;
my $gb = Guestbook->new();
$gb->run();