###################################################################### # # EPrints 404 Error Hander # ###################################################################### # # This file is part of GNU EPrints 2. # # Copyright (c) 2000-2004 University of Southampton, UK. SO17 1BJ. # # EPrints 2 is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # EPrints 2 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. # # You should have received a copy of the GNU General Public License # along with EPrints 2; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # ###################################################################### #cjg Not fully finnished. Should detect missing items. use EPrints; use strict; my $session = new EPrints::Session(); exit( 0 ) unless( defined $session ); my $url = $ENV{REDIRECT_URL}; my $r = $session->{ request }; my $c = $r->connection; # Has 404 message been suppressed? (don't forget to reset it for this connection) my $show = $c->notes->get( "show_404" ); $c->notes->set( show_404 => undef ); if( defined($show) and !$show ) { $session->terminate(); exit( 0 ); } my $newurl; my $fn = $session->get_repository->get_conf( "catch404" ); if( defined $fn ) { $newurl = &{$fn}( $session, $url ); } if( defined $newurl ) { $session->redirect( $newurl ); } elsif( $url =~ m#^/view/# ) { &noview_404( $session ); } else { &plain_404( $session ); } $session->terminate(); ## Try and work out if the user is trying to access a deleted document #my $url = $ENV{REDIRECT_URL}; # #my $was_deleted = 0; # ## Look for digits in the path #if( $url =~ m#/(\d+)/(\d\d)/(\d\d)/(\d\d)/# ) #{ # # There's a match, looks like we have an ID # my $guessed_id = $1.$2.$3.$4; # # # Was the eprint deleted? # #cjg! # #my $deletion_record = new EPrints::Deletion( $session, $guessed_id ); # # if( defined $deletion_record ) # { # # The user seems to be trying to get to a deleted eprint. # print $session->{render}->render_deleted_eprint( $deletion_record ); # } # else # { # # See if the eprint exists. # my $eprint = new EPrints::DataObj::EPrint( # $session, # $guessed_id,; # EPrints::Database::table_name( "archive" ) ); # # if( defined $eprint ) # { # # Seems to be a slightly malformed access to an existing eprint. # existing_record( $session, $eprint ); # } # else # { # # Not a deleted or existing eprint: a plain old Document Not Found # plain_404( $session ); # } # } #} #else #{ # # No match, can't find any ID. Just a plain old 404. # plain_404( $session ); #} # #$session->terminate(); # # # ####################################################################### ## ## existing_record( $session, $eprint ) ## ## Render an appropriate erro saying that the user seems to be trying ## to get to a particular eprint, but may have just entered the URL ## incorrectly. ## ####################################################################### # #sub existing_record #{ # my( $session, $eprint ) = @_; # # print $session->{render}->start_html( # $session->{lang}->phrase( "cgi/handle_404:doc_not_found" ) ); # # print "<P>"; # print $session->{lang}->phrase( "cgi/handle_404:file_not_found" ); # print "<CODE>$url</CODE></P>\n"; # print "<P>"; # print $session->{lang}->phrase( "cgi/handle_404:looking_for" ); # print "</P>\n"; # print "<P ALIGN=CENTER>"; # print $session->{render}->render_eprint_citation( $eprint, 1, 1 ); # print "</P>\n"; # # print $session->{render}->end_html(); #} ###################################################################### # # plain_404( $session ) # # Render a standard Document Not Found error message. # ###################################################################### sub plain_404 { my( $session ) = @_; $session->build_page( $session->html_phrase( "cgi/handle_http_error:404_title" ), $session->html_phrase( "cgi/handle_http_error:404_blurb", url => $session->make_text( $ENV{REDIRECT_URL} ) ), "plain_404" ); $session->send_page(); } sub noview_404 { my( $session ) = @_; my $error = "The browse views section is missing. The site admin needs to run generate_views. This should be automated with cron. See the documentation for more details."; $session->build_page( $session->html_phrase( "cgi/handle_http_error:404_title" ), $session->make_text( $error ), "noview_404" ); $session->get_repository->log( $error ); $session->send_page(); }