[system] / branches / rel-2-3-dev / webwork-modperl / lib / WeBWorK / ContentGenerator / Instructor / FileXfer.pm Repository:
ViewVC logotype

View of /branches/rel-2-3-dev/webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor/FileXfer.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4396 - (download) (as text) (annotate)
Thu Aug 24 21:07:52 2006 UTC (6 years, 9 months ago)
File size: 14532 byte(s)
This commit was manufactured by cvs2svn to create branch 'rel-2-3-dev'.

    1 ################################################################################
    2 # WeBWorK Online Homework Delivery System
    3 # Copyright © 2000-2006 The WeBWorK Project, http://openwebwork.sf.net/
    4 # $CVSHeader: webwork2/lib/WeBWorK/ContentGenerator/Instructor/FileXfer.pm,v 1.12 2006/07/08 14:07:34 gage Exp $
    5 #
    6 # This program is free software; you can redistribute it and/or modify it under
    7 # the terms of either: (a) the GNU General Public License as published by the
    8 # Free Software Foundation; either version 2, or (at your option) any later
    9 # version, or (b) the "Artistic License" which comes with this package.
   10 #
   11 # This program is distributed in the hope that it will be useful, but WITHOUT
   12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
   13 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
   14 # Artistic License for more details.
   15 ################################################################################
   16 
   17 package WeBWorK::ContentGenerator::Instructor::FileXfer;
   18 use base qw(WeBWorK::ContentGenerator::Instructor);
   19 
   20 =head1 NAME
   21 
   22 WeBWorK::ContentGenerator::Instructor::FileXfer - transfer course files from/to
   23 client
   24 
   25 =cut
   26 
   27 use strict;
   28 use warnings;
   29 use CGI qw(-nosticky );
   30 
   31 sub pre_header_initialize {
   32   my ($self) = @_;
   33   my $r = $self->r;
   34   my $ce = $r->ce;
   35   my $authz = $r->authz;
   36 
   37   my $userID = $r->param("user");
   38 
   39   my ($type, $action) = ("", "");
   40   if (defined $r->param("deleteDef"))           { $type = "def";         $action = "delete";   }
   41   if (defined $r->param("downloadDef"))         { $type = "def";         $action = "download"; }
   42   if (defined $r->param("uploadDef"))           { $type = "def";         $action = "upload";   }
   43   if (defined $r->param("deleteClasslist"))     { $type = "classlist";   $action = "delete";   }
   44   if (defined $r->param("downloadClasslist"))   { $type = "classlist";   $action = "download"; }
   45   if (defined $r->param("uploadClasslist"))     { $type = "classlist";   $action = "upload";   }
   46   if (defined $r->param("deleteScoringFile"))   { $type = "scoringFile"; $action = "delete";   }
   47   if (defined $r->param("downloadScoringFile")) { $type = "scoringFile"; $action = "download"; }
   48   if (defined $r->param("uploadScoringFile"))   { $type = "scoringFile"; $action = "upload";   }
   49   if (defined $r->param("deleteTemplateFile"))  { $type = "templateFile"; $action = "delete";   }
   50   if (defined $r->param("downloadTemplateFile")){ $type = "templateFile"; $action = "download"; }
   51   if (defined $r->param("uploadTemplateFile"))  { $type = "templateFile"; $action = "upload";   }
   52 
   53 
   54   # make sure we have permission to do what we want to do
   55   if ($type eq "def") {
   56     unless ($authz->hasPermissions($userID, "modify_set_def_files")) {
   57       $self->addbadmessage(CGI::p("You are not authorized to modify the list of set definition files."));
   58       return;
   59     }
   60   } elsif ($type eq "classlist") {
   61     unless ($authz->hasPermissions($userID, "modify_classlist_files")) {
   62       $self->addbadmessage(CGI::p("You are not authorized to modify the list of classlist files."));
   63       return;
   64     }
   65   } elsif ($type eq "scoringFile") {
   66     unless ($authz->hasPermissions($userID, "modify_scoring_files")) {
   67       $self->addbadmessage(CGI::p("You are not authorized to modify the list of scoring files."));
   68       return;
   69     }
   70   } elsif ($type eq "templateFile") {
   71     unless ($authz->hasPermissions($userID, "modify_problem_template_files")) {
   72       $self->addbadmessage(CGI::p("You are not authorized to modify the list of problem template files."));
   73       return;
   74     }
   75   }
   76 
   77   # call handler for the action we want to perform
   78   if ($action eq "delete") {
   79     $self->handleDelete($type);
   80   } elsif ($action eq "download") {
   81     $self->handleDownload($type);
   82   } elsif ($action eq "upload") {
   83     $self->handleUpload($type);
   84   }
   85 }
   86 
   87 sub handleDelete {
   88   my ($self, $type) = @_;
   89   my $r = $self->r;
   90   my $ce = $r->ce;
   91 
   92   my (@fileList, $selectParam, $dir);
   93   if ($type eq "classlist") {
   94     @fileList = $self->getCSVList;
   95     $selectParam = "classlist";
   96     $dir = $ce->{courseDirs}->{templates};
   97   } elsif ($type eq "def") {
   98     @fileList = $self->getDefList;
   99     $selectParam = "def";
  100     $dir = $ce->{courseDirs}->{templates};
  101   } elsif ($type eq "scoringFile") {
  102     @fileList = $self->getScoringFileList;
  103     $selectParam = "scoringFile";
  104     $dir = $ce->{courseDirs}->{scoring};
  105   } elsif ($type eq "templateFile") {
  106       my $templateSubDir    = $r->param("templateSubDir");
  107     @fileList = $self->getTemplateFileList($templateSubDir);
  108     $selectParam = "templateFile";
  109     $dir = $ce->{courseDirs}->{templates}."/$templateSubDir";
  110   } else {
  111     die "handleDelete() doesn't know what to do with file type $type!";
  112   }
  113 
  114   # get file name
  115   my $fileToDelete = $r->param($selectParam);
  116   unless ($fileToDelete) {
  117     $self->addbadmessage(CGI::p("No file selected for deletion."));
  118     return;
  119   }
  120 
  121   # FIXME: FOR THE LOVE OF GOD, ADD SECURITY CHECKS!!!!!!
  122   # (actually I think it's not such a big deal, since we're checking the
  123   # tainted input against a finite set of files that we know are okay to
  124   # delete)
  125 
  126   # make sure it's in the file list
  127   unless (grep { $_ eq $fileToDelete } @fileList) {
  128     $self->addbadmessage(CGI::p("File \"$fileToDelete\" not found in file list."));
  129     return;
  130   }
  131 
  132   # (at this point we know the filename isn't dangerous)
  133 
  134   # delete it
  135   unlink "$dir/$fileToDelete";
  136   $self->addgoodmessage("$dir/$fileToDelete has been deleted.");
  137 }
  138 
  139 sub handleDownload {
  140   my ($self, $type) = @_;
  141   my $r = $self->r;
  142   my $ce = $r->ce;
  143 
  144   my (@fileList, $selectParam, $dir);
  145   if ($type eq "classlist") {
  146     @fileList = $self->getCSVList;
  147     $selectParam = "classlist";
  148     $dir = $ce->{courseDirs}->{templates};
  149   } elsif ($type eq "def") {
  150     @fileList = $self->getDefList;
  151     $selectParam = "def";
  152     $dir = $ce->{courseDirs}->{templates};
  153   } elsif ($type eq "scoringFile") {
  154     @fileList = $self->getScoringFileList;
  155     $selectParam = "scoringFile";
  156     $dir = $ce->{courseDirs}->{scoring};
  157   } elsif ($type eq "templateFile") {
  158       my $templateSubDir    = $r->param("templateSubDir");
  159     @fileList = $self->getTemplateFileList($templateSubDir);
  160     $selectParam = "templateFile";
  161     $dir = $ce->{courseDirs}->{templates};
  162     $dir = $ce->{courseDirs}->{templates}."/$templateSubDir";
  163   } else {
  164     die "handleDownload() doesn't know what to do with file type $type!";
  165   }
  166 
  167   # get file name
  168   my $fileToDownload = $r->param($selectParam);
  169   unless ($fileToDownload) {
  170     $self->addbadmessage(CGI::p("No file selected for download."));
  171     return;
  172   }
  173 
  174   # make sure it's in the file list
  175   unless (grep { $_ eq $fileToDownload } @fileList) {
  176     $self->addbadmessage(CGI::p("File \"$fileToDownload\" not found in file list."));
  177     return;
  178   }
  179 
  180   # set the file to sent:
  181   $self->reply_with_file("text/plain", "$dir/$fileToDownload", $fileToDownload, 0);
  182 }
  183 
  184 sub handleUpload {
  185   my ($self, $type) = @_;
  186   my $r = $self->r;
  187   my $ce = $r->ce;
  188 
  189   my (@fileList, $uploadParam, $uploadNameParam, $ext, $destDir);
  190   if ($type eq "classlist") {
  191     @fileList = $self->getCSVList;
  192     $uploadParam = "newClasslist";
  193     $uploadNameParam = "newClasslistName";
  194     $ext = ".lst";
  195     $destDir = $ce->{courseDirs}->{templates};
  196   } elsif ($type eq "def") {
  197     @fileList = $self->getDefList;
  198     $uploadParam = "newDef";
  199     $uploadNameParam = "newDefName";
  200     $ext = ".def";
  201     $destDir = $ce->{courseDirs}->{templates};
  202   } elsif ($type eq "scoringFile") {
  203     @fileList = $self->getScoringFileList;
  204     $uploadParam = "newScoringFile";
  205     $uploadNameParam = "newScoringFileName";
  206     $ext = ".csv";
  207     $destDir = $ce->{courseDirs}->{scoring};
  208   } elsif ($type eq "templateFile") {
  209       my $templateSubDir    = $r->param("templateSubDir");
  210     @fileList = $self->getTemplateFileList($templateSubDir);
  211     $uploadParam = "newTemplateFile";
  212     $uploadNameParam = "newTemplateFileName";
  213     $ext = ".pg";
  214     $destDir = $ce->{courseDirs}->{templates}."/$templateSubDir";
  215   }
  216 
  217   # get upload ID and hash
  218   my $uploadIDHash = $r->param($uploadParam);
  219   unless ($uploadIDHash) {
  220     $self->addbadmessage(CGI::p("No file selected for upload."));
  221     return;
  222   }
  223   my ($id, $hash) = split /\s+/, $uploadIDHash;
  224 
  225   #warn "upload param contains $uploadIDHash\n";
  226   #warn "upload ID is $id\n";
  227   #warn "upload hash is $hash\n";
  228 
  229   # retrieve upload from upload cache
  230   my $upload = WeBWorK::Upload->retrieve($id, $hash,
  231     dir => $ce->{webworkDirs}->{uploadCache}
  232   );
  233 
  234   # determine what to call the resulting file
  235   my $fileName = $r->param($uploadNameParam) || $upload->filename;
  236 
  237   # tack on the file extension if it's not already there
  238   $fileName .= $ext unless $fileName =~ m/$ext$/;
  239 
  240   # does the file name have the path separator in it?
  241   die "illegal character in upload name: \"/\". (no hacking!)" if $fileName =~ m|/|;
  242 
  243   # does a file already exist with that name?
  244   if (grep { $_ eq $fileName } @fileList) {
  245     $self->addbadmessage(CGI::p("A file named \"$fileName\" exists. Either remove it, or chose a different name for your upload."));
  246     return;
  247   }
  248 
  249   $upload->disposeTo("$destDir/$fileName");
  250   $self->addgoodmessage("$destDir/$fileName has been uploaded.");
  251 }
  252 
  253 sub body {
  254   my ($self) = @_;
  255   my $r = $self->r;
  256   my $authz = $r->authz;
  257 
  258   my $userID = $r->param("user");
  259 
  260   return CGI::div({class=>"ResultsWithError"}, "You are not authorized to access the Instructor tools.")
  261     unless $authz->hasPermissions($r->param("user"), "access_instructor_tools");
  262 
  263   # if we needed to get either of these lists earlier, use the cached copy
  264   # otherwise, get them from the filesystem
  265   #my $classlistsRef = $self->{classlists} || [ $self->getCSVList ];
  266   #my $setDefsRef    = $self->{setDefs}    || [ $self->getDefList ];
  267 
  268   my $templateSubDir    = $r->param("templateSubDir");
  269   $templateSubDir = "" if $templateSubDir and $templateSubDir eq ' Top'; #deal with special value for top directory
  270   my $classlistsRef     = [ $self->getCSVList         ];
  271   my $setDefsRef        = [ $self->getDefList         ];
  272   my $scoringFileRef    = [ $self->getScoringFileList ];
  273   my $templateDirRef    = [ $self->getTemplateDirList ];
  274   my $templateFileRef   = [ $self->getTemplateFileList($templateSubDir) ];
  275 
  276 
  277 
  278   print CGI::p(<<EOT);
  279 Use the tools below to modify course files. Set definition files and classlist
  280 files are only used for importing and exporting set and user data.
  281 EOT
  282 
  283   print CGI::table({-border=>1, -nowrap=>1},
  284     CGI::Tr({-valign=>"top"},
  285       $authz->hasPermissions($userID, "modify_set_def_files") ?
  286       CGI::td({},
  287         CGI::p("Set Definition Files"),
  288         CGI::startform("POST", $r->uri, "multipart/form-data"),
  289         $self->hidden_authen_fields,
  290         CGI::scrolling_list(
  291           -name => "def",
  292           -values => $setDefsRef,
  293           -size => 8,
  294           -multiple => 0,
  295         ), CGI::br(),
  296         CGI::submit("deleteDef", "Delete"),
  297         CGI::font({-color=>"red"}, CGI::em("Delete is not undoable!")),
  298         CGI::br(),
  299         CGI::submit("downloadDef", "Download"),
  300         CGI::br(),
  301         CGI::p("Upload New Set Definition File:"),
  302         CGI::filefield(
  303           -name => "newDef",
  304           -size => 30,
  305         ), CGI::br(),
  306         "Use name:", CGI::textfield("newDefName", "", 30), CGI::br(),
  307         CGI::submit("uploadDef", "Upload Set Definition File"),
  308         CGI::endform(),
  309       ) : CGI::td({}, CGI::div({class=>"ResultsWithError"}, CGI::p("You are not authorized to modify the list of set definition files."))),
  310       $authz->hasPermissions($userID, "modify_classlist_files") ?
  311         CGI::td({},
  312           CGI::p("Classlist Files"),
  313           CGI::startform("POST", $r->uri, "multipart/form-data"),
  314           $self->hidden_authen_fields,
  315           CGI::scrolling_list(
  316             -name => "classlist",
  317             -values => $classlistsRef,
  318             -size => 8,
  319             -multiple => 0,
  320           ), CGI::br(),
  321           CGI::submit("deleteClasslist", "Delete"),
  322           CGI::font({-color=>"red"}, CGI::em("Delete is not undoable!")),
  323           CGI::br(),
  324           CGI::submit("downloadClasslist", "Download"), CGI::br(),
  325           CGI::p("Upload New Classlist File:"),
  326           CGI::filefield(
  327             -name => "newClasslist",
  328             -size => 30,
  329           ), CGI::br(),
  330           "Use name:", CGI::textfield("newClasslistName", "", 30), CGI::br(),
  331           CGI::submit("uploadClasslist", "Upload Classlist File"),
  332           CGI::endform(),
  333         ) : CGI::td({}, CGI::div({class=>"ResultsWithError"}, CGI::p("You are not authorized to modify the list of classlist files."))),
  334     ),
  335     CGI::Tr({-valign=>"top"},
  336       $authz->hasPermissions($userID, "modify_scoring_files") ?
  337         CGI::td({},
  338           CGI::p("Scoring Files"),
  339           CGI::startform("POST", $r->uri, "multipart/form-data"),
  340           $self->hidden_authen_fields,
  341           CGI::scrolling_list(
  342             -name => "scoringFile",
  343             -values => $scoringFileRef,
  344             -size => 8,
  345             -multiple => 0,
  346           ), CGI::br(),
  347           CGI::submit("deleteScoringFile", "Delete"),
  348           CGI::font({-color=>"red"}, CGI::em("Delete is not undoable!")),
  349           CGI::br(),
  350           CGI::submit("downloadScoringFile", "Download"),
  351           CGI::br(),
  352           CGI::p("Upload New Scoring File:"),
  353           CGI::filefield(
  354             -name => "newScoringFile",
  355             -size => 30,
  356           ), CGI::br(),
  357           "Use name:", CGI::textfield("newScoringFileName", "", 30), CGI::br(),
  358           CGI::submit("uploadScoringFile", "Upload Scoring File"),
  359           CGI::endform(),
  360         ) : CGI::td({}, CGI::div({class=>"ResultsWithError"}, CGI::p("You are not authorized to modify the list of scoring files."))),
  361        $authz->hasPermissions($userID, "modify_problem_template_files") ?
  362         CGI::td({},
  363           CGI::p("Problem Template Files"),
  364           CGI::startform("POST", $r->uri, "multipart/form-data"),
  365           $self->hidden_authen_fields,
  366           CGI::popup_menu(
  367             -name => "templateSubDir",
  368             -values => $templateDirRef,
  369             -default => ( defined($templateSubDir) )?  $templateSubDir:' Top',
  370           ),CGI::br(),
  371           CGI::submit('UpdateList','Update List'),CGI::br(),
  372           CGI::scrolling_list(
  373             -name => "templateFile",
  374             -values => $templateFileRef,
  375             -size => 8,
  376             -multiple => 0,
  377           ), CGI::br(),
  378           CGI::submit("deleteTemplateFile", "Delete"),
  379           CGI::font({-color=>"red"}, CGI::em("Delete is not undoable!")),
  380           CGI::br(),
  381           CGI::submit("downloadTemplateFile", "Download"),
  382           CGI::br(),
  383           CGI::p("Upload New Problem Template File:"),
  384           CGI::filefield(
  385             -name => "newTemplateFile",
  386             -size => 30,
  387           ), CGI::br(),
  388           "Use name:", CGI::textfield("newTemplateFileName", "", 30), CGI::br(),
  389           CGI::submit("uploadTemplateFile", "Upload Problem Template File"),
  390           CGI::endform(),
  391         ) : CGI::td({}, CGI::div({class=>"ResultsWithError"}, CGI::p("You are not authorized to modify the list of problem template files."))),
  392 
  393     ),
  394 
  395   );
  396 
  397   return "";
  398 }
  399 
  400 1;
  401 
  402 __END__
  403 
  404 =head1 AUTHOR
  405 
  406 Written by Sam Hathaway, sh002i (at) math.rochester.edu
  407 
  408 =cut

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9