Author: spadkins
Date: Thu Sep 13 13:05:34 2007
New Revision: 9944

Modified:
   p5ee/trunk/App-Context/lib/App/Context/HTTP.pm

Log:
Changes for application login logoff

Modified: p5ee/trunk/App-Context/lib/App/Context/HTTP.pm
==============================================================================
--- p5ee/trunk/App-Context/lib/App/Context/HTTP.pm      (original)
+++ p5ee/trunk/App-Context/lib/App/Context/HTTP.pm      Thu Sep 13 13:05:34 2007
@@ -135,26 +135,46 @@
     my ($self) = @_;
 
     my $timer = $self->{options}{"app.Context.timer"};
+    my $app   = $self->{options}{app};
     my $content_description = "Unknown";
     $self->start_timer() if ($timer);
-    eval {
-        $self->dispatch_events_begin();
 
+    $self->dispatch_events_begin();
+
+    eval {
+        my $user = $self->user();
+        my $authorization = $self->authorization();
         my $events = $self->{events};
-        my ($event, $service, $name, $method, $args);
+        my ($event, $service_type, $service_name, $method, $args);
         my $results = "";
         # my $display_current_widget = 1;
 
         while ($#$events > -1) {
             $event = shift(@$events);
-            ($service, $name, $method, $args) = @$event;
-            $results = $self->call($service, $name, $method, $args);
-            $args = join(",", @$args) if (ref($args) eq "ARRAY");
-            $self->lap_timer("$service($name).$method($args)") if ($timer);
-        }
-        my $type = $self->so_get("default","ctype","SessionObject");
-        $name = $self->so_get("default","cname");
-        $results = $self->service($type, $name);
+            ($service_type, $service_name, $method, $args) = @$event;
+            if 
($authorization->is_authorized("/App/$service_type/$service_name/$method", 
$user)) {
+                $results = $self->call($service_type, $service_name, $method, 
$args);
+                $args = join(",", @$args) if (ref($args) eq "ARRAY");
+                
$self->lap_timer("$service_type($service_name).$method($args)") if ($timer);
+                $user = $self->user();
+            }
+        }
+        $service_type = $self->so_get("default","ctype","SessionObject");
+        $service_name = $self->so_get("default","cname");
+
+        if ($authorization->is_authorized("/App/$service_type/$service_name", 
$user)) {
+            # do nothing
+        }
+        else {
+            if ($self->session_object_exists("login_${app}")) {
+                $service_name = "login_${app}";
+            }
+            else {
+                $service_name = "login";
+            }
+        }
+
+        $results = $self->service($service_type, $service_name);
 
         my $response = $self->response();
         my $ref = ref($results);
@@ -169,7 +189,7 @@
         }
         else {
             $response->content($results->internals());
-            $content_description = "$type($name).internals()";
+            $content_description = "$service_type($service_name).internals()";
         }
 
         $self->send_response();
@@ -504,26 +524,78 @@
 sub user {
     &App::sub_entry if ($App::trace);
     my $self = shift;
-    my $user = $self->request()->user();
-    $self->{user} = $user;
-    my $switchable_users = $self->get_option("switchable_users");
-    if ($switchable_users && $switchable_users =~ /\b$user\b/) {
-        # check more carefully ...
-        if ($switchable_users eq $user ||
-            $switchable_users =~ /:$user:/ ||
-            $switchable_users =~ /^$user:/ ||
-            $switchable_users =~ /:$user$/) {
-            my $effective_user = $self->so_get("default","u");
-            if ($effective_user) {
-                $user = $effective_user;
-                $self->{effective_user} = $effective_user;
+    my $user = $self->{effective_user} || $self->{user};
+
+    if (!$user) {
+        my $options = $self->{options};
+        my ($effective_user);
+        my $authenticated = 0;
+
+        if ($options->{app_auth_required}) {
+            # Bypass Basic Authentication, /../..?u=username&p=password
+            my $password = $self->so_get("default","p");
+            $user = $self->so_get("default","u");
+            if (defined $password && defined $user) {
+                my $authentication = $self->authentication();
+                if ( $authentication->validate_password($user, $password) ) {
+                    $authenticated = 1;
+                    $effective_user = $self->so_get("default","eu");
+                }
             }
         }
+        else {
+            $user = $self->request()->user();
+
+            my $p_pass = $self->so_get("default","p");
+            my $u_user = $self->so_get("default","u");
+            if (defined $p_pass && defined $u_user) {
+                my $authentication = $self->authentication();
+                if ( $authentication->validate_password($u_user, $p_pass) ) {
+                    $authenticated = 1;
+                    $user = $self->so_get("default","u");
+                    $effective_user = $self->so_get("default","u");
+                }
+            }
+
+            $authenticated = 1;
+            $effective_user = $self->so_get("default","u");
+        }
+
+        $user = "guest" if (!$authenticated);
+        $ENV{REMOTE_USER} = $user;
+        $self->{user} = $user;
+
+        if ($user && $authenticated) {
+            my $switchable_users = $self->get_option("switchable_users");
+            if ($switchable_users && $switchable_users =~ /\b$user\b/) {
+                # check more carefully ...
+                if ($switchable_users eq $user ||
+                    $switchable_users =~ /:$user:/ ||
+                    $switchable_users =~ /^$user:/ ||
+                    $switchable_users =~ /:$user$/) {
+                    if ($effective_user) {
+                        $user = $effective_user;
+                        $self->{effective_user} = $effective_user;
+                    }
+                }
+            }
+        }
+
+        $self->so_set("default", "user", $user);
     }
+
     &App::sub_exit($user) if ($App::trace);
     return $user;
 }
 
+sub set_user {
+    &App::sub_entry if ($App::trace);
+    my ($self, $user) = @_;
+    $self->{user} = $user;
+    delete $self->{effective_user};
+    &App::sub_exit() if ($App::trace);
+}
+
 #04899 000.000000 000.000000 Start 2006/06/28 21:56:52.827139 GET            
[222.252.72.65] localhost
 #04899 000.023569 000.023569 MarketVision[8] Controller code loaded
 #04899 000.394568 000.418137 MarketVision[666] code loaded, vars initialized

Reply via email to