Guest User

Untitled

a guest
Jan 17th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.10 KB | None | 0 0
  1. package DF::AAA;
  2. use Mason::Moose;
  3. extends qw(Plack::Middleware);
  4. use Poet qw($cache $env $conf);
  5.  
  6. # Publicly available paths
  7. my %public = (
  8. '/login' => 1,
  9. '/favicon.ico' => 1,
  10. );
  11.  
  12. has 'mapref' => ( is => 'ro' );
  13.  
  14. method remap($env) {
  15.  
  16. my $path_info = $env->{PATH_INFO};
  17. my $script_name = $env->{SCRIPT_NAME};
  18.  
  19. my($http_host, $server_name) = @{$env}{qw( HTTP_HOST SERVER_NAME )};
  20.  
  21. if ($http_host and my $port = $env->{SERVER_PORT}) {
  22. $http_host =~ s/:$port$//;
  23. }
  24.  
  25. my $mr = $self->mapref; $mr = $$mr;
  26. for my $map (@{ $mr->{_sorted_mapping} }) {
  27. my($host, $location, $app) = @$map;
  28. my $path = $path_info; # copy
  29.  
  30. no warnings 'uninitialized';
  31. next unless not defined $host or
  32. $http_host eq $host or
  33. $server_name eq $host;
  34. next unless $location eq '' or $path =~ s!^\Q$location\E!!;
  35. next unless $path eq '' or $path =~ m!^/!;
  36.  
  37. my $orig_path_info = $env->{PATH_INFO};
  38. my $orig_script_name = $env->{SCRIPT_NAME};
  39.  
  40. $env->{PATH_INFO} = $path;
  41. $env->{SCRIPT_NAME} = $script_name . $location;
  42.  
  43. return sub {
  44. $env->{PATH_INFO} = $orig_path_info;
  45. $env->{SCRIPT_NAME} = $orig_script_name;
  46. };
  47. }
  48. }
  49.  
  50. method call ($psgi_env) {
  51. my $req = $env->app_class('Plack::Request')->new($psgi_env);
  52.  
  53. my $login = $req->param('login') || $req->session->{login};
  54. my $passwd= $req->param('passwd') || $req->session->{passwd};
  55. my $authenticated = $cache->compute(join(':', 'session', $psgi_env->{'psgix.session.options'}{id}, 'auth'), $conf->get_or_die('login.refresh'), sub
  56. return $login and $passwd;
  57. });
  58.  
  59. my $restore = $self->remap($psgi_env);
  60. if ($authenticated or $public{$req->path_info}) {
  61. $restore->();
  62. return $self->app->($psgi_env);
  63. }
  64.  
  65. $req->session->{redir_to} = $req->request_uri;
  66.  
  67. my $res = $req->new_response();
  68. $res->redirect( $req->script_name . '/login');
  69. $restore->();
  70. $res->finalize;
  71. }
Add Comment
Please, Sign In to add comment