--- loncom/interface/lonsupportreq.pm 2006/12/06 22:22:37 1.39 +++ loncom/interface/lonsupportreq.pm 2013/01/04 18:35:12 1.72 @@ -1,5 +1,5 @@ # -# $Id: lonsupportreq.pm,v 1.39 2006/12/06 22:22:37 albertel Exp $ +# $Id: lonsupportreq.pm,v 1.72 2013/01/04 18:35:12 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,18 +27,19 @@ 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::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) = @_; @@ -48,15 +49,30 @@ sub handler { 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 = $env{'form.function'}; - my $origurl = &unescape($env{'form.origurl'}); - my $action = $env{'form.action'}; + 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 ($action eq 'process') { + if ($command eq 'process') { &print_request_receipt($r,$origurl,$function); } else { &print_request_form($r,$origurl,$function); @@ -66,61 +82,93 @@ sub handler { 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 $tablecolor = &Apache::loncommon::designparm($function.'.tabbg'); - if (($tablecolor eq '') || ($tablecolor eq '#FFFFFF')) { - $tablecolor = '#EEEE99'; - } + my ($os,$browser,$bversion,$uhost,$uname,$udom,$uhome,$urole,$usec,$email,$cid, + $cdom,$cnum,$ctitle,$ccode,$sectionlist,$lastname,$firstname,$server, + $formname,$public,$homeserver); + $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'}; - $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'; - if ($origurl =~ m-^http://-) { - $server = $origurl; + if (($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) { + $public = 1; } else { - $server = 'http://'.$ENV{'SERVER_NAME'}.$origurl; + 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'}; } - my $scripttag = (<<'END'); + $formname = 'logproblem'; + my $machine = &Apache::lonnet::absolute_url(); + 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', + rsub => 'You must include a subject', + rdes => 'You must include a description', + 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 (128 KB max.)', + fini => 'Finish', + clfm => 'Clear Form', + ); + my $scripttag = (<<"END"); function validate() { if (validmail(document.logproblem.email) == false) { - alert("The e-mail address you entered: "+document.logproblem.email.value+" is not a valid e-mail address."); + alert("$lt{'email'}: "+document.logproblem.email.value+" $lt{'notv'}."); + return; + } + if (document.logproblem.subject.value == '') { + alert("$lt{'rsub'}."); + return; + } + if (document.logproblem.description.value == '') { + alert("$lt{'rdes'}."); return; } document.logproblem.submit(); } -function validmail(field) { - var str = field.value; - if (window.RegExp) { - var reg1str = "(@.*@)|(\\.\\.)|(@\\.)|(\\.@)|(^\\.)"; - var reg2str = "^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$"; //" - var reg1 = new RegExp(reg1str); - var reg2 = new RegExp(reg2str); - if (!reg1.test(str) && reg2.test(str)) { - return true; - } - return false; - } - else - { - if(str.indexOf("@") >= 0) { - return true; - } - return false; - } -} END - - if ($cid =~ m/_/) { - ($cdom,$cnum) = split/_/,$cid; + $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); @@ -128,41 +176,55 @@ END $ccode = $csettings{'internal.coursecode'}; $sectionlist = $csettings{'internal.sectionnums'}; } - if ($env{'environment.critnotification'}) { - $email = $env{'environment.critnotification'}; - } - if (!$email && $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 (@sections) { - my ($sec,$grp) = split/:/,$_; + + 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; + foreach my $section (@sections) { + my ($sec,$grp) = split(/:/,$section); $groupid{$sec} = $grp; } - my $codedom = $Apache::lonnet::perlvar{'lonDefDomain'}; - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['codedom']); - if (exists($env{'form.codedom'})) { - $codedom = $env{'form.codedom'}; + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['codedom', + 'useremail','useraccount']); + 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'},'"<>&'); + } + } } + 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 %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; @@ -172,9 +234,6 @@ function initialize_codes() { return; } |; - if ($cdom) { - $codedom = $cdom; - } if ($cnum) { $coursecodes{$cnum} = $ccode; if ($ccode eq '') { @@ -204,238 +263,152 @@ 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();", + ); - my $start_page = - &Apache::loncommon::start_page('Support Request',$js, + + $r->print(&Apache::loncommon::start_page('Support Request',$js, { 'function' => $function, 'add_entries' => \%add_entries, - 'only_body' => 1,}); - $r->print($start_page); - + 'only_body' => 1,})); if ($r->uri eq '/adm/helpdesk') { &print_header($r,$origurl); } - $r->print(<<"END"); -
- - - - -
- - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -END - if (defined($env{'user.name'})) { - $r->print(< - - - - - - -END + $output .= &Apache::lonhtmlcommon::row_closure(); + $num ++; + $i = $num%2; + $output .= &Apache::lonhtmlcommon::row_title($lt{'subj'},undef,'LC_oddrow_value'). + ' '."\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)) { + 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; + } } - - $r->print(< - -
- - - - -
Name: -
-
- - - - -
-END + my @css = ('LC_evenrow_value','LC_oddrow_value'); + my $num = 1; + my $i = $num%2; + 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"; - $r->print("$fullname"); + $output .= $fullname.'&').'" />'."\n"; } else { if (defined($firstname) && $firstname ne '') { $fullname = $firstname; } elsif (defined($lastname) && $lastname ne '') { - $fullname= " $lastname"; + $fullname = " $lastname"; } - $r->print(''); + $output .= '&').'" />'."\n"; } - $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); + $output .= '      '. + &Apache::lonhtmlcommon::row_closure()."\n"; + $num ++; + $i = $num%2; + $output .= &Apache::lonhtmlcommon::row_title($lt{'emad'},undef,$css[$i]). + '&').'" />
'."\n". + &Apache::lonhtmlcommon::row_closure(); + $num ++; + $i = $num%2; + if (($env{'user.name'} =~ /^$match_username$/) && (!$public)) { + 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 = '&').'" />'."\n"; + my $uname_input = '&').'" />'."\n"; + if (($env{'user.name'} =~ /^$match_username$/) && + ($env{'user.domain'} =~ /^$match_domain$/) && (!$public)) { + $output .= ''.$lt{'unme'}.': '.$uname.'  '.$lt{'doma'}.': '.$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 (($env{'user.domain'} =~ /^$match_domain$/) && (!$public)) { + $output .= $lt{'entu'}; + } elsif (($env{'user.name'} =~ /^$match_username$/) && (!$public)) { + $output .= $lt{'chdo'}; + } else { + $output .= $lt{'entr'}; + } + $output .= '
'."\n"; + if (!$public) { + if ($env{'user.domain'} =~ /^$match_domain$/) { + $udomform = ''.$lt{'doma'}.': '.$udom.$udom_input; + } elsif ($env{'user.name'} =~ /^$match_username$/) { + $unameform = ''.$lt{'unme'}.': '.$uname.'  '.$uname_input; + } } if ($udomform eq '') { - $udomform = 'domain: '; - $udomform .= &Apache::loncommon::select_dom_form($codedom,'udom'); + $udomform = ''.$lt{'doma'}.': '; + $udomform .= &Apache::loncommon::select_dom_form($codedom,'udom')."\n"; } if ($unameform eq '') { - $unameform= 'username  '; + $unameform= ''.$lt{'unme'}.'  '; } - $r->print($unameform.$udomform.'
Enter the username you use to log-in to your LON-CAPA system, and choose your domain.'); + $output .= $unameform.$udomform; } - $r->print(< -
-
-
-
- - - - -
URL of page: -
-
- - - - -
- $server -
-
-
-
- - - - -
Phone #: -
-
- - - - -
-
-
-
-
-
- - - - -
Course Details:$details_title -
-
- - - -
-END - if ($cnum) { + $output .= &Apache::lonhtmlcommon::row_closure(); + $num ++; + $i = $num%2; + $output .= &Apache::lonhtmlcommon::row_title("$lt{'urlp'}",undef,$css[$i]). + $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; + $output .= &Apache::lonhtmlcommon::row_title("$lt{'crsd'}$details_title",undef,$css[$i]); + if ($cnum) { if ($coursecodes{$cnum}) { - foreach (@codetitles) { - $r->print(''.$_.': '.$codes{$cnum}{$_}.'; '); + foreach my $item (@codetitles) { + $output .= ''.$item.': '.$codes{$cnum}{$item}.'; '; } - $r->print(' '); + $output .= ' &').'" />'."\n"; } else { - $r->print('Enter institutional course code:  - '); + $output .= $lt{'enin'}.':  + '."\n"; } } else { if ($totcodes > 0) { my $numtitles = @codetitles; if ($numtitles == 0) { - $r->print('Enter institutional course code:  - '); + $output .= $lt{'enin'}.':  + '."\n"; } else { + my @standardnames = &Apache::loncommon::get_standard_codeitems(); my $lasttitle = $numtitles; if ($numtitles > 4) { $lasttitle = 4; } - $r->print('
'.$codetitles[0].'
'."\n". - ''); + $output .= ''; for (my $i=1; $i<$numtitles; $i++) { - $r->print('' - ); + ''."\n"; } - $r->print('
'.$codetitles[0].'
'."\n". + '
'.$codetitles[$i].'
'."\n". - '
'.$codetitles[$i].'
'."\n". + ''."\n". - '
'); + $output .= '
'; if ($numtitles > 4) { - $r->print('

'.$codetitles[$numtitles].'
'."\n". - ''."\n"); + $output .= '

'.$codetitles[$numtitles].'
'."\n". + ''."\n"; } } } else { - $r->print('Enter institutional course code:  - '); + $output .= $lt{'enin'}.':  + '."\n"; } } if ($ctitle) { - $r->print('
Title: '.$ctitle.''); + $output .= '
'.$lt{'titl'}.': '.$ctitle. + '&').'" />'."\n"; } else { - $r->print('
Enter course title:  - '); + $output .= '
'.$lt{'enct'}.':  + '."\n"; } - $r->print(< -
-
-
-
- - - - -
Section Number: -
-
- - - -
-END + $output .= &Apache::lonhtmlcommon::row_closure(); + $num ++; + $i = $num%2; + $output .= &Apache::lonhtmlcommon::row_title($lt{'secn'},undef,$css[$i]); if ($sectionlist) { - $r->print("". + " \n"; + foreach my $id (sort(keys(%groupid))) { + if ($id eq $groupid{$id} || $groupid{$id} eq '') { + $output .= " \n"; } else { - $r->print(" \n"); + $output .= " \n"; } } - $r->print(""); + $output .= ""; } else { - $r->print(""); + $output .= ''."\n"; } - $r->print(< -
-
-
-
- - - - -
Subject -
-
- - - - -
- -
-
-
-
- - - - -
Detailed description: -
-
- - - - -
- -
-
-
-
- - - - -
Optional file upload: -
-
- - - - -
-
Upload a file (e.g., a screenshot) relevant to your support request (128 KB max. size). -
-
-
-
- - - - -
Finish: -
-
+ $output .= &Apache::lonhtmlcommon::row_title($lt{'fini'},undef,$css[$i]); + $output .= <
- -   + +     - +
-
-
-
- - - +END + $output .= &Apache::lonhtmlcommon::row_closure(1); + $output .= &Apache::lonhtmlcommon::end_pick_box(); + $r->print(< +
END $r->print(&Apache::loncommon::end_page()); return; @@ -649,61 +536,202 @@ END sub print_request_receipt { my ($r,$url,$function) = @_; + my $public; + if (($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) { + $public = 1; + } + unless (($env{'user.name'} =~ /^$match_username$/) && (!$public)) { + my $lonhost = $r->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'); my @cookievars = ('lonID'); my $admin = $Apache::lonnet::perlvar{'lonAdminMail'}; - my $to = $Apache::lonnet::perlvar{'lonSupportEMail'}; + 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 %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); + } + } + } + } + } 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','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'}; + my $totcodes = 0; + my %coursecodes; + $totcodes = &Apache::courseclassifier::retrieve_instcodes(\%coursecodes,$defdom,$totcodes); + 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', + ); + + 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'}); } - if (defined($env{'form.Semester'})) { - $coursecode .= $env{'form.Semester'}; + } + + if (($homeserver) && (defined($env{'form.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 (defined($env{'form.Department'})) { - $coursecode .= $env{'form.Department'}; + 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: ').&cleanup_html($bad_ccs[0]); + } + } elsif (@bad_ccs > 1) { + $badccmsg .= '
'.&mt('The following Cc e-mail addresses are invalid: '). &cleanup_html(join(', ',@bad_ccs)); } - if (defined($env{'form.Number'})) { - $coursecode .= $env{'form.Number'}; - } - } - 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'} - $coursecode - section: $env{'form.section'} -Subject: $env{'form.subject'} -Description: $env{'form.description'} -URL: $env{'form.sourceurl'} -Date/Time: $reporttime + } + $env{'form.user'} = "'".$env{'form.uname'}.':'.$env{'form.udom'}."'"; + $env{'form.crsi'} = $env{'form.title'}.' - '.$coursecode.' - '.$lt{'sect'}.': '.$env{'form.section'}; + my $supportmsg = <#g; - my $displaymsg = 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'} - $coursecode - section: $env{'form.section'}
-Subject: $env{'form.subject'}
-Description: $descrip
-URL: $env{'form.sourceurl'}
-Date/Time: $reporttime
- |; +END + 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 = &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 = &cleanup_html($showurl); + $displaymsg .= + ''. + "$lt{$item}: $showurl
\n"; + } elsif ($item eq 'cc') { + if ($okcclist) { + my $showcclist = &cleanup_html($okcclist); + $displaymsg .= + ''. + "$lt{$item}: $showcclist
\n"; + } + } else { + my $showitem = $env{'form.'.$item}; + $showitem = &cleanup_html($showitem); + $displaymsg .= + ''. + "$lt{$item}: $showitem
\n"; + } + } + } + $displaymsg .= ''. + $lt{'date'}.': '.$reporttime.'
'."\n"; my $start_page = &Apache::loncommon::start_page('Support request recorded',undef, @@ -717,56 +745,87 @@ Date/Time: $reporttime $r->print(<<"END"); $start_page - + END if ($r->uri eq '/adm/helpdesk') { &print_header($r,$url,'process'); } - if ($to =~ m/^[^\@]+\@[^\@]+$/) { - $r->print("

A support request has been sent to $to

"); - } else { - $to = $admin; - if ($to =~ m/^[^\@]+\@[^\@]+$/) { - $r->print("

A support request has been sent to $to

"); -END + 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 { - $r->print(<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 or administrator at your institution. Instead a copy has been sent to the LON-CAPA support team at Michigan State University. -END - $to = 'helpdesk@lon-capa.org'; + $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(&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'}; } } + if (defined($env{'form.cc'})) { + if ($badccmsg) { + $displaymsg .= $badccmsg; + } + } + my $subject = $env{'form.subject'}; - $subject =~ s#(`)#'#g; - $subject =~ s#\$#\(\$\)#g; - $supportmsg =~ s#(`)#'#g; - $supportmsg =~ s#\$#\(\$\)#g; - $displaymsg =~ s#(`)#'#g; - $displaymsg =~ s#\$#\(\$\)#g; + $subject =~ s/(`)/'/g; + $subject =~ s/\$/\(\$\)/g; + $supportmsg =~ s/(`)/'/g; + $supportmsg =~ s/\$/\(\$\)/g; + $displaymsg =~ s/(`)/'/g; + $displaymsg =~ s/\$/\(\$\)/g; my $fname; my $attachmentpath = ''; my $attachmentsize = ''; - if (defined($env{'user.name'})) { - if ($env{'form.screenshot.filename'}) { + if ((defined($env{'user.name'})) && (!$public)) { + if ($homeserver && $env{'form.screenshot.filename'}) { $attachmentsize = length($env{'form.screenshot'}); if ($attachmentsize > 131072) { - $displaymsg .= "
The uploaded screenshot file ($attachmentsize bytes) included with your request exceeded the maximum allowed size - 128 KB, and has therefore been discarded."; + $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 %cookies = (); + my %cookies; my $cookie=CGI::Cookie->parse($r->header_in('Cookie')); if ($$cookie{'lonID'} =~ /lonID=($LONCAPA::handle_re);/) { $cookies{'lonID'} = $1; @@ -774,16 +833,21 @@ END if ($attachmentpath =~ m-/([^/]+)$-) { $fname = $1; - $displaymsg .= "
An uploaded screenshot file - $fname ($attachmentsize bytes) was included in the request sent by $env{'user.name'} from LON-CAPA domain: $env{'user.domain'}"; + $displaymsg .= '
' + .&mt('An uploaded screenshot file [_1] ([_2] bytes) was included in the request sent by [_3].' + ,''.$fname.'' + ,$attachmentsize + ,$env{'user.name'}.':'.$env{'user.domain'} + ); $supportmsg .= "\n"; - foreach (@cookievars) { - $supportmsg .= "$_: $cookies{$_}\n"; + foreach my $var (@cookievars) { + $supportmsg .= "$var: $cookies{$var}\n"; } - foreach (@ENVvars) { - $supportmsg .= "$_: $ENV{$_}\n"; + foreach my $var(@ENVvars) { + $supportmsg .= "$var: $ENV{$var}\n"; } - foreach (@envvars) { - $supportmsg .= "$_: $env{$_}\n"; + foreach my $var (@envvars) { + $supportmsg .= "$var: $env{$var}\n"; } } @@ -794,8 +858,19 @@ END 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 ($attachmentpath) { + if ($homeserver && $attachmentpath) { my ($type, $encoding) = MIME::Types::by_suffix($attachmentpath); $msg->attach(Type => $type, Path => $attachmentpath, @@ -804,17 +879,17 @@ END } else { my $envdata = ''; - foreach (@cookievars) { - $envdata .= "$_: $cookies{$_}\n"; + foreach my $var (@cookievars) { + $envdata .= "$var: $cookies{$var}\n"; } - foreach (@ENVvars) { - $envdata .= "$_: $ENV{$_}\n"; + foreach my $var (@ENVvars) { + $envdata .= "$var: $ENV{$var}\n"; } - foreach (@envvars) { - $envdata .= "$_: $env{$_}\n"; + foreach my $var (@envvars) { + $envdata .= "$var: $env{$var}\n"; } - foreach (@loncvars) { - $envdata .= "$_: $env{$_}\n"; + foreach my $var (@loncvars) { + $envdata .= "$var: $env{$var}\n"; } $msg->attach(Type => 'TEXT', Data => $envdata); @@ -823,160 +898,158 @@ END ### Send it: $msg->send('sendmail'); - if ($attachmentpath =~ m#$Apache::lonnet::perlvar{'lonDaemons'}/tmp/helprequests/(\d+)/[^/]+#) { + if ($attachmentpath =~ m|$Apache::lonnet::perlvar{'lonDaemons'}/tmp/helprequests/(\d+)/[^/]+|) { unlink($attachmentpath); } - $r->print(qq| - Your support request contained the following information:

- - - - -
- - - - -
- - - - -
- - - - - - - - - - - - -
- - - - -
Information supplied -
-
- - - - -
$displaymsg
-
-
-
- - - - -
Additional information recorded -
-
- - - - -
- |); - foreach (@cookievars) { - unless($cookies{$_} eq '') { - $r->print("$_: $cookies{$_}, "); - } - } - foreach (@ENVvars) { - unless($ENV{$_} eq '') { - $r->print("$_: $ENV{$_}, "); - } - } - foreach (@envvars) { - unless($env{$_} eq '') { - $r->print("$_: $env{$_}, "); - } - } - $r->print(" -
-
-
-
-
- "); - $r->print(&Apache::loncommon::end_page()); + $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,$action) = @_; + my ($r,$origurl,$command) = @_; my $location=&Apache::loncommon::lonhttpdurl("/adm"); - my $tablecolor = '#EEEE99'; my ($component_url); my $helpdesk_link = ''; - if ($action eq 'process') { + 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' + 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,$getstarttext); + my ($getstartlink,$reviewtext); if (-e $Apache::lonnet::perlvar{'lonDocRoot'}.'/adm/gettingstarted.html') { $getstartlink = qq| $lt{'getst'}|; - $getstarttext = ' '.&mt('and the "Getting started" guide').' '; + $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.'); } - $r->print(<   - -
  LON-CAPA help/support - - - - + 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"); +
- - - - -
- - - - -
- - - - $getstartlink - - -
(Login help) $lt{'login'} $helpdesk_link(Ask helpdesk) $lt{'ask'}  (Back to last location) $lt{'back'} 
-
-
-
+ + + - + - - + + END - unless ($action eq 'process') { - $r->print(' + 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 + +
  
 
 
'.&mt(' -Please review the information in "Log-in help"').$getstarttext.' '.&mt('if you are unable to log-in').'. '.&mt('If your problem is still unresolved, the form below can be used to send a question to the LON-CAPA helpdesk').'.
'.&mt('Note').': '.&mt('Student questions about course content should be directed to the course instructor').'.

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

'); return; } +sub get_domain { + my $codedom; + if (exists($env{'form.codedom'})) { + 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'}; + } else { + $codedom = &Apache::lonnet::default_login_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; + $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.