Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package DF::AAA;
- use Mason::Moose;
- extends qw(Plack::Middleware);
- use Poet qw($cache $env $conf);
- # Publicly available paths
- my %public = (
- '/login' => 1,
- '/favicon.ico' => 1,
- );
- has 'mapref' => ( is => 'ro' );
- method remap($env) {
- my $path_info = $env->{PATH_INFO};
- my $script_name = $env->{SCRIPT_NAME};
- my($http_host, $server_name) = @{$env}{qw( HTTP_HOST SERVER_NAME )};
- if ($http_host and my $port = $env->{SERVER_PORT}) {
- $http_host =~ s/:$port$//;
- }
- my $mr = $self->mapref; $mr = $$mr;
- for my $map (@{ $mr->{_sorted_mapping} }) {
- my($host, $location, $app) = @$map;
- my $path = $path_info; # copy
- no warnings 'uninitialized';
- next unless not defined $host or
- $http_host eq $host or
- $server_name eq $host;
- next unless $location eq '' or $path =~ s!^\Q$location\E!!;
- next unless $path eq '' or $path =~ m!^/!;
- my $orig_path_info = $env->{PATH_INFO};
- my $orig_script_name = $env->{SCRIPT_NAME};
- $env->{PATH_INFO} = $path;
- $env->{SCRIPT_NAME} = $script_name . $location;
- return sub {
- $env->{PATH_INFO} = $orig_path_info;
- $env->{SCRIPT_NAME} = $orig_script_name;
- };
- }
- }
- method call ($psgi_env) {
- my $req = $env->app_class('Plack::Request')->new($psgi_env);
- my $login = $req->param('login') || $req->session->{login};
- my $passwd= $req->param('passwd') || $req->session->{passwd};
- my $authenticated = $cache->compute(join(':', 'session', $psgi_env->{'psgix.session.options'}{id}, 'auth'), $conf->get_or_die('login.refresh'), sub
- return $login and $passwd;
- });
- my $restore = $self->remap($psgi_env);
- if ($authenticated or $public{$req->path_info}) {
- $restore->();
- return $self->app->($psgi_env);
- }
- $req->session->{redir_to} = $req->request_uri;
- my $res = $req->new_response();
- $res->redirect( $req->script_name . '/login');
- $restore->();
- $res->finalize;
- }
Add Comment
Please, Sign In to add comment