summaryrefslogtreecommitdiff
path: root/rt/bin/mason_handler.scgi
diff options
context:
space:
mode:
authorivan <ivan>2002-08-12 06:17:09 +0000
committerivan <ivan>2002-08-12 06:17:09 +0000
commit3ef62a0570055da710328937e7f65dbb2c027c62 (patch)
treed549158b172fd499b4f81a2981b62aabbde4f99b /rt/bin/mason_handler.scgi
parent030438c9cb1c12ccb79130979ef0922097b4311a (diff)
import rt 2.0.14
Diffstat (limited to 'rt/bin/mason_handler.scgi')
-rwxr-xr-xrt/bin/mason_handler.scgi193
1 files changed, 193 insertions, 0 deletions
diff --git a/rt/bin/mason_handler.scgi b/rt/bin/mason_handler.scgi
new file mode 100755
index 0000000..b9846c8
--- /dev/null
+++ b/rt/bin/mason_handler.scgi
@@ -0,0 +1,193 @@
+#!!!PERL!! -w
+
+#!/usr/bin/speedy -- -t600 -M8
+# $Header: /home/cvs/cvsroot/freeside/rt/bin/mason_handler.scgi,v 1.1 2002-08-12 06:17:07 ivan Exp $
+# RT is (c) 1996-2001 Jesse Vincent (jesse@fsck.com);
+#
+# Contains code derived from mason.cgi
+# mason.cgi is Copyright December 2000 Joshua Kronengold (mneme@io.com,
+# mneme@cyberspace.org). All Rights Reserved.
+
+use strict;
+# {{{ Clean out the environment a little bit
+$ENV{'PATH'} = '/bin:/usr/bin'; # or whatever you need
+$ENV{'CDPATH'} = '' if defined $ENV{'CDPATH'};
+$ENV{'SHELL'} = '/bin/sh' if defined $ENV{'SHELL'};
+$ENV{'ENV'} = '' if defined $ENV{'ENV'};
+$ENV{'IFS'} = '' if defined $ENV{'IFS'};
+# }}}
+
+package RT::Mason;
+use HTML::Mason; # brings in subpackages: Parser, Interp, etc.
+use vars qw($VERSION %session $Nobody $SystemUser);
+
+# List of modules that you want to use from components (see Admin
+# manual for details)
+
+$VERSION="!!RT_VERSION!!";
+
+use lib "!!RT_LIB_PATH!!";
+use lib "!!RT_ETC_PATH!!";
+
+
+#This drags in RT's config.pm
+use config;
+use Carp;
+
+use HTML::Mason::FakeApache;
+use CGI;
+
+# {{{ Set up CGI environment and grab CGI params:
+
+my $r=new HTML::Mason::FakeApache;
+
+$|=1; # set output to non-buffered.
+
+my %cgi;
+CGI::ReadParse(\%cgi); # %cgi is now a tied hash containing our params.
+
+my $q=$cgi{CGI}; # $q now contains the object tied to %cgi.
+# }}}
+
+# {{{ require what we need
+{
+ package HTML::Mason::Commands;
+
+ use vars qw(%session);
+
+ use RT::Ticket;
+ use RT::Tickets;
+ use RT::Transaction;
+ use RT::Transactions;
+ use RT::User;
+ use RT::Users;
+ use RT::CurrentUser;
+ use RT::Template;
+ use RT::Templates;
+ use RT::Queue;
+ use RT::Queues;
+ use RT::ScripAction;
+ use RT::ScripActions;
+ use RT::ScripCondition;
+ use RT::ScripConditions;
+ use RT::Scrip;
+ use RT::Scrips;
+ use RT::Group;
+ use RT::Groups;
+ use RT::Keyword;
+ use RT::Keywords;
+ use RT::ObjectKeyword;
+ use RT::ObjectKeywords;
+ use RT::KeywordSelect;
+ use RT::KeywordSelects;
+ use RT::GroupMember;
+ use RT::GroupMembers;
+ use RT::Watcher;
+ use RT::Watchers;
+ use RT::Handle;
+ use RT::Interface::Web;
+ use MIME::Entity;
+ use CGI::Cookie;
+ use Date::Parse;
+ use HTML::Entities;
+
+
+ use Apache::Session::File;
+
+
+}
+# }}}
+
+# {{{ RT Database setup
+ $RT::Handle = new RT::Handle;
+
+ $RT::Handle->Connect;
+
+ use RT::CurrentUser;
+
+ #RT's system user is a genuine database user. its id lives here
+ $RT::SystemUser = new RT::CurrentUser();
+ $RT::SystemUser->LoadByName('RT_System');
+
+ #RT's "nobody user" is a genuine database user. its ID lives here.
+ $RT::Nobody = new RT::CurrentUser();
+ $RT::Nobody->LoadByName('Nobody');
+
+
+# }}}
+
+
+
+
+# {{{ Deal with cookies
+
+my %cookies = fetch CGI::Cookie();
+eval {
+ tie %HTML::Mason::Commands::session, 'Apache::Session::File',
+ ( $cookies{'AF_SID'} ? $cookies{'AF_SID'}->value() : undef );
+};
+
+if ( $@ ) {
+ # If the session is invalid, create a new session.
+ if ( $@ =~ m#^Object does not exist in the data store# ) {
+ tie %HTML::Mason::Commands::session, 'Apache::Session::File', undef;
+ undef $cookies{'AF_SID'};
+ }
+}
+
+if ( !$cookies{'AF_SID'} ) {
+ my $cookie = new CGI::Cookie(
+ -name=>'AF_SID',
+ -value=>$HTML::Mason::Commands::session{_session_id},
+ -path => '/');
+ print 'Set-Cookie: '. $cookie."\r\n";
+}
+
+# }}}
+
+my $path=$ENV{PATH_INFO} || "/"; $path=~s/\'/\\\'/g;
+
+my $type=`/usr/bin/file '$RT::MasonComponentRoot/$path'`;
+
+# {{{ if it's a text file, handle it with mason.
+if($type=~/text|directory/) {
+ my ($out, %mason_params);
+ my $parser = RT::Interface::Web::NewParser(allow_globals=>[qw($r)]);
+ $mason_params{parser}=$parser;
+ $r->content_type('text/html');
+ # (get cookies line) ...
+ $r->access_hash('headers_in','Cookie',$ENV{HTTP_COOKIE});
+ $r->{'args@'}=[];
+ $mason_params{out_method}=\$out;
+
+ my $interp = RT::Interface::Web::NewInterp(%mason_params);
+
+ $interp->set_global(r=>$r);
+ $interp->exec($path,%cgi);
+ $r->send_http_header();
+ print $out;
+}
+# }}}
+
+# {{{ if it's not a text file, just stream it out.
+
+else { # file is binary, damn it
+ my $mime_type;
+ if ( $mime_type=
+ eval{ use MIME::Types;
+ my($type,$encoding)=MIME::Types::by_suffix($path);
+ $type; }) {
+ print $q->header($mime_type);
+ $path=~s/[\|\>\<\&]//g;
+ open F,"$RT::MasonComponentRoot/$path" or
+ die "couldn't open $path -- $!";
+ print while <F>;
+ close F;
+ } else {
+ die "couldn't resolve type of non-text file (!@; $type) -- install Mime::Types\n";
+ }
+ }
+
+# }}}
+
+untie %HTML::Mason::Commands::session;