X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDispatcher.pm;h=b4f75ba1bbd860d098acf54553db0d034fe21fa8;hb=d4f9d559a4a4d5e8fa2bb10be268e24634169b5e;hp=2599f5f0f7ff39bbacb5c917f9834486a5666c55;hpb=7bd555b62a7501d750d7989b75b46a40c5e7c1a3;p=kivitendo-erp.git diff --git a/SL/Dispatcher.pm b/SL/Dispatcher.pm index 2599f5f0f..b4f75ba1b 100644 --- a/SL/Dispatcher.pm +++ b/SL/Dispatcher.pm @@ -15,6 +15,7 @@ use SL::LXDebug; use SL::Locale; use SL::Common; use Form; +use List::Util qw(first); use Moose; use Rose::DB; use Rose::DB::Object; @@ -31,11 +32,12 @@ sub pre_request_checks { sub show_error { $::lxdebug->enter_sub; - my $template = shift; - my $error_type = shift || ''; - my $locale = Locale->new($::language, 'all'); - $::form->{error} = $::locale->text('The session is invalid or has expired.') if ($error_type eq 'session'); - $::form->{error} = $::locale->text('Incorrect password!.') if ($error_type eq 'password'); + my $template = shift; + my $error_type = shift || ''; + + $::locale = Locale->new($::language); + $::form->{error} = $::locale->text('The session is invalid or has expired.') if ($error_type eq 'session'); + $::form->{error} = $::locale->text('Incorrect password!.') if ($error_type eq 'password'); $::myconfig{countrycode} = $::language; $::form->{stylesheet} = 'css/lx-office-erp.css'; @@ -68,6 +70,7 @@ sub pre_startup_setup { $::userspath = "users"; $::templates = "templates"; $::memberfile = "users/members"; + $::menufile = "menu.ini"; $::sendmail = "| /usr/sbin/sendmail -t"; $::lxdebug = LXDebug->new; $::auth = SL::Auth->new; @@ -99,10 +102,10 @@ sub require_main_code { }; $::form->error($EVAL_ERROR) if ($EVAL_ERROR); } - if ($::form->{login} && -f "bin/mozilla/$::form->{login}_$::form->{script}") { + if ($::form->{login} && -f "bin/mozilla/$::form->{login}_$script") { eval { package main; - require "bin/mozilla/$::form->{login}_$::form->{script}"; + require "bin/mozilla/$::form->{login}_$script"; }; $::form->error($EVAL_ERROR) if ($EVAL_ERROR); } @@ -113,7 +116,7 @@ sub handle_request { $::lxdebug->begin_request; my $interface = lc(shift || 'cgi'); - my $script_name; + my ($script_name, $action); if ($interface =~ m/^(?:fastcgi|fcgid|fcgi)$/) { $script_name = $ENV{SCRIPT_NAME}; @@ -123,12 +126,16 @@ sub handle_request { $script_name = $0; } + $::cgi = CGI->new(''); + $::locale = Locale->new($::language); + $::form = Form->new; + %::called_subs = (); + + eval { ($script_name, $action) = _route_request($script_name); 1; } or return; + my ($script, $path, $suffix) = fileparse($script_name, ".pl"); require_main_code($script, $suffix); - $::cgi = CGI->new(''); - $::locale = Locale->new($::language, $script); - $::form = Form->new; $::form->{script} = $script . $suffix; pre_request_checks(); @@ -138,7 +145,7 @@ sub handle_request { $::form->{titlebar} = "Lx-Office " . $::locale->text('Version') . " $::form->{version}"; ::run($::auth->restore_session); - } elsif ($::form->{action}) { + } elsif ($action) { # copy from am.pl routines $::form->error($::locale->text('System currently down for maintenance!')) if -e "$main::userspath/nologin" && $script ne 'admin'; @@ -149,7 +156,7 @@ sub handle_request { show_error('login/password_error', 'password') unless $::myconfig{login}; - $::locale = Locale->new($::myconfig{countrycode}, $script); + $::locale = Locale->new($::myconfig{countrycode}); show_error('login/password_error', 'password') if SL::Auth::OK != $::auth->authenticate($::form->{login}, $::form->{password}, 0); @@ -158,10 +165,10 @@ sub handle_request { delete $::form->{password}; map { $::form->{$_} = $::myconfig{$_} } qw(stylesheet charset) - unless $::form->{action} eq 'save' && $::form->{type} eq 'preferences'; + unless $action eq 'save' && $::form->{type} eq 'preferences'; $::form->set_standard_title; - ::call_sub('::' . $::locale->findsub($::form->{action})); + ::call_sub('::' . $::locale->findsub($action)); } else { $::form->error($::locale->text('action= not defined!')); @@ -194,6 +201,42 @@ sub unrequire_bin_mozilla { } } +sub _route_request { + my $script_name = shift; + + return $script_name =~ m/dispatcher\.pl$/ ? _route_dispatcher_request() : ($script_name, $::form->{action}); +} + +sub _route_dispatcher_request { + my $name_re = qr{[a-z]\w*}; + my ($script_name, $action); + + eval { + die "Unroutable request -- inavlid module name.\n" if !$::form->{M} || ($::form->{M} !~ m/^${name_re}$/); + $script_name = $::form->{M} . '.pl'; + + if ($::form->{A}) { + $action = $::form->{A}; + + } else { + $action = first { m/^A_${name_re}$/ } keys %{ $::form }; + die "Unroutable request -- inavlid action name.\n" if !$action; + + delete $::form->{$action}; + $action = substr $action, 2; + } + + delete @{$::form}{qw(M A)}; + + 1; + } or do { + $::form->{label_error} = $::cgi->pre($EVAL_ERROR); + show_error('generic/error'); + }; + + return ($script_name, $action); +} + package main; use strict;