version 1.1075.2.70, 2014/04/23 10:33:52
|
version 1.1075.2.108, 2016/08/13 20:20:23
|
Line 72 use Apache::lonuserstate();
|
Line 72 use Apache::lonuserstate();
|
use Apache::courseclassifier(); |
use Apache::courseclassifier(); |
use LONCAPA qw(:DEFAULT :match); |
use LONCAPA qw(:DEFAULT :match); |
use DateTime::TimeZone; |
use DateTime::TimeZone; |
use DateTime::Locale::Catalog; |
use DateTime::Locale; |
|
use Encode(); |
use Authen::Captcha; |
use Authen::Captcha; |
use Captcha::reCAPTCHA; |
use Captcha::reCAPTCHA; |
|
use JSON::DWIW; |
|
use LWP::UserAgent; |
use Crypt::DES; |
use Crypt::DES; |
use DynaLoader; # for Crypt::DES version |
use DynaLoader; # for Crypt::DES version |
|
|
Line 532 ENDAUTHORBRW
|
Line 535 ENDAUTHORBRW
|
|
|
sub coursebrowser_javascript { |
sub coursebrowser_javascript { |
my ($domainfilter,$sec_element,$formname,$role_element,$crstype, |
my ($domainfilter,$sec_element,$formname,$role_element,$crstype, |
$credits_element) = @_; |
$credits_element,$instcode) = @_; |
my $wintitle = 'Course_Browser'; |
my $wintitle = 'Course_Browser'; |
if ($crstype eq 'Community') { |
if ($crstype eq 'Community') { |
$wintitle = 'Community_Browser'; |
$wintitle = 'Community_Browser'; |
Line 583 sub coursebrowser_javascript {
|
Line 586 sub coursebrowser_javascript {
|
var ownername = document.forms[formid].ccuname.value; |
var ownername = document.forms[formid].ccuname.value; |
var ownerdom = document.forms[formid].ccdomain.options[document.forms[formid].ccdomain.selectedIndex].value; |
var ownerdom = document.forms[formid].ccdomain.options[document.forms[formid].ccdomain.selectedIndex].value; |
url += '&cloner='+ownername+':'+ownerdom; |
url += '&cloner='+ownername+':'+ownerdom; |
|
if (type == 'Course') { |
|
url += '&crscode='+document.forms[formid].crscode.value; |
|
} |
|
} |
|
if (formname == 'requestcrs') { |
|
url += '&crsdom=$domainfilter&crscode=$instcode'; |
} |
} |
if (multflag !=null && multflag != '') { |
if (multflag !=null && multflag != '') { |
url += '&multiple='+multflag; |
url += '&multiple='+multflag; |
Line 958 sub select_datelocale {
|
Line 967 sub select_datelocale {
|
} |
} |
$output .= '> </option>'; |
$output .= '> </option>'; |
} |
} |
|
my @languages = &Apache::lonlocal::preferred_languages(); |
my (@possibles,%locale_names); |
my (@possibles,%locale_names); |
my @locales = DateTime::Locale::Catalog::Locales; |
my @locales = DateTime::Locale->ids(); |
foreach my $locale (@locales) { |
foreach my $id (@locales) { |
if (ref($locale) eq 'HASH') { |
if ($id ne '') { |
my $id = $locale->{'id'}; |
my ($en_terr,$native_terr); |
if ($id ne '') { |
my $loc = DateTime::Locale->load($id); |
my $en_terr = $locale->{'en_territory'}; |
if (ref($loc)) { |
my $native_terr = $locale->{'native_territory'}; |
$en_terr = $loc->name(); |
my @languages = &Apache::lonlocal::preferred_languages(); |
$native_terr = $loc->native_name(); |
if (grep(/^en$/,@languages) || !@languages) { |
if (grep(/^en$/,@languages) || !@languages) { |
if ($en_terr ne '') { |
if ($en_terr ne '') { |
$locale_names{$id} = '('.$en_terr.')'; |
$locale_names{$id} = '('.$en_terr.')'; |
Line 980 sub select_datelocale {
|
Line 990 sub select_datelocale {
|
$locale_names{$id} = '('.$en_terr.')'; |
$locale_names{$id} = '('.$en_terr.')'; |
} |
} |
} |
} |
push (@possibles,$id); |
$locale_names{$id} = Encode::encode('UTF-8',$locale_names{$id}); |
|
push(@possibles,$id); |
} |
} |
} |
} |
} |
} |
Line 991 sub select_datelocale {
|
Line 1002 sub select_datelocale {
|
} |
} |
$output.=">$item"; |
$output.=">$item"; |
if ($locale_names{$item} ne '') { |
if ($locale_names{$item} ne '') { |
$output.=" $locale_names{$item}</option>\n"; |
$output.=' '.$locale_names{$item}; |
} |
} |
$output.="</option>\n"; |
$output.="</option>\n"; |
} |
} |
Line 1292 sub helpLatexCheatsheet {
|
Line 1303 sub helpLatexCheatsheet {
|
unless ($not_author) { |
unless ($not_author) { |
$out .= ' <span>' |
$out .= ' <span>' |
.&help_open_topic('Authoring_Output_Tags',&mt('Output Tags'),$stayOnPage,undef,600) |
.&help_open_topic('Authoring_Output_Tags',&mt('Output Tags'),$stayOnPage,undef,600) |
.'</span>'; |
.'</span> <span>' |
|
.&help_open_topic('Authoring_Multilingual_Problems',&mt('Languages'),$stayOnPage,undef,600) |
|
.'</span>'; |
} |
} |
$out .= '</span>'; # End cheatsheet |
$out .= '</span>'; # End cheatsheet |
return $out; |
return $out; |
Line 2339 Outputs:
|
Line 2352 Outputs:
|
|
|
=item * $clientinfo |
=item * $clientinfo |
|
|
|
=item * $clientosversion |
|
|
=back |
=back |
|
|
=back |
=back |
Line 2358 sub decode_user_agent {
|
Line 2373 sub decode_user_agent {
|
my $clientmathml=''; |
my $clientmathml=''; |
my $clientunicode='0'; |
my $clientunicode='0'; |
my $clientmobile=0; |
my $clientmobile=0; |
|
my $clientosversion=''; |
for (my $i=0;$i<=$#browsertype;$i++) { |
for (my $i=0;$i<=$#browsertype;$i++) { |
my ($bname,$match,$notmatch,$vreg,$minv,$univ)=split(/\:/,$browsertype[$i]); |
my ($bname,$match,$notmatch,$vreg,$minv,$univ)=split(/\%/,$browsertype[$i]); |
if (($httpbrowser=~/$match/i) && ($httpbrowser!~/$notmatch/i)) { |
if (($httpbrowser=~/$match/i) && ($httpbrowser!~/$notmatch/i)) { |
$clientbrowser=$bname; |
$clientbrowser=$bname; |
$httpbrowser=~/$vreg/i; |
$httpbrowser=~/$vreg/i; |
Line 2379 sub decode_user_agent {
|
Line 2395 sub decode_user_agent {
|
if ($httpbrowser=~/next/i) { $clientos='next'; } |
if ($httpbrowser=~/next/i) { $clientos='next'; } |
if (($httpbrowser=~/mac/i) || |
if (($httpbrowser=~/mac/i) || |
($httpbrowser=~/powerpc/i)) { $clientos='mac'; } |
($httpbrowser=~/powerpc/i)) { $clientos='mac'; } |
if ($httpbrowser=~/win/i) { $clientos='win'; } |
if ($httpbrowser=~/win/i) { |
|
$clientos='win'; |
|
if ($httpbrowser =~/Windows\s+NT\s+(\d+\.\d+)/i) { |
|
$clientosversion = $1; |
|
} |
|
} |
if ($httpbrowser=~/embed/i) { $clientos='pda'; } |
if ($httpbrowser=~/embed/i) { $clientos='pda'; } |
if ($httpbrowser=~/(Android|iPod|iPad|iPhone|webOS|Blackberry|Windows Phone|Opera m(?:ob|in)|Fennec)/i) { |
if ($httpbrowser=~/(Android|iPod|iPad|iPhone|webOS|Blackberry|Windows Phone|Opera m(?:ob|in)|Fennec)/i) { |
$clientmobile=lc($1); |
$clientmobile=lc($1); |
Line 2390 sub decode_user_agent {
|
Line 2411 sub decode_user_agent {
|
$clientinfo = 'chromeframe-'.$1; |
$clientinfo = 'chromeframe-'.$1; |
} |
} |
return ($httpbrowser,$clientbrowser,$clientversion,$clientmathml, |
return ($httpbrowser,$clientbrowser,$clientversion,$clientmathml, |
$clientunicode,$clientos,$clientmobile,$clientinfo); |
$clientunicode,$clientos,$clientmobile,$clientinfo, |
|
$clientosversion); |
} |
} |
|
|
############################################################### |
############################################################### |
Line 3666 sub user_lang {
|
Line 3688 sub user_lang {
|
=over 4 |
=over 4 |
|
|
=item * &get_previous_attempt($symb, $username, $domain, $course, |
=item * &get_previous_attempt($symb, $username, $domain, $course, |
$getattempt, $regexp, $gradesub) |
$getattempt, $regexp, $gradesub, $usec, $identifier) |
|
|
Return string with previous attempt on problem. Arguments: |
Return string with previous attempt on problem. Arguments: |
|
|
Line 3688 Return string with previous attempt on p
|
Line 3710 Return string with previous attempt on p
|
|
|
=item * $gradesub: routine that processes the string if it matches $regexp |
=item * $gradesub: routine that processes the string if it matches $regexp |
|
|
|
=item * $usec: section of the desired student |
|
|
|
=item * $identifier: counter for student (multiple students one problem) or |
|
problem (one student; whole sequence). |
|
|
=back |
=back |
|
|
The output string is a table containing all desired attempts, if any. |
The output string is a table containing all desired attempts, if any. |
Line 3695 The output string is a table containing
|
Line 3722 The output string is a table containing
|
=cut |
=cut |
|
|
sub get_previous_attempt { |
sub get_previous_attempt { |
my ($symb,$username,$domain,$course,$getattempt,$regexp,$gradesub)=@_; |
my ($symb,$username,$domain,$course,$getattempt,$regexp,$gradesub,$usec,$identifier)=@_; |
my $prevattempts=''; |
my $prevattempts=''; |
no strict 'refs'; |
no strict 'refs'; |
if ($symb) { |
if ($symb) { |
Line 3705 sub get_previous_attempt {
|
Line 3732 sub get_previous_attempt {
|
my %lasthash=(); |
my %lasthash=(); |
my $version; |
my $version; |
for ($version=1;$version<=$returnhash{'version'};$version++) { |
for ($version=1;$version<=$returnhash{'version'};$version++) { |
foreach my $key (sort(split(/\:/,$returnhash{$version.':keys'}))) { |
foreach my $key (reverse(sort(split(/\:/,$returnhash{$version.':keys'})))) { |
$lasthash{$key}=$returnhash{$version.':'.$key}; |
if ($key =~ /\.rawrndseed$/) { |
|
my ($id) = ($key =~ /^(.+)\.rawrndseed$/); |
|
$lasthash{$id.'.rndseed'} = $returnhash{$version.':'.$key}; |
|
} else { |
|
$lasthash{$key}=$returnhash{$version.':'.$key}; |
|
} |
} |
} |
} |
} |
$prevattempts=&start_data_table().&start_data_table_header_row(); |
$prevattempts=&start_data_table().&start_data_table_header_row(); |
$prevattempts.='<th>'.&mt('History').'</th>'; |
$prevattempts.='<th>'.&mt('History').'</th>'; |
my (%typeparts,%lasthidden); |
my (%typeparts,%lasthidden,%regraded,%hidestatus); |
my $showsurv=&Apache::lonnet::allowed('vas',$env{'request.course.id'}); |
my $showsurv=&Apache::lonnet::allowed('vas',$env{'request.course.id'}); |
foreach my $key (sort(keys(%lasthash))) { |
foreach my $key (sort(keys(%lasthash))) { |
my ($ign,@parts) = split(/\./,$key); |
my ($ign,@parts) = split(/\./,$key); |
Line 3728 sub get_previous_attempt {
|
Line 3760 sub get_previous_attempt {
|
$lasthidden{$ign.'.'.$id} = 1; |
$lasthidden{$ign.'.'.$id} = 1; |
} |
} |
} |
} |
|
if ($identifier ne '') { |
|
my $id = join(',',@parts); |
|
if (&Apache::lonnet::EXT("resource.$id.problemstatus",$symb, |
|
$domain,$username,$usec,undef,$course) =~ /^no/) { |
|
$hidestatus{$ign.'.'.$id} = 1; |
|
} |
|
} |
|
} elsif ($data eq 'regrader') { |
|
if (($identifier ne '') && (@parts)) { |
|
my $id = join(',',@parts); |
|
$regraded{$ign.'.'.$id} = 1; |
|
} |
} |
} |
} else { |
} else { |
if ($#parts == 0) { |
if ($#parts == 0) { |
Line 3739 sub get_previous_attempt {
|
Line 3783 sub get_previous_attempt {
|
} |
} |
$prevattempts.=&end_data_table_header_row(); |
$prevattempts.=&end_data_table_header_row(); |
if ($getattempt eq '') { |
if ($getattempt eq '') { |
|
my (%solved,%resets,%probstatus); |
|
if (($identifier ne '') && (keys(%regraded) > 0)) { |
|
for ($version=1;$version<=$returnhash{'version'};$version++) { |
|
foreach my $id (keys(%regraded)) { |
|
if (($returnhash{$version.':'.$id.'.regrader'}) && |
|
($returnhash{$version.':'.$id.'.tries'} eq '') && |
|
($returnhash{$version.':'.$id.'.award'} eq '')) { |
|
push(@{$resets{$id}},$version); |
|
} |
|
} |
|
} |
|
} |
for ($version=1;$version<=$returnhash{'version'};$version++) { |
for ($version=1;$version<=$returnhash{'version'};$version++) { |
my @hidden; |
my (@hidden,@unsolved); |
if (%typeparts) { |
if (%typeparts) { |
foreach my $id (keys(%typeparts)) { |
foreach my $id (keys(%typeparts)) { |
if (($returnhash{$version.':'.$id.'.type'} eq 'anonsurvey') || ($returnhash{$version.':'.$id.'.type'} eq 'anonsurveycred')) { |
if (($returnhash{$version.':'.$id.'.type'} eq 'anonsurvey') || |
|
($returnhash{$version.':'.$id.'.type'} eq 'anonsurveycred')) { |
push(@hidden,$id); |
push(@hidden,$id); |
|
} elsif ($identifier ne '') { |
|
unless (($returnhash{$version.':'.$id.'.type'} eq 'survey') || |
|
($returnhash{$version.':'.$id.'.type'} eq 'surveycred') || |
|
($hidestatus{$id})) { |
|
next if ((ref($resets{$id}) eq 'ARRAY') && grep(/^\Q$version\E$/,@{$resets{$id}})); |
|
if ($returnhash{$version.':'.$id.'.solved'} eq 'correct_by_student') { |
|
push(@{$solved{$id}},$version); |
|
} elsif (($returnhash{$version.':'.$id.'.solved'} ne '') && |
|
(ref($solved{$id}) eq 'ARRAY')) { |
|
my $skip; |
|
if (ref($resets{$id}) eq 'ARRAY') { |
|
foreach my $reset (@{$resets{$id}}) { |
|
if ($reset > $solved{$id}[-1]) { |
|
$skip=1; |
|
last; |
|
} |
|
} |
|
} |
|
unless ($skip) { |
|
my ($ign,$partslist) = split(/\./,$id,2); |
|
push(@unsolved,$partslist); |
|
} |
|
} |
|
} |
} |
} |
} |
} |
} |
} |
$prevattempts.=&start_data_table_row(). |
$prevattempts.=&start_data_table_row(). |
'<td>'.&mt('Transaction [_1]',$version).'</td>'; |
'<td>'.&mt('Transaction [_1]',$version); |
|
if (@unsolved) { |
|
$prevattempts .= '<span class="LC_nobreak"><label>'. |
|
'<input type="checkbox" name="HIDE'.$identifier.'" value="'.$version.':'.join('_',@unsolved).'" />'. |
|
&mt('Hide').'</label></span>'; |
|
} |
|
$prevattempts .= '</td>'; |
if (@hidden) { |
if (@hidden) { |
foreach my $key (sort(keys(%lasthash))) { |
foreach my $key (sort(keys(%lasthash))) { |
next if ($key =~ /\.foilorder$/); |
next if ($key =~ /\.foilorder$/); |
Line 3771 sub get_previous_attempt {
|
Line 3858 sub get_previous_attempt {
|
} |
} |
} else { |
} else { |
if ($key =~ /\./) { |
if ($key =~ /\./) { |
my $value = &format_previous_attempt_value($key, |
my $value = $returnhash{$version.':'.$key}; |
$returnhash{$version.':'.$key}); |
if ($key =~ /\.rndseed$/) { |
$prevattempts.='<td>'.$value.' </td>'; |
my ($id) = ($key =~ /^(.+)\.rndseed$/); |
|
if (exists($returnhash{$version.':'.$id.'.rawrndseed'})) { |
|
$value = $returnhash{$version.':'.$id.'.rawrndseed'}; |
|
} |
|
} |
|
$prevattempts.='<td>'.&format_previous_attempt_value($key,$value). |
|
' </td>'; |
} else { |
} else { |
$prevattempts.='<td> </td>'; |
$prevattempts.='<td> </td>'; |
} |
} |
Line 3782 sub get_previous_attempt {
|
Line 3875 sub get_previous_attempt {
|
} else { |
} else { |
foreach my $key (sort(keys(%lasthash))) { |
foreach my $key (sort(keys(%lasthash))) { |
next if ($key =~ /\.foilorder$/); |
next if ($key =~ /\.foilorder$/); |
my $value = &format_previous_attempt_value($key, |
my $value = $returnhash{$version.':'.$key}; |
$returnhash{$version.':'.$key}); |
if ($key =~ /\.rndseed$/) { |
$prevattempts.='<td>'.$value.' </td>'; |
my ($id) = ($key =~ /^(.+)\.rndseed$/); |
|
if (exists($returnhash{$version.':'.$id.'.rawrndseed'})) { |
|
$value = $returnhash{$version.':'.$id.'.rawrndseed'}; |
|
} |
|
} |
|
$prevattempts.='<td>'.&format_previous_attempt_value($key,$value). |
|
' </td>'; |
} |
} |
} |
} |
$prevattempts.=&end_data_table_row(); |
$prevattempts.=&end_data_table_row(); |
Line 4234 sub findallcourses {
|
Line 4333 sub findallcourses {
|
############################################### |
############################################### |
|
|
sub blockcheck { |
sub blockcheck { |
my ($setters,$activity,$uname,$udom,$url) = @_; |
my ($setters,$activity,$uname,$udom,$url,$is_course) = @_; |
|
|
if (!defined($udom)) { |
if (defined($udom) && defined($uname)) { |
|
# If uname and udom are for a course, check for blocks in the course. |
|
if (($is_course) || (&Apache::lonnet::is_course($udom,$uname))) { |
|
my ($startblock,$endblock,$triggerblock) = |
|
&get_blocks($setters,$activity,$udom,$uname,$url); |
|
return ($startblock,$endblock,$triggerblock); |
|
} |
|
} else { |
$udom = $env{'user.domain'}; |
$udom = $env{'user.domain'}; |
} |
|
if (!defined($uname)) { |
|
$uname = $env{'user.name'}; |
$uname = $env{'user.name'}; |
} |
} |
|
|
# If uname and udom are for a course, check for blocks in the course. |
|
|
|
if (&Apache::lonnet::is_course($udom,$uname)) { |
|
my ($startblock,$endblock,$triggerblock) = |
|
&get_blocks($setters,$activity,$udom,$uname,$url); |
|
return ($startblock,$endblock,$triggerblock); |
|
} |
|
|
|
my $startblock = 0; |
my $startblock = 0; |
my $endblock = 0; |
my $endblock = 0; |
my $triggerblock = ''; |
my $triggerblock = ''; |
Line 4260 sub blockcheck {
|
Line 4356 sub blockcheck {
|
# boards, chat or groups, check for blocking in current course only. |
# boards, chat or groups, check for blocking in current course only. |
|
|
if (($activity eq 'boards' || $activity eq 'chat' || |
if (($activity eq 'boards' || $activity eq 'chat' || |
$activity eq 'groups') && ($env{'request.course.id'})) { |
$activity eq 'groups' || $activity eq 'printout') && |
|
($env{'request.course.id'})) { |
foreach my $key (keys(%live_courses)) { |
foreach my $key (keys(%live_courses)) { |
if ($key ne $env{'request.course.id'}) { |
if ($key ne $env{'request.course.id'}) { |
delete($live_courses{$key}); |
delete($live_courses{$key}); |
Line 4524 sub parse_block_record {
|
Line 4621 sub parse_block_record {
|
} |
} |
|
|
sub blocking_status { |
sub blocking_status { |
my ($activity,$uname,$udom,$url) = @_; |
my ($activity,$uname,$udom,$url,$is_course) = @_; |
my %setters; |
my %setters; |
|
|
# check for active blocking |
# check for active blocking |
my ($startblock,$endblock,$triggerblock) = |
my ($startblock,$endblock,$triggerblock) = |
&blockcheck(\%setters,$activity,$uname,$udom,$url); |
&blockcheck(\%setters,$activity,$uname,$udom,$url,$is_course); |
my $blocked = 0; |
my $blocked = 0; |
if ($startblock && $endblock) { |
if ($startblock && $endblock) { |
$blocked = 1; |
$blocked = 1; |
Line 4541 sub blocking_status {
|
Line 4638 sub blocking_status {
|
# build a link to a popup window containing the details |
# build a link to a popup window containing the details |
my $querystring = "?activity=$activity"; |
my $querystring = "?activity=$activity"; |
# $uname and $udom decide whose portfolio the user is trying to look at |
# $uname and $udom decide whose portfolio the user is trying to look at |
if ($activity eq 'port') { |
if (($activity eq 'port') || ($activity eq 'passwd')) { |
$querystring .= "&udom=$udom" if $udom; |
$querystring .= "&udom=$udom" if ($udom =~ /^$match_domain$/); |
$querystring .= "&uname=$uname" if $uname; |
$querystring .= "&uname=$uname" if ($uname =~ /^$match_username$/); |
} elsif ($activity eq 'docs') { |
} elsif ($activity eq 'docs') { |
$querystring .= '&url='.&HTML::Entities::encode($url,'&"'); |
$querystring .= '&url='.&HTML::Entities::encode($url,'&"'); |
} |
} |
Line 4562 END_MYBLOCK
|
Line 4659 END_MYBLOCK
|
|
|
my $popupUrl = "/adm/blockingstatus/$querystring"; |
my $popupUrl = "/adm/blockingstatus/$querystring"; |
my $text = &mt('Communication Blocked'); |
my $text = &mt('Communication Blocked'); |
|
my $class = 'LC_comblock'; |
if ($activity eq 'docs') { |
if ($activity eq 'docs') { |
$text = &mt('Content Access Blocked'); |
$text = &mt('Content Access Blocked'); |
|
$class = ''; |
} elsif ($activity eq 'printout') { |
} elsif ($activity eq 'printout') { |
$text = &mt('Printing Blocked'); |
$text = &mt('Printing Blocked'); |
|
} elsif ($activity eq 'passwd') { |
|
$text = &mt('Password Changing Blocked'); |
} |
} |
$output .= <<"END_BLOCK"; |
$output .= <<"END_BLOCK"; |
<div class='LC_comblock'> |
<div class='$class'> |
<a onclick='openWindow("$popupUrl","Blocking Table",600,300,"no","no");return false;' href='/adm/blockingstatus/$querystring' |
<a onclick='openWindow("$popupUrl","Blocking Table",600,300,"no","no");return false;' href='/adm/blockingstatus/$querystring' |
title='$text'> |
title='$text'> |
<img class='LC_noBorder LC_middle' title='$text' src='/res/adm/pages/comblock.png' alt='$text'/></a> |
<img class='LC_noBorder LC_middle' title='$text' src='/res/adm/pages/comblock.png' alt='$text'/></a> |
Line 4584 END_BLOCK
|
Line 4685 END_BLOCK
|
############################################### |
############################################### |
|
|
sub check_ip_acc { |
sub check_ip_acc { |
my ($acc)=@_; |
my ($acc,$clientip)=@_; |
&Apache::lonxml::debug("acc is $acc"); |
&Apache::lonxml::debug("acc is $acc"); |
if (!defined($acc) || $acc =~ /^\s*$/ || $acc =~/^\s*no\s*$/i) { |
if (!defined($acc) || $acc =~ /^\s*$/ || $acc =~/^\s*no\s*$/i) { |
return 1; |
return 1; |
} |
} |
my $allowed=0; |
my $allowed=0; |
my $ip=$env{'request.host'} || $ENV{'REMOTE_ADDR'}; |
my $ip=$env{'request.host'} || $ENV{'REMOTE_ADDR'} || $clientip; |
|
|
my $name; |
my $name; |
foreach my $pattern (split(',',$acc)) { |
foreach my $pattern (split(',',$acc)) { |
Line 4686 sub get_domainconf {
|
Line 4787 sub get_domainconf {
|
if (keys(%{$domconfig{'login'}})) { |
if (keys(%{$domconfig{'login'}})) { |
foreach my $key (keys(%{$domconfig{'login'}})) { |
foreach my $key (keys(%{$domconfig{'login'}})) { |
if (ref($domconfig{'login'}{$key}) eq 'HASH') { |
if (ref($domconfig{'login'}{$key}) eq 'HASH') { |
if ($key eq 'loginvia') { |
if (($key eq 'loginvia') || ($key eq 'headtag')) { |
if (ref($domconfig{'login'}{'loginvia'}) eq 'HASH') { |
if (ref($domconfig{'login'}{$key}) eq 'HASH') { |
foreach my $hostname (keys(%{$domconfig{'login'}{'loginvia'}})) { |
foreach my $hostname (keys(%{$domconfig{'login'}{$key}})) { |
if (ref($domconfig{'login'}{'loginvia'}{$hostname}) eq 'HASH') { |
if (ref($domconfig{'login'}{$key}{$hostname}) eq 'HASH') { |
if ($domconfig{'login'}{'loginvia'}{$hostname}{'server'}) { |
if ($key eq 'loginvia') { |
my $server = $domconfig{'login'}{'loginvia'}{$hostname}{'server'}; |
if ($domconfig{'login'}{'loginvia'}{$hostname}{'server'}) { |
$designhash{$udom.'.login.loginvia'} = $server; |
my $server = $domconfig{'login'}{'loginvia'}{$hostname}{'server'}; |
if ($domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'} eq 'custom') { |
$designhash{$udom.'.login.loginvia'} = $server; |
|
if ($domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'} eq 'custom') { |
$designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'custompath'}; |
$designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'custompath'}; |
} else { |
} else { |
$designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'}; |
$designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'}; |
|
} |
} |
} |
if ($domconfig{'login'}{'loginvia'}{$hostname}{'exempt'}) { |
} elsif ($key eq 'headtag') { |
$designhash{$udom.'.login.loginvia_exempt_'.$hostname} = $domconfig{'login'}{'loginvia'}{$hostname}{'exempt'}; |
if ($domconfig{'login'}{'headtag'}{$hostname}{'url'}) { |
|
$designhash{$udom.'.login.headtag_'.$hostname} = $domconfig{'login'}{'headtag'}{$hostname}{'url'}; |
} |
} |
} |
} |
|
if ($domconfig{'login'}{$key}{$hostname}{'exempt'}) { |
|
$designhash{$udom.'.login.'.$key.'_exempt_'.$hostname} = $domconfig{'login'}{$key}{$hostname}{'exempt'}; |
|
} |
} |
} |
} |
} |
} |
} |
Line 5026 Inputs:
|
Line 5132 Inputs:
|
|
|
=item * $args, optional argument valid values are |
=item * $args, optional argument valid values are |
no_auto_mt_title -> prevents &mt()ing the title arg |
no_auto_mt_title -> prevents &mt()ing the title arg |
inherit_jsmath -> when creating popup window in a page, |
|
should it have jsmath forced on by the |
|
current page |
|
|
|
=item * $advtoolsref, optional argument, ref to an array containing |
=item * $advtoolsref, optional argument, ref to an array containing |
inlineremote items to be added in "Functions" menu below |
inlineremote items to be added in "Functions" menu below |
Line 5096 sub bodytag {
|
Line 5199 sub bodytag {
|
|
|
# construct main body tag |
# construct main body tag |
my $bodytag = "<body $extra_body_attr>". |
my $bodytag = "<body $extra_body_attr>". |
&Apache::lontexconvert::init_math_support($args->{'inherit_jsmath'}); |
&Apache::lontexconvert::init_math_support(); |
|
|
&get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']); |
&get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']); |
|
|
Line 5120 sub bodytag {
|
Line 5223 sub bodytag {
|
$dc_info =~ s/\s+$//; |
$dc_info =~ s/\s+$//; |
} |
} |
|
|
$role = '<span class="LC_nobreak">('.$role.')</span>' if $role; |
$role = '<span class="LC_nobreak">('.$role.')</span>' if ($role && !$env{'browser.mobile'}); |
|
|
if ($env{'request.state'} eq 'construct') { $forcereg=1; } |
if ($env{'request.state'} eq 'construct') { $forcereg=1; } |
|
|
Line 5323 sub endbodytag {
|
Line 5426 sub endbodytag {
|
unless ((ref($args) eq 'HASH') && ($args->{'notbody'})) { |
unless ((ref($args) eq 'HASH') && ($args->{'notbody'})) { |
$endbodytag='</body>'; |
$endbodytag='</body>'; |
} |
} |
$endbodytag=&Apache::lontexconvert::jsMath_process()."\n".$endbodytag; |
|
if ( exists( $env{'internal.head.redirect'} ) ) { |
if ( exists( $env{'internal.head.redirect'} ) ) { |
if (!(ref($args) eq 'HASH' && $args->{'noredirectlink'})) { |
if (!(ref($args) eq 'HASH' && $args->{'noredirectlink'})) { |
$endbodytag= |
$endbodytag= |
Line 5498 div.LC_confirm_box .LC_success img {
|
Line 5600 div.LC_confirm_box .LC_success img {
|
vertical-align: middle; |
vertical-align: middle; |
} |
} |
|
|
|
.LC_maxwidth { |
|
max-width: 100%; |
|
height: auto; |
|
} |
|
|
|
.LC_textsize_mobile { |
|
\@media only screen and (max-device-width: 480px) { |
|
-webkit-text-size-adjust:100%; -moz-text-size-adjust:100%; -ms-text-size-adjust:100%; |
|
} |
|
} |
|
|
.LC_icon { |
.LC_icon { |
border: none; |
border: none; |
vertical-align: middle; |
vertical-align: middle; |
Line 5619 table#LC_menubuttons img {
|
Line 5732 table#LC_menubuttons img {
|
vertical-align: middle; |
vertical-align: middle; |
} |
} |
|
|
|
.LC_breadcrumbs_hoverable { |
|
background: $sidebg; |
|
} |
|
|
td.LC_table_cell_checkbox { |
td.LC_table_cell_checkbox { |
text-align: center; |
text-align: center; |
} |
} |
Line 6602 fieldset {
|
Line 6719 fieldset {
|
/* overflow: hidden; */ |
/* overflow: hidden; */ |
} |
} |
|
|
|
article.geogebraweb div { |
|
margin: 0; |
|
} |
|
|
fieldset > legend { |
fieldset > legend { |
font-weight: bold; |
font-weight: bold; |
padding: 0 5px 0 5px; |
padding: 0 5px 0 5px; |
Line 7294 sub headtag {
|
Line 7415 sub headtag {
|
'<head>'. |
'<head>'. |
&font_settings($args); |
&font_settings($args); |
|
|
my $inhibitprint = &print_suppression(); |
my $inhibitprint; |
|
if ($args->{'print_suppress'}) { |
|
$inhibitprint = &print_suppression(); |
|
} |
|
|
if (!$args->{'frameset'}) { |
if (!$args->{'frameset'}) { |
$result .= &Apache::lonhtmlcommon::htmlareaheaders(); |
$result .= &Apache::lonhtmlcommon::htmlareaheaders(); |
Line 7334 sub headtag {
|
Line 7458 sub headtag {
|
<meta http-equiv="pragma" content="no-cache" /> |
<meta http-equiv="pragma" content="no-cache" /> |
<meta http-equiv="Refresh" content="$time; url=$url" /> |
<meta http-equiv="Refresh" content="$time; url=$url" /> |
ADDMETA |
ADDMETA |
|
} else { |
|
unless (($args->{'frameset'}) || ($args->{'js_ready'}) || ($args->{'only_body'}) || ($args->{'no_nav_bar'})) { |
|
my $requrl = $env{'request.uri'}; |
|
if ($requrl eq '') { |
|
$requrl = $ENV{'REQUEST_URI'}; |
|
$requrl =~ s/\?.+$//; |
|
} |
|
unless (($requrl =~ m{^/adm/(?:switchserver|login|authenticate|logout|groupsort|cleanup|helper|slotrequest|grades)(\?|$)}) || |
|
(($requrl =~ m{^/res/}) && (($env{'form.submitted'} eq 'scantron') || |
|
($env{'form.grade_symb'}) || ($Apache::lonhomework::scantronmode)))) { |
|
my $dom_in_use = $Apache::lonnet::perlvar{'lonDefDomain'}; |
|
unless (&Apache::lonnet::allowed('mau',$dom_in_use)) { |
|
my %domdefs = &Apache::lonnet::get_domain_defaults($dom_in_use); |
|
if (ref($domdefs{'offloadnow'}) eq 'HASH') { |
|
my $lonhost = $Apache::lonnet::perlvar{'lonHostID'}; |
|
if ($domdefs{'offloadnow'}{$lonhost}) { |
|
my $newserver = &Apache::lonnet::spareserver(30000,undef,1,$dom_in_use); |
|
if (($newserver) && ($newserver ne $lonhost)) { |
|
my $numsec = 5; |
|
my $timeout = $numsec * 1000; |
|
my ($newurl,$locknum,%locks,$msg); |
|
if ($env{'request.role.adv'}) { |
|
($locknum,%locks) = &Apache::lonnet::get_locks(); |
|
} |
|
my $disable_submit = 0; |
|
if ($requrl =~ /$LONCAPA::assess_re/) { |
|
$disable_submit = 1; |
|
} |
|
if ($locknum) { |
|
my @lockinfo = sort(values(%locks)); |
|
$msg = &mt('Once the following tasks are complete: ')."\\n". |
|
join(", ",sort(values(%locks)))."\\n". |
|
&mt('your session will be transferred to a different server, after you click "Roles".'); |
|
} else { |
|
if (($requrl =~ m{^/res/}) && ($env{'form.submitted'} =~ /^part_/)) { |
|
$msg = &mt('Your LON-CAPA submission has been recorded')."\\n"; |
|
} |
|
$msg .= &mt('Your current LON-CAPA session will be transferred to a different server in [quant,_1,second].',$numsec); |
|
$newurl = '/adm/switchserver?otherserver='.$newserver; |
|
if (($env{'request.role'}) && ($env{'request.role'} ne 'cm')) { |
|
$newurl .= '&role='.$env{'request.role'}; |
|
} |
|
if ($env{'request.symb'}) { |
|
$newurl .= '&symb='.$env{'request.symb'}; |
|
} else { |
|
$newurl .= '&origurl='.$requrl; |
|
} |
|
} |
|
&js_escape(\$msg); |
|
$result.=<<OFFLOAD |
|
<meta http-equiv="pragma" content="no-cache" /> |
|
<script type="text/javascript"> |
|
// <![CDATA[ |
|
function LC_Offload_Now() { |
|
var dest = "$newurl"; |
|
if (dest != '') { |
|
window.location.href="$newurl"; |
|
} |
|
} |
|
\$(document).ready(function () { |
|
window.alert('$msg'); |
|
if ($disable_submit) { |
|
\$(".LC_hwk_submit").prop("disabled", true); |
|
\$( ".LC_textline" ).prop( "readonly", "readonly"); |
|
} |
|
setTimeout('LC_Offload_Now()', $timeout); |
|
}); |
|
// ]]> |
|
</script> |
|
OFFLOAD |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
} |
} |
if (!defined($title)) { |
if (!defined($title)) { |
$title = 'The LearningOnline Network with CAPA'; |
$title = 'The LearningOnline Network with CAPA'; |
Line 7347 ADDMETA
|
Line 7547 ADDMETA
|
$result .= '>' |
$result .= '>' |
.$inhibitprint |
.$inhibitprint |
.$head_extra; |
.$head_extra; |
if ($env{'browser.mobile'}) { |
my $clientmobile; |
|
if (($env{'user.name'} eq '') && ($env{'user.domain'} eq '')) { |
|
(undef,undef,undef,undef,undef,undef,$clientmobile) = &decode_user_agent(); |
|
} else { |
|
$clientmobile = $env{'browser.mobile'}; |
|
} |
|
if ($clientmobile) { |
$result .= ' |
$result .= ' |
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"> |
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"> |
<meta name="apple-mobile-web-app-capable" content="yes" />'; |
<meta name="apple-mobile-web-app-capable" content="yes" />'; |
Line 7420 sub print_suppression {
|
Line 7626 sub print_suppression {
|
} |
} |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
my $blocked = &blocking_status('printout',$cnum,$cdom); |
my $blocked = &blocking_status('printout',$cnum,$cdom,undef,1); |
if ($blocked) { |
if ($blocked) { |
my $checkrole = "cm./$cdom/$cnum"; |
my $checkrole = "cm./$cdom/$cnum"; |
if ($env{'request.course.sec'} ne '') { |
if ($env{'request.course.sec'} ne '') { |
Line 7531 $args - additional optional args support
|
Line 7737 $args - additional optional args support
|
no_inline_link -> if true and in remote mode, don't show the |
no_inline_link -> if true and in remote mode, don't show the |
'Switch To Inline Menu' link |
'Switch To Inline Menu' link |
no_auto_mt_title -> prevent &mt()ing the title arg |
no_auto_mt_title -> prevent &mt()ing the title arg |
inherit_jsmath -> when creating popup window in a page, |
|
should it have jsmath forced on by the |
|
current page |
|
bread_crumbs -> Array containing breadcrumbs |
bread_crumbs -> Array containing breadcrumbs |
bread_crumbs_component -> if exists show it as headline else show only the breadcrumbs |
bread_crumbs_component -> if exists show it as headline else show only the breadcrumbs |
group -> includes the current group, if page is for a |
group -> includes the current group, if page is for a |
Line 7660 function set_wishlistlink(title, path) {
|
Line 7863 function set_wishlistlink(title, path) {
|
title = title.replace(/^LON-CAPA /,''); |
title = title.replace(/^LON-CAPA /,''); |
} |
} |
title = encodeURIComponent(title); |
title = encodeURIComponent(title); |
|
title = title.replace("'","\\\'"); |
if (!path) { |
if (!path) { |
path = location.pathname; |
path = location.pathname; |
} |
} |
path = encodeURIComponent(path); |
path = encodeURIComponent(path); |
|
path = path.replace("'","\\\'"); |
Win = window.open('/adm/wishlist?mode=newLink&setTitle='+title+'&setPath='+path, |
Win = window.open('/adm/wishlist?mode=newLink&setTitle='+title+'&setPath='+path, |
'wishlistNewLink','width=560,height=350,scrollbars=0'); |
'wishlistNewLink','width=560,height=350,scrollbars=0'); |
} |
} |
Line 7706 var modalWindow = {
|
Line 7911 var modalWindow = {
|
}; |
}; |
var openMyModal = function(source,width,height,scrolling,transparency,style) |
var openMyModal = function(source,width,height,scrolling,transparency,style) |
{ |
{ |
|
source = source.replace("'","'"); |
modalWindow.windowId = "myModal"; |
modalWindow.windowId = "myModal"; |
modalWindow.width = width; |
modalWindow.width = width; |
modalWindow.height = height; |
modalWindow.height = height; |
modalWindow.content = "<iframe width='"+width+"' height='"+height+"' frameborder='0' scrolling='"+scrolling+"' allowtransparency='"+transparency+"' src='" + source + "' style='"+style+"'></iframe>"; |
modalWindow.content = "<iframe width='"+width+"' height='"+height+"' frameborder='0' scrolling='"+scrolling+"' allowtransparency='"+transparency+"' src='" + source + "' style='"+style+"'></iframe>"; |
modalWindow.open(); |
modalWindow.open(); |
}; |
}; |
// END LON-CAPA Internal --> |
// END LON-CAPA Internal --> |
// ]]> |
// ]]> |
</script> |
</script> |
Line 8313 role status: active, previous or future.
|
Line 8519 role status: active, previous or future.
|
sub check_user_status { |
sub check_user_status { |
my ($udom,$uname,$cdom,$crs,$role,$sec) = @_; |
my ($udom,$uname,$cdom,$crs,$role,$sec) = @_; |
my %userinfo = &Apache::lonnet::dump('roles',$udom,$uname); |
my %userinfo = &Apache::lonnet::dump('roles',$udom,$uname); |
my @uroles = keys %userinfo; |
my @uroles = keys(%userinfo); |
my $srchstr; |
my $srchstr; |
my $active_chk = 'none'; |
my $active_chk = 'none'; |
my $now = time; |
my $now = time; |
Line 9043 sub user_picker {
|
Line 9249 sub user_picker {
|
} |
} |
$srchterm = $srch->{'srchterm'}; |
$srchterm = $srch->{'srchterm'}; |
} |
} |
my %lt=&Apache::lonlocal::texthash( |
my %html_lt=&Apache::lonlocal::texthash( |
'usr' => 'Search criteria', |
'usr' => 'Search criteria', |
'doma' => 'Domain/institution to search', |
'doma' => 'Domain/institution to search', |
'uname' => 'username', |
'uname' => 'username', |
Line 9056 sub user_picker {
|
Line 9262 sub user_picker {
|
'exact' => 'is', |
'exact' => 'is', |
'contains' => 'contains', |
'contains' => 'contains', |
'begins' => 'begins with', |
'begins' => 'begins with', |
|
); |
|
my %js_lt=&Apache::lonlocal::texthash( |
'youm' => "You must include some text to search for.", |
'youm' => "You must include some text to search for.", |
'thte' => "The text you are searching for must contain at least two characters when using a 'begins' type search.", |
'thte' => "The text you are searching for must contain at least two characters when using a 'begins' type search.", |
'thet' => "The text you are searching for must contain at least three characters when using a 'contains' type search.", |
'thet' => "The text you are searching for must contain at least three characters when using a 'contains' type search.", |
Line 9065 sub user_picker {
|
Line 9273 sub user_picker {
|
'whse' => "When searching by last,first you must include at least one character in the first name.", |
'whse' => "When searching by last,first you must include at least one character in the first name.", |
'thfo' => "The following need to be corrected before the search can be run:", |
'thfo' => "The following need to be corrected before the search can be run:", |
); |
); |
|
&html_escape(\%html_lt); |
|
&js_escape(\%js_lt); |
my $domform = &select_dom_form($currdom,'srchdomain',1,1); |
my $domform = &select_dom_form($currdom,'srchdomain',1,1); |
my $srchinsel = ' <select name="srchin">'; |
my $srchinsel = ' <select name="srchin">'; |
|
|
Line 9079 sub user_picker {
|
Line 9289 sub user_picker {
|
next if ($option eq 'crs' && !$env{'request.course.id'}); |
next if ($option eq 'crs' && !$env{'request.course.id'}); |
if ($curr_selected{'srchin'} eq $option) { |
if ($curr_selected{'srchin'} eq $option) { |
$srchinsel .= ' |
$srchinsel .= ' |
<option value="'.$option.'" selected="selected">'.$lt{$option}.'</option>'; |
<option value="'.$option.'" selected="selected">'.$html_lt{$option}.'</option>'; |
} else { |
} else { |
$srchinsel .= ' |
$srchinsel .= ' |
<option value="'.$option.'">'.$lt{$option}.'</option>'; |
<option value="'.$option.'">'.$html_lt{$option}.'</option>'; |
} |
} |
} |
} |
$srchinsel .= "\n </select>\n"; |
$srchinsel .= "\n </select>\n"; |
Line 9091 sub user_picker {
|
Line 9301 sub user_picker {
|
foreach my $option ('lastname','lastfirst','uname') { |
foreach my $option ('lastname','lastfirst','uname') { |
if ($curr_selected{'srchby'} eq $option) { |
if ($curr_selected{'srchby'} eq $option) { |
$srchbysel .= ' |
$srchbysel .= ' |
<option value="'.$option.'" selected="selected">'.$lt{$option}.'</option>'; |
<option value="'.$option.'" selected="selected">'.$html_lt{$option}.'</option>'; |
} else { |
} else { |
$srchbysel .= ' |
$srchbysel .= ' |
<option value="'.$option.'">'.$lt{$option}.'</option>'; |
<option value="'.$option.'">'.$html_lt{$option}.'</option>'; |
} |
} |
} |
} |
$srchbysel .= "\n </select>\n"; |
$srchbysel .= "\n </select>\n"; |
Line 9103 sub user_picker {
|
Line 9313 sub user_picker {
|
foreach my $option ('begins','contains','exact') { |
foreach my $option ('begins','contains','exact') { |
if ($curr_selected{'srchtype'} eq $option) { |
if ($curr_selected{'srchtype'} eq $option) { |
$srchtypesel .= ' |
$srchtypesel .= ' |
<option value="'.$option.'" selected="selected">'.$lt{$option}.'</option>'; |
<option value="'.$option.'" selected="selected">'.$html_lt{$option}.'</option>'; |
} else { |
} else { |
$srchtypesel .= ' |
$srchtypesel .= ' |
<option value="'.$option.'">'.$lt{$option}.'</option>'; |
<option value="'.$option.'">'.$html_lt{$option}.'</option>'; |
} |
} |
} |
} |
$srchtypesel .= "\n </select>\n"; |
$srchtypesel .= "\n </select>\n"; |
Line 9191 function validateEntry(callingForm) {
|
Line 9401 function validateEntry(callingForm) {
|
|
|
if (srchterm == "") { |
if (srchterm == "") { |
checkok = 0; |
checkok = 0; |
msg += "$lt{'youm'}\\n"; |
msg += "$js_lt{'youm'}\\n"; |
} |
} |
|
|
if (srchtype== 'begins') { |
if (srchtype== 'begins') { |
if (srchterm.length < 2) { |
if (srchterm.length < 2) { |
checkok = 0; |
checkok = 0; |
msg += "$lt{'thte'}\\n"; |
msg += "$js_lt{'thte'}\\n"; |
} |
} |
} |
} |
|
|
if (srchtype== 'contains') { |
if (srchtype== 'contains') { |
if (srchterm.length < 3) { |
if (srchterm.length < 3) { |
checkok = 0; |
checkok = 0; |
msg += "$lt{'thet'}\\n"; |
msg += "$js_lt{'thet'}\\n"; |
} |
} |
} |
} |
if (srchin == 'instd') { |
if (srchin == 'instd') { |
if (srchdomain == '') { |
if (srchdomain == '') { |
checkok = 0; |
checkok = 0; |
msg += "$lt{'yomc'}\\n"; |
msg += "$js_lt{'yomc'}\\n"; |
} |
} |
} |
} |
if (srchin == 'dom') { |
if (srchin == 'dom') { |
if (srchdomain == '') { |
if (srchdomain == '') { |
checkok = 0; |
checkok = 0; |
msg += "$lt{'ymcd'}\\n"; |
msg += "$js_lt{'ymcd'}\\n"; |
} |
} |
} |
} |
if (srchby == 'lastfirst') { |
if (srchby == 'lastfirst') { |
if (srchterm.indexOf(",") == -1) { |
if (srchterm.indexOf(",") == -1) { |
checkok = 0; |
checkok = 0; |
msg += "$lt{'whus'}\\n"; |
msg += "$js_lt{'whus'}\\n"; |
} |
} |
if (srchterm.indexOf(",") == srchterm.length -1) { |
if (srchterm.indexOf(",") == srchterm.length -1) { |
checkok = 0; |
checkok = 0; |
msg += "$lt{'whse'}\\n"; |
msg += "$js_lt{'whse'}\\n"; |
} |
} |
} |
} |
if (checkok == 0) { |
if (checkok == 0) { |
alert("$lt{'thfo'}\\n"+msg); |
alert("$js_lt{'thfo'}\\n"+msg); |
return; |
return; |
} |
} |
if (checkok == 1) { |
if (checkok == 1) { |
Line 9248 $new_user_create
|
Line 9458 $new_user_create
|
END_BLOCK |
END_BLOCK |
|
|
$output .= &Apache::lonhtmlcommon::start_pick_box(). |
$output .= &Apache::lonhtmlcommon::start_pick_box(). |
&Apache::lonhtmlcommon::row_title($lt{'doma'}). |
&Apache::lonhtmlcommon::row_title($html_lt{'doma'}). |
$domform. |
$domform. |
&Apache::lonhtmlcommon::row_closure(). |
&Apache::lonhtmlcommon::row_closure(). |
&Apache::lonhtmlcommon::row_title($lt{'usr'}). |
&Apache::lonhtmlcommon::row_title($html_lt{'usr'}). |
$srchbysel. |
$srchbysel. |
$srchtypesel. |
$srchtypesel. |
'<input type="text" size="15" name="srchterm" value="'.$srchterm.'" />'. |
'<input type="text" size="15" name="srchterm" value="'.$srchterm.'" />'. |
Line 9264 END_BLOCK
|
Line 9474 END_BLOCK
|
|
|
sub user_rule_check { |
sub user_rule_check { |
my ($usershash,$checks,$alerts,$rulematch,$inst_results,$curr_rules,$got_rules) = @_; |
my ($usershash,$checks,$alerts,$rulematch,$inst_results,$curr_rules,$got_rules) = @_; |
my $response; |
my ($response,%inst_response); |
if (ref($usershash) eq 'HASH') { |
if (ref($usershash) eq 'HASH') { |
foreach my $user (keys(%{$usershash})) { |
if (keys(%{$usershash}) > 1) { |
my ($uname,$udom) = split(/:/,$user); |
my (%by_username,%by_id,%userdoms); |
next if ($udom eq '' || $uname eq ''); |
my $checkid; |
my ($id,$newuser); |
|
if (ref($usershash->{$user}) eq 'HASH') { |
|
$newuser = $usershash->{$user}->{'newuser'}; |
|
$id = $usershash->{$user}->{'id'}; |
|
} |
|
my $inst_response; |
|
if (ref($checks) eq 'HASH') { |
if (ref($checks) eq 'HASH') { |
if (defined($checks->{'username'})) { |
if ((!defined($checks->{'username'})) && (defined($checks->{'id'}))) { |
($inst_response,%{$inst_results->{$user}}) = |
$checkid = 1; |
&Apache::lonnet::get_instuser($udom,$uname); |
} |
} elsif (defined($checks->{'id'})) { |
} |
($inst_response,%{$inst_results->{$user}}) = |
foreach my $user (keys(%{$usershash})) { |
&Apache::lonnet::get_instuser($udom,undef,$id); |
my ($uname,$udom) = split(/:/,$user); |
|
if ($checkid) { |
|
if (ref($usershash->{$user}) eq 'HASH') { |
|
if ($usershash->{$user}->{'id'} ne '') { |
|
$by_id{$udom}{$usershash->{$user}->{'id'}} = $uname; |
|
$userdoms{$udom} = 1; |
|
if (ref($inst_results) eq 'HASH') { |
|
$inst_results->{$uname.':'.$udom} = {}; |
|
} |
|
} |
|
} |
|
} else { |
|
$by_username{$udom}{$uname} = 1; |
|
$userdoms{$udom} = 1; |
|
if (ref($inst_results) eq 'HASH') { |
|
$inst_results->{$uname.':'.$udom} = {}; |
|
} |
|
} |
|
} |
|
foreach my $udom (keys(%userdoms)) { |
|
if (!$got_rules->{$udom}) { |
|
my %domconfig = &Apache::lonnet::get_dom('configuration', |
|
['usercreation'],$udom); |
|
if (ref($domconfig{'usercreation'}) eq 'HASH') { |
|
foreach my $item ('username','id') { |
|
if (ref($domconfig{'usercreation'}{$item.'_rule'}) eq 'ARRAY') { |
|
$$curr_rules{$udom}{$item} = |
|
$domconfig{'usercreation'}{$item.'_rule'}; |
|
} |
|
} |
|
} |
|
$got_rules->{$udom} = 1; |
|
} |
|
} |
|
if ($checkid) { |
|
foreach my $udom (keys(%by_id)) { |
|
my ($outcome,$results) = &Apache::lonnet::get_multiple_instusers($udom,$by_id{$udom},'id'); |
|
if ($outcome eq 'ok') { |
|
foreach my $id (keys(%{$by_id{$udom}})) { |
|
my $uname = $by_id{$udom}{$id}; |
|
$inst_response{$uname.':'.$udom} = $outcome; |
|
} |
|
if (ref($results) eq 'HASH') { |
|
foreach my $uname (keys(%{$results})) { |
|
if (exists($inst_response{$uname.':'.$udom})) { |
|
$inst_response{$uname.':'.$udom} = $outcome; |
|
$inst_results->{$uname.':'.$udom} = $results->{$uname}; |
|
} |
|
} |
|
} |
|
} |
} |
} |
} else { |
} else { |
($inst_response,%{$inst_results->{$user}}) = |
foreach my $udom (keys(%by_username)) { |
&Apache::lonnet::get_instuser($udom,$uname); |
my ($outcome,$results) = &Apache::lonnet::get_multiple_instusers($udom,$by_username{$udom}); |
return; |
if ($outcome eq 'ok') { |
|
foreach my $uname (keys(%{$by_username{$udom}})) { |
|
$inst_response{$uname.':'.$udom} = $outcome; |
|
} |
|
if (ref($results) eq 'HASH') { |
|
foreach my $uname (keys(%{$results})) { |
|
$inst_results->{$uname.':'.$udom} = $results->{$uname}; |
|
} |
|
} |
|
} |
|
} |
} |
} |
if (!$got_rules->{$udom}) { |
} elsif (keys(%{$usershash}) == 1) { |
my %domconfig = &Apache::lonnet::get_dom('configuration', |
my $user = (keys(%{$usershash}))[0]; |
['usercreation'],$udom); |
my ($uname,$udom) = split(/:/,$user); |
if (ref($domconfig{'usercreation'}) eq 'HASH') { |
if (($udom ne '') && ($uname ne '')) { |
foreach my $item ('username','id') { |
if (ref($usershash->{$user}) eq 'HASH') { |
if (ref($domconfig{'usercreation'}{$item.'_rule'}) eq 'ARRAY') { |
if (ref($checks) eq 'HASH') { |
$$curr_rules{$udom}{$item} = |
if (defined($checks->{'username'})) { |
$domconfig{'usercreation'}{$item.'_rule'}; |
($inst_response{$user},%{$inst_results->{$user}}) = |
|
&Apache::lonnet::get_instuser($udom,$uname); |
|
} elsif (defined($checks->{'id'})) { |
|
if ($usershash->{$user}->{'id'} ne '') { |
|
($inst_response{$user},%{$inst_results->{$user}}) = |
|
&Apache::lonnet::get_instuser($udom,undef, |
|
$usershash->{$user}->{'id'}); |
|
} else { |
|
($inst_response{$user},%{$inst_results->{$user}}) = |
|
&Apache::lonnet::get_instuser($udom,$uname); |
|
} |
|
} |
|
} else { |
|
($inst_response{$user},%{$inst_results->{$user}}) = |
|
&Apache::lonnet::get_instuser($udom,$uname); |
|
return; |
|
} |
|
if (!$got_rules->{$udom}) { |
|
my %domconfig = &Apache::lonnet::get_dom('configuration', |
|
['usercreation'],$udom); |
|
if (ref($domconfig{'usercreation'}) eq 'HASH') { |
|
foreach my $item ('username','id') { |
|
if (ref($domconfig{'usercreation'}{$item.'_rule'}) eq 'ARRAY') { |
|
$$curr_rules{$udom}{$item} = |
|
$domconfig{'usercreation'}{$item.'_rule'}; |
|
} |
|
} |
} |
} |
|
$got_rules->{$udom} = 1; |
} |
} |
} |
} |
$got_rules->{$udom} = 1; |
} else { |
|
return; |
|
} |
|
} else { |
|
return; |
|
} |
|
foreach my $user (keys(%{$usershash})) { |
|
my ($uname,$udom) = split(/:/,$user); |
|
next if (($udom eq '') || ($uname eq '')); |
|
my $id; |
|
if (ref($inst_results) eq 'HASH') { |
|
if (ref($inst_results->{$user}) eq 'HASH') { |
|
$id = $inst_results->{$user}->{'id'}; |
|
} |
|
} |
|
if ($id eq '') { |
|
if (ref($usershash->{$user})) { |
|
$id = $usershash->{$user}->{'id'}; |
|
} |
} |
} |
foreach my $item (keys(%{$checks})) { |
foreach my $item (keys(%{$checks})) { |
if (ref($$curr_rules{$udom}) eq 'HASH') { |
if (ref($$curr_rules{$udom}) eq 'HASH') { |
if (ref($$curr_rules{$udom}{$item}) eq 'ARRAY') { |
if (ref($$curr_rules{$udom}{$item}) eq 'ARRAY') { |
if (@{$$curr_rules{$udom}{$item}} > 0) { |
if (@{$$curr_rules{$udom}{$item}} > 0) { |
my %rule_check = &Apache::lonnet::inst_rulecheck($udom,$uname,$id,$item,$$curr_rules{$udom}{$item}); |
my %rule_check = &Apache::lonnet::inst_rulecheck($udom,$uname,$id,$item, |
|
$$curr_rules{$udom}{$item}); |
foreach my $rule (@{$$curr_rules{$udom}{$item}}) { |
foreach my $rule (@{$$curr_rules{$udom}{$item}}) { |
if ($rule_check{$rule}) { |
if ($rule_check{$rule}) { |
$$rulematch{$user}{$item} = $rule; |
$$rulematch{$user}{$item} = $rule; |
if ($inst_response eq 'ok') { |
if ($inst_response{$user} eq 'ok') { |
if (ref($inst_results) eq 'HASH') { |
if (ref($inst_results) eq 'HASH') { |
if (ref($inst_results->{$user}) eq 'HASH') { |
if (ref($inst_results->{$user}) eq 'HASH') { |
if (keys(%{$inst_results->{$user}}) == 0) { |
if (keys(%{$inst_results->{$user}}) == 0) { |
$$alerts{$item}{$udom}{$uname} = 1; |
$$alerts{$item}{$udom}{$uname} = 1; |
|
} elsif ($item eq 'id') { |
|
if ($inst_results->{$user}->{'id'} eq '') { |
|
$$alerts{$item}{$udom}{$uname} = 1; |
|
} |
} |
} |
} |
} |
} |
} |
Line 9581 reservable_now - ref to hash of student_
|
Line 9895 reservable_now - ref to hash of student_
|
|
|
Keys in inner hash are: |
Keys in inner hash are: |
(a) symb: either blank or symb to which slot use is restricted. |
(a) symb: either blank or symb to which slot use is restricted. |
(b) endreserve: end date of reservation period. |
(b) endreserve: end date of reservation period. |
|
(c) uniqueperiod: start,end dates when slot is to be uniquely |
|
selected. |
|
|
sorted_future - ref to array of student_schedulable slots reservable in |
sorted_future - ref to array of student_schedulable slots reservable in |
the future, ordered by start date of reservation period. |
the future, ordered by start date of reservation period. |
Line 9592 future_reservable - ref to hash of stude
|
Line 9908 future_reservable - ref to hash of stude
|
Keys in inner hash are: |
Keys in inner hash are: |
(a) symb: either blank or symb to which slot use is restricted. |
(a) symb: either blank or symb to which slot use is restricted. |
(b) startreserve: start date of reservation period. |
(b) startreserve: start date of reservation period. |
|
(c) uniqueperiod: start,end dates when slot is to be uniquely |
|
selected. |
|
|
=back |
=back |
|
|
Line 9645 sub get_future_slots {
|
Line 9963 sub get_future_slots {
|
my $startreserve = $slots{$slot}->{'startreserve'}; |
my $startreserve = $slots{$slot}->{'startreserve'}; |
my $endreserve = $slots{$slot}->{'endreserve'}; |
my $endreserve = $slots{$slot}->{'endreserve'}; |
my $symb = $slots{$slot}->{'symb'}; |
my $symb = $slots{$slot}->{'symb'}; |
|
my $uniqueperiod; |
|
if (ref($slots{$slot}->{'uniqueperiod'}) eq 'ARRAY') { |
|
$uniqueperiod = join(',',@{$slots{$slot}->{'uniqueperiod'}}); |
|
} |
if (($startreserve < $now) && |
if (($startreserve < $now) && |
(!$endreserve || $endreserve > $now)) { |
(!$endreserve || $endreserve > $now)) { |
my $lastres = $endreserve; |
my $lastres = $endreserve; |
Line 9653 sub get_future_slots {
|
Line 9975 sub get_future_slots {
|
} |
} |
$reservable_now{$slot} = { |
$reservable_now{$slot} = { |
symb => $symb, |
symb => $symb, |
endreserve => $lastres |
endreserve => $lastres, |
|
uniqueperiod => $uniqueperiod, |
}; |
}; |
} elsif (($startreserve > $now) && |
} elsif (($startreserve > $now) && |
(!$endreserve || $endreserve > $startreserve)) { |
(!$endreserve || $endreserve > $startreserve)) { |
$future_reservable{$slot} = { |
$future_reservable{$slot} = { |
symb => $symb, |
symb => $symb, |
startreserve => $startreserve |
startreserve => $startreserve, |
|
uniqueperiod => $uniqueperiod, |
}; |
}; |
} |
} |
} |
} |
Line 9894 sub ask_for_embedded_content {
|
Line 10218 sub ask_for_embedded_content {
|
($path) = |
($path) = |
($toplevel =~ m{^(\Q/uploaded/$cdom/$cnum/\E(?:docs|supplemental)/(?:default|\d+)/\d+)/}); |
($toplevel =~ m{^(\Q/uploaded/$cdom/$cnum/\E(?:docs|supplemental)/(?:default|\d+)/\d+)/}); |
} |
} |
$fileloc = &Apache::lonnet::filelocation('',$toplevel); |
if ($toplevel=~/^\/*(uploaded|editupload)/) { |
|
$fileloc = $toplevel; |
|
$fileloc=~ s/^\s*(\S+)\s*$/$1/; |
|
my ($udom,$uname,$fname) = |
|
($fileloc=~ m{^/+(?:uploaded|editupload)/+($match_domain)/+($match_name)/+(.*)$}); |
|
$fileloc = propath($udom,$uname).'/userfiles/'.$fname; |
|
} else { |
|
$fileloc = &Apache::lonnet::filelocation('',$toplevel); |
|
} |
$fileloc =~ s{^/}{}; |
$fileloc =~ s{^/}{}; |
($filename) = ($fileloc =~ m{.+/([^/]+)$}); |
($filename) = ($fileloc =~ m{.+/([^/]+)$}); |
$heading = &mt('Status of dependencies in [_1]',"$title ($filename)"); |
$heading = &mt('Status of dependencies in [_1]',"$title ($filename)"); |
Line 11050 sub decompress_form {
|
Line 11382 sub decompress_form {
|
"$topdir/media/player.swf", |
"$topdir/media/player.swf", |
"$topdir/media/swfobject.js", |
"$topdir/media/swfobject.js", |
"$topdir/media/expressInstall.swf"); |
"$topdir/media/expressInstall.swf"); |
my @camtasia8 = ("$topdir/","$topdir/$topdir.html", |
my @camtasia8_1 = ("$topdir/","$topdir/$topdir.html", |
"$topdir/$topdir.mp4", |
"$topdir/$topdir.mp4", |
"$topdir/$topdir\_config.xml", |
"$topdir/$topdir\_config.xml", |
"$topdir/$topdir\_controller.swf", |
"$topdir/$topdir\_controller.swf", |
Line 11072 sub decompress_form {
|
Line 11404 sub decompress_form {
|
"$topdir/skins/express_show/", |
"$topdir/skins/express_show/", |
"$topdir/skins/express_show/player-min.css", |
"$topdir/skins/express_show/player-min.css", |
"$topdir/skins/express_show/spritesheet.png"); |
"$topdir/skins/express_show/spritesheet.png"); |
|
my @camtasia8_4 = ("$topdir/","$topdir/$topdir.html", |
|
"$topdir/$topdir.mp4", |
|
"$topdir/$topdir\_config.xml", |
|
"$topdir/$topdir\_controller.swf", |
|
"$topdir/$topdir\_embed.css", |
|
"$topdir/$topdir\_First_Frame.png", |
|
"$topdir/$topdir\_player.html", |
|
"$topdir/$topdir\_Thumbnails.png", |
|
"$topdir/playerProductInstall.swf", |
|
"$topdir/scripts/", |
|
"$topdir/scripts/config_xml.js", |
|
"$topdir/scripts/techsmith-smart-player.min.js", |
|
"$topdir/skins/", |
|
"$topdir/skins/configuration_express.xml", |
|
"$topdir/skins/express_show/", |
|
"$topdir/skins/express_show/spritesheet.min.css", |
|
"$topdir/skins/express_show/spritesheet.png", |
|
"$topdir/skins/express_show/techsmith-smart-player.min.css"); |
my @diffs = &compare_arrays(\@paths,\@camtasia6); |
my @diffs = &compare_arrays(\@paths,\@camtasia6); |
if (@diffs == 0) { |
if (@diffs == 0) { |
$is_camtasia = 6; |
$is_camtasia = 6; |
} else { |
} else { |
@diffs = &compare_arrays(\@paths,\@camtasia8); |
@diffs = &compare_arrays(\@paths,\@camtasia8_1); |
if (@diffs == 0) { |
if (@diffs == 0) { |
$is_camtasia = 8; |
$is_camtasia = 8; |
|
} else { |
|
@diffs = &compare_arrays(\@paths,\@camtasia8_4); |
|
if (@diffs == 0) { |
|
$is_camtasia = 8; |
|
} |
} |
} |
} |
} |
} |
} |
Line 13890 sub check_clone {
|
Line 14245 sub check_clone {
|
(&Apache::lonnet::allowed('ccc',$env{'request.role.domain'}))) { |
(&Apache::lonnet::allowed('ccc',$env{'request.role.domain'}))) { |
$can_clone = 1; |
$can_clone = 1; |
} else { |
} else { |
my %clonehash = &Apache::lonnet::get('environment',['cloners'], |
my %clonehash = &Apache::lonnet::get('environment',['cloners','internal.coursecode'], |
$args->{'clonedomain'},$args->{'clonecourse'}); |
$args->{'clonedomain'},$args->{'clonecourse'}); |
my @cloners = split(/,/,$clonehash{'cloners'}); |
if ($clonehash{'cloners'} eq '') { |
if (grep(/^\*$/,@cloners)) { |
my %domdefs = &Apache::lonnet::get_domain_defaults($args->{'course_domain'}); |
$can_clone = 1; |
if ($domdefs{'canclone'}) { |
} elsif (grep(/^\*\:\Q$args->{'ccdomain'}\E$/,@cloners)) { |
unless ($domdefs{'canclone'} eq 'none') { |
$can_clone = 1; |
if ($domdefs{'canclone'} eq 'domain') { |
|
if ($args->{'ccdomain'} eq $args->{'clonedomain'}) { |
|
$can_clone = 1; |
|
} |
|
} elsif (($clonehash{'internal.coursecode'}) && ($args->{'crscode'}) && |
|
($args->{'clonedomain'} eq $args->{'course_domain'})) { |
|
if (&Apache::lonnet::default_instcode_cloning($args->{'clonedomain'},$domdefs{'canclone'}, |
|
$clonehash{'internal.coursecode'},$args->{'crscode'})) { |
|
$can_clone = 1; |
|
} |
|
} |
|
} |
|
} |
} else { |
} else { |
|
my @cloners = split(/,/,$clonehash{'cloners'}); |
|
if (grep(/^\*$/,@cloners)) { |
|
$can_clone = 1; |
|
} elsif (grep(/^\*\:\Q$args->{'ccdomain'}\E$/,@cloners)) { |
|
$can_clone = 1; |
|
} elsif (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners)) { |
|
$can_clone = 1; |
|
} |
|
unless ($can_clone) { |
|
if (($clonehash{'internal.coursecode'}) && ($args->{'crscode'}) && |
|
($args->{'clonedomain'} eq $args->{'course_domain'})) { |
|
my (%gotdomdefaults,%gotcodedefaults); |
|
foreach my $cloner (@cloners) { |
|
if (($cloner ne '*') && ($cloner !~ /^\*\:$match_domain$/) && |
|
($cloner !~ /^$match_username\:$match_domain$/) && ($cloner ne '')) { |
|
my (%codedefaults,@code_order); |
|
if (ref($gotcodedefaults{$args->{'clonedomain'}}) eq 'HASH') { |
|
if (ref($gotcodedefaults{$args->{'clonedomain'}}{'defaults'}) eq 'HASH') { |
|
%codedefaults = %{$gotcodedefaults{$args->{'clonedomain'}}{'defaults'}}; |
|
} |
|
if (ref($gotcodedefaults{$args->{'clonedomain'}}{'order'}) eq 'ARRAY') { |
|
@code_order = @{$gotcodedefaults{$args->{'clonedomain'}}{'order'}}; |
|
} |
|
} else { |
|
&Apache::lonnet::auto_instcode_defaults($args->{'clonedomain'}, |
|
\%codedefaults, |
|
\@code_order); |
|
$gotcodedefaults{$args->{'clonedomain'}}{'defaults'} = \%codedefaults; |
|
$gotcodedefaults{$args->{'clonedomain'}}{'order'} = \@code_order; |
|
} |
|
if (@code_order > 0) { |
|
if (&Apache::lonnet::check_instcode_cloning(\%codedefaults,\@code_order, |
|
$cloner,$clonehash{'internal.coursecode'}, |
|
$args->{'crscode'})) { |
|
$can_clone = 1; |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
unless ($can_clone) { |
my $ccrole = 'cc'; |
my $ccrole = 'cc'; |
if ($args->{'crstype'} eq 'Community') { |
if ($args->{'crstype'} eq 'Community') { |
$ccrole = 'co'; |
$ccrole = 'co'; |
} |
} |
my %roleshash = |
my %roleshash = |
&Apache::lonnet::get_my_roles($args->{'ccuname'}, |
&Apache::lonnet::get_my_roles($args->{'ccuname'}, |
$args->{'ccdomain'}, |
$args->{'ccdomain'}, |
'userroles',['active'],[$ccrole], |
'userroles',['active'],[$ccrole], |
[$args->{'clonedomain'}]); |
[$args->{'clonedomain'}]); |
if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) { |
if ($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) { |
$can_clone = 1; |
$can_clone = 1; |
} elsif (&Apache::lonnet::is_course_owner($args->{'clonedomain'},$args->{'clonecourse'},$args->{'ccuname'},$args->{'ccdomain'})) { |
} elsif (&Apache::lonnet::is_course_owner($args->{'clonedomain'},$args->{'clonecourse'}, |
|
$args->{'ccuname'},$args->{'ccdomain'})) { |
$can_clone = 1; |
$can_clone = 1; |
|
} |
|
} |
|
unless ($can_clone) { |
|
if ($args->{'crstype'} eq 'Community') { |
|
$clonemsg = &mt('No new community created.').$linefeed.&mt('The new community could not be cloned from the existing community because the new community owner ([_1]) does not have cloning rights in the existing community ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); |
} else { |
} else { |
if ($args->{'crstype'} eq 'Community') { |
$clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); |
$clonemsg = &mt('No new community created.').$linefeed.&mt('The new community could not be cloned from the existing community because the new community owner ([_1]) does not have cloning rights in the existing community ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); |
|
} else { |
|
$clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); |
|
} |
|
} |
} |
} |
} |
} |
} |
Line 14445 sub escape_url {
|
Line 14858 sub escape_url {
|
my ($url) = @_; |
my ($url) = @_; |
my @urlslices = split(/\//, $url,-1); |
my @urlslices = split(/\//, $url,-1); |
my $lastitem = &escape(pop(@urlslices)); |
my $lastitem = &escape(pop(@urlslices)); |
return join('/',@urlslices).'/'.$lastitem; |
return &HTML::Entities::encode(join('/',@urlslices),"'").'/'.$lastitem; |
} |
} |
|
|
sub compare_arrays { |
sub compare_arrays { |
Line 14503 sub init_user_environment {
|
Line 14916 sub init_user_environment {
|
} |
} |
} |
} |
closedir(DIR); |
closedir(DIR); |
|
# If there is a undeleted lockfile for the user's paste buffer remove it. |
|
my $namespace = 'nohist_courseeditor'; |
|
my $lockingkey = 'paste'."\0".'locked_num'; |
|
my %lockhash = &Apache::lonnet::get($namespace,[$lockingkey], |
|
$domain,$username); |
|
if (exists($lockhash{$lockingkey})) { |
|
my $delresult = &Apache::lonnet::del($namespace,[$lockingkey],$domain,$username); |
|
unless ($delresult eq 'ok') { |
|
&Apache::lonnet::logthis("Failed to delete paste buffer locking key in $namespace for ".$username.":".$domain." Result was: $delresult"); |
|
} |
|
} |
} |
} |
# Give them a new cookie |
# Give them a new cookie |
my $id = ($args->{'robot'} ? 'robot'.$args->{'robot'} |
my $id = ($args->{'robot'} ? 'robot'.$args->{'robot'} |
Line 14516 sub init_user_environment {
|
Line 14940 sub init_user_environment {
|
} |
} |
# ------------------------------------ Check browser type and MathML capability |
# ------------------------------------ Check browser type and MathML capability |
|
|
my ($httpbrowser,$clientbrowser,$clientversion,$clientmathml, |
my ($httpbrowser,$clientbrowser,$clientversion,$clientmathml,$clientunicode, |
$clientunicode,$clientos,$clientmobile,$clientinfo) = &decode_user_agent($r); |
$clientos,$clientmobile,$clientinfo,$clientosversion) = &decode_user_agent($r); |
|
|
# ------------------------------------------------------------- Get environment |
# ------------------------------------------------------------- Get environment |
|
|
Line 14550 sub init_user_environment {
|
Line 14974 sub init_user_environment {
|
"browser.os" => $clientos, |
"browser.os" => $clientos, |
"browser.mobile" => $clientmobile, |
"browser.mobile" => $clientmobile, |
"browser.info" => $clientinfo, |
"browser.info" => $clientinfo, |
|
"browser.osversion" => $clientosversion, |
"server.domain" => $Apache::lonnet::perlvar{'lonDefDomain'}, |
"server.domain" => $Apache::lonnet::perlvar{'lonDefDomain'}, |
"request.course.fn" => '', |
"request.course.fn" => '', |
"request.course.uri" => '', |
"request.course.uri" => '', |
Line 14876 sub build_filters {
|
Line 15301 sub build_filters {
|
} |
} |
$cloneableonlyform = '<span class="LC_nobreak"><label><input type="radio" name="cloneableonly" value="1" '.$cloneableon.'/> '.&mt('Required').'</label>'.(' 'x3).'<label><input type="radio" name="cloneableonly" value="" '.$cloneableoff.' /> '.&mt('No restriction').'</label></span>'; |
$cloneableonlyform = '<span class="LC_nobreak"><label><input type="radio" name="cloneableonly" value="1" '.$cloneableon.'/> '.&mt('Required').'</label>'.(' 'x3).'<label><input type="radio" name="cloneableonly" value="" '.$cloneableoff.' /> '.&mt('No restriction').'</label></span>'; |
if ($formname eq 'ccrs') { |
if ($formname eq 'ccrs') { |
$cloneabletitle = &mt('Cloneable for').' '.$cloneruname.':'.$clonerudom; |
$cloneabletitle = &mt('Cloneable for [_1]',$cloneruname.':'.$clonerudom); |
} else { |
} else { |
$cloneabletitle = &mt('Cloneable by you'); |
$cloneabletitle = &mt('Cloneable by you'); |
} |
} |
Line 14920 sub build_filters {
|
Line 15345 sub build_filters {
|
$output .= '<input type="hidden" name="phase" value="courselist" />'."\n". |
$output .= '<input type="hidden" name="phase" value="courselist" />'."\n". |
'<input type="hidden" name="prevphase" value="'. |
'<input type="hidden" name="prevphase" value="'. |
$prevphase.'" />'."\n"; |
$prevphase.'" />'."\n"; |
} elsif ($formname ne 'quotacheck') { |
} elsif ($formname eq 'quotacheck') { |
|
$output .= qq| |
|
<input type="hidden" name="sortby" value="" /> |
|
<input type="hidden" name="sortorder" value="" /> |
|
|; |
|
} else { |
my $name_input; |
my $name_input; |
if ($cnameelement ne '') { |
if ($cnameelement ne '') { |
$name_input = '<input type="hidden" name="cnameelement" value="'. |
$name_input = '<input type="hidden" name="cnameelement" value="'. |
Line 15113 cloneruname - optional username of new c
|
Line 15543 cloneruname - optional username of new c
|
|
|
clonerudom - optional domain of new course owner |
clonerudom - optional domain of new course owner |
|
|
domcloner - Optional "domcloner" flag; has value=1 if user has ccc priv in domain being filtered by, |
domcloner - optional "domcloner" flag; has value=1 if user has ccc priv in domain being filtered by, |
(used when DC is using course creation form) |
(used when DC is using course creation form) |
|
|
codetitles - reference to array of titles of components in institutional codes (official courses). |
codetitles - reference to array of titles of components in institutional codes (official courses). |
|
|
|
cc_clone - escaped comma separated list of courses for which course cloner has active CC role |
|
(and so can clone automatically) |
|
|
|
reqcrsdom - domain of new course, where search_courses is used to identify potential courses to clone |
|
|
|
reqinstcode - institutional code of new course, where search_courses is used to identify potential |
|
courses to clone |
|
|
Returns: %courses - hash of courses satisfying search criteria, keys = course IDs, values are corresponding colon-separated escaped description, institutional code, owner and type. |
Returns: %courses - hash of courses satisfying search criteria, keys = course IDs, values are corresponding colon-separated escaped description, institutional code, owner and type. |
|
|
Line 15128 Side Effects: None
|
Line 15565 Side Effects: None
|
|
|
|
|
sub search_courses { |
sub search_courses { |
my ($dom,$type,$filter,$numtitles,$cloneruname,$clonerudom,$domcloner,$codetitles) = @_; |
my ($dom,$type,$filter,$numtitles,$cloneruname,$clonerudom,$domcloner,$codetitles, |
|
$cc_clone,$reqcrsdom,$reqinstcode) = @_; |
my (%courses,%showcourses,$cloner); |
my (%courses,%showcourses,$cloner); |
if (($filter->{'ownerfilter'} ne '') || |
if (($filter->{'ownerfilter'} ne '') || |
($filter->{'ownerdomfilter'} ne '')) { |
($filter->{'ownerdomfilter'} ne '')) { |
Line 15176 sub search_courses {
|
Line 15614 sub search_courses {
|
$filter->{'combownerfilter'}, |
$filter->{'combownerfilter'}, |
$filter->{'coursefilter'}, |
$filter->{'coursefilter'}, |
undef,undef,$type,$regexpok,undef,undef, |
undef,undef,$type,$regexpok,undef,undef, |
undef,undef,$cloner,$env{'form.cc_clone'}, |
undef,undef,$cloner,$cc_clone, |
$filter->{'cloneableonly'}, |
$filter->{'cloneableonly'}, |
$createdbefore,$createdafter,undef, |
$createdbefore,$createdafter,undef, |
$domcloner); |
$domcloner,undef,$reqcrsdom,$reqinstcode); |
if (($filter->{'personfilter'} ne '') && ($filter->{'persondomfilter'} ne '')) { |
if (($filter->{'personfilter'} ne '') && ($filter->{'persondomfilter'} ne '')) { |
my $ccrole; |
my $ccrole; |
if ($type eq 'Community') { |
if ($type eq 'Community') { |
Line 15213 sub search_courses {
|
Line 15651 sub search_courses {
|
return %courses; |
return %courses; |
} |
} |
|
|
|
|
=pod |
=pod |
|
|
=back |
=back |
|
|
|
=head1 Routines for version requirements for current course. |
|
|
|
=over 4 |
|
|
|
=item * &check_release_required() |
|
|
|
Compares required LON-CAPA version with version on server, and |
|
if required version is newer looks for a server with the required version. |
|
|
|
Looks first at servers in user's owen domain; if none suitable, looks at |
|
servers in course's domain are permitted to host sessions for user's domain. |
|
|
|
Inputs: |
|
|
|
$loncaparev - Version on current server (format: Major.Minor.Subrelease-datestamp) |
|
|
|
$courseid - Course ID of current course |
|
|
|
$rolecode - User's current role in course (for switchserver query string). |
|
|
|
$required - LON-CAPA version needed by course (format: Major.Minor). |
|
|
|
|
|
Returns: |
|
|
|
$switchserver - query string tp append to /adm/switchserver call (if |
|
current server's LON-CAPA version is too old. |
|
|
|
$warning - Message is displayed if no suitable server could be found. |
|
|
=cut |
=cut |
|
|
|
sub check_release_required { |
|
my ($loncaparev,$courseid,$rolecode,$required) = @_; |
|
my ($switchserver,$warning); |
|
if ($required ne '') { |
|
my ($reqdmajor,$reqdminor) = ($required =~ /^(\d+)\.(\d+)$/); |
|
my ($major,$minor) = ($loncaparev =~ /^\'?(\d+)\.(\d+)\.[\w.\-]+\'?$/); |
|
if ($reqdmajor ne '' && $reqdminor ne '') { |
|
my $otherserver; |
|
if (($major eq '' && $minor eq '') || |
|
(($reqdmajor > $major) || (($reqdmajor == $major) && ($reqdminor > $minor)))) { |
|
my ($userdomserver) = &Apache::lonnet::choose_server($env{'user.domain'},undef,$required,1); |
|
my $switchlcrev = |
|
&Apache::lonnet::get_server_loncaparev($env{'user.domain'}, |
|
$userdomserver); |
|
my ($swmajor,$swminor) = ($switchlcrev =~ /^\'?(\d+)\.(\d+)\.[\w.\-]+\'?$/); |
|
if (($swmajor eq '' && $swminor eq '') || ($reqdmajor > $swmajor) || |
|
(($reqdmajor == $swmajor) && ($reqdminor > $swminor))) { |
|
my $cdom = $env{'course.'.$courseid.'.domain'}; |
|
if ($cdom ne $env{'user.domain'}) { |
|
my ($coursedomserver,$coursehostname) = &Apache::lonnet::choose_server($cdom,undef,$required,1); |
|
my $serverhomeID = &Apache::lonnet::get_server_homeID($coursehostname); |
|
my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID); |
|
my %defdomdefaults = &Apache::lonnet::get_domain_defaults($serverhomedom); |
|
my %udomdefaults = &Apache::lonnet::get_domain_defaults($env{'user.domain'}); |
|
my $remoterev = &Apache::lonnet::get_server_loncaparev($serverhomedom,$coursedomserver); |
|
my $canhost = |
|
&Apache::lonnet::can_host_session($env{'user.domain'}, |
|
$coursedomserver, |
|
$remoterev, |
|
$udomdefaults{'remotesessions'}, |
|
$defdomdefaults{'hostedsessions'}); |
|
|
sub build_release_hashes { |
if ($canhost) { |
my ($checkparms,$checkresponsetypes,$checkcrstypes,$anonsurvey,$randomizetry) = @_; |
$otherserver = $coursedomserver; |
return unless((ref($checkparms) eq 'HASH') && (ref($checkresponsetypes) eq 'HASH') && |
} else { |
(ref($checkcrstypes) eq 'HASH') && (ref($anonsurvey) eq 'HASH') && |
$warning = &mt('Requires LON-CAPA version [_1].',$env{'course.'.$courseid.'.internal.releaserequired'}).'<br />'. &mt("No suitable server could be found amongst servers in either your own domain or in the course's domain."); |
(ref($randomizetry) eq 'HASH')); |
} |
foreach my $key (keys(%Apache::lonnet::needsrelease)) { |
} else { |
my ($item,$name,$value) = split(/:/,$key); |
$warning = &mt('Requires LON-CAPA version [_1].',$env{'course.'.$courseid.'.internal.releaserequired'}).'<br />'.&mt("No suitable server could be found amongst servers in your own domain (which is also the course's domain)."); |
if ($item eq 'parameter') { |
} |
if (ref($checkparms->{$name}) eq 'ARRAY') { |
} else { |
unless(grep(/^\Q$name\E$/,@{$checkparms->{$name}})) { |
$otherserver = $userdomserver; |
push(@{$checkparms->{$name}},$value); |
|
} |
} |
} else { |
|
push(@{$checkparms->{$name}},$value); |
|
} |
} |
} elsif ($item eq 'resourcetag') { |
if ($otherserver ne '') { |
if ($name eq 'responsetype') { |
$switchserver = 'otherserver='.$otherserver.'&role='.$rolecode; |
$checkresponsetypes->{$value} = $Apache::lonnet::needsrelease{$key} |
|
} |
} |
} elsif ($item eq 'course') { |
} |
if ($name eq 'crstype') { |
} |
$checkcrstypes->{$value} = $Apache::lonnet::needsrelease{$key}; |
return ($switchserver,$warning); |
|
} |
|
|
|
=pod |
|
|
|
=item * &check_release_result() |
|
|
|
Inputs: |
|
|
|
$switchwarning - Warning message if no suitable server found to host session. |
|
|
|
$switchserver - query string to append to /adm/switchserver containing lonHostID |
|
and current role. |
|
|
|
Returns: HTML to display with information about requirement to switch server. |
|
Either displaying warning with link to Roles/Courses screen or |
|
display link to switchserver. |
|
|
|
=cut |
|
|
|
sub check_release_result { |
|
my ($switchwarning,$switchserver) = @_; |
|
my $output = &start_page('Selected course unavailable on this server'). |
|
'<p class="LC_warning">'; |
|
if ($switchwarning) { |
|
$output .= $switchwarning.'<br /><a href="/adm/roles">'; |
|
if (&show_course()) { |
|
$output .= &mt('Display courses'); |
|
} else { |
|
$output .= &mt('Display roles'); |
|
} |
|
$output .= '</a>'; |
|
} elsif ($switchserver) { |
|
$output .= &mt('This course requires a newer version of LON-CAPA than is installed on this server.'). |
|
'<br />'. |
|
'<a href="/adm/switchserver?'.$switchserver.'">'. |
|
&mt('Switch Server'). |
|
'</a>'; |
|
} |
|
$output .= '</p>'.&end_page(); |
|
return $output; |
|
} |
|
|
|
=pod |
|
|
|
=item * &needs_coursereinit() |
|
|
|
Determine if course contents stored for user's session needs to be |
|
refreshed, because content has changed since "Big Hash" last tied. |
|
|
|
Check for change is made if time last checked is more than 10 minutes ago |
|
(by default). |
|
|
|
Inputs: |
|
|
|
$loncaparev - Version on current server (format: Major.Minor.Subrelease-datestamp) |
|
|
|
$interval (optional) - Time which may elapse (in s) between last check for content |
|
change in current course. (default: 600 s). |
|
|
|
Returns: an array; first element is: |
|
|
|
=over 4 |
|
|
|
'switch' - if content updates mean user's session |
|
needs to be switched to a server running a newer LON-CAPA version |
|
|
|
'update' - if course session needs to be refreshed (i.e., Big Hash needs to be reloaded) |
|
on current server hosting user's session |
|
|
|
'' - if no action required. |
|
|
|
=back |
|
|
|
If first item element is 'switch': |
|
|
|
second item is $switchwarning - Warning message if no suitable server found to host session. |
|
|
|
third item is $switchserver - query string to append to /adm/switchserver containing lonHostID |
|
and current role. |
|
|
|
otherwise: no other elements returned. |
|
|
|
=back |
|
|
|
=cut |
|
|
|
sub needs_coursereinit { |
|
my ($loncaparev,$interval) = @_; |
|
return() unless ($env{'request.course.id'} && $env{'request.course.tied'}); |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my $now = time; |
|
if ($interval eq '') { |
|
$interval = 600; |
|
} |
|
if (($now-$env{'request.course.timechecked'})>$interval) { |
|
my $lastchange = &Apache::lonnet::get_coursechange($cdom,$cnum); |
|
&Apache::lonnet::appenv({'request.course.timechecked'=>$now}); |
|
if ($lastchange > $env{'request.course.tied'}) { |
|
my %curr_reqd_hash = &Apache::lonnet::userenvironment($cdom,$cnum,'internal.releaserequired'); |
|
if ($curr_reqd_hash{'internal.releaserequired'} ne '') { |
|
my $required = $env{'course.'.$cdom.'_'.$cnum.'.internal.releaserequired'}; |
|
if ($curr_reqd_hash{'internal.releaserequired'} ne $required) { |
|
&Apache::lonnet::appenv({'course.'.$cdom.'_'.$cnum.'.internal.releaserequired' => |
|
$curr_reqd_hash{'internal.releaserequired'}}); |
|
my ($switchserver,$switchwarning) = |
|
&check_release_required($loncaparev,$cdom.'_'.$cnum,$env{'request.role'}, |
|
$curr_reqd_hash{'internal.releaserequired'}); |
|
if ($switchwarning ne '' || $switchserver ne '') { |
|
return ('switch',$switchwarning,$switchserver); |
|
} |
|
} |
} |
} |
|
return ('update'); |
} |
} |
} |
} |
($anonsurvey->{major},$anonsurvey->{minor}) = split(/\./,$Apache::lonnet::needsrelease{'parameter:type:anonsurvey'}); |
return (); |
($randomizetry->{major},$randomizetry->{minor}) = split(/\./,$Apache::lonnet::needsrelease{'parameter:type:randomizetry'}); |
|
return; |
|
} |
} |
|
|
sub update_content_constraints { |
sub update_content_constraints { |
Line 15432 sub symb_to_docspath {
|
Line 16037 sub symb_to_docspath {
|
sub captcha_display { |
sub captcha_display { |
my ($context,$lonhost) = @_; |
my ($context,$lonhost) = @_; |
my ($output,$error); |
my ($output,$error); |
my ($captcha,$pubkey,$privkey) = &get_captcha_config($context,$lonhost); |
my ($captcha,$pubkey,$privkey,$version) = |
|
&get_captcha_config($context,$lonhost); |
if ($captcha eq 'original') { |
if ($captcha eq 'original') { |
$output = &create_captcha(); |
$output = &create_captcha(); |
unless ($output) { |
unless ($output) { |
$error = 'captcha'; |
$error = 'captcha'; |
} |
} |
} elsif ($captcha eq 'recaptcha') { |
} elsif ($captcha eq 'recaptcha') { |
$output = &create_recaptcha($pubkey); |
$output = &create_recaptcha($pubkey,$version); |
unless ($output) { |
unless ($output) { |
$error = 'recaptcha'; |
$error = 'recaptcha'; |
} |
} |
} |
} |
return ($output,$error,$captcha); |
return ($output,$error,$captcha,$version); |
} |
} |
|
|
sub captcha_response { |
sub captcha_response { |
my ($context,$lonhost) = @_; |
my ($context,$lonhost) = @_; |
my ($captcha_chk,$captcha_error); |
my ($captcha_chk,$captcha_error); |
my ($captcha,$pubkey,$privkey) = &get_captcha_config($context,$lonhost); |
my ($captcha,$pubkey,$privkey.$version) = &get_captcha_config($context,$lonhost); |
if ($captcha eq 'original') { |
if ($captcha eq 'original') { |
($captcha_chk,$captcha_error) = &check_captcha(); |
($captcha_chk,$captcha_error) = &check_captcha(); |
} elsif ($captcha eq 'recaptcha') { |
} elsif ($captcha eq 'recaptcha') { |
$captcha_chk = &check_recaptcha($privkey); |
$captcha_chk = &check_recaptcha($privkey,$version); |
} else { |
} else { |
$captcha_chk = 1; |
$captcha_chk = 1; |
} |
} |
Line 15463 sub captcha_response {
|
Line 16069 sub captcha_response {
|
|
|
sub get_captcha_config { |
sub get_captcha_config { |
my ($context,$lonhost) = @_; |
my ($context,$lonhost) = @_; |
my ($captcha,$pubkey,$privkey,$hashtocheck); |
my ($captcha,$pubkey,$privkey,$version,$hashtocheck); |
my $hostname = &Apache::lonnet::hostname($lonhost); |
my $hostname = &Apache::lonnet::hostname($lonhost); |
my $serverhomeID = &Apache::lonnet::get_server_homeID($hostname); |
my $serverhomeID = &Apache::lonnet::get_server_homeID($hostname); |
my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID); |
my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID); |
Line 15479 sub get_captcha_config {
|
Line 16085 sub get_captcha_config {
|
} |
} |
if ($privkey && $pubkey) { |
if ($privkey && $pubkey) { |
$captcha = 'recaptcha'; |
$captcha = 'recaptcha'; |
|
$version = $hashtocheck->{'recaptchaversion'}; |
|
if ($version ne '2') { |
|
$version = 1; |
|
} |
} else { |
} else { |
$captcha = 'original'; |
$captcha = 'original'; |
} |
} |
Line 15496 sub get_captcha_config {
|
Line 16106 sub get_captcha_config {
|
$privkey = $domconfhash{$serverhomedom.'.login.recaptchakeys_private'}; |
$privkey = $domconfhash{$serverhomedom.'.login.recaptchakeys_private'}; |
if ($privkey && $pubkey) { |
if ($privkey && $pubkey) { |
$captcha = 'recaptcha'; |
$captcha = 'recaptcha'; |
|
$version = $domconfhash{$serverhomedom.'.login.recaptchaversion'}; |
|
if ($version ne '2') { |
|
$version = 1; |
|
} |
} else { |
} else { |
$captcha = 'original'; |
$captcha = 'original'; |
} |
} |
Line 15503 sub get_captcha_config {
|
Line 16117 sub get_captcha_config {
|
$captcha = 'original'; |
$captcha = 'original'; |
} |
} |
} |
} |
return ($captcha,$pubkey,$privkey); |
return ($captcha,$pubkey,$privkey,$version); |
} |
} |
|
|
sub create_captcha { |
sub create_captcha { |
Line 15562 sub check_captcha {
|
Line 16176 sub check_captcha {
|
} |
} |
|
|
sub create_recaptcha { |
sub create_recaptcha { |
my ($pubkey) = @_; |
my ($pubkey,$version) = @_; |
my $use_ssl; |
if ($version >= 2) { |
if ($ENV{'SERVER_PORT'} == 443) { |
return '<div class="g-recaptcha" data-sitekey="'.$pubkey.'"></div>'; |
$use_ssl = 1; |
} else { |
} |
my $use_ssl; |
my $captcha = Captcha::reCAPTCHA->new; |
if ($ENV{'SERVER_PORT'} == 443) { |
return $captcha->get_options_setter({theme => 'white'})."\n". |
$use_ssl = 1; |
$captcha->get_html($pubkey,undef,$use_ssl). |
} |
&mt('If either word is hard to read, [_1] will replace them.', |
my $captcha = Captcha::reCAPTCHA->new; |
'<img src="/res/adm/pages/refresh.gif" alt="reCAPTCHA refresh" />'). |
return $captcha->get_options_setter({theme => 'white'})."\n". |
'<br /><br />'; |
$captcha->get_html($pubkey,undef,$use_ssl). |
|
&mt('If the text is hard to read, [_1] will replace them.', |
|
'<img src="/res/adm/pages/refresh.gif" alt="reCAPTCHA refresh" />'). |
|
'<br /><br />'; |
|
} |
} |
} |
|
|
sub check_recaptcha { |
sub check_recaptcha { |
my ($privkey) = @_; |
my ($privkey,$version) = @_; |
my $captcha_chk; |
my $captcha_chk; |
my $captcha = Captcha::reCAPTCHA->new; |
if ($version >= 2) { |
my $captcha_result = |
my $ua = LWP::UserAgent->new; |
$captcha->check_answer( |
$ua->timeout(10); |
$privkey, |
my %info = ( |
$ENV{'REMOTE_ADDR'}, |
secret => $privkey, |
$env{'form.recaptcha_challenge_field'}, |
response => $env{'form.g-recaptcha-response'}, |
$env{'form.recaptcha_response_field'}, |
remoteip => $ENV{'REMOTE_ADDR'}, |
); |
); |
if ($captcha_result->{is_valid}) { |
my $response = $ua->post('https://www.google.com/recaptcha/api/siteverify',\%info); |
$captcha_chk = 1; |
if ($response->is_success) { |
|
my $data = JSON::DWIW->from_json($response->decoded_content); |
|
if (ref($data) eq 'HASH') { |
|
if ($data->{'success'}) { |
|
$captcha_chk = 1; |
|
} |
|
} |
|
} |
|
} else { |
|
my $captcha = Captcha::reCAPTCHA->new; |
|
my $captcha_result = |
|
$captcha->check_answer( |
|
$privkey, |
|
$ENV{'REMOTE_ADDR'}, |
|
$env{'form.recaptcha_challenge_field'}, |
|
$env{'form.recaptcha_response_field'}, |
|
); |
|
if ($captcha_result->{is_valid}) { |
|
$captcha_chk = 1; |
|
} |
} |
} |
return $captcha_chk; |
return $captcha_chk; |
} |
} |
|
|
sub emailusername_info { |
sub emailusername_info { |
my @fields = ('firstname','lastname','institution','web','location','officialemail'); |
my @fields = ('firstname','lastname','institution','web','location','officialemail','id'); |
my %titles = &Apache::lonlocal::texthash ( |
my %titles = &Apache::lonlocal::texthash ( |
lastname => 'Last Name', |
lastname => 'Last Name', |
firstname => 'First Name', |
firstname => 'First Name', |
Line 15601 sub emailusername_info {
|
Line 16238 sub emailusername_info {
|
location => "School's city, state/province, country", |
location => "School's city, state/province, country", |
web => "School's web address", |
web => "School's web address", |
officialemail => 'E-mail address at institution (if different)', |
officialemail => 'E-mail address at institution (if different)', |
|
id => 'Student/Employee ID', |
); |
); |
return (\@fields,\%titles); |
return (\@fields,\%titles); |
} |
} |
Line 15627 sub cleanup_html {
|
Line 16265 sub cleanup_html {
|
return $outgoing; |
return $outgoing; |
} |
} |
|
|
|
# Checks for critical messages and returns a redirect url if one exists. |
|
# $interval indicates how often to check for messages. |
|
sub critical_redirect { |
|
my ($interval) = @_; |
|
if ((time-$env{'user.criticalcheck.time'})>$interval) { |
|
my @what=&Apache::lonnet::dump('critical', $env{'user.domain'}, |
|
$env{'user.name'}); |
|
&Apache::lonnet::appenv({'user.criticalcheck.time'=>time}); |
|
my $redirecturl; |
|
if ($what[0]) { |
|
if (($what[0] ne 'con_lost') && ($what[0]!~/^error\:/)) { |
|
$redirecturl='/adm/email?critical=display'; |
|
my $url=&Apache::lonnet::absolute_url().$redirecturl; |
|
return (1, $url); |
|
} |
|
} |
|
} |
|
return (); |
|
} |
|
|
# Use: |
# Use: |
# my $answer=reply("encrypt:passwd:$udom:$uname:$upass",$tryserver); |
# my $answer=reply("encrypt:passwd:$udom:$uname:$upass",$tryserver); |
# |
# |
Line 15661 sub des_decrypt {
|
Line 16319 sub des_decrypt {
|
} else { |
} else { |
$cypher=new DES $keybin; |
$cypher=new DES $keybin; |
} |
} |
my $plaintext= |
my $plaintext=''; |
$cypher->decrypt(unpack("a8",pack("H16",substr($cyphertext,0,16)))); |
my $cypherlength = length($cyphertext); |
$plaintext.= |
my $numchunks = int($cypherlength/32); |
$cypher->decrypt(unpack("a8",pack("H16",substr($cyphertext,16,16)))); |
for (my $j=0; $j<$numchunks; $j++) { |
$plaintext=substr($plaintext,1,ord(substr($plaintext,0,1)) ); |
my $start = $j*32; |
|
my $cypherblock = substr($cyphertext,$start,32); |
|
my $chunk = |
|
$cypher->decrypt(unpack("a8",pack("H16",substr($cypherblock,0,16)))); |
|
$chunk .= |
|
$cypher->decrypt(unpack("a8",pack("H16",substr($cypherblock,16,16)))); |
|
$chunk=substr($chunk,1,ord(substr($chunk,0,1)) ); |
|
$plaintext .= $chunk; |
|
} |
return $plaintext; |
return $plaintext; |
} |
} |
|
|