Parent Directory
|
Revision Log
There were at least a few potential recipients whose permission leve was not defined. I added an extra check that prevents anyone with a 0 or blank permission level from receiving feedback. The actual level of recipients is defined in a constant at the top of Feedback.pm This addresses issues raised while fixing bug #653
1 ################################################################################ 2 # WeBWorK Online Homework Delivery System 3 # Copyright © 2000-2003 The WeBWorK Project, http://openwebwork.sf.net/ 4 # $CVSHeader: webwork-modperl/lib/WeBWorK/ContentGenerator/Feedback.pm,v 1.22 2004/07/12 00:49:04 jj 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::Feedback; 18 use base qw(WeBWorK::ContentGenerator); 19 20 =head1 NAME 21 22 WeBWorK::ContentGenerator::Feedback - Send mail to professors. 23 24 =cut 25 26 # *** feedback should be exempt from authentication, so that people can send 27 # feedback from the login page! 28 29 use strict; 30 use warnings; 31 use Data::Dumper; 32 use CGI::Pretty qw(); 33 use Mail::Sender; 34 use Text::Wrap qw(wrap); 35 use constant PERMISION_TO_RECEIVE_EMAIL => 5; 36 # request paramaters used 37 # 38 # user 39 # key 40 # module 41 # set (if from ProblemSet or Problem) 42 # problem (if from Problem) 43 # displayMode (if from Problem) 44 # showOldAnswers (if from Problem) 45 # showCorrectAnswers (if from Problem) 46 # showHints (if from Problem) 47 # showSolutions (if from Problem) 48 49 # state data sent 50 # 51 # user object for current user 52 # permission level of current user 53 # current session key 54 # which ContentGenerator module called Feedback? 55 # set object for current set (if from ProblemSet or Problem) 56 # problem object for current problem (if from Problem) 57 # display options (if from Problem) 58 59 sub body { 60 my ($self) = @_; 61 my $r = $self->r; 62 my $ce = $r->ce; 63 my $db = $r->db; 64 65 # get form fields 66 my $key = $r->param("key"); 67 my $userName = $r->param("user"); 68 my $module = $r->param("module"); 69 my $setName = $r->param("set"); 70 my $problemNumber = $r->param("problem"); 71 my $displayMode = $r->param("displayMode"); 72 my $showOldAnswers = $r->param("showOldAnswers"); 73 my $showCorrectAnswers = $r->param("showCorrectAnswers"); 74 my $showHints = $r->param("showHints"); 75 my $showSolutions = $r->param("showSolutions"); 76 my $from = $r->param("from"); 77 my $feedback = $r->param("feedback"); 78 79 my ($user, $set, $problem); 80 $user = $db->getUser($userName) # checked 81 if defined $userName and $userName ne ""; 82 if (defined $user) { 83 $set = $db->getMergedSet($userName, $setName) # checked 84 if defined $setName and $setName ne ""; 85 $problem = $db->getMergedProblem($userName, $setName, $problemNumber) # checked 86 if defined $set and defined $problemNumber && $problemNumber ne ""; 87 } else { 88 $set = $db->getGlobalSet($setName) # checked 89 if defined $setName and $setName ne ""; 90 $problem = $db->getGlobalProblem($setName, $problemNumber) # checked 91 if defined $set and defined $problemNumber && $problemNumber ne ""; 92 } 93 94 # get some network settings 95 my $hostname = $r->hostname(); 96 my $port = $r->get_server_port(); 97 my $remoteIdent = $r->get_remote_logname() || "UNKNOWN"; 98 my $remoteHost = $r->get_remote_host(); 99 100 # generate context URLs 101 my $emailableURL; 102 my $returnURL; 103 if ($user) { 104 my $modulePath; 105 my @args; 106 if ($set) { 107 if ($problem) { 108 $modulePath = $r->urlpath->newFromModule("WeBWorK::ContentGenerator::Problem", 109 courseID => $r->urlpath->arg("courseID"), 110 setID => $set->set_id, 111 problemID => $problem->problem_id, 112 ); 113 @args = qw/displayMode showOldAnswers showCorrectAnswers showHints showSolutions/; 114 } else { 115 $modulePath = $r->urlpath->newFromModule("WeBWorK::ContentGenerator::ProblemSet", 116 courseID => $r->urlpath->arg("courseID"), 117 setID => $set->set_id, 118 ); 119 @args = (); 120 } 121 } else { 122 $modulePath = $r->urlpath->newFromModule("WeBWorK::ContentGenerator::ProblemSets", 123 courseID => $r->urlpath->arg("courseID"), 124 ); 125 @args = (); 126 } 127 my $URL; 128 if($port == 443) { # for secure servers 129 $URL = "https://$hostname"; 130 } else { 131 $URL = "http://$hostname:$port"; # FIXME: there should probably be an option for adding this stuff in systemLink() 132 } 133 $emailableURL = $URL . $self->systemLink($modulePath, 134 authen => 0, 135 params => [ "effectiveUser", @args ], 136 ); 137 $returnURL = $URL . $self->systemLink($modulePath, 138 authen => 1, 139 params => [ @args ], 140 ); 141 } else { 142 $emailableURL = "(not available)"; 143 $returnURL = ""; 144 } 145 146 if (defined $r->param("sendFeedback")) { 147 # get verbosity level 148 my $verbosity = $ce->{mail}->{feedbackVerbosity}; 149 150 # determine the sender of the email 151 my $sender = ($user && $user->email_address 152 ? $user->email_address 153 : $from); 154 155 # determine the recipients of the email 156 my @recipients; 157 if (defined $ce->{mail}->{feedbackRecipients}) { 158 @recipients = @{$ce->{mail}->{feedbackRecipients}}; 159 } else { 160 # send to all professors and TAs 161 foreach my $rcptName ($db->listUsers()) { 162 my $rcptPerm = $db->getPermissionLevel($rcptName); # checked 163 next unless ref($rcptPerm); 164 # we check to make sure that the permission is not 0 or a blank 165 # this is a hack to handle some cases where the permission level 166 # id snot defined to be a number 167 if ($rcptPerm->permission() and $rcptPerm->permission() >= PERMISION_TO_RECEIVE_EMAIL) { 168 my $rcpt = $db->getUser($rcptName); # checked 169 if ($rcpt and $rcpt->email_address) { 170 push @recipients, $rcpt->email_address; 171 } 172 } 173 } 174 } 175 176 # sanity checks 177 unless ($sender) { 178 $self->feedbackForm($user, $returnURL, 179 "No Sender specified."); 180 return ""; 181 } 182 unless (@recipients) { 183 $self->feedbackForm($user, $returnURL, 184 "No recipients specified."); 185 return ""; 186 } 187 unless ($feedback) { 188 $self->feedbackForm($user, $returnURL, 189 "Message was blank."); 190 return ""; 191 } 192 193 # bring up a mailer 194 my $mailer = Mail::Sender->new({ 195 from => $sender, 196 to => join(",", @recipients), 197 # *** we might want to have a CE setting for 198 # "additional recipients" 199 smtp => $ce->{mail}->{smtpServer}, 200 subject => "WeBWorK feedback: ".$user->first_name." ".$user->last_name. 201 ( ( defined($setName) && defined($problemNumber) ) ? 202 " set$setName/prob$problemNumber" : "" 203 ), 204 headers => "X-Remote-Host: ".$r->get_remote_host(), 205 }); 206 unless (ref $mailer) { 207 $self->feedbackForm($user, $returnURL, 208 "Failed to create a mailer: $Mail::Sender::Error"); 209 return ""; 210 } 211 unless (ref $mailer->Open()) { 212 $self->feedbackForm($user, $returnURL, 213 "Failed to open the mailer: $Mail::Sender::Error"); 214 return ""; 215 } 216 my $MAIL = $mailer->GetHandle(); 217 218 # print message 219 print $MAIL 220 wrap("", "", "This feedback message was automatically", 221 "generated by the WeBWorK system at", 222 "$hostname:$port, in response to a request from", 223 "$remoteIdent\@$remoteHost."), "\n\n"; 224 print $MAIL "Context: $emailableURL\n\n"; 225 226 if ($feedback) { 227 print $MAIL 228 "***** The feedback message: *****\n\n", 229 wrap("", "", $feedback), "\n\n"; 230 } 231 if ($problem and $verbosity >= 1) { 232 print $MAIL 233 "***** Data about the problem processor: *****\n\n", 234 235 "Display Mode: $displayMode\n", 236 "Show Old Answers? $showOldAnswers\n", 237 "Show Correct Answers? $showCorrectAnswers\n", 238 "Show Hints? $showHints\n", 239 "Show Solutions? $showSolutions\n\n", 240 } 241 if ($user and $verbosity >= 1) { 242 print $MAIL 243 "***** Data about the user: *****\n\n", 244 $user->toString(), "\n\n"; 245 246 } 247 if ($problem and $verbosity >= 1) { 248 print $MAIL 249 "***** Data about the problem: *****\n\n", 250 $problem->toString(), "\n\n"; 251 252 } 253 if ($set and $verbosity >= 1) { 254 print $MAIL 255 "***** Data about the problem set: *****\n\n", 256 $set->toString(), "\n\n"; 257 258 } 259 if ($ce and $verbosity >= 2) { 260 print $MAIL 261 "***** Data about the environment: *****\n\n", 262 Dumper($ce), "\n\n"; 263 264 } 265 266 # end the message 267 close $MAIL; 268 269 # print confirmation 270 print CGI::p("Your message was sent successfully."); 271 print CGI::p(CGI::a({-href => $returnURL}, "Return to your work")); 272 print CGI::pre(wrap("", "", $feedback)); 273 } else { 274 # just print the feedback form, with no message 275 $self->feedbackForm($user, $returnURL, ""); 276 } 277 278 return ""; 279 } 280 281 sub feedbackForm { 282 my ($self, $user, $returnURL, $message) = @_; 283 my $r = $self->r; 284 285 print CGI::start_form(-method=>"POST", -action=>$r->uri); 286 print $self->hidden_authen_fields; 287 print $self->hidden_fields(qw( 288 module set problem displayMode showOldAnswers showCorrectAnswers 289 showHints showSolutions 290 )); 291 print CGI::p(CGI::b("From:"), " ", 292 ($user && $user->email_address 293 ? CGI::tt($user->email_address) 294 : CGI::textfield("from", "", 40)) 295 ); 296 print CGI::p("Use this form to report to your professor a 297 problem with the WeBWorK system or an error in a problem 298 you are attempting. Along with your message, additional 299 information about the state of the system will be 300 included."); 301 print CGI::p(CGI::i($message)) if $message; 302 print CGI::p( 303 CGI::b("Feedback:"), CGI::br(), 304 CGI::textarea("feedback", "", 20, 80), 305 ); 306 print CGI::submit("sendFeedback", "Send Feedback"); 307 print CGI::end_form(); 308 print CGI::p(CGI::a({-href=>$returnURL}, "Cancel Feedback")); 309 } 310 311 1;
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |