# The LearningOnline Network with CAPA
# Helpdesk request form
#
# $Id: lonsupportreq.pm,v 1.105 2023/07/26 01:03:58 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 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 qw(:DEFAULT :match);
use HTML::Entities;
sub handler {
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'};
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,$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;
}
}
$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',
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;
}
$extra_validations
document.logproblem.submit();
}
END
$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'};
}
}
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 $details_title;
if ($codedom) {
$details_title = '
('.$codedom.')';
}
my $js = <<"ENDJS";
ENDJS
if ($knownuser) {
$js .="\n".'';
} elsif ($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('