--- loncom/interface/lonsupportreq.pm 2010/04/14 03:09:35 1.56
+++ loncom/interface/lonsupportreq.pm 2019/07/23 13:58:53 1.96
@@ -1,5 +1,7 @@
+# The LearningOnline Network with CAPA
+# Helpdesk request form
#
-# $Id: lonsupportreq.pm,v 1.56 2010/04/14 03:09:35 raeburn Exp $
+# $Id: lonsupportreq.pm,v 1.96 2019/07/23 13:58:53 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,21 @@ 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'};
+ if ($origurl =~ m{^https?://[^/]+(.*)$}) {
+ $origurl =~ $1;
+ }
+ $origurl =~ s/(`)//g;
+ $origurl =~ s/\$/\(\$\)/g;
my $command = $env{'form.command'};
if ($command eq 'process') {
@@ -67,43 +81,159 @@ 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 %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 = '';
+ }
+ }
+ }
+ 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 +252,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 +340,141 @@ function initialize_codes() {
my @css = ('LC_evenrow_value','LC_oddrow_value');
my $num = 1;
my $i = $num%2;
- $r->print('