X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=rt%2Fshare%2Fhtml%2FSearch%2FElements%2FResultsRSSView;h=83bcd416c7b0546c38dd49c8f1ba594da59dfb8d;hp=a453a8603d78cfc0baa6751150bac381d6d2a29d;hb=de9d037528895f7151a9aead6724ce2df95f9586;hpb=ed1f84b4e8f626245995ecda5afcf83092c153b2 diff --git a/rt/share/html/Search/Elements/ResultsRSSView b/rt/share/html/Search/Elements/ResultsRSSView index a453a8603..83bcd416c 100644 --- a/rt/share/html/Search/Elements/ResultsRSSView +++ b/rt/share/html/Search/Elements/ResultsRSSView @@ -2,7 +2,7 @@ %# %# COPYRIGHT: %# -%# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC +%# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC %# %# %# (Except where explicitly superseded by other copyright notices) @@ -46,42 +46,6 @@ %# %# END BPS TAGGED BLOCK }}} <%INIT> -my $old_current_user; - -if ( $m->request_comp->path =~ RT->Config->Get('WebNoAuthRegex') ) { - my $path = $m->dhandler_arg; - - my $notfound = sub { - my $mesg = shift; - $r->headers_out->{'Status'} = '404 Not Found'; - $RT::Logger->info("Error encountered in rss generation: $mesg"); - $m->clear_and_abort; - }; - - $notfound->("Invalid path: $path") unless $path =~ m!^([^/]+)/([^/]+)/?!; - - my ( $name, $auth ) = ( $1, $2 ); - - # Unescape parts - $name =~ s/\%([0-9a-z]{2})/chr(hex($1))/gei; - - # Decode from bytes to characters - $name = Encode::decode( "UTF-8", $name ); - - my $user = RT::User->new(RT->SystemUser); - $user->Load($name); - $notfound->("Invalid user: $user") unless $user->id; - - $notfound->("Invalid authstring") - unless $user->ValidateAuthString( $auth, - $ARGS{Query} . $ARGS{Order} . $ARGS{OrderBy} ); - - $old_current_user = $session{'CurrentUser'}; - my $cu = RT::CurrentUser->new; - $cu->Load($user); - $session{'CurrentUser'} = $cu; -} - my $Tickets = RT::Tickets->new($session{'CurrentUser'}); $Tickets->FromSQL($ARGS{'Query'}); if ($OrderBy =~ /\|/) { @@ -94,44 +58,60 @@ if ($OrderBy =~ /\|/) { } else { $Tickets->OrderBy(FIELD => $OrderBy, ORDER => $Order); } -$r->content_type('application/rss+xml'); - +$r->content_type('application/rss+xml; charset=utf-8'); +use XML::RSS; +my $rss = XML::RSS->new(version => '1.0'); - # create an RSS 1.0 file (http://purl.org/rss/1.0/) - use XML::RSS; - my $rss = XML::RSS->new(version => '1.0'); - $rss->channel( - title => RT->Config->Get('rtname').": Search " . $ARGS{'Query'}, - link => RT->Config->Get('WebURL'), - description => "", - dc => { - }, - generator => "RT v" . $RT::VERSION, - syn => { - updatePeriod => "hourly", - updateFrequency => "1", - updateBase => "1901-01-01T00:00+00:00", - }, - ); +my $url; +if ( RT->Config->Get('CanonicalizeURLsInFeeds') ) { + $url = RT->Config->Get('WebURL'); +} else { + $url = RT::Interface::Web::GetWebURLFromRequest(); +} - while ( my $Ticket = $Tickets->Next()) { - my $creator_str = $m->scomp('/Elements/ShowUser', User => $Ticket->CreatorObj); - $creator_str =~ s/[\r\n]//g; - $rss->add_item( - title => $Ticket->Subject || loc('No Subject'), - link => RT->Config->Get('WebURL')."Ticket/Display.html?id=".$Ticket->id, - description => $Ticket->Transactions->First->Content, - dc => { creator => $creator_str, - date => $Ticket->CreatedObj->RFC2822, - }, - guid => $Ticket->Queue . '_' . $Ticket->id, - ); - } +my $base_date = RT::Date->new( RT->SystemUser ); +$base_date->SetToNow; +$base_date->SetToMidnight; + +$rss->channel( + title => RT->Config->Get('rtname').": Search " . $ARGS{'Query'}, + link => $url, + description => "", + dc => { }, + generator => "RT v" . $RT::VERSION, + syn => { + updatePeriod => "hourly", + updateFrequency => "1", + updateBase => $base_date->W3CDTF, + }, +); + + +while ( my $Ticket = $Tickets->Next()) { + my $creator_str = $Ticket->CreatorObj->Format; + $creator_str =~ s/[\r\n]//g; + + # Get the plain-text content; it is interpreted as HTML by RSS + # readers, so it must be escaped (and is escaped _again_ when + # inserted into the XML). + my $content = $Ticket->Transactions->First->Content; + $content = $m->interp->apply_escapes( $content, 'h'); + + $rss->add_item( + title => $Ticket->Subject || loc('No Subject'), + link => $url . "Ticket/Display.html?id=".$Ticket->id, + description => $content, + dc => { + creator => $creator_str, + date => $Ticket->CreatedObj->W3CDTF, + }, + guid => $Ticket->Queue . '_' . $Ticket->id, + ); +} $m->out($rss->as_string); -$session{'CurrentUser'} = $old_current_user if $old_current_user; $m->abort(); <%ARGS>