aboutsummaryrefslogtreecommitdiffstats
path: root/lib/FPanel/Interface.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/FPanel/Interface.pm')
-rw-r--r--lib/FPanel/Interface.pm118
1 files changed, 118 insertions, 0 deletions
diff --git a/lib/FPanel/Interface.pm b/lib/FPanel/Interface.pm
new file mode 100644
index 0000000..adac0f0
--- /dev/null
+++ b/lib/FPanel/Interface.pm
@@ -0,0 +1,118 @@
+package FPanel::Interface;
+
+use strict;
+use warnings;
+use utf8;
+
+use lib 'lib';
+use base 'FPanel::Login';
+
+sub cgiapp_init {
+ my $self = shift;
+
+ $self->SUPER::cgiapp_init;
+
+ # define runmodes (pages) that require successful login:
+ $self->authen->protected_runmodes( ':all' );
+}
+
+sub index : Runmode {
+ my $self = shift;
+ my $template = $self->load_tmpl("index.html");
+ my $domain = (split /\//, $ENV{PATH_INFO},3)[1];
+ $template->param({
+ NAME => 'INDEX',
+ URL => $self->query->url(),
+ MYDOMAIN => $domain,
+ USER => $self->authen->username,
+ });
+ return $template->output;
+}
+
+sub DomainList : StartRunmode {
+ my $self = shift;
+
+ my ($u,$d) = split /@/, $self->authen->username, 2;
+ my $dn = "fvu=$u,fvd=$d,ou=virtual,o=mailHosting,dc=fripost,dc=dev";
+
+ my $ldap = Net::LDAP->new( 'ldap://127.0.0.1:389',
+ , async => 1,
+ , onerror => 'die'
+ );
+ my $sasl = Authen::SASL->new( mechanism => 'DIGEST-MD5'
+ , callback => { user => 'FPanel'
+ , pass => 'panel'
+ , authname => "dn:$dn" }
+ );
+ my $mesg = $ldap->bind( sasl => $sasl ) ;
+ die $mesg->error if $mesg->code;
+
+ my $domains = $ldap->search( base => "ou=virtual,o=mailHosting,dc=fripost,dc=dev"
+ , scope => 'one'
+ , filter => 'objectClass=FripostVirtualDomain'
+ , deref => 'never'
+ );
+ die $domains->error if $domains->code;
+
+
+ my $template = $self->load_tmpl("domain-list.html");
+ my $url = $self->query->url();
+ $template->param( URL => $url );
+ $template->param( USER_LOCALPART => $u, USER_DOMAINPART => $d);
+ my $i = 1;
+ $template->param( DOMAIN => [
+ map { $i = 1-$i;
+ { DOMAIN => $_->get_value('fvd')
+ , PERMS => &list_perms($_, $dn)
+ , DESCRIPTION => join ("\n", $_->get_value('description'))
+ , ISACTIVE => $_->get_value('fripostIsStatusActive') eq 'TRUE' ? 1 : 0
+ , URL => $url
+ , ODD => $i
+ };
+ }
+ $domains->sorted('fvd')
+ ]);
+ return $template->output;
+}
+
+sub list_perms {
+ my ($entry, $dn) = @_;
+ my $perms = '';
+
+ my $canCreateAlias = $entry->get_value ('fripostCanCreateAlias', asref => 1);
+ $perms .= 'a'
+ if defined $canCreateAlias and
+ grep { $dn eq $_ or (split /,/,$dn,2)[1] eq $_ }
+ @{$canCreateAlias};
+
+ my $canCreateList = $entry->get_value ('fripostCanCreateList', asref => 1);
+ $perms .= 'l'
+ if defined $canCreateList and
+ grep { $dn eq $_ or (split /,/,$dn,2)[1] eq $_ }
+ @{$canCreateList};
+
+ my $owner = $entry->get_value ('fripostOwner', asref => 1);
+ $perms = 'o'
+ if defined $owner and grep { $dn eq $_ } @{$owner};
+
+ my $postmaster = $entry->get_value ('fripostPostmaster', asref => 1);
+ $perms = 'p'
+ if defined $postmaster and grep { $dn eq $_ } @{$postmaster};
+
+ if ( $perms =~ /a/) {
+ return 'can create aliases & lists' if ( $perms =~ /l/);
+ return 'can create aliases';
+ }
+ elsif ( $perms eq 'l' ) {
+ return 'can create lists';
+ }
+ elsif ( $perms eq 'o' ) {
+ return 'owner';
+ }
+ elsif ( $perms eq 'p' ) {
+ return 'postmaster';
+ }
+}
+
+1;
+