--- trunk/webwork2/lib/Apache/WeBWorK.pm 2002/06/20 16:02:12 393
+++ trunk/webwork2/lib/Apache/WeBWorK.pm 2003/02/26 17:58:16 746
@@ -1,57 +1,71 @@
-# Apache::WeBWorK - The WeBWorK dispatcher module
-# Place something like the following in your Apache configuration to load the
-# WeBWorK module and install it as a handler for the WeBWorK system
-
-# PerlRequire /path/to/webwork/conf/init.pl
-# PerlSetVar webwork_root /path/to/webwork
-#
-# SetHandler perl-script
-# PerlHandler Apache::WeBWorK
-#
-
-# In addition, you will have to edit init.pl in what should be obvious ways.
+################################################################################
+# WeBWorK mod_perl (c) 2000-2002 WeBWorK Project
+# $Id$
+################################################################################
package Apache::WeBWorK;
+=head1 NAME
+
+Apache::WeBWorK - The WeBWorK dispatcher module.
+
+=cut
+
use strict;
+use warnings;
use Apache::Constants qw(:common REDIRECT);
use Apache::Request;
-use Data::UUID;
-use WeBWorK::CourseEnvironment;
use WeBWorK::Authen;
use WeBWorK::Authz;
-use WeBWorK::ContentGenerator::Test;
+use WeBWorK::Constants qw(WEBWORK_HOME);
+use WeBWorK::ContentGenerator::Feedback;
use WeBWorK::ContentGenerator::Login;
-use WeBWorK::ContentGenerator::ProblemSets;
-use WeBWorK::ContentGenerator::ProblemSet;
+use WeBWorK::ContentGenerator::Logout;
+use WeBWorK::ContentGenerator::Hardcopy;
+use WeBWorK::ContentGenerator::Options;
use WeBWorK::ContentGenerator::Problem;
-use WeBWorK::Constants qw(SECRET);
-
-# Yes, this is supposed to be in the global namespace. We're only setting it if
-my $SECRET;
-
-# Sets up the common environment needed for every subsystem and then dispatches
-# the page request to the appropriate content generator.
+use WeBWorK::ContentGenerator::ProblemSet;
+use WeBWorK::ContentGenerator::ProblemSets;
+use WeBWorK::ContentGenerator::Professor;
+use WeBWorK::ContentGenerator::Test;
+use WeBWorK::CourseEnvironment;
-# This function has MANY MANY points of exit (return statements)! woo!
-# call it a quirk of my coding style. I think it makes it easier to read in this case.
+# This module should be installed as a Handler for the location selected for
+# WeBWorK on your webserver. Here is an example of a stanza that can be added
+# to your httpd.conf file to achieve this:
+#
+#
+# PerlFreshRestart On
+#
+# SetHandler perl-script
+# PerlHandler Apache::WeBWorK
+# PerlSetVar webwork_root /path/to/webwork-modperl
+#
+# use lib '/path/to/webwork-modperl/lib';
+# use lib '/path/to/webwork-modperl/pglib';
+#
+#
+#
sub handler() {
- my $r = Apache::Request->new(shift); # have to deal with unpredictable GET or POST data ,and sift through it for the key. So use Apache::Request
-
+ my $r = Apache::Request->new(shift); # have to deal with unpredictable GET or POST data, and sift through it for the key. So use Apache::Request
+
# This stuff is pretty much copied out of the O'Reilly mod_perl book.
# It's for figuring out the basepath. I may change this up if I
# find a better way to do it.
- my $path_info = $r->path_info;
- my $path_translated = $r->lookup_uri($path_info)->filename;
+ my $path_info = $r->path_info || "";
my $current_uri = $r->uri;
my $args = $r->args;
+ $current_uri =~ m/^(.*)$path_info/;
+ my $urlRoot = $1;
+
# If it's a valid WeBWorK URI, it ends in a /. This is assumed
# alllll over the place.
unless (substr($current_uri,-1) eq '/') {
$r->header_out(Location => "$current_uri/" . ($args ? "?$args" : ""));
return REDIRECT;
+ # *** any post data gets lost here -- fix that.
}
# Create the @components array, which contains the path specified in the URL
@@ -60,21 +74,28 @@
my $course = shift @components;
# Try to get the course environment.
- my $course_env = eval {WeBWorK::CourseEnvironment->new($webwork_root, $course);};
+ my $course_env = eval {WeBWorK::CourseEnvironment->new($webwork_root, $urlRoot, $course);};
if ($@) { # If there was an error getting the requested course
# TODO: display an error page. For now, 404 it.
warn $@;
return DECLINED;
}
-
+
+ # If no course was specified, redirect to the URL specified by the constant WEBWORK_HOME
+ # (this is typically just "/".)
+ unless (defined $course) {
+ $r->header_out(Location => $course_env->{webworkURLs}->{home});
+ return REDIRECT;
+ }
+
# Freak out if the requested course doesn't exist. For now, this is just a
# check to see if the course directory exists.
if (!-e $course_env->{webworkDirs}->{courses} . "/$course") {
+ warn "Course directory for $course not found at "
+ . $course_env->{webworkDirs}->{courses} . "/$course" ."\n";
return DECLINED;
}
-
-
### Begin dispatching ###
# WeBWorK::Authen::verify erases the passwd field and sets the key field
@@ -85,22 +106,27 @@
# After we are authenticated, there are some things that need to be
# sorted out, Authorization-wize, before we start dispatching to individual
# content generators.
- my $effectiveUser = $r->param("effectiveUser");
my $user = $r->param("user");
+ my $effectiveUser = $r->param("effectiveUser") || $user;
my $su_authorized = WeBWorK::Authz->new($r, $course_env)->hasPermissions($user, "become_student", $effectiveUser);
- # This hoary statement has the effect of forcing effectiveUser to equal user unless
- # the user is otherwise authorized.
- if (!defined $effectiveUser || !($user ne $effectiveUser && $su_authorized)) {
- $r->param("effectiveUser",$user);
- }
+ $effectiveUser = $user unless $su_authorized;
+ $r->param("effectiveUser", $effectiveUser);
my $arg = shift @components;
if (!defined $arg) { # We want the list of problem sets
return WeBWorK::ContentGenerator::ProblemSets->new($r, $course_env)->go;
+ } elsif ($arg eq "hardcopy") {
+ my $hardcopyArgument = shift @components;
+ $hardcopyArgument = "" unless defined $hardcopyArgument;
+ return WeBWorK::ContentGenerator::Hardcopy->new($r, $course_env)->go($hardcopyArgument);
} elsif ($arg eq "prof") {
- ###
- } elsif ($arg eq "prefs") {
- ###
+ return WeBWorK::ContentGenerator::Professor->new($r, $course_env)->go;
+ } elsif ($arg eq "options") {
+ return WeBWorK::ContentGenerator::Options->new($r, $course_env)->go;
+ } elsif ($arg eq "feedback") {
+ return WeBWorK::ContentGenerator::Feedback->new($r, $course_env)->go;
+ } elsif ($arg eq "logout") {
+ return WeBWorK::ContentGenerator::Logout->new($r, $course_env)->go;
} elsif ($arg eq "test") {
return WeBWorK::ContentGenerator::Test->new($r, $course_env)->go;
} else { # We've got the name of a problem set.
@@ -110,10 +136,7 @@
if (!defined $ps_arg) {
# list the problems in the problem set
return WeBWorK::ContentGenerator::ProblemSet->new($r, $course_env)->go($problem_set);
- } elsif ($ps_arg eq "hardcopy") {
- ###
- }
- else {
+ } else {
# We've got the name of a problem
my $problem = $ps_arg;
return WeBWorK::ContentGenerator::Problem->new($r, $course_env)->go($problem_set, $problem);
@@ -121,7 +144,7 @@
}
}
-
+
# If the dispatcher doesn't know any modules that want to handle
# the current path, it'll claim that the path does not exist by
# declining the request.