package WebGUI::Asset::Wobject::HttpProxy; #------------------------------------------------------------------- # WebGUI is Copyright 2001-2006 Plain Black Corporation. #------------------------------------------------------------------- # Please read the legal notices (docs/legal.txt) and the license # (docs/license.txt) that came with this distribution before using # this software. #------------------------------------------------------------------- # http://www.plainblack.com info@plainblack.com #------------------------------------------------------------------- use strict; use URI; use LWP; use HTTP::Cookies; use HTTP::Request::Common; use HTML::Entities; use WebGUI::International; use WebGUI::Storage; use WebGUI::Asset::Wobject; use WebGUI::Asset::Wobject::HttpProxy::Parse; use WebGUI::Cache; our @ISA = qw(WebGUI::Asset::Wobject); #------------------------------------------------------------------- sub definition { my $class = shift; my $session = shift; my $definition = shift; my $i18n = WebGUI::International->new($session,"Asset_HttpProxy"); push(@{$definition}, { assetName=>$i18n->get('assetName'), uiLevel => 5, icon=>'httpProxy.gif', tableName=>'HttpProxy', className=>'WebGUI::Asset::Wobject::HttpProxy', properties=>{ templateId =>{ fieldType=>"template", defaultValue=>'PBtmpl0000000000000033' }, proxiedUrl=>{ fieldType=>"url", defaultValue=>'http://' }, timeout=>{ fieldType=>"selectBox", defaultValue=>30 }, removeStyle=>{ fieldType=>"yesNo", defaultValue=>1 }, cacheTimeout=>{ fieldType=>"interval", defaultValue=>0 }, filterHtml=>{ fieldType=>"filterContent", defaultValue=>"javascript" }, followExternal=>{ fieldType=>"yesNo", defaultValue=>1 }, rewriteUrls=>{ fieldType=>"yesNo", defaultValue=>1 }, followRedirect=>{ fieldType=>"yesNo", defaultValue=>0 }, searchFor=>{ fieldType=>"text", defaultValue=>undef }, stopAt=>{ fieldType=>"text", defaultValue=>undef }, cookieJarStorageId=>{ noFormPost=>1, fieldType=>"hidden", defaultValue=>undef } } }); return $class->SUPER::definition($session, $definition); } #------------------------------------------------------------------- sub getCookieJar { my $self = shift; my $storage; unless ($self->get("cookieJarStorageId")) { $storage = WebGUI::Storage->create($self->session); $self->update({cookieJarStorageId=>$storage->getId}); } else { $storage = WebGUI::Storage->get($self->session,$self->get("cookieJarStorageId")); } return $storage; } #------------------------------------------------------------------- sub getEditForm { my $self = shift; my $i18n = WebGUI::International->new($self->session,"Asset_HttpProxy"); my $tabform = $self->SUPER::getEditForm(); $tabform->getTab("display")->template( -value=>$self->getValue('templateId'), -label=>$i18n->get('http proxy template title'), -hoverHelp=>$i18n->get('http proxy template title description'), -namespace=>"HttpProxy" ); my %hash; tie %hash, 'Tie::IxHash'; %hash=(5=>5,10=>10,20=>20,30=>30,60=>60); $tabform->getTab("properties")->url( -name=>"proxiedUrl", -label=>$i18n->get(1), -hoverHelp=>$i18n->get('1 description'), -value=>$self->getValue("proxiedUrl") ); $tabform->getTab("security")->yesNo( -name=>"followExternal", -label=>$i18n->get(5), -hoverHelp=>$i18n->get('5 description'), -value=>$self->getValue("followExternal") ); $tabform->getTab("security")->yesNo( -name=>"followRedirect", -label=>$i18n->get(8), -hoverHelp=>$i18n->get('8 description'), -value=>$self->getValue("followRedirect") ); $tabform->getTab("properties")->yesNo( -name=>"rewriteUrls", -label=>$i18n->get(12), -hoverHelp=>$i18n->get('12 description'), -value=>$self->getValue("rewriteUrls") ); $tabform->getTab("display")->interval( -name=>"cacheTimeout", -label=>$i18n->get('cache timeout'), -hoverHelp=>$i18n->get('cache timeout description'), -uiLevel => 8, -value=>$self->getValue("cacheTimeout") ); $tabform->getTab("display")->yesNo( -name=>"removeStyle", -label=>$i18n->get(6), -hoverHelp=>$i18n->get('6 description'), -value=>$self->getValue("removeStyle") ); $tabform->getTab("display")->filterContent( -name=>"filterHtml", -value=>$self->getValue("filterHtml") ); $tabform->getTab("properties")->selectBox( -name=>"timeout", -options=>\%hash, -label=>$i18n->get(4), -hoverHelp=>$i18n->get('4 description'), -value=>[$self->getValue("timeout")] ); $tabform->getTab("display")->text( -name=>"searchFor", -label=>$i18n->get(13), -hoverHelp=>$i18n->get('13 description'), -value=>$self->getValue("searchFor") ); $tabform->getTab("display")->text( -name=>"stopAt", -label=>$i18n->get(14), -hoverHelp=>$i18n->get('14 description'), -value=>$self->getValue("stopAt") ); return $tabform; } #------------------------------------------------------------------- =head2 prepareView ( ) See WebGUI::Asset::prepareView() for details. =cut sub prepareView { my $self = shift; $self->SUPER::prepareView(); my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId")); $template->prepare; $self->{_viewTemplate} = $template; } #------------------------------------------------------------------- sub purge { my $self = shift; $self->getCookieJar->delete; $self->SUPER::purge; } #------------------------------------------------------------------- =head2 purgeCache () See WebGUI::Asset::purgeCache() for details. =cut sub purgeCache { my $self = shift; WebGUI::Cache->new($self->session,$self->get("proxiedUrl"),"URL")->delete; WebGUI::Cache->new($self->session,$self->get("proxiedUrl"),"HEADER")->delete; $self->SUPER::purgeCache; } #------------------------------------------------------------------- sub view { my $self = shift; my $cookiebox = $self->session->url->escape($self->session->var->get("sessionId")); $cookiebox =~ s/[^A-Za-z0-9\-\.\_]//g; #removes all funky characters $cookiebox .= '.cookie'; my $jar = HTTP::Cookies->new(File => $self->getCookieJar->getPath($cookiebox), AutoSave => 1, Ignore_Discard => 1); my (%var, %formdata, @formUpload, $redirect, $response, $header, $userAgent, $proxiedUrl, $request); if($self->session->form->process("func")!~/editSave/i) { $proxiedUrl = $self->session->form->process("FormAction") || $self->session->form->process("proxiedUrl") || $self->get("proxiedUrl") ; } else { $proxiedUrl = $self->get("proxiedUrl"); $self->session->env->get("REQUEST_METHOD")='GET'; } $redirect=0; return $self->processTemplate({},$self->get("templateId")) unless ($proxiedUrl ne ""); my $cachedContent = WebGUI::Cache->new($self->session,$proxiedUrl,"URL"); my $cachedHeader = WebGUI::Cache->new($self->session,$proxiedUrl,"HEADER"); $var{header} = $cachedHeader->get; $var{content} = $cachedContent->get; unless ($var{content} && $self->session->env->get("REQUEST_METHOD")=~/GET/i) { $redirect=0; until($redirect == 5) { # We follow max 5 redirects to prevent bouncing/flapping $userAgent = new LWP::UserAgent; $userAgent->agent($self->session->env->get("HTTP_USER_AGENT")); $userAgent->timeout($self->get("timeout")); $userAgent->env_proxy; $proxiedUrl = URI->new($proxiedUrl); #my $allowed_url = URI->new($self->get('proxiedUrl'))->abs;; #if ($self->get("followExternal")==0 && $proxiedUrl !~ /\Q$allowed_url/i) { if ($self->get("followExternal")==0 && (URI->new($self->get('proxiedUrl'))->host) ne (URI->new($proxiedUrl)->host) ) { $var{header} = "text/html"; return "
GET status line: ".$response->status_line.""; } unless ($self->get("cacheTimeout") <= 10) { $cachedContent->set($var{content},$self->get("cacheTimeout")); $cachedHeader->set($var{header},$self->get("cacheTimeout")); } } if($var{header} ne "text/html") { $self->session->http->setMimeType($var{header}); return $var{content}; } else { return $self->processTemplate(\%var,undef,$self->{_viewTemplate}); } } #------------------------------------------------------------------- sub www_view { my $self = shift; return $self->session->privilege->noAccess() unless $self->canView; my $output = $self->view; # this is s a stop gap. we need to do something here that deals with the real www_view and caching, etc. if ($self->session->http->getMimeType() ne "text/html") { return $output; } else { return $self->processStyle($output); } } 1;