From 3ef62a0570055da710328937e7f65dbb2c027c62 Mon Sep 17 00:00:00 2001 From: ivan Date: Mon, 12 Aug 2002 06:17:09 +0000 Subject: import rt 2.0.14 --- rt/bin/mason_handler.scgi | 193 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100755 rt/bin/mason_handler.scgi (limited to 'rt/bin/mason_handler.scgi') 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 ; + close F; + } else { + die "couldn't resolve type of non-text file (!@; $type) -- install Mime::Types\n"; + } + } + +# }}} + +untie %HTML::Mason::Commands::session; -- cgit v1.1