aboutsummaryrefslogtreecommitdiffstats
path: root/lib/FPanel/Interface.pm
blob: 0d2cd0e19652e205c2beeb36d42d784338d41954 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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'
                                 , cache => 1
                                 , utf8 => 1 );
  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'
                                 , cache => 1
                                 , utf8 => 1
                                 , loop_context_vars => 1 );
  my $url = $self->query->url();
  $template->param( URL => $url );
  $template->param( USER_LOCALPART => $u, USER_DOMAINPART => $d);
  $template->param( DOMAIN => [
          map { { DOMAIN => $_->get_value('fvd')
                , PERMS => &list_perms($_, $dn)
                , DESCRIPTION => join ("\n", $_->get_value('description'))
                , ISACTIVE => $_->get_value('fripostIsStatusActive') eq 'TRUE' ? 1 : 0
                , URL => $url
                };
              }
              $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;