--- loncom/interface/lonsupportreq.pm 2011/03/03 00:33:38 1.65 +++ loncom/interface/lonsupportreq.pm 2013/01/04 17:46:00 1.71 @@ -1,5 +1,5 @@ # -# $Id: lonsupportreq.pm,v 1.65 2011/03/03 00:33:38 raeburn Exp $ +# $Id: lonsupportreq.pm,v 1.71 2013/01/04 17:46:00 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,9 +36,10 @@ use Apache::lonhtmlcommon; use Apache::lonnet; use Apache::lonlocal; use Apache::lonacc(); +use Apache::lonauth(); use Apache::courseclassifier; use LONCAPA qw(:DEFAULT :match); - +use HTML::Entities; sub handler { my ($r) = @_; @@ -56,8 +57,19 @@ sub handler { if ($r->uri eq '/adm/helpdesk') { &Apache::lonacc::get_posted_cgi($r); } - my $function = $env{'form.function'}; + my $function; + if ($env{'form.function'}) { + if (($env{'form.function'} eq 'norole') || + ($env{'form.function'} eq 'student') || + ($env{'form.function'} eq 'admin') || + ($env{'form.function'} eq 'author')) { + $function = $env{'form.function'}; + } + } my $origurl = $env{'form.origurl'}; + $origurl =~ s{^https?://}{}; + $origurl =~ s/(`)//g; + $origurl =~ s/\$/\(\$\)/g; my $command = $env{'form.command'}; if ($command eq 'process') { @@ -72,7 +84,7 @@ sub print_request_form { my ($r,$origurl,$function) = @_; my ($os,$browser,$bversion,$uhost,$uname,$udom,$uhome,$urole,$usec,$email,$cid, $cdom,$cnum,$ctitle,$ccode,$sectionlist,$lastname,$firstname,$server, - $formname,$public); + $formname,$public,$homeserver); $function = &Apache::loncommon::get_users_function() if (!$function); $ccode = ''; $os = $env{'browser.os'}; @@ -82,22 +94,28 @@ sub print_request_form { if (($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) { $public = 1; } else { - $uname = $env{'user.name'}; - $udom = $env{'user.domain'}; + if (($env{'user.name'} ne '') && ($env{'user.domain'} ne '')) { + $homeserver = &Apache::lonnet::homeserver($env{'user.name'}, + $env{'user.domain'}); + if ($homeserver eq 'no_host') { + undef($homeserver); + } else { + $uname = $env{'user.name'}; + $udom = $env{'user.domain'}; + } + } + } + if ($homeserver) { + $uhome = $env{'user.home'}; + $urole = $env{'request.role'}; + $usec = $env{'request.course.sec'}; + $cid = $env{'request.course.id'}; } - $uhome = $env{'user.home'}; - $urole = $env{'request.role'}; - $usec = $env{'request.course.sec'}; - $cid = $env{'request.course.id'}; $formname = 'logproblem'; my $machine = &Apache::lonnet::absolute_url(); - if ($origurl =~ m-^https?://-) { - $server = $origurl; - } else { - $server = $machine.$origurl; - } - my $showserver = $server; - $showserver =~ s/\?.*$//; + my $sourceurl = $machine.$origurl; + $server = $machine.&cleanup_html($origurl); + $server =~ s/\?.*$//; my %lt = &Apache::lonlocal::texthash ( email => 'The e-mail address you entered', notv => 'is not a valid e-mail address', @@ -159,18 +177,20 @@ END $sectionlist = $csettings{'internal.sectionnums'}; } - if ($env{'environment.permanentemail'}) { - $email = $env{'environment.permanentemail'}; - } elsif ($env{'environment.critnotification'}) { - $email = $env{'environment.critnotification'}; - } elsif ($env{'environment.notification'}) { - $email = $env{'environment.notification'}; - } - if ($env{'environment.lastname'}) { - $lastname = $env{'environment.lastname'}; - } - if ($env{'environment.firstname'}) { - $firstname = $env{'environment.firstname'}; + if ($homeserver) { + if ($env{'environment.permanentemail'}) { + $email = $env{'environment.permanentemail'}; + } elsif ($env{'environment.critnotification'}) { + $email = $env{'environment.critnotification'}; + } elsif ($env{'environment.notification'}) { + $email = $env{'environment.notification'}; + } + if ($env{'environment.lastname'}) { + $lastname = $env{'environment.lastname'}; + } + if ($env{'environment.firstname'}) { + $firstname = $env{'environment.firstname'}; + } } my @sections = split(/,/,$sectionlist); my %groupid; @@ -243,11 +263,19 @@ function initialize_codes() { } } - my $js = ''; - my %add_entries = (topmargin => "0", - marginheight => "0", - onLoad =>"initialize_codes()",); + my $js = <<"ENDJS"; + +ENDJS + my %add_entries = ( + style => "margin-top:0px;margin-bottom:0px;", + onload => "initialize_codes();", + ); $r->print(&Apache::loncommon::start_page('Support Request',$js, @@ -260,20 +288,24 @@ function initialize_codes() { my @css = ('LC_evenrow_value','LC_oddrow_value'); my $num = 1; my $i = $num%2; - $r->print('
'."\n"); + my $formtype; + if ($homeserver) { + $formtype = ' enctype="multipart/form-data"'; + } + $r->print(''."\n"); my $output = &Apache::lonhtmlcommon::start_pick_box(). &Apache::lonhtmlcommon::row_title($lt{'name'},undef,$css[$num])."\n"; my $fullname = ''; if ((defined($lastname) && $lastname ne '') && (defined($firstname) && $firstname ne '')) { $fullname = "$firstname $lastname"; - $output .= $fullname.'&').'" />'; + $output .= $fullname.'&').'" />'."\n"; } else { if (defined($firstname) && $firstname ne '') { $fullname = $firstname; } elsif (defined($lastname) && $lastname ne '') { $fullname = " $lastname"; } - $output .= '&').'" />'; + $output .= '&').'" />'."\n"; } $output .= '      '. &Apache::lonhtmlcommon::row_closure()."\n"; @@ -286,17 +318,19 @@ function initialize_codes() { $num ++; $i = $num%2; if (($env{'user.name'} =~ /^$match_username$/) && (!$public)) { - $output .= &Apache::lonhtmlcommon::row_title($lt{'emac'},undef,$css[$i]). - '
'."\n". - &Apache::lonhtmlcommon::row_closure(); - $num ++; - $i = $num%2; + if ($homeserver) { + $output .= &Apache::lonhtmlcommon::row_title($lt{'emac'},undef,$css[$i]). + '
'."\n". + &Apache::lonhtmlcommon::row_closure(); + $num ++; + $i = $num%2; + } } $output .= &Apache::lonhtmlcommon::row_title("$lt{'unme'}/$lt{'doma'}",undef,$css[$i]); my $udom_input = '&').'" />'; + &HTML::Entities::encode($udom,'"<>&').'" />'."\n"; my $uname_input = '&').'" />'; + &HTML::Entities::encode($uname,'"<>&').'" />'."\n"; if (($env{'user.name'} =~ /^$match_username$/) && ($env{'user.domain'} =~ /^$match_domain$/) && (!$public)) { $output .= ''.$lt{'unme'}.': '.$uname.'  '.$lt{'doma'}.': '.$udom.$udom_input.$uname_input; @@ -310,7 +344,7 @@ function initialize_codes() { } else { $output .= $lt{'entr'}; } - $output .= '
'; + $output .= '
'."\n"; if (!$public) { if ($env{'user.domain'} =~ /^$match_domain$/) { $udomform = ''.$lt{'doma'}.': '.$udom.$udom_input; @@ -320,7 +354,7 @@ function initialize_codes() { } if ($udomform eq '') { $udomform = ''.$lt{'doma'}.': '; - $udomform .= &Apache::loncommon::select_dom_form($codedom,'udom'); + $udomform .= &Apache::loncommon::select_dom_form($codedom,'udom')."\n"; } if ($unameform eq '') { $unameform= ''.$lt{'unme'}.'  '; @@ -331,11 +365,11 @@ function initialize_codes() { $num ++; $i = $num%2; $output .= &Apache::lonhtmlcommon::row_title("$lt{'urlp'}",undef,$css[$i]). - $showserver.'&').'" />'. + $server."\n".'&').'" />'."\n". &Apache::lonhtmlcommon::row_closure(). &Apache::lonhtmlcommon::row_title("$lt{'phon'}",undef,'LC_evenrow_value'). - '
'. + '
'."\n". &Apache::lonhtmlcommon::row_closure(); $num ++; $i = $num%2; @@ -345,17 +379,17 @@ function initialize_codes() { foreach my $item (@codetitles) { $output .= ''.$item.': '.$codes{$cnum}{$item}.'; '; } - $output .= ' &').'" />'; + $output .= ' &').'" />'."\n"; } else { $output .= $lt{'enin'}.':  - '; + '."\n"; } } else { if ($totcodes > 0) { my $numtitles = @codetitles; if ($numtitles == 0) { $output .= $lt{'enin'}.':  - '; + '."\n"; } else { my @standardnames = &Apache::loncommon::get_standard_codeitems(); my $lasttitle = $numtitles; @@ -364,7 +398,7 @@ function initialize_codes() { } $output .= ' -
'.$codetitles[0].'
'."\n". ''; + '."\n"; } } if ($ctitle) { @@ -438,7 +472,7 @@ function initialize_codes() { } $output .= ""; } else { - $output .= ''; + $output .= ''."\n"; } $output .= &Apache::lonhtmlcommon::row_closure(); $num ++; @@ -447,16 +481,32 @@ function initialize_codes() { ' '."\n". &Apache::lonhtmlcommon::row_closure(). &Apache::lonhtmlcommon::row_title($lt{'detd'},undef,'LC_evenrow_value'). - ' '. + ' '."\n". &Apache::lonhtmlcommon::row_closure(); $num ++; $i = $num%2; if (($env{'user.name'} =~ /^$match_username$/) && (!$public)) { - $output .= &Apache::lonhtmlcommon::row_title($lt{'opfi'},undef,$css[$i]). - '
'.$lt{'uplf'}."\n". - &Apache::lonhtmlcommon::row_closure(); - $num ++; - $i = $num%2; + if ($homeserver) { + $output .= &Apache::lonhtmlcommon::row_title($lt{'opfi'},undef,$css[$i]). + '
'. + "\n".$lt{'uplf'}."\n". + &Apache::lonhtmlcommon::row_closure(); + $num ++; + $i = $num%2; + } + } else { + my $lonhost = $r->dir_config('lonHostID'); + my ($captchaform,$error) = + &Apache::loncommon::captcha_display('login',$lonhost); + if ($captchaform) { + $output .= &Apache::lonhtmlcommon::row_title(&mt('Validation'),undef, + $css[$i])."\n". + $captchaform."\n". + &Apache::lonhtmlcommon::row_closure(); + $num ++; + $i = $num%2; + } } $output .= &Apache::lonhtmlcommon::row_title($lt{'fini'},undef,$css[$i]); $output .= <dir_config('lonHostID'); + my ($captcha_chk,$captcha_error) = + &Apache::loncommon::captcha_response('login',$lonhost); + if ($captcha_chk != 1) { + $r->print(&Apache::loncommon::start_page('Support request failed',undef, + {'function' => $function, + 'add_entries' => { + topmargin => "0", + marginheight => "0", + }, + 'only_body' => 1,})); + if ($r->uri eq '/adm/helpdesk') { + &print_header($r,$url,'process'); + } + $r->print('

'.&mt('Support request failed').'

'. + ''. + &mt('Validation of the code you entered failed.'). + &Apache::loncommon::end_page()); + return; + } + } my @ENVvars = ('HTTP_HOST','HTTP_USER_AGENT','REMOTE_ADDR','SERVER_ADDR','SERVER_NAME'); my @envvars = ('browser.os','browser.type','browser.version','user.home','request.role'); my @loncvars = ('user.name','user.domain','request.course.sec','request.course.id'); @@ -558,7 +634,6 @@ sub print_request_receipt { sourceurl => 'URL', date => 'Date/Time', secn => 'Section', - asup => 'A support request has been sent to', warn => 'Warning: Problem with support e-mail address', your => 'Your support request contained the following information', sect => 'section', @@ -566,8 +641,17 @@ sub print_request_receipt { adin => 'Additional information recorded', ); - my (@ok_ccs,@bad_ccs,$badccmsg,$okcclist); - if ((defined($env{'user.name'})) && (defined($env{'form.cc'}))) { + my (@ok_ccs,@bad_ccs,$badccmsg,$okcclist,$public,$homeserver); + if (($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) { + $public = 1; + } else { + if (($env{'user.name'} ne '') && ($env{'user.domain'} ne '')) { + $homeserver = &Apache::lonnet::homeserver($env{'user.name'}, + $env{'user.domain'}); + } + } + + if (($homeserver) && (defined($env{'form.cc'}))) { my @ccs; if ($env{'form.cc'} =~ /,/) { @ccs = split(/,/,$env{'form.cc'}); @@ -593,10 +677,11 @@ sub print_request_receipt { $okcclist = join(', ',@ok_ccs); } if (@bad_ccs == 1) { - $badccmsg .= '
'.&mt('The following Cc e-mail address is invalid: ').$bad_ccs[0]; + if ($bad_ccs[0] ne '') { + $badccmsg .= '
'.&mt('The following Cc e-mail address is invalid: ').&cleanup_html($bad_ccs[0]); + } } elsif (@bad_ccs > 1) { - my $bad_cc_string = join(', ',@bad_ccs); - $badccmsg .= '
'.&mt('The following Cc e-mail addresses are invalid: ').$bad_cc_string; + $badccmsg .= '
'.&mt('The following Cc e-mail addresses are invalid: '). &cleanup_html(join(', ',@bad_ccs)); } } $env{'form.user'} = "'".$env{'form.uname'}.':'.$env{'form.udom'}."'"; @@ -632,9 +717,12 @@ END ''. "$lt{$item}: $showurl
\n"; } elsif ($item eq 'cc') { - $displaymsg .= - ''. - "$lt{$item}: $okcclist
\n"; + if ($okcclist) { + my $showcclist = &cleanup_html($okcclist); + $displaymsg .= + ''. + "$lt{$item}: $showcclist
\n"; + } } else { my $showitem = $env{'form.'.$item}; $showitem = &cleanup_html($showitem); @@ -689,14 +777,20 @@ END $bad_email = 1; } } - if ($bad_email) { - $r->print(' -

'.$lt{'warn'}.'

'. -&mt('As the e-mail address provided for this LON-CAPA server ([_1]) does not appear to be a valid e-mail address, your support request has not been sent to the LON-CAPA support staff or administrator at your institution.',$to).' '.&mt('Instead a copy has been sent to the LON-CAPA support team at Michigan State University.')); - $to = 'helpdesk@lon-capa.org'; + + my $message; + if (!$bad_email) { + $message = &Apache::lonhtmlcommon::confirm_success( + &mt('A support request has been sent to [_1]',''.$to.'')); } else { - $r->print('

'.$lt{'asup'}.' '.$to.'

'); + $message = &Apache::lonhtmlcommon::confirm_success( + $lt{'warn'}.'
' + .&mt('As the e-mail address provided for this LON-CAPA server ([_1]) does not appear to be a valid e-mail address, your support request has [_2]not[_3] been sent to the LON-CAPA support staff or administrator at your institution.',''.$to.'','','') + .' '.&mt('Instead a copy has been sent to the LON-CAPA support team at Michigan State University.'),1); + $to = 'helpdesk@lon-capa.org'; } + $r->print(&Apache::loncommon::confirmwrapper($message)); + if (defined($env{'form.email'})) { $env{'form.email'} =~ s/^\s+//; $env{'form.email'} =~ s/\s+$//; @@ -724,7 +818,7 @@ END my $attachmentsize = ''; if ((defined($env{'user.name'})) && ($env{'user.name'} ne 'public') && ($env{'user.domain'} ne 'public')) { - if ($env{'form.screenshot.filename'}) { + if ($homeserver && $env{'form.screenshot.filename'}) { $attachmentsize = length($env{'form.screenshot'}); if ($attachmentsize > 131072) { $displaymsg .= '
'.&mt('The uploaded screenshot file ([_1] bytes) included with your request exceeded the maximum allowed size - 128 KB, and has therefore been discarded.',$attachmentsize); @@ -744,7 +838,7 @@ END $fname = $1; $displaymsg .= '
' .&mt('An uploaded screenshot file [_1] ([_2] bytes) was included in the request sent by [_3].' - ,''.$fname.'' + ,''.$fname.'' ,$attachmentsize ,$env{'user.name'}.':'.$env{'user.domain'} ); @@ -767,9 +861,11 @@ END Type =>'TEXT', Data => $supportmsg, ); - if (@ok_ccs > 0) { - my $cc_string = join(', ',@ok_ccs); - $msg->add("Cc" => $cc_string); + if ($homeserver) { + if (@ok_ccs > 0) { + my $cc_string = join(', ',@ok_ccs); + $msg->add("Cc" => $cc_string); + } } if ($bcc ne '') { $msg->add("Bcc" => $bcc); @@ -777,7 +873,7 @@ END $msg->attr("content-type" => "text/plain"); $msg->attr("content-type.charset" => "UTF-8"); - if ($attachmentpath) { + if ($homeserver && $attachmentpath) { my ($type, $encoding) = MIME::Types::by_suffix($attachmentpath); $msg->attach(Type => $type, Path => $attachmentpath, @@ -850,11 +946,14 @@ sub print_header { $helpdesk_link = ''; } my %lt = &Apache::lonlocal::texthash ( - login => 'Log-in help', - ask => 'Ask helpdesk', - getst => 'Getting started guide', - back => 'Back to last location', + login => 'Log-in help', + ask => 'Ask helpdesk', + getst => 'Getting started guide', + back => 'Back to last location', headline => 'help/support', + stud => 'Students', + ifyo => 'If your problem is still unresolved, the form below can be used to send a question to the LON-CAPA helpdesk.', + cont => 'Contact your instructor instead.', ); my ($getstartlink,$reviewtext); if (-e $Apache::lonnet::perlvar{'lonDocRoot'}.'/adm/gettingstarted.html') { @@ -863,42 +962,54 @@ sub print_header { } else { $reviewtext = &mt('Please review the information in "Log-in help" if you are unable to log-in.'); } + my $linkback; if ($origurl eq '') { - $origurl = 'javascript:history.go(-1)'; + $linkback = 'javascript:history.go(-1)'; + } else { + $linkback = &HTML::Entities::encode($origurl,'"<>&'); } - $r->print(<
  + my $loginhelp = &Apache::lonauth::loginhelpdisplay(); + if ($loginhelp eq '') { + $loginhelp = '/adm/loginproblems.html'; + } + $r->print(<<"END"); + + + + - + - - + + END if ($command ne 'process') { - $r->print(' + my $stuwarn = &mt('Do [_1]not[_2] use this form to ask about course content.', + '',''); + $r->print(<<"END"); - - '); + +END } $r->print('
 
- + logo LON-CAPA $lt{'headline'} - - $getstartlink - + + $getstartlink +
  
 
 
'.$reviewtext.' ' -.&mt('If your problem is still unresolved, the form below can be used to send a question to the LON-CAPA helpdesk.').'
' -.''.&mt('Students').': '.&mt('Do not use this form to ask questions about course content.').' ' -.&mt('Contact your instructor instead.') -.'

+
$reviewtext + $lt{'ifyo'}
+$lt{'stud'}: +$stuwarn $lt{'cont'} +

'); @@ -908,8 +1019,11 @@ END sub get_domain { my $codedom; if (exists($env{'form.codedom'})) { - $codedom = $env{'form.codedom'}; - } elsif ($env{'request.course.id'}) { + if (&Apache::lonnet::domain($env{'form.codedom'}) ne '') { + return $env{'form.codedom'}; + } + } + if ($env{'request.course.id'}) { $codedom = $env{'course.'.$env{'request.course.id'}.'.domain'}; } elsif ($env{'request.role.domain'}) { $codedom = $env{'request.role.domain'}; @@ -924,6 +1038,7 @@ sub cleanup_html { my $outgoing; if ($incoming ne '') { $outgoing = $incoming; + $outgoing =~ s/;/;/g; $outgoing =~ s/\#/#/g; $outgoing =~ s/\&/&/g; $outgoing =~ s/ 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.