import of rt 3.0.4
[freeside.git] / rt / html / Elements / SetupSessionCookie
diff --git a/rt/html/Elements/SetupSessionCookie b/rt/html/Elements/SetupSessionCookie
new file mode 100644 (file)
index 0000000..4d728ce
--- /dev/null
@@ -0,0 +1,77 @@
+%# BEGIN LICENSE BLOCK
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
+%# 
+%# (Except where explictly superceded by other copyright notices)
+%# 
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%# 
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%# General Public License for more details.
+%# 
+%# Unless otherwise specified, all modifications, corrections or
+%# extensions to this work which alter its source code become the
+%# property of Best Practical Solutions, LLC when submitted for
+%# inclusion in the work.
+%# 
+%# 
+%# END LICENSE BLOCK
+<%init>
+my %cookies = CGI::Cookie->fetch();
+my %backends = (
+    mysql      => 'Apache::Session::MySQL',
+    Pg         => 'Apache::Session::Postgres',
+    Oracle     => 'Apache::Session::Oracle',
+) unless $RT::WebSessionClass;
+my $session_class = $RT::WebSessionClass || $backends{$RT::DatabaseType} || 'Apache::Session::File';
+my $pm = "$session_class.pm"; $pm =~ s|::|/|g; require $pm;
+
+    eval {
+        tie %session, $session_class,
+          $SessionCookie || ( $cookies{'RT_SID'} ? $cookies{'RT_SID'}->value() : undef ),
+          $backends{$RT::DatabaseType} ? {
+            Handle     => $RT::Handle->dbh,
+            LockHandle => $RT::Handle->dbh,
+          } : {
+            Directory     => $RT::MasonSessionDir,
+            LockDirectory => $RT::MasonSessionDir,
+          };
+    };
+    if ($@) {
+
+        # If the session is invalid, create a new session.
+        if ( $@ =~ /Object does not/i ) {
+            tie %session, $session_class, undef,
+             $backends{$RT::DatabaseType} ? {
+                Handle     => $RT::Handle->dbh,
+                LockHandle => $RT::Handle->dbh,
+              } : {
+                Directory     => $RT::MasonSessionDir,
+                LockDirectory => $RT::MasonSessionDir,
+              };
+            undef $cookies{'RT_SID'};
+        }
+        else {
+            die "RT Couldn't write to session directory '$RT::MasonSessionDir': $@. Check that this dir ectory's permissions are correct.";
+        }
+    }
+
+    if ( !$cookies{'RT_SID'} ) {
+        my $cookie = new CGI::Cookie(
+            -name  => 'RT_SID',
+            -value => $session{_session_id},
+            -path  => '/',
+        );
+        $r->header_out('Set-Cookie', $cookie->as_string);
+
+    } 
+    return();
+</%init>
+<%args>
+$SessionCookie => ''
+</%args>