--- loncom/interface/lonsupportreq.pm 2010/04/14 07:31:21 1.55.4.3 +++ loncom/interface/lonsupportreq.pm 2017/10/13 20:37:35 1.93 @@ -1,5 +1,7 @@ +# The LearningOnline Network with CAPA +# Helpdesk request form # -# $Id: lonsupportreq.pm,v 1.55.4.3 2010/04/14 07:31:21 raeburn Exp $ +# $Id: lonsupportreq.pm,v 1.93 2017/10/13 20:37:35 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,8 +29,6 @@ package Apache::lonsupportreq; use strict; -use MIME::Types; -use MIME::Lite; use CGI::Cookie(); use Apache::Constants qw(:common); use Apache::loncommon(); @@ -36,9 +36,10 @@ use Apache::lonhtmlcommon; use Apache::lonnet; use Apache::lonlocal; use Apache::lonacc(); +use Apache::lonauth(); use Apache::courseclassifier; -use LONCAPA; - +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 $origurl = &unescape($env{'form.origurl'}); + 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') { @@ -67,43 +79,155 @@ sub handler { } return OK; } - + 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); + my ($os,$browser,$bversion,$uname,$udom,$uhome,$urole,$usec,$email,$cid, + $cdom,$cnum,$ctitle,$ccode,$sectionlist,$lastname,$firstname,$server, + $formname,$public,$homeserver,$knownuser,$captcha_form,$captcha_error, + $captcha,$recaptcha_version,$extra_validations,%groupid); $function = &Apache::loncommon::get_users_function() if (!$function); $ccode = ''; $os = $env{'browser.os'}; $browser = $env{'browser.type'}; $bversion = $env{'browser.version'}; - $uhost = $env{'request.host'}; - my ($uname,$udom); - if (($env{'user.name'} ne 'public') && ($env{'user.domain'} ne 'public')) { - $uname = $env{'user.name'}; - $udom = $env{'user.domain'}; - } - $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; + 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 eq 'no_host') { + undef($homeserver); + } else { + $uname = $env{'user.name'}; + $udom = $env{'user.domain'}; + } + } + } + if (($env{'user.name'} =~ /^$match_username$/) && + ($env{'user.domain'} =~ /^$match_domain$/) && (!$public)) { + $knownuser = 1; } else { - $server = $machine.$origurl; + my $lonhost = $r->dir_config('lonHostID'); + ($captcha_form,$captcha_error,$captcha,$recaptcha_version) = + &Apache::loncommon::captcha_display('login',$lonhost); + } + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['codedom', + 'useremail','useraccount']); + + if ($homeserver) { + $uhome = $env{'user.home'}; + $urole = $env{'request.role'}; + $usec = $env{'request.course.sec'}; + $cid = $env{'request.course.id'}; } - my $showserver = $server; - $showserver =~ s/\?.*$//; - my %lt = &Apache::lonlocal::texthash ( + if ($cid) { + $cdom = $env{'course.'.$cid.'.domain'}; + $cnum = $env{'course.'.$cid.'.num'}; + } + if ($cdom && $cnum) { + my %csettings = &Apache::lonnet::get('environment',['description','internal.coursecode','internal.sectionnums'],$cdom,$cnum); + $ctitle = $csettings{'description'}; + $ccode = $csettings{'internal.coursecode'}; + $sectionlist = $csettings{'internal.sectionnums'}; + my @sections = split(/,/,$sectionlist); + foreach my $section (@sections) { + my ($sec,$grp) = split(/:/,$section); + $groupid{$sec} = $grp; + } + } + + $formname = 'logproblem'; + my $codedom = &get_domain(); + my %helpform; + my %domconfig = + &Apache::lonnet::get_dom('configuration',['contacts'],$codedom); + if (ref($domconfig{'contacts'}) eq 'HASH') { + if (ref($domconfig{'contacts'}{'helpform'}) eq 'HASH') { + %helpform = %{$domconfig{'contacts'}{'helpform'}}; + } + } + + my %coursecodes; + my %codes; + my @codetitles; + my %cat_titles; + my %cat_order; + my %idlist; + my %idnums; + my %idlist_titles; + my $caller = 'global'; + my $totcodes = 0; + my $format_reply; + my $jscript = ''; + my $loaditems = qq| +function initialize_codes() { + return; +} + |; + unless ($helpform{'course'} eq 'no') { + $totcodes = &Apache::courseclassifier::retrieve_instcodes(\%coursecodes,$codedom); + if ($totcodes > 0) { + $format_reply = &Apache::lonnet::auto_instcode_format($caller,$codedom,\%coursecodes,\%codes,\@codetitles,\%cat_titles,\%cat_order); + if ($format_reply eq 'ok') { + my $numtypes = @codetitles; + &Apache::courseclassifier::build_code_selections(\%codes,\@codetitles,\%cat_titles,\%cat_order,\%idlist,\%idnums,\%idlist_titles); + my ($scripttext,$longtitles) = &Apache::courseclassifier::javascript_definitions(\@codetitles,\%idlist,\%idlist_titles,\%idnums,\%cat_titles); + my $longtitles_str = join('","',@{$longtitles}); + my $allidlist = $idlist{$codetitles[0]}; + my $knowncodes; + if (($ccode ne '') && ($cnum ne '')) { + my (%singlecodes,@singlecodetitles,%singlecat_titles,%singlecat_order); + my $crscode_reply = &Apache::lonnet::auto_instcode_format($cnum,$codedom,{ $cnum => $ccode },\%singlecodes, + \@singlecodetitles,\%singlecat_titles,\%singlecat_order); + if (ref($singlecodes{$cnum}) eq 'HASH') { + $knowncodes = $singlecodes{$cnum}; + } + } + $jscript .= &Apache::courseclassifier::courseset_js_start($formname,$longtitles_str,$allidlist); + $jscript .= $scripttext; + $jscript .= &Apache::courseclassifier::javascript_code_selections($formname,\@codetitles,$knowncodes,$sectionlist); + $loaditems = ''; + } + } + } + my %missing = &Apache::lonlocal::texthash( + username => 'You must include a name.', + phone => 'You must include a phone.', + ); + &js_escape(\%missing); + if (keys(%helpform)) { + foreach my $key (keys(%helpform)) { + if (($helpform{$key} eq 'req') && ($missing{$key} ne '')) { + next if (($key eq 'username') && (($knownuser) || + (($env{'user.name'} =~ /^$match_username$/) && (!$public)))); + $extra_validations .= <<"END"; + + if (document.$formname.$key.value == '') { + alert("$missing{$key}"); + return; + } + +END + } + } + } + my $machine = &Apache::lonnet::absolute_url(); + my $sourceurl = $machine.$origurl; + $server = $machine.&Apache::loncommon::cleanup_html($origurl); + $server =~ s/\?.*$//; + my %js_lt = &Apache::lonlocal::texthash ( email => 'The e-mail address you entered', notv => 'is not a valid e-mail address', rsub => 'You must include a subject', rdes => 'You must include a description', + ); + my %html_lt = &Apache::lonlocal::texthash ( name => 'Name', subm => 'Submit Request', emad => 'Your e-mail address', - emac => 'Cc', + emac => 'Cc', unme => 'username', doma => 'domain', entu => 'Enter the username you use to log-in to LON-CAPA', @@ -122,116 +246,82 @@ sub print_request_form { subj => 'Subject', detd => 'Detailed Description', opfi => 'Optional file upload', - uplf => 'Upload a file (e.g., a screenshot) relevant to your help request (128 KB max.)', + uplf => 'Upload a file (e.g., a screenshot) relevant to your help request', fini => 'Finish', clfm => 'Clear Form', ); + &js_escape(\%js_lt); + &html_escape(\%html_lt); my $scripttag = (<<"END"); function validate() { if (validmail(document.logproblem.email) == false) { - alert("$lt{'email'}: "+document.logproblem.email.value+" $lt{'notv'}."); + alert("$js_lt{'email'}: "+document.logproblem.email.value+" $js_lt{'notv'}."); return; } if (document.logproblem.subject.value == '') { - alert("$lt{'rsub'}."); + alert("$js_lt{'rsub'}."); return; } if (document.logproblem.description.value == '') { - alert("$lt{'rdes'}."); + alert("$js_lt{'rdes'}."); return; } + $extra_validations document.logproblem.submit(); } END $scripttag .= &Apache::lonhtmlcommon::javascript_valid_email(); - if ($cid) { - $cdom = $env{'course.'.$cid.'.domain'}; - $cnum = $env{'course.'.$cid.'.num'}; - } - if ($cdom && $cnum) { - my %csettings = &Apache::lonnet::get('environment',['description','internal.coursecode','internal.sectionnums'],$cdom,$cnum); - $ctitle = $csettings{'description'}; - $ccode = $csettings{'internal.coursecode'}; - $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'}; - } - my @sections = split(/,/,$sectionlist); - my %groupid; - foreach my $section (@sections) { - my ($sec,$grp) = split(/:/,$section); - $groupid{$sec} = $grp; + 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'}; + } + } + if ($env{'form.origurl'} eq '/adm/createaccount') { + if ($email eq '') { + if ($env{'form.useremail'} =~ /^[^\@]+\@[^\@]+$/) { + $email = &HTML::Entities::encode($env{'form.useremail'},'"<>&'); + } + } + if ($uname eq '') { + if ($env{'form.useraccount'} =~ /^$match_username$/) { + $uname = &HTML::Entities::encode($env{'form.useraccount'},'"<>&'); + } + } } - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['codedom']); - my $codedom = &get_domain(); my $details_title; if ($codedom) { $details_title = '
('.$codedom.')'; } - my %coursecodes; - my %codes; - my @codetitles; - my %cat_titles; - my %cat_order; - my %idlist; - my %idnums; - my %idlist_titles; - my $caller = 'global'; - my $totcodes = 0; - my $format_reply; - my $jscript = ''; - my $loaditems = qq| -function initialize_codes() { - return; -} - |; - if ($cnum) { - $coursecodes{$cnum} = $ccode; - if ($ccode eq '') { - $totcodes = &Apache::courseclassifier::retrieve_instcodes(\%coursecodes,$codedom,$totcodes); - } else { - $coursecodes{$cnum} = $ccode; - $caller = $cnum; - $totcodes ++; - } - } else { - $totcodes = &Apache::courseclassifier::retrieve_instcodes(\%coursecodes,$codedom,$totcodes); - } - if ($totcodes > 0) { - if ($ccode eq '') { - $format_reply = &Apache::lonnet::auto_instcode_format($caller,$codedom,\%coursecodes,\%codes,\@codetitles,\%cat_titles,\%cat_order); - if ($format_reply eq 'ok') { - my $numtypes = @codetitles; - &Apache::courseclassifier::build_code_selections(\%codes,\@codetitles,\%cat_titles,\%cat_order,\%idlist,\%idnums,\%idlist_titles); - my ($scripttext,$longtitles) = &Apache::courseclassifier::javascript_definitions(\@codetitles,\%idlist,\%idlist_titles,\%idnums,\%cat_titles); - my $longtitles_str = join('","',@{$longtitles}); - my $allidlist = $idlist{$codetitles[0]}; - $jscript .= &Apache::courseclassifier::courseset_js_start($formname,$longtitles_str,$allidlist); - $jscript .= $scripttext; - $jscript .= &Apache::courseclassifier::javascript_code_selections($formname,@codetitles); - $loaditems = ''; - } - } - } - - my $js = ''; - my %add_entries = (topmargin => "0", - marginheight => "0", - onLoad =>"initialize_codes()",); + + my $js = <<"ENDJS"; + + +ENDJS + if ($recaptcha_version >=2) { + $js.= "\n".''."\n"; + } + my %add_entries = ( + style => "margin-top:0px;margin-bottom:0px;", + onload => "initialize_codes();", + ); $r->print(&Apache::loncommon::start_page('Support Request',$js, @@ -244,107 +334,139 @@ 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"'; + } + my $topsubmit = '      '; + my $shownsubmit; + $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.'&').'" />'; - } else { - if (defined($firstname) && $firstname ne '') { - $fullname = $firstname; - } elsif (defined($lastname) && $lastname ne '') { - $fullname = " $lastname"; + &Apache::lonhtmlcommon::row_headline(). + ''. + &mt('(All fields marked with * are required.)'). + ''. + &Apache::lonhtmlcommon::row_closure(); + unless ($helpform{'username'} eq 'no') { + my ($reqd,$namefield,$fullname); + if ((defined($lastname) && $lastname ne '') && (defined($firstname) && $firstname ne '')) { + $fullname = "$firstname $lastname"; + $namefield = $fullname.'&').'" />'."\n"; + } else { + if (defined($firstname) && $firstname ne '') { + $fullname = $firstname; + } elsif (defined($lastname) && $lastname ne '') { + $fullname = " $lastname"; + } + $namefield = '&').'" />'."\n"; + if ($helpform{'username'} eq 'req') { + $reqd = '*'; + } } - $output .= '&').'" />'; + $output .= &Apache::lonhtmlcommon::row_title($html_lt{'name'}.$reqd,undef,$css[$num])."\n".$namefield. + $topsubmit. + &Apache::lonhtmlcommon::row_closure()."\n"; + $shownsubmit = 1; + $num ++; + $i = $num%2; } - $output .= '      '. - &Apache::lonhtmlcommon::row_closure()."\n"; - $num ++; - $i = $num%2; - $output .= &Apache::lonhtmlcommon::row_title($lt{'emad'},undef,$css[$i]). + $output .= &Apache::lonhtmlcommon::row_title( + ''. + $html_lt{'emad'}.' *' + ,undef,$css[$i]). '&').'" />
'."\n". - &Apache::lonhtmlcommon::row_closure(); + &HTML::Entities::encode($email,'"<>&').'" />'."\n"; + unless ($shownsubmit) { + $output .= $topsubmit; + } + $output .= &Apache::lonhtmlcommon::row_closure(); $num ++; $i = $num%2; - if (defined($uname)) { - $output .= &Apache::lonhtmlcommon::row_title($lt{'emac'},undef,$css[$i]). - '
'."\n". - &Apache::lonhtmlcommon::row_closure(); - $num ++; - $i = $num%2; + if ($knownuser) { + if ($homeserver) { + unless ($helpform{'cc'} eq 'no') { + $output .= &Apache::lonhtmlcommon::row_title($html_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 = '&').'" />'; - my $uname_input = '&').'" />'; - if (defined($uname) && defined($udom)) { - $output .= ''.$lt{'unme'}.': '.$uname.'  '.$lt{'doma'}.': '.$udom.$udom_input.$uname_input; - } else { - my $udomform = ''; - my $unameform = ''; - if (defined($udom)) { - $output .= $lt{'entu'}; - } elsif (defined($uname)) { - $output .= $lt{'chdo'}; + unless ($helpform{'user'} eq 'no') { + $output .= &Apache::lonhtmlcommon::row_title("$html_lt{'unme'}/$html_lt{'doma'}",undef,$css[$i]); + my $udom_input = '&').'" />'."\n"; + my $uname_input = '&').'" />'."\n"; + if ($knownuser) { + $output .= ''.$html_lt{'unme'}.': '.$uname.'  '.$html_lt{'doma'}.': '.$udom.$udom_input.$uname_input; } else { - $output .= $lt{'entr'}; - } - $output .= '
'; - if (defined($udom)) { - $udomform = ''.$lt{'doma'}.': '.$udom.$udom_input; - } elsif (defined($uname)) { - $unameform = ''.$lt{'unme'}.': '.$uname.'  '.$uname_input; - } - if ($udomform eq '') { - $udomform = ''.$lt{'doma'}.': '; - $udomform .= &Apache::loncommon::select_dom_form($codedom,'udom'); - } - if ($unameform eq '') { - $unameform= ''.$lt{'unme'}.'  '; + my $udomform = ''; + my $unameform = ''; + if (($env{'user.domain'} =~ /^$match_domain$/) && (!$public)) { + $output .= $html_lt{'entu'}; + } elsif (($env{'user.name'} =~ /^$match_username$/) && (!$public)) { + $output .= $html_lt{'chdo'}; + } else { + $output .= $html_lt{'entr'}; + } + $output .= '
'."\n"; + if (!$public) { + if ($env{'user.domain'} =~ /^$match_domain$/) { + $udomform = ''.$html_lt{'doma'}.': '.$udom.$udom_input; + } elsif ($env{'user.name'} =~ /^$match_username$/) { + $unameform = ''.$html_lt{'unme'}.': '.$uname.'  '.$uname_input; + } + } + if ($udomform eq '') { + $udomform = ''.$html_lt{'doma'}.': '; + $udomform .= &Apache::loncommon::select_dom_form($codedom,'udom')."\n"; + } + if ($unameform eq '') { + $unameform= ''.$html_lt{'unme'}.'  '; + } + $output .= $unameform.$udomform; } - $output .= $unameform.$udomform; + $output .= &Apache::lonhtmlcommon::row_closure(); + $num ++; } - $output .= &Apache::lonhtmlcommon::row_closure(); - $num ++; $i = $num%2; - $output .= &Apache::lonhtmlcommon::row_title("$lt{'urlp'}",undef,$css[$i]). - $showserver.'&').'" />'. - &Apache::lonhtmlcommon::row_closure(). - &Apache::lonhtmlcommon::row_title("$lt{'phon'}",undef,'LC_evenrow_value'). - '
'. + $output .= &Apache::lonhtmlcommon::row_title("$html_lt{'urlp'}",undef,$css[$i]). + $server."\n".'&').'" />'."\n". &Apache::lonhtmlcommon::row_closure(); - $num ++; - $i = $num%2; - $output .= &Apache::lonhtmlcommon::row_title("$lt{'crsd'}$details_title",undef,$css[$i]); - if ($cnum) { - if ($coursecodes{$cnum}) { - foreach my $item (@codetitles) { - $output .= ''.$item.': '.$codes{$cnum}{$item}.'; '; - } - $output .= ' &').'" />'; - } else { - $output .= $lt{'enin'}.':  - '; + unless ($helpform{'phone'} eq 'no') { + my $reqd; + if ($helpform{'phone'} eq 'req') { + $reqd = '*'; } - } else { + $output .= &Apache::lonhtmlcommon::row_title($html_lt{'phon'}.$reqd,undef,'LC_evenrow_value'). + '
'."\n". + &Apache::lonhtmlcommon::row_closure(); + $num ++; + $i = $num%2; + } + unless ($helpform{'course'} eq 'no') { + $output .= &Apache::lonhtmlcommon::row_title("$html_lt{'crsd'}$details_title",undef,$css[$i]); if ($totcodes > 0) { my $numtitles = @codetitles; if ($numtitles == 0) { - $output .= $lt{'enin'}.':  - '; + $output .= $html_lt{'enin'}.':  + '."\n"; } else { + my @standardnames = &Apache::loncommon::get_standard_codeitems(); my $lasttitle = $numtitles; if ($numtitles > 4) { $lasttitle = 4; - } + } + my $onchange; + if ($sectionlist) { + $onchange = 'toggleSecVis()'; + } $output .= ''; for (my $i=1; $i<$numtitles; $i++) { $output .= ''."\n"; } $output .= '
'.$codetitles[0].'
'."\n". - ''."\n". + ' \n"; my @items = (); my @longitems = (); if ($idlist{$codetitles[0]} =~ /","/) { @@ -372,83 +494,118 @@ function initialize_codes() { $output .= '
'.$codetitles[$i].'
'."\n". - ''."\n". + ''."\n". ''."\n". '
'; if ($numtitles > 4) { $output .= '

'.$codetitles[$numtitles].'
'."\n". - ''."\n". + ''."\n". ''."\n"; } } } else { - $output .= $lt{'enin'}.':  - '; + $output .= $html_lt{'enin'}.':  + '."\n"; } - } - if ($ctitle) { - $output .= '
'.$lt{'titl'}.': '.$ctitle. - '*'; + } + $output .= '
'.$html_lt{'enct'}.$reqd.':  + &').'" />'."\n"; - } else { - $output .= '
'.$lt{'enct'}.':  - '."\n"; + $output .= &Apache::lonhtmlcommon::row_closure(); + $num ++; + $i = $num%2; } - $output .= &Apache::lonhtmlcommon::row_closure(); - $num ++; - $i = $num%2; - $output .= &Apache::lonhtmlcommon::row_title($lt{'secn'},undef,$css[$i]); - if ($sectionlist) { - $output .= "\n". + " \n"; + foreach my $id (sort(keys(%groupid))) { + if ($id eq $groupid{$id} || $groupid{$id} eq '') { + $output .= " \n"; + } else { + $output .= " \n"; + } } + $output .= ''."\n". + ''."\n"; + } else { + $output .= ''."\n"; } - $output .= ""; - } else { - $output .= ''; + $output .= &Apache::lonhtmlcommon::row_closure(); + $num ++; + $i = $num%2; } - $output .= &Apache::lonhtmlcommon::row_closure(); - $num ++; - $i = $num%2; - $output .= &Apache::lonhtmlcommon::row_title($lt{'subj'},undef,'LC_oddrow_value'). - ' '."\n". + $output .= &Apache::lonhtmlcommon::row_title( + ''. + $html_lt{'subj'}.' *' + ,undef,'LC_oddrow_value'). + ''."\n". &Apache::lonhtmlcommon::row_closure(). - &Apache::lonhtmlcommon::row_title($lt{'detd'},undef,'LC_evenrow_value'). - ' '. + &Apache::lonhtmlcommon::row_title( + ''. + $html_lt{'detd'}.' *' + ,undef,'LC_evenrow_value'). + ''."\n". &Apache::lonhtmlcommon::row_closure(); $num ++; $i = $num%2; - if (defined($uname)) { - $output .= &Apache::lonhtmlcommon::row_title($lt{'opfi'},undef,$css[$i]). - '
'.$lt{'uplf'}."\n". - &Apache::lonhtmlcommon::row_closure(); - $num ++; - $i = $num%2; + if ($knownuser) { + if ($homeserver) { + unless ($helpform{'screenshot'} eq 'no') { + my $max = 1048576; + my $showmax = 1.00; + if ($helpform{'maxsize'} =~ /^\d+\.\d*$/) { + $max *= $helpform{'maxsize'}; + $showmax = $helpform{'maxsize'}; + } + $showmax = ' ('.sprintf("%.2f",$showmax).' '.&mt('MB max.').')'; + $output .= &Apache::lonhtmlcommon::row_title($html_lt{'opfi'},undef,$css[$i]) + .' ' + .'' + .'
'."\n".$html_lt{'uplf'}.$showmax."\n" + .&Apache::lonhtmlcommon::row_closure(); + $num ++; + $i = $num%2; + } + } + } else { + if ($captcha_form) { + $output .= &Apache::lonhtmlcommon::row_title( + ''. + &mt('Validation'). + ' *' + ,undef,$css[$i]). + $captcha_form."\n". + &Apache::lonhtmlcommon::row_closure(); + $num ++; + $i = $num%2; + } } - $output .= &Apache::lonhtmlcommon::row_title($lt{'fini'},undef,$css[$i]); + $output .= &Apache::lonhtmlcommon::row_title($html_lt{'fini'},undef,$css[$i]); $output .= < -   +     - + @@ -466,60 +623,108 @@ END sub print_request_receipt { my ($r,$url,$function) = @_; + my $public; + if (($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) { + $public = 1; + } + my $lonhost = $r->dir_config('lonHostID'); + unless (($env{'user.name'} =~ /^$match_username$/) && (!$public)) { + 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').'

'. + &Apache::lonhtmlcommon::confirm_success( + &mt('Validation of the code you entered failed.'),1). + '

'. + &Apache::lonhtmlcommon::actionbox([ + &mt('[_1]Go back[_2] and try again', + '','')]). + &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'); - my @cookievars = ('lonID'); + my @cookievars; + if ($ENV{'SERVER_PORT'} == 443) { + @cookievars = ('lonLinkID'); + } else { + @cookievars = ('lonID'); + } my $admin = $Apache::lonnet::perlvar{'lonAdminMail'}; my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'}; my $defdom = &get_domain(); - my $to = &Apache::loncommon::build_recipient_list(undef,'helpdeskmail', - $defdom,$origmail); my $from = $admin; - my $bcc; + my %helpform; my %domconfig = &Apache::lonnet::get_dom('configuration',['contacts'],$defdom); if (ref($domconfig{'contacts'}) eq 'HASH') { - if (exists($domconfig{'contacts'}{'helpdeskmail'})) { - if (ref($domconfig{'contacts'}{'helpdeskmail'}) eq 'HASH') { - my $bccmail = $domconfig{'contacts'}{'helpdeskmail'}{'bcc'}; - if ($bccmail ne '') { - my @bccs = split(/,/,$bccmail); - my @ok_bccs; - foreach my $bcc (@bccs) { - $bcc =~ s/^\s+//g; - $bcc =~ s/\s+$//g; - if ($bcc =~ m/^[^\@]+\@[^\@]+$/) { - if (!(grep(/^\Q$bcc\E$/,@ok_bccs))) { - push(@ok_bccs,$bcc); - } - } - } - if (@ok_bccs > 0) { - $bcc = join(', ',@ok_bccs); - } - } - } + if (ref($domconfig{'contacts'}{'helpform'}) eq 'HASH') { + %helpform = %{$domconfig{'contacts'}{'helpform'}}; } } my $reporttime = &Apache::lonlocal::locallocaltime(time); - my @formvars = ('username','email','uname','udom','sourceurl','phone','section','coursecode','title','subject','description','screenshot'); - - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},\@formvars); - my $coursecode = $env{'form.coursecode'}; - if ($coursecode eq '') { - if (defined($env{'form.Year'})) { - $coursecode .= $env{'form.Year'}; - } - if (defined($env{'form.Semester'})) { - $coursecode .= $env{'form.Semester'}; - } - if (defined($env{'form.Department'})) { - $coursecode .= $env{'form.Department'}; - } - if (defined($env{'form.Number'})) { - $coursecode .= $env{'form.Number'}; + my %formvars = ( + email => 1, + sourceurl => 1, + subject => 1, + description => 1, + ); + unless ($helpform{'username'} eq 'no') { + $formvars{'username'} = 1; + } + unless ($helpform{'user'} eq 'no') { + $formvars{'uname'} = 1; + $formvars{'udom'} = 1; + } + unless ($helpform{'phone'} eq 'no') { + $formvars{'phone'} = 1; + } + unless ($helpform{'section'} eq 'no') { + $formvars{'section'} = 1; + } + unless ($helpform{'course'} eq 'no') { + $formvars{'course'} = 1; + } + unless ($helpform{'cc'} eq 'no') { + $formvars{'cc'} = 1; + } + unless ($helpform{'screenshot'} eq 'no') { + $formvars{'screenshot'} = 1; + } + my $coursecode; + if ($formvars{'course'}) { + $coursecode = $env{'form.coursecode'}; + if ($coursecode eq '') { + my $totcodes = 0; + my %coursecodes; + $totcodes = &Apache::courseclassifier::retrieve_instcodes(\%coursecodes,$defdom); + my @standardnames = &Apache::loncommon::get_standard_codeitems(); + if ($totcodes > 0) { + my $noregexps = 1; + $coursecode = + &Apache::courseclassifier::instcode_from_selectors($defdom,$noregexps); + } + if ($coursecode eq '') { + foreach my $item (@standardnames) { + if ((defined($env{'form.'.$item})) && ($env{'form.'.$item} ne '-1')) { + $coursecode .= $env{'form.'.$item}; + } + } + } } } my %lt = &Apache::lonlocal::texthash ( @@ -534,7 +739,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', @@ -542,8 +746,27 @@ 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,$homeserver); + unless ($public) { + if (($env{'user.name'} ne '') && ($env{'user.domain'} ne '')) { + $homeserver = &Apache::lonnet::homeserver($env{'user.name'}, + $env{'user.domain'}); + } + } + my ($cid,$cdom,$cnum,$sectionlist,$ccode); + if ($homeserver) { + $cid = $env{'request.course.id'}; + } + if ($cid) { + $cdom = $env{'course.'.$cid.'.domain'}; + $cnum = $env{'course.'.$cid.'.num'}; + } + if ($cdom && $cnum) { + my %csettings = &Apache::lonnet::get('environment',['description','internal.coursecode','internal.sectionnums'],$cdom,$cnum); + $ccode = $csettings{'internal.coursecode'}; + $sectionlist = $csettings{'internal.sectionnums'}; + } + if (($homeserver) && (defined($env{'form.cc'})) && ($formvars{'cc'})) { my @ccs; if ($env{'form.cc'} =~ /,/) { @ccs = split(/,/,$env{'form.cc'}); @@ -559,7 +782,7 @@ sub print_request_receipt { if (!(grep(/^\Q$cc\E$/,@ok_ccs))) { push(@ok_ccs,$cc); } - } else { + } elsif ($cc ne '') { if (!(grep(/^\Q$cc\E$/,@bad_ccs))) { push(@bad_ccs,$cc); } @@ -569,33 +792,62 @@ 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: ').&Apache::loncommon::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: '). &Apache::loncommon::cleanup_html(join(', ',@bad_ccs)); } } $env{'form.user'} = "'".$env{'form.uname'}.':'.$env{'form.udom'}."'"; - $env{'form.csri'} = $env{'form.title'}.' - '.$coursecode.' - '.$lt{'sect'}.': '.$env{'form.section'}; - my $supportmsg = <|g; $displaymsg .= ''. @@ -603,23 +855,58 @@ END } elsif ($item eq 'sourceurl') { my $showurl = $env{'form.sourceurl'}; $showurl =~ s/\?.*$//; - $showurl = &cleanup_html($showurl); + $showurl = &Apache::loncommon::cleanup_html($showurl); $displaymsg .= ''. "$lt{$item}: $showurl
\n"; } elsif ($item eq 'cc') { - $displaymsg .= - ''. - "$lt{$item}: $okcclist
\n"; + next if ($helpform{'cc'} eq 'no'); + if ($okcclist) { + my $showcclist = &Apache::loncommon::cleanup_html($okcclist); + $displaymsg .= + ''. + "$lt{$item}: $showcclist
\n"; + } } else { + if (($item eq 'username') || ($item eq 'user') || ($item eq 'phone')) { + next if ($helpform{$item} eq 'no'); + } + next if (($item eq 'crsi') && ($helpform{'course'} eq 'no')); my $showitem = $env{'form.'.$item}; - $showitem = &cleanup_html($showitem); + $showitem = &Apache::loncommon::cleanup_html($showitem); $displaymsg .= ''. "$lt{$item}: $showitem
\n"; } } } + + my ($requname,$requdom,$reqemail); + foreach my $field ('uname','udom','email') { + $env{'form.'.$field} =~ s/^\s+//; + $env{'form.'.$field} =~ s/\s+$//; + } + if ($env{'form.uname'} =~ /^$match_username$/) { + $requdom = $env{'form.udom'}; + } + if ($env{'form.udom'} =~ /^$match_domain$/) { + $requdom = $env{'form.udom'}; + } + if ($env{'form.email'} =~ m/^[^\@]+\@[^\@]+$/) { + $reqemail = $env{'form.email'}; + } + + my $dom_in_effect; + unless ($env{'user.domain'} eq 'public') { + $dom_in_effect = $env{'user.domain'}; + } + if ($dom_in_effect eq '') { + $dom_in_effect = $requdom; + } + if ($dom_in_effect eq '') { + $dom_in_effect = $defdom; + } + $displaymsg .= ''. $lt{'date'}.': '.$reporttime.'
'."\n"; @@ -634,7 +921,7 @@ END $r->print(<<"END"); $start_page - + END @@ -642,6 +929,11 @@ END &print_header($r,$url,'process'); } my $bad_email = 0; + my ($to,$bcc,$addtext) = + &Apache::loncommon::build_recipient_list(undef,'helpdeskmail', + $dom_in_effect,$origmail, + $requname,$requdom, + $reqemail); if ($to =~ /,/) { my @ok_email; foreach my $email (split(/,/,$to)) { @@ -665,20 +957,22 @@ 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'; } - if (defined($env{'form.email'})) { - $env{'form.email'} =~ s/^\s+//; - $env{'form.email'} =~ s/\s+$//; - if ($env{'form.email'} =~ m/^[^\@]+\@[^\@]+$/) { - $from = $env{'form.email'}; - } + $r->print(&Apache::loncommon::confirmwrapper($message)); + + if ($reqemail ne '') { + $from = $reqemail; } if (defined($env{'form.cc'})) { @@ -697,15 +991,27 @@ END my $fname; my $attachmentpath = ''; - my $attachmentsize = ''; - if ((defined($env{'user.name'})) && ($env{'user.name'} ne 'public') - && ($env{'user.domain'} ne 'public')) { - if ($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); - } else { - $attachmentpath=&Apache::lonnet::userfileupload('screenshot',undef,'helprequests'); + my $showsize = ''; + + if ((defined($env{'user.name'})) && (!$public)) { + if ($homeserver && $env{'form.screenshot.filename'}) { + unless ($helpform{'screenshot'} eq 'no') { + my $attachmentsize = length($env{'form.screenshot'}); + my $max = 1048576; + my $showmax = 1.00; + if ($helpform{'maxsize'} =~ /^\d+\.\d*$/) { + $max *= $helpform{'maxsize'}; + $showmax = $helpform{'maxsize'}; + } + $showmax = '('.sprintf("%.2f",$showmax).' MB)'; + $showsize = $attachmentsize/1048576; + $showsize = '('.sprintf("%.2f",$showsize).' MB)'; + if ($attachmentsize > $max) { + $displaymsg .= '
'. + &mt('The uploaded screenshot file [_1] included with your request exceeded the maximum allowed size [_2], and has therefore been discarded.',$showsize,$showmax).''; + } else { + $attachmentpath=&Apache::lonnet::userfileupload('screenshot',undef,'helprequests'); + } } } } @@ -715,13 +1021,14 @@ END if ($$cookie{'lonID'} =~ /lonID=($LONCAPA::handle_re);/) { $cookies{'lonID'} = $1; } - + if ($$cookie{'lonLinkID'} =~ /lonLinkID=([a-f0-9]+_linked);/) { + $cookies{'lonLinkID'} = $1; + } if ($attachmentpath =~ m-/([^/]+)$-) { $fname = $1; $displaymsg .= '
' - .&mt('An uploaded screenshot file [_1] ([_2] bytes) was included in the request sent by [_3].' - ,''.$fname.'' - ,$attachmentsize + .&mt('An uploaded screenshot file [_1] was included in the request sent by [_2].' + ,''.$fname.' '.$showsize, ,$env{'user.name'}.':'.$env{'user.domain'} ); $supportmsg .= "\n"; @@ -735,49 +1042,43 @@ END $supportmsg .= "$var: $env{$var}\n"; } } - - my $msg = MIME::Lite->new( - From => $from, - To => $to, - Subject => $subject, - Type =>'TEXT', - Data => $supportmsg, - ); - if (@ok_ccs > 0) { - my $cc_string = join(', ',@ok_ccs); - $msg->add("Cc" => $cc_string); - } - if ($bcc ne '') { - $msg->add("Bcc" => $bcc); - } - - if ($attachmentpath) { - my ($type, $encoding) = MIME::Types::by_suffix($attachmentpath); - $msg->attach(Type => $type, - Path => $attachmentpath, - Filename => $fname - ); - } else { - my $envdata = ''; + my $cc_string; + if ($homeserver) { + if (@ok_ccs > 0) { + $cc_string = join(', ',@ok_ccs); + } + } + + my $attachment_text = ''; + unless ($homeserver && $attachmentpath) { foreach my $var (@cookievars) { - $envdata .= "$var: $cookies{$var}\n"; + $attachment_text .= "$var: $cookies{$var}\n"; } foreach my $var (@ENVvars) { - $envdata .= "$var: $ENV{$var}\n"; + $attachment_text .= "$var: $ENV{$var}\n"; } foreach my $var (@envvars) { - $envdata .= "$var: $env{$var}\n"; + $attachment_text .= "$var: $env{$var}\n"; } foreach my $var (@loncvars) { - $envdata .= "$var: $env{$var}\n"; + $attachment_text .= "$var: $env{$var}\n"; } - $msg->attach(Type => 'TEXT', - Data => $envdata); } -### Send it: - $msg->send('sendmail'); + if ($addtext) { + my ($addloc,$addstr) = split(/:/,$addtext,2); + $addstr = &unescape($addstr); + if ($addloc eq 's') { + $subject = $addstr.' '.$subject; + } elsif ($addloc eq 'b') { + $supportmsg = $addstr."\n".$supportmsg; + } + } + + # Compose and send a MIME email + &Apache::loncommon::mime_email($from, $to, $subject, $supportmsg, $cc_string, $bcc, + $attachmentpath, $fname, $attachment_text); if ($attachmentpath =~ m|$Apache::lonnet::perlvar{'lonDaemons'}/tmp/helprequests/(\d+)/[^/]+|) { unlink($attachmentpath); @@ -824,11 +1125,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') { @@ -837,39 +1141,55 @@ sub print_header { } else { $reviewtext = &mt('Please review the information in "Log-in help" if you are unable to log-in.'); } - $r->print(<   - + my $linkback; + if ($origurl eq '') { + $linkback = 'javascript:history.go(-1)'; + } else { + $linkback = &HTML::Entities::encode($origurl,'"<>&'); + } + 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('
 
-    - LON-CAPA $lt{'headline'} + 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'} +


'); @@ -879,8 +1199,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'}; @@ -890,22 +1213,4 @@ sub get_domain { return $codedom; } -sub cleanup_html { - my ($incoming) = @_; - my $outgoing; - if ($incoming ne '') { - $outgoing = $incoming; - $outgoing =~ s/\#/#/g; - $outgoing =~ s/\&/&/g; - $outgoing =~ s//>/g; - $outgoing =~ s/\(/(/g; - $outgoing =~ s/\)/)/g; - $outgoing =~ s/"/"/g; - $outgoing =~ s/'/'/g; - $outgoing =~ s/\$/$/g; - } - return $outgoing; -} - 1; 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.