--- loncom/interface/lonsupportreq.pm 2004/07/03 18:49:42 1.1 +++ loncom/interface/lonsupportreq.pm 2019/08/03 23:40:16 1.79.2.5 @@ -1,622 +1,1231 @@ +# The LearningOnline Network with CAPA +# Helpdesk request form +# +# $Id: lonsupportreq.pm,v 1.79.2.5 2019/08/03 23:40:16 raeburn Exp $ +# +# Copyright Michigan State University Board of Trustees +# +# This file is part of the LearningOnline Network with CAPA (LON-CAPA). +# +# LON-CAPA is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LON-CAPA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LON-CAPA; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# /home/httpd/html/adm/gpl.txt +# +# http://www.lon-capa.org/ +# + package Apache::lonsupportreq; use strict; -use lib qw(/home/httpd/lib/perl); +use MIME::Types; +use MIME::Lite; +use CGI::Cookie(); use Apache::Constants qw(:common); -use Apache::loncommon; +use Apache::loncommon(); +use Apache::lonhtmlcommon; use Apache::lonnet; -use localenroll; use Apache::lonlocal; - -use Mail::Send; -# use MIME::Lite; -# use MIME::Types; +use Apache::lonacc(); +use Apache::lonauth(); +use Apache::courseclassifier; +use LONCAPA qw(:DEFAULT :match); +use HTML::Entities; sub handler { - my $r = shift; - $r->content_type('text/html'); + my ($r) = @_; + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; if ($r->header_only) { return OK; } + if ($r->uri eq '/adm/helpdesk') { + &Apache::lonlocal::get_language_handle($r); + } + + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['origurl','function']); + if ($r->uri eq '/adm/helpdesk') { + &Apache::lonacc::get_posted_cgi($r); + } + 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'}; + if ($origurl =~ m{^https?://[^/]+(.*)$}) { + $origurl =~ $1; + } + $origurl =~ s/(`)//g; + $origurl =~ s/\$/\(\$\)/g; + my $command = $env{'form.command'}; - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['action','origurl','function']); - my $action = $ENV{'form.action'}; - my $function = $ENV{'form.function'}; - my $origurl = &Apache::lonnet::unescape($ENV{'form.origurl'}); - if ($action eq 'process') { + if ($command eq 'process') { &print_request_receipt($r,$origurl,$function); } else { &print_request_form($r,$origurl,$function); } 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); - my $bodytag = &Apache::loncommon::bodytag('',$function,'topmargin="0",marginheight="0"',1); - my $tablecolor = &Apache::loncommon::designparm($function.'.tabbg'); - $os = $ENV{'browser.os'}; - $browser = $ENV{'browser.type'}; - $bversion = $ENV{'browser.version'}; - $uhost = $ENV{'request.host'}; - $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'}; - $server = $ENV{'SERVER_NAME'}; - my $scripttag; - if ($cid =~ m/_/) { - ($cdom,$cnum) = split/_/,$cid; + 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'}; + 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 { + 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'}; + } + 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; + } } - if ($ENV{'environment.critnotification'}) { - $email = $ENV{'environment.critnotification'}; - } - if (!$email && $ENV{'environment.notification'}) { - $email = $ENV{'environment.notification'}; + + $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'}}; + } } - if ($ENV{'environment.lastname'}) { - $lastname = $ENV{'environment.lastname'}; + + my %codes; + my @codetitles; + my %cat_titles; + my %cat_order; + my %idlist; + my %idnums; + my %idlist_titles; + my $totcodes = 0; + my $jscript = ''; + my $loaditems = qq| +function initialize_codes() { + return; +} + |; + unless ($helpform{'course'} eq 'no') { + my $instcats = &Apache::lonnet::get_dom_instcats($codedom); + if (ref($instcats) eq 'HASH') { + if ((ref($instcats->{'codetitles'}) eq 'ARRAY') && (ref($instcats->{'codes'}) eq 'HASH') && + (ref($instcats->{'cat_titles'}) eq 'HASH') && (ref($instcats->{'cat_order'}) eq 'HASH')) { + %codes = %{$instcats->{'codes'}}; + @codetitles = @{$instcats->{'codetitles'}}; + %cat_titles = %{$instcats->{'cat_titles'}}; + %cat_order = %{$instcats->{'cat_order'}}; + $totcodes = scalar(keys(%codes)); + } + if ($totcodes > 0) { + 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 = ''; + } + } } - if ($ENV{'environment.firstname'}) { - $firstname = $ENV{'environment.firstname'}; - } - my @sections = split/,/,$sectionlist; - my %groupid = (); - foreach (@sections) { - my ($sec,$grp) = split/:/,$_; - $groupid{$sec} = $grp; + 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; } - $r->print(< - - LON-CAPA support request + END - my $defdom = $Apache::lonnet::perlvar{'lonDefDomain'}; - my $codedom = $defdom; - my %coursecodes = (); - my %codes = (); - my @codetitles = (); - my %cat_titles = (); - my %cat_order = (); - my $caller = 'global'; - my $totcodes = 0; - my $format_reply; - - if ($cdom) { - $codedom = $cdom; - } - if ($cnum) { - $coursecodes{$cnum} = $ccode; - if ($ccode eq '') { - $totcodes = &retrieve_instcodes(\%coursecodes,$codedom,$totcodes); - } else { - $coursecodes{$cnum} = $ccode; - $caller = $cnum; - $totcodes ++; + } } - } else { - $totcodes = &retrieve_instcodes(\%coursecodes,$codedom,$totcodes); } - if ($totcodes > 0) { - $format_reply = &Apache::lonnet::auto_instcode_format($caller,$codedom,\%coursecodes,\%codes,\@codetitles,\%cat_titles,\%cat_order); + 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', + unme => 'username', + doma => 'domain', + entu => 'Enter the username you use to log-in to LON-CAPA', + chdo => 'Choose your LON-CAPA domain', + entr => 'Enter the username you use to log-in to LON-CAPA, and your domain.', + urlp => 'URL of page', + phon => 'Phone', + crsd => 'Course Details', + enin => 'Enter institutional course code', + pick => 'Pick', + enct => 'Enter course title', + secn => 'Section Number', + sele => 'Select', + titl => 'Title', + lsec => 'LON-CAPA sec', + subj => 'Subject', + detd => 'Detailed Description', + opfi => 'Optional file upload', + 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("$js_lt{'email'}: "+document.logproblem.email.value+" $js_lt{'notv'}."); + return; + } + if (document.logproblem.subject.value == '') { + alert("$js_lt{'rsub'}."); + return; + } + if (document.logproblem.description.value == '') { + alert("$js_lt{'rdes'}."); + return; } - $r->print(< - - LON-CAPA support request -$scripttag - -$bodytag - - - - -
- - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
Name: -
-
- - - -
+ $extra_validations + document.logproblem.submit(); +} + END - my $fullname = ''; - if ((defined($lastname) && $lastname ne '') && (defined($firstname) && $firstname ne '')) { - $fullname = "$firstname $lastname"; - $r->print("$fullname"); - } else { - if (defined($firstname) && $firstname ne '') { - $fullname = $firstname; - } elsif (defined($lastname) && $lastname ne '') { - $fullname= " $lastname"; + $scripttag .= &Apache::lonhtmlcommon::javascript_valid_email(); + + 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'}; } - $r->print('
'); } - $r->print(< -
-
-
-
- - - - -
E-mail address: -
-
- - - - -
-
-
-
-
-
- - - - -
username/domain: -
-
- - - -
-END - my $udom_input = ''; - my $uname_input = ''; - if (defined($uname) && defined($udom)) { - $r->print('username: '.$uname.'  domain: '.$udom.$udom_input.$uname_input); - } else { - my $udomform = ''; - my $unameform = ''; - if (defined($udom)) { - $udomform = 'domain: '.$udom.$udom_input; - } elsif (defined($uname)) { - $unameform = 'username: '.$uname.'  '.$uname_input; - } - if ($udomform eq '') { - $udomform = 'domain: '; - $udomform .= &Apache::loncommon::select_dom_form('','udom'); + if ($env{'form.origurl'} eq '/adm/createaccount') { + if ($email eq '') { + if ($env{'form.useremail'} =~ /^[^\@]+\@[^\@]+$/) { + $email = &HTML::Entities::encode($env{'form.useremail'},'"<>&'); + } } - if ($unameform eq '') { - $unameform= 'username  '; + if ($uname eq '') { + if ($env{'form.useraccount'} =~ /^$match_username$/) { + $uname = &HTML::Entities::encode($env{'form.useraccount'},'"<>&'); + } } - $r->print($unameform.$udomform.'
Enter the username you use to log-in to your LON-CAPA system, and choose your domain.'); } - $r->print(< -
-
-
-
- - - - -
URL of page: -
-
- - - - -
- $server$origurl -
-
-
-
- - - - -
Phone #: -
-
- - - - -
-
-
-
-
-
- - - - -
Course Details: -
-
- - - -
-END - if ($coursecodes{$cnum}) { - foreach (@codetitles) { - $r->print(''.$_.': '.$codes{$cnum}{$_}); + my $details_title; + if ($codedom) { + $details_title = '
('.$codedom.')'; + } + + 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, + { 'function' => $function, + 'add_entries' => \%add_entries, + 'only_body' => 1,})); + if ($r->uri eq '/adm/helpdesk') { + &print_header($r,$origurl); + } + my @css = ('LC_evenrow_value','LC_oddrow_value'); + my $num = 1; + my $i = $num%2; + 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_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 .= &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_title( + ''. + $html_lt{'emad'}.' *' + ,undef,$css[$i]). + '&').'" />'."\n"; + unless ($shownsubmit) { + $output .= $topsubmit; + } + $output .= &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; + } } - $r->print('. '); - } else { - $r->print('Enter institutional course code:  - '); } - if ($ctitle) { - $r->print('
Title: '.$ctitle.''); - } else { - $r->print('
Enter course title:  - '); + 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 { + 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 .= &Apache::lonhtmlcommon::row_closure(); + $num ++; } - $r->print(< -
-
-
-
- - - - -
Section Number: -
-
- - - -
-END - if ($sectionlist) { - $r->print("&').'" />'."\n". + &Apache::lonhtmlcommon::row_closure(); + unless ($helpform{'phone'} eq 'no') { + my $reqd; + if ($helpform{'phone'} eq 'req') { + $reqd = '*'; + } + $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 .= $html_lt{'enin'}.':  + '."\n"; } else { - $r->print("
-
-
-
- - - - -
Subject -
-
- - - - -
- -
-
-
-
- - - - -
Detailed description: -
-
- - - - -
- -
-
-
-
- - - - -
Finish: -
-
+ $output .= &Apache::lonhtmlcommon::row_title($html_lt{'fini'},undef,$css[$i]); + $output .= <
- -   + +     - +
-
-
-
- - - END - - -# What do we know about this user? -# foreach (sort keys %ENV) { -# if ($_ =~ m/^browser/) { -# $r->print("key is $_, value is $ENV{$_}"); -# } elsif ($_ =~ m/^environment/) { -# $r->print("key is $_, value is $ENV{$_}"); -# } elsif ($_ =~ m/^request/) { -# $r->print("key is $_, value is $ENV{$_}"); -# } elsif ($_ =~ m/^user\.(domain|home|name)/) { -# $r->print("key is $_, value is $ENV{$_}"); -# } elsif ($_ =~ /^[A-Z]/) { -# $r->print("key is $_, value is $ENV{$_}"); -# } -# } - return + $output .= &Apache::lonhtmlcommon::row_closure(1); + $output .= &Apache::lonhtmlcommon::end_pick_box(); + $r->print(< +
+END + $r->print(&Apache::loncommon::end_page()); + return; } sub print_request_receipt { my ($r,$url,$function) = @_; - my @envvars = ('lonID','HTTP_HOST','HTTP_USER_AGENT','REMOTE_ADDR','SERVER_ADDR','SERVER_NAME','browser.os','browser.type','browser.version','user.home','request.role'); - my $bodytag = &Apache::loncommon::bodytag('',$function,'topmargin="0" marginheight="0"',1); - my $to = $Apache::lonnet::perlvar{'lonSupportEMail'}; + 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; + 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,$bcc,$addtext) = + &Apache::loncommon::build_recipient_list(undef,'helpdeskmail', + $defdom,$origmail); + my $from = $admin; + my %helpform; + my %domconfig = + &Apache::lonnet::get_dom('configuration',['contacts'],$defdom); + if (ref($domconfig{'contacts'}) eq 'HASH') { + if (ref($domconfig{'contacts'}{'helpform'}) eq 'HASH') { + %helpform = %{$domconfig{'contacts'}{'helpform'}}; + } + } my $reporttime = &Apache::lonlocal::locallocaltime(time); - my $fontcolor = &Apache::loncommon::designparm($function.'.font'); - my $vlinkcolor = &Apache::loncommon::designparm($function.'.vlink'); - my $tablecolor = &Apache::loncommon::designparm($function.'.tabbg'); - my @formvars = ('username','email','uname','udom','origurl','phone','section','coursecode','title','subject','description'); - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},\@formvars); - -# if ($ENV{'request.course.fn'}) { -# my $formdatafile = $ENV{'request.course.fn'}.'.formdata'; -# if (-e $formdatafile) { -# open(FILE,"<$formdatafile"); -# my @buffer =; -# close(FILE); -# foreach (@buffer) { -# print STDERR $_; -# } -# } -# } - - my $supportmsg = qq| -Name: $ENV{'form.username'} -Email: $ENV{'form.email'} -Username/domain: $ENV{'form.uname'} - $ENV{'form.udom'} -Tel: $ENV{'form.phone'} -Course Information: $ENV{'form.title'} - $ENV{'form.coursecode'} - section: $ENV{'form.section'} -Subject: $ENV{'form.subject'} -Description: $ENV{'form.description'} -URL: $ENV{'form.origurl'} -Date/Time: $reporttime + 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 $instcats = &Apache::lonnet::get_dom_instcats($defdom); + if (ref($instcats) eq 'HASH') { + if (ref($instcats->{'codes'}) eq 'HASH') { + $totcodes = scalar(keys(%{$instcats->{'codes'}})); + } + } + 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 ( + username => 'Name', + email => 'E-mail', + cc => 'Cc', + user => 'Username/domain', + phone => 'Phone', + crsi => 'Course Information', + subject => 'Subject', + description => 'Description', + sourceurl => 'URL', + date => 'Date/Time', + secn => 'Section', + warn => 'Warning: Problem with support e-mail address', + your => 'Your support request contained the following information', + sect => 'section', + info => 'Information supplied', + adin => 'Additional information recorded', + ); - |; - if ($to =~ m/^[^\@]+\@[^\@]+$/) { - $r->print(< - - LON-CAPA support request recorded - -$bodytag -

A support request has been sent to $to

+ 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'}); + } else { + $env{'form.cc'} =~ s/^\s+//; + $env{'form.cc'} =~ s/\s+$//; + @ccs = $env{'form.cc'}; + } + foreach my $cc (@ccs) { + $cc =~ s/^\s+//g; + $cc =~ s/\s+$//g; + if ($cc =~ m/^[^\@]+\@[^\@]+$/) { + if (!(grep(/^\Q$cc\E$/,@ok_ccs))) { + push(@ok_ccs,$cc); + } + } elsif ($cc ne '') { + if (!(grep(/^\Q$cc\E$/,@bad_ccs))) { + push(@bad_ccs,$cc); + } + } + } + if (@ok_ccs > 0) { + $okcclist = join(', ',@ok_ccs); + } + if (@bad_ccs == 1) { + 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) { + $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'}."'"; + if ($formvars{'course'}) { + $env{'form.crsi'} = $env{'form.title'}; + if ($coursecode ne '') { + $env{'form.crsi'} .= ' - '.$coursecode; + } + } + if ($formvars{'section'}) { + my $section; + if ($sectionlist) { + if ($coursecode eq $ccode) { + $section = $env{'form.sectionsel'} + } else { + $section = $env{'form.sectiontxt'}; + } + } else { + $section = $env{'form.section'}; + } + $env{'form.crsi'} .= ' - '.$lt{'sect'}.': '.$section; + } + my $supportmsg; + if ($formvars{'username'}) { + $supportmsg .= "$lt{'username'}: $env{'form.username'}\n"; + } + $supportmsg .= "$lt{'email'}: $env{'form.email'}\n"; + if (($homeserver) && (defined($env{'form.cc'})) && ($formvars{'cc'})) { + $supportmsg .= "$lt{'cc'}: $okcclist\n"; + } + if ($formvars{'user'}) { + $supportmsg .= "$lt{'user'}: $env{'form.user'}\n"; + } + if ($formvars{'phone'}) { + $supportmsg .= "$lt{'phone'}: $env{'form.phone'}\n"; + } + if ($formvars{'course'}) { + $supportmsg .= "$lt{'crsi'}: $env{'form.crsi'}\n"; + } + $supportmsg .= "$lt{'subject'}: $env{'form.subject'} +$lt{'description'}: $env{'form.description'} +$lt{'sourceurl'}: $env{'form.sourceurl'} +$lt{'date'}: $reporttime +"; + + my $displaymsg; + foreach my $item ('username','email','cc','user','phone','crsi','subject','description','sourceurl') { + if ($env{'form.'.$item} ne '') { + if ($item eq 'description') { + my $descrip = $env{'form.description'}; + $descrip = &Apache::loncommon::cleanup_html($descrip); + $descrip =~ s|[\n\r\f]|
|g; + $displaymsg .= + ''. + "$lt{$item}: $descrip
\n"; + } elsif ($item eq 'sourceurl') { + my $showurl = $env{'form.sourceurl'}; + $showurl =~ s/\?.*$//; + $showurl = &Apache::loncommon::cleanup_html($showurl); + $displaymsg .= + ''. + "$lt{$item}: $showurl
\n"; + } elsif ($item eq 'cc') { + 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 = &Apache::loncommon::cleanup_html($showitem); + $displaymsg .= + ''. + "$lt{$item}: $showitem
\n"; + } + } + } + $displaymsg .= ''. + $lt{'date'}.': '.$reporttime.'
'."\n"; + + my $start_page = + &Apache::loncommon::start_page('Support request recorded',undef, + {'function' => $function, + 'add_entries' => { + topmargin => "0", + marginheight => "0", + }, + 'only_body' => 1,}); + + $r->print(<<"END"); +$start_page + + + END - } else { + if ($r->uri eq '/adm/helpdesk') { + &print_header($r,$url,'process'); + } + my $bad_email = 0; + if ($to =~ /,/) { + my @ok_email; + foreach my $email (split(/,/,$to)) { + if ($email =~ m/^[^\@]+\@[^\@]+$/) { + if (!grep(/^\Q$email\E$/,@ok_email)) { + push(@ok_email,$email); + } + } + } + if (@ok_email > 0) { + $to = join(',',@ok_email); + } elsif ($admin =~ m/^[^\@]+\@[^\@]+$/) { + $to = $admin; + } else { + $bad_email = 1; + } + } elsif ($to !~ m/^[^\@]+\@[^\@]+$/) { + if ($admin =~ m/^[^\@]+\@[^\@]+$/) { + $to = $admin; + } else { + $bad_email = 1; + } + } + + my $message; + if (!$bad_email) { + $message = &Apache::lonhtmlcommon::confirm_success( + &mt('A support request has been sent to [_1]',''.$to.'')); + } else { + $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(< - - LON-CAPA support request recorded - -$bodytag -

Warning: Problem with support e-mail address

-As the e-mail address provided for this LON-CAPA server ($to) does not appear to be a valid e-mail address, your support request has not been sent to the LON-CAPA support staff at your institution. Instead a copy has been sent to the LON-CAPA support team at Michigan State University. -END } - my $msg = new Mail::Send; - $msg->to($to); -# if (defined($ENV{'form.email'})) { -# if ($ENV{'form.email'} =~ m/^[^\@]+\@[^\@]+$/) { -# $msg->from($ENV{'form.email'}); -# } -# } - $msg->subject('[LON-CAPA] - support request'); - if (my $fh = $msg->open()) { - print $fh $supportmsg; - $fh->close; + $r->print(&Apache::loncommon::confirmwrapper($message)); + + 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(<Your support request contained the following information:

- - - - + + my %cookies; + my $cookie=CGI::Cookie->parse($r->header_in('Cookie')); + 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] was included in the request sent by [_2].' + ,''.$fname.' '.$showsize, + ,$env{'user.name'}.':'.$env{'user.domain'} + ); + $supportmsg .= "\n"; + foreach my $var (@cookievars) { + $supportmsg .= "$var: $cookies{$var}\n"; + } + foreach my $var(@ENVvars) { + $supportmsg .= "$var: $ENV{$var}\n"; + } + foreach my $var (@envvars) { + $supportmsg .= "$var: $env{$var}\n"; + } + } + + my $cc_string; + if ($homeserver) { + if (@ok_ccs > 0) { + $cc_string = join(', ',@ok_ccs); + } + } + + my $attachment_text = ''; + unless ($homeserver && $attachmentpath) { + foreach my $var (@cookievars) { + $attachment_text .= "$var: $cookies{$var}\n"; + } + foreach my $var (@ENVvars) { + $attachment_text .= "$var: $ENV{$var}\n"; + } + foreach my $var (@envvars) { + $attachment_text .= "$var: $env{$var}\n"; + } + foreach my $var (@loncvars) { + $attachment_text .= "$var: $env{$var}\n"; + } + } + + 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; + } + } + + my $msg = MIME::Lite->new( + From => $from, + To => $to, + Subject => $subject, + Type =>'TEXT', + Data => $supportmsg, + ); + if ($homeserver) { + if (@ok_ccs > 0) { + my $cc_string = join(', ',@ok_ccs); + $msg->add("Cc" => $cc_string); + } + } + if ($bcc ne '') { + $msg->add("Bcc" => $bcc); + } + $msg->attr("content-type" => "text/plain"); + $msg->attr("content-type.charset" => "UTF-8"); + + if ($homeserver && $attachmentpath) { + my ($type, $encoding) = MIME::Types::by_suffix($attachmentpath); + $msg->attach(Type => $type, + Path => $attachmentpath, + Filename => $fname + ); + + } elsif ($attachment_text ne '') { + $msg->attach(Type => 'TEXT', + Data => $attachment_text); + } + +### Send it: + $msg->send('sendmail'); + + if ($attachmentpath =~ m|$Apache::lonnet::perlvar{'lonDaemons'}/tmp/helprequests/(\d+)/[^/]+|) { + unlink($attachmentpath); + } + $r->print(''.$lt{'your'}.':

'."\n"); + $r->print('
'. + &Apache::lonhtmlcommon::start_pick_box(). + &Apache::lonhtmlcommon::row_title($lt{'info'},undef,'LC_oddrow_value')."\n".$displaymsg."\n". + &Apache::lonhtmlcommon::row_closure(). + &Apache::lonhtmlcommon::row_title($lt{'adin'},undef,'LC_evenrow_value')); + my $envmsg; + foreach my $var (@cookievars) { + if ($cookies{$var} ne '') { + $envmsg.= ''. + $var.': '.$cookies{$var}.', '; + } + } + foreach my $var (@ENVvars) { + if ($ENV{$var} ne '') { + $envmsg .= ''. + $var.': '.$ENV{$var}.', '; + } + } + foreach my $var (@envvars) { + if ($env{$var} ne '') { + $envmsg .= ''. + $var.': '.$env{$var}.', '; + } + } + $envmsg =~ s/, $//; + $r->print($envmsg."\n". + &Apache::lonhtmlcommon::row_closure(1)."\n". + &Apache::lonhtmlcommon::end_pick_box(). + "
\n". + &Apache::loncommon::end_page()); +} + +sub print_header { + my ($r,$origurl,$command) = @_; + my $location=&Apache::loncommon::lonhttpdurl("/adm"); + my ($component_url); + my $helpdesk_link = ''; + if ($command eq 'process') { + $helpdesk_link = ''; + } + my %lt = &Apache::lonlocal::texthash ( + 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') { + $getstartlink = qq||; + $reviewtext = &mt('Please review the information in "Log-in help" and the "Getting started" guide if you are unable to log-in.'); + } else { + $reviewtext = &mt('Please review the information in "Log-in help" if you are unable to log-in.'); + } + 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"); +
- - - - -
- - - - -
- - - - - - - - - -
- - - - -
Information supplied -
-
- - - - -
-END - my @textmsg = split/\n/,$supportmsg; - foreach my $line (@textmsg) { - $line =~ s|^||; - $line =~ s|:|:|; - $r->print("$line
"); + + if (defined($env{'form.cc'})) { + if ($badccmsg) { + $displaymsg .= $badccmsg; + } } - $r->print('
-
- - - - -
Additional information recorded -
-
- - - - -
- '); - foreach (@envvars) { - $r->print("$_:  $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'); + } + } + } } - $r->print(" -
-
-
-
-
 $lt{'getst'}
+ + + + + + + + +END + if ($command ne 'process') { + 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 + + - "); +
+
 
 
$reviewtext + $lt{'ifyo'} +

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


+
'); + return; } -sub retrieve_instcodes { - my ($coursecodes,$codedom,$totcodes) = @_; - my %courses = &Apache::lonnet::courseiddump($codedom,'.',1); - foreach my $course (keys %courses) { - if ($courses{$course} =~ m/^[^:]*:([^:]+)$/) { - $$coursecodes{$course} = &Apache::lonnet::unescape($1); - $totcodes ++; +sub get_domain { + my $codedom; + if (exists($env{'form.codedom'})) { + if (&Apache::lonnet::domain($env{'form.codedom'}) ne '') { + return $env{'form.codedom'}; } } - return $totcodes; + if ($env{'request.course.id'}) { + $codedom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + } elsif ($env{'request.role.domain'}) { + $codedom = $env{'request.role.domain'}; + } else { + $codedom = &Apache::lonnet::default_login_domain(); + } + return $codedom; } 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.