Merge branch 'master' of github.com:kivitendo/kivitendo-erp
[kivitendo-erp.git] / SL / Dispatcher / AuthHandler.pm
1   package SL::Dispatcher::AuthHandler;
2
3 use strict;
4
5 use parent qw(Rose::Object);
6
7 use SL::Dispatcher::AuthHandler::Admin;
8 use SL::Dispatcher::AuthHandler::None;
9 use SL::Dispatcher::AuthHandler::User;
10
11 my %valid_auth_levels = map { ($_ => 1) } qw(user admin none);
12
13 sub handle {
14   my ($self, %param) = @_;
15
16   my $auth_level                       = $self->get_auth_level(%param);
17
18   my $handler_name                     = "SL::Dispatcher::AuthHandler::" . ucfirst($auth_level);
19   $self->{handlers}                  ||= {};
20   $self->{handlers}->{$handler_name} ||= $handler_name->new;
21   my $ok = $self->{handlers}->{$handler_name}->handle;
22
23   return (
24     auth_level     => $auth_level,
25     keep_auth_vars => $self->get_keep_auth_vars(%param),
26     auth_ok        => $ok,
27   );
28 }
29
30 sub get_auth_level {
31   my ($self, %param) = @_;
32
33   my $auth_level = $param{routing_type} eq 'old'        ? ($param{script} eq 'admin' ? 'admin' : 'user')
34                  : $param{routing_type} eq 'controller' ? "SL::Controller::$param{controller}"->get_auth_level($param{action})
35                  :                                        'user';
36
37   return $valid_auth_levels{$auth_level} ? $auth_level : 'user';
38 }
39
40 sub get_keep_auth_vars {
41   my ($self, %param) = @_;
42
43   return $param{routing_type} eq 'controller' ? "SL::Controller::$param{controller}"->keep_auth_vars_in_form : 0;
44 }
45
46 1;