version 1.1073, 2012/04/25 21:22:01
|
version 1.1130, 2013/05/25 21:56:23
|
Line 67 use Apache::lonhtmlcommon();
|
Line 67 use Apache::lonhtmlcommon();
|
use Apache::loncoursedata(); |
use Apache::loncoursedata(); |
use Apache::lontexconvert(); |
use Apache::lontexconvert(); |
use Apache::lonclonecourse(); |
use Apache::lonclonecourse(); |
|
use Apache::lonuserutils(); |
|
use Apache::lonuserstate(); |
use LONCAPA qw(:DEFAULT :match); |
use LONCAPA qw(:DEFAULT :match); |
use DateTime::TimeZone; |
use DateTime::TimeZone; |
use DateTime::Locale::Catalog; |
use DateTime::Locale::Catalog; |
|
use Text::Aspell; |
|
use Authen::Captcha; |
|
use Captcha::reCAPTCHA; |
|
|
# ---------------------------------------------- Designs |
# ---------------------------------------------- Designs |
use vars qw(%defaultdesign); |
use vars qw(%defaultdesign); |
Line 154 sub ssi_with_retries {
|
Line 159 sub ssi_with_retries {
|
# ----------------------------------------------- Filetypes/Languages/Copyright |
# ----------------------------------------------- Filetypes/Languages/Copyright |
my %language; |
my %language; |
my %supported_language; |
my %supported_language; |
|
my %supported_codes; |
my %latex_language; # For choosing hyphenation in <transl..> |
my %latex_language; # For choosing hyphenation in <transl..> |
my %latex_language_bykey; # for choosing hyphenation from metadata |
my %latex_language_bykey; # for choosing hyphenation from metadata |
my %cprtag; |
my %cprtag; |
Line 188 BEGIN {
|
Line 194 BEGIN {
|
while (my $line = <$fh>) { |
while (my $line = <$fh>) { |
next if ($line=~/^\#/); |
next if ($line=~/^\#/); |
chomp($line); |
chomp($line); |
my ($key,$two,$country,$three,$enc,$val,$sup,$latex)=(split(/\t/,$line)); |
my ($key,$code,$country,$three,$enc,$val,$sup,$latex)=(split(/\t/,$line)); |
$language{$key}=$val.' - '.$enc; |
$language{$key}=$val.' - '.$enc; |
if ($sup) { |
if ($sup) { |
$supported_language{$key}=$sup; |
$supported_language{$key}=$sup; |
|
$supported_codes{$key} = $code; |
} |
} |
if ($latex) { |
if ($latex) { |
$latex_language_bykey{$key} = $latex; |
$latex_language_bykey{$key} = $latex; |
$latex_language{$two} = $latex; |
$latex_language{$code} = $latex; |
} |
} |
} |
} |
close($fh); |
close($fh); |
Line 524 ENDAUTHORBRW
|
Line 531 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) = @_; |
my $wintitle = 'Course_Browser'; |
my $wintitle = 'Course_Browser'; |
if ($crstype eq 'Community') { |
if ($crstype eq 'Community') { |
$wintitle = 'Community_Browser'; |
$wintitle = 'Community_Browser'; |
Line 587 sub coursebrowser_javascript {
|
Line 595 sub coursebrowser_javascript {
|
} |
} |
$id_functions |
$id_functions |
ENDSTDBRW |
ENDSTDBRW |
if (($sec_element ne '') || ($role_element ne '')) { |
if (($sec_element ne '') || ($role_element ne '') || ($credits_element ne '')) { |
$output .= &setsec_javascript($sec_element,$formname,$role_element); |
$output .= &setsec_javascript($sec_element,$formname,$role_element, |
|
$credits_element); |
} |
} |
$output .= ' |
$output .= ' |
// ]]> |
// ]]> |
Line 657 if (!Array.prototype.indexOf) {
|
Line 666 if (!Array.prototype.indexOf) {
|
var n = 0; |
var n = 0; |
if (arguments.length > 0) { |
if (arguments.length > 0) { |
n = Number(arguments[1]); |
n = Number(arguments[1]); |
if (n !== n) { // shortcut for verifying if it's NaN |
if (n !== n) { // shortcut for verifying if it is NaN |
n = 0; |
n = 0; |
} else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { |
} else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { |
n = (n > 0 || -1) * Math.floor(Math.abs(n)); |
n = (n > 0 || -1) * Math.floor(Math.abs(n)); |
Line 745 ENDUSERBRW
|
Line 754 ENDUSERBRW
|
} |
} |
|
|
sub setsec_javascript { |
sub setsec_javascript { |
my ($sec_element,$formname,$role_element) = @_; |
my ($sec_element,$formname,$role_element,$credits_element) = @_; |
my (@courserolenames,@communityrolenames,$rolestr,$courserolestr, |
my (@courserolenames,@communityrolenames,$rolestr,$courserolestr, |
$communityrolestr); |
$communityrolestr); |
if ($role_element ne '') { |
if ($role_element ne '') { |
Line 840 function setRole(crstype) {
|
Line 849 function setRole(crstype) {
|
} |
} |
|; |
|; |
} |
} |
|
if ($credits_element) { |
|
$setsections .= qq| |
|
function setCredits(defaultcredits) { |
|
document.$formname.$credits_element.value = defaultcredits; |
|
return; |
|
} |
|
|; |
|
} |
return $setsections; |
return $setsections; |
} |
} |
|
|
Line 885 sub check_uncheck_jscript {
|
Line 902 sub check_uncheck_jscript {
|
function checkAll(field) { |
function checkAll(field) { |
if (field.length > 0) { |
if (field.length > 0) { |
for (i = 0; i < field.length; i++) { |
for (i = 0; i < field.length; i++) { |
field[i].checked = true ; |
if (!field[i].disabled) { |
|
field[i].checked = true; |
|
} |
} |
} |
} else { |
} else { |
field.checked = true |
if (!field.disabled) { |
|
field.checked = true; |
|
} |
} |
} |
} |
} |
|
|
Line 990 sub select_language {
|
Line 1011 sub select_language {
|
$langchoices{$code} = &plainlanguagedescription($id); |
$langchoices{$code} = &plainlanguagedescription($id); |
} |
} |
} |
} |
|
%langchoices = &Apache::lonlocal::texthash(%langchoices); |
return &select_form($selected,$name,\%langchoices); |
return &select_form($selected,$name,\%langchoices); |
} |
} |
|
|
=pod |
=pod |
|
|
|
|
|
=item * &list_languages() |
|
|
|
Returns an array reference that is suitable for use in language prompters. |
|
Each array element is itself a two element array. The first element |
|
is the language code. The second element a descsriptiuon of the |
|
language itself. This is suitable for use in e.g. |
|
&Apache::edit::select_arg (once dereferenced that is). |
|
|
|
=cut |
|
|
|
sub list_languages { |
|
my @lang_choices; |
|
|
|
foreach my $id (&languageids()) { |
|
my $code = &supportedlanguagecode($id); |
|
if ($code) { |
|
my $selector = $supported_codes{$id}; |
|
my $description = &plainlanguagedescription($id); |
|
push (@lang_choices, [$selector, $description]); |
|
} |
|
} |
|
return \@lang_choices; |
|
} |
|
|
|
=pod |
|
|
=item * &linked_select_forms(...) |
=item * &linked_select_forms(...) |
|
|
linked_select_forms returns a string containing a <script></script> block |
linked_select_forms returns a string containing a <script></script> block |
Line 1021 linked_select_forms takes the following
|
Line 1070 linked_select_forms takes the following
|
|
|
=item * $menuorder, the order of values in the first menu |
=item * $menuorder, the order of values in the first menu |
|
|
|
=item * $onchangefirst, additional javascript call to execute for an onchange |
|
event for the first <select> tag |
|
|
|
=item * $onchangesecond, additional javascript call to execute for an onchange |
|
event for the second <select> tag |
|
|
=back |
=back |
|
|
Below is an example of such a hash. Only the 'text', 'default', and |
Below is an example of such a hash. Only the 'text', 'default', and |
Line 1074 sub linked_select_forms {
|
Line 1129 sub linked_select_forms {
|
$secondselectname, |
$secondselectname, |
$hashref, |
$hashref, |
$menuorder, |
$menuorder, |
|
$onchangefirst, |
|
$onchangesecond |
) = @_; |
) = @_; |
my $second = "document.$formname.$secondselectname"; |
my $second = "document.$formname.$secondselectname"; |
my $first = "document.$formname.$firstselectname"; |
my $first = "document.$formname.$firstselectname"; |
Line 1130 function select1_changed() {
|
Line 1187 function select1_changed() {
|
</script> |
</script> |
END |
END |
# output the initial values for the selection lists |
# output the initial values for the selection lists |
$result .= "<select size=\"1\" name=\"$firstselectname\" onchange=\"select1_changed()\">\n"; |
$result .= "<select size=\"1\" name=\"$firstselectname\" onchange=\"select1_changed();$onchangefirst\">\n"; |
my @order = sort(keys(%{$hashref})); |
my @order = sort(keys(%{$hashref})); |
if (ref($menuorder) eq 'ARRAY') { |
if (ref($menuorder) eq 'ARRAY') { |
@order = @{$menuorder}; |
@order = @{$menuorder}; |
Line 1143 END
|
Line 1200 END
|
$result .= "</select>\n"; |
$result .= "</select>\n"; |
my %select2 = %{$hashref->{$firstdefault}->{'select2'}}; |
my %select2 = %{$hashref->{$firstdefault}->{'select2'}}; |
$result .= $middletext; |
$result .= $middletext; |
$result .= "<select size=\"1\" name=\"$secondselectname\">\n"; |
$result .= "<select size=\"1\" name=\"$secondselectname\""; |
|
if ($onchangesecond) { |
|
$result .= ' onchange="'.$onchangesecond.'"'; |
|
} |
|
$result .= ">\n"; |
my $seconddefault = $hashref->{$firstdefault}->{'default'}; |
my $seconddefault = $hashref->{$firstdefault}->{'default'}; |
|
|
my @secondorder = sort(keys(%select2)); |
my @secondorder = sort(keys(%select2)); |
Line 1981 sub select_form {
|
Line 2042 sub select_form {
|
# For display filters |
# For display filters |
|
|
sub display_filter { |
sub display_filter { |
|
my ($context) = @_; |
if (!$env{'form.show'}) { $env{'form.show'}=10; } |
if (!$env{'form.show'}) { $env{'form.show'}=10; } |
if (!$env{'form.displayfilter'}) { $env{'form.displayfilter'}='currentfolder'; } |
if (!$env{'form.displayfilter'}) { $env{'form.displayfilter'}='currentfolder'; } |
return '<span class="LC_nobreak"><label>'.&mt('Records [_1]', |
my $phraseinput = 'hidden'; |
|
my $includeinput = 'hidden'; |
|
my ($checked,$includetypestext); |
|
if ($env{'form.displayfilter'} eq 'containing') { |
|
$phraseinput = 'text'; |
|
if ($context eq 'parmslog') { |
|
$includeinput = 'checkbox'; |
|
if ($env{'form.includetypes'}) { |
|
$checked = ' checked="checked"'; |
|
} |
|
$includetypestext = &mt('Include parameter types'); |
|
} |
|
} else { |
|
$includetypestext = ' '; |
|
} |
|
my ($additional,$secondid,$thirdid); |
|
if ($context eq 'parmslog') { |
|
$additional = |
|
'<label><input type="'.$includeinput.'" name="includetypes"'. |
|
$checked.' name="includetypes" value="1" id="includetypes" />'. |
|
' <span id="includetypestext">'.$includetypestext.'</span>'. |
|
'</label>'; |
|
$secondid = 'includetypes'; |
|
$thirdid = 'includetypestext'; |
|
} |
|
my $onchange = "javascript:toggleHistoryOptions(this,'containingphrase','$context', |
|
'$secondid','$thirdid')"; |
|
return '<span class="LC_nobreak"><label>'.&mt('Records: [_1]', |
&Apache::lonmeta::selectbox('show',$env{'form.show'},undef, |
&Apache::lonmeta::selectbox('show',$env{'form.show'},undef, |
(&mt('all'),10,20,50,100,1000,10000))). |
(&mt('all'),10,20,50,100,1000,10000))). |
'</label></span> <span class="LC_nobreak">'. |
'</label></span> <span class="LC_nobreak">'. |
&mt('Filter [_1]', |
&mt('Filter: [_1]', |
&select_form($env{'form.displayfilter'}, |
&select_form($env{'form.displayfilter'}, |
'displayfilter', |
'displayfilter', |
{'currentfolder' => 'Current folder/page', |
{'currentfolder' => 'Current folder/page', |
'containing' => 'Containing phrase', |
'containing' => 'Containing phrase', |
'none' => 'None'})). |
'none' => 'None'},$onchange)).' '. |
'<input type="text" name="containingphrase" size="30" value="'.&HTML::Entities::encode($env{'form.containingphrase'}).'" /></span>'; |
'<input type="'.$phraseinput.'" name="containingphrase" id="containingphrase" size="30" value="'. |
|
&HTML::Entities::encode($env{'form.containingphrase'}). |
|
'" />'.$additional; |
|
} |
|
|
|
sub display_filter_js { |
|
my $includetext = &mt('Include parameter types'); |
|
return <<"ENDJS"; |
|
|
|
function toggleHistoryOptions(setter,firstid,context,secondid,thirdid) { |
|
var firstType = 'hidden'; |
|
if (setter.options[setter.selectedIndex].value == 'containing') { |
|
firstType = 'text'; |
|
} |
|
firstObject = document.getElementById(firstid); |
|
if (typeof(firstObject) == 'object') { |
|
if (firstObject.type != firstType) { |
|
changeInputType(firstObject,firstType); |
|
} |
|
} |
|
if (context == 'parmslog') { |
|
var secondType = 'hidden'; |
|
if (firstType == 'text') { |
|
secondType = 'checkbox'; |
|
} |
|
secondObject = document.getElementById(secondid); |
|
if (typeof(secondObject) == 'object') { |
|
if (secondObject.type != secondType) { |
|
changeInputType(secondObject,secondType); |
|
} |
|
} |
|
var textItem = document.getElementById(thirdid); |
|
var currtext = textItem.innerHTML; |
|
var newtext; |
|
if (firstType == 'text') { |
|
newtext = '$includetext'; |
|
} else { |
|
newtext = ' '; |
|
} |
|
if (currtext != newtext) { |
|
textItem.innerHTML = newtext; |
|
} |
|
} |
|
return; |
|
} |
|
|
|
function changeInputType(oldObject,newType) { |
|
var newObject = document.createElement('input'); |
|
newObject.type = newType; |
|
if (oldObject.size) { |
|
newObject.size = oldObject.size; |
|
} |
|
if (oldObject.value) { |
|
newObject.value = oldObject.value; |
|
} |
|
if (oldObject.name) { |
|
newObject.name = oldObject.name; |
|
} |
|
if (oldObject.id) { |
|
newObject.id = oldObject.id; |
|
} |
|
oldObject.parentNode.replaceChild(newObject,oldObject); |
|
return; |
|
} |
|
|
|
ENDJS |
} |
} |
|
|
sub gradeleveldescription { |
sub gradeleveldescription { |
Line 2037 sub select_level_form {
|
Line 2191 sub select_level_form {
|
|
|
=pod |
=pod |
|
|
=item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms) |
=item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms,$excdoms) |
|
|
Returns a string containing a <select name='$name' size='1'> form to |
Returns a string containing a <select name='$name' size='1'> form to |
allow a user to select the domain to preform an operation in. |
allow a user to select the domain to preform an operation in. |
Line 2050 If the $showdomdesc flag is set, the dom
|
Line 2204 If the $showdomdesc flag is set, the dom
|
|
|
The optional $onchange argument specifies what should occur if the domain selector is changed, e.g., 'this.form.submit()' if the form is to be automatically submitted. |
The optional $onchange argument specifies what should occur if the domain selector is changed, e.g., 'this.form.submit()' if the form is to be automatically submitted. |
|
|
The optional $incdoms is a reference to an array of domains which will be the only available options. |
The optional $incdoms is a reference to an array of domains which will be the only available options. |
|
|
|
The optional $excdoms is a reference to an array of domains which will be excluded from the available options. |
|
|
=cut |
=cut |
|
|
#------------------------------------------- |
#------------------------------------------- |
sub select_dom_form { |
sub select_dom_form { |
my ($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms) = @_; |
my ($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms,$excdoms) = @_; |
if ($onchange) { |
if ($onchange) { |
$onchange = ' onchange="'.$onchange.'"'; |
$onchange = ' onchange="'.$onchange.'"'; |
} |
} |
my @domains; |
my (@domains,%exclude); |
if (ref($incdoms) eq 'ARRAY') { |
if (ref($incdoms) eq 'ARRAY') { |
@domains = sort {lc($a) cmp lc($b)} (@{$incdoms}); |
@domains = sort {lc($a) cmp lc($b)} (@{$incdoms}); |
} else { |
} else { |
@domains = sort {lc($a) cmp lc($b)} (&Apache::lonnet::all_domains()); |
@domains = sort {lc($a) cmp lc($b)} (&Apache::lonnet::all_domains()); |
} |
} |
if ($includeempty) { @domains=('',@domains); } |
if ($includeempty) { @domains=('',@domains); } |
|
if (ref($excdoms) eq 'ARRAY') { |
|
map { $exclude{$_} = 1; } @{$excdoms}; |
|
} |
my $selectdomain = "<select name=\"$name\" size=\"1\"$onchange>\n"; |
my $selectdomain = "<select name=\"$name\" size=\"1\"$onchange>\n"; |
foreach my $dom (@domains) { |
foreach my $dom (@domains) { |
|
next if ($exclude{$dom}); |
$selectdomain.="<option value=\"$dom\" ". |
$selectdomain.="<option value=\"$dom\" ". |
($dom eq $defdom ? 'selected="selected" ' : '').'>'.$dom; |
($dom eq $defdom ? 'selected="selected" ' : '').'>'.$dom; |
if ($showdomdesc) { |
if ($showdomdesc) { |
Line 2382 END
|
Line 2542 END
|
return $result; |
return $result; |
} |
} |
|
|
sub authform_authorwarning{ |
sub authform_authorwarning { |
my $result=''; |
my $result=''; |
$result='<i>'. |
$result='<i>'. |
&mt('As a general rule, only authors or co-authors should be '. |
&mt('As a general rule, only authors or co-authors should be '. |
Line 2391 sub authform_authorwarning{
|
Line 2551 sub authform_authorwarning{
|
return $result; |
return $result; |
} |
} |
|
|
sub authform_nochange{ |
sub authform_nochange { |
my %in = ( |
my %in = ( |
formname => 'document.cu', |
formname => 'document.cu', |
kerb_def_dom => 'MSU.EDU', |
kerb_def_dom => 'MSU.EDU', |
@_, |
@_, |
); |
); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my $result; |
my $result; |
if (keys(%can_assign) == 0) { |
if (!$authnum) { |
$result = &mt('Under you current role you are not permitted to change login settings for this user'); |
$result = &mt('Under your current role you are not permitted to change login settings for this user'); |
} else { |
} else { |
$result = '<label>'.&mt('[_1] Do not change login data', |
$result = '<label>'.&mt('[_1] Do not change login data', |
'<input type="radio" name="login" value="nochange" '. |
'<input type="radio" name="login" value="nochange" '. |
Line 2420 sub authform_kerberos {
|
Line 2580 sub authform_kerberos {
|
); |
); |
my ($check4,$check5,$krbcheck,$krbarg,$krbver,$result,$authtype, |
my ($check4,$check5,$krbcheck,$krbarg,$krbver,$result,$authtype, |
$autharg,$jscall); |
$autharg,$jscall); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
if ($in{'kerb_def_auth'} eq 'krb5') { |
if ($in{'kerb_def_auth'} eq 'krb5') { |
$check5 = ' checked="checked"'; |
$check5 = ' checked="checked"'; |
} else { |
} else { |
Line 2470 sub authform_kerberos {
|
Line 2630 sub authform_kerberos {
|
if (defined($in{'mode'})) { |
if (defined($in{'mode'})) { |
if ($in{'mode'} eq 'modifycourse') { |
if ($in{'mode'} eq 'modifycourse') { |
if ($authnum == 1) { |
if ($authnum == 1) { |
$authtype = '<input type="hidden" name="login" value="krb" />'; |
$authtype = '<input type="radio" name="login" value="krb" />'; |
} |
} |
} |
} |
} |
} |
Line 2482 sub authform_kerberos {
|
Line 2642 sub authform_kerberos {
|
$krbcheck.' />'; |
$krbcheck.' />'; |
} |
} |
if (($can_assign{'krb4'} && $can_assign{'krb5'}) || |
if (($can_assign{'krb4'} && $can_assign{'krb5'}) || |
($can_assign{'krb4'} && !$can_assign{'krb5'} && |
($can_assign{'krb4'} && !$can_assign{'krb5'} && |
$in{'curr_authtype'} eq 'krb5') || |
$in{'curr_authtype'} eq 'krb5') || |
(!$can_assign{'krb4'} && $can_assign{'krb5'} && |
(!$can_assign{'krb4'} && $can_assign{'krb5'} && |
$in{'curr_authtype'} eq 'krb4')) { |
$in{'curr_authtype'} eq 'krb4')) { |
$result .= &mt |
$result .= &mt |
('[_1] Kerberos authenticated with domain [_2] '. |
('[_1] Kerberos authenticated with domain [_2] '. |
Line 2520 sub authform_kerberos {
|
Line 2680 sub authform_kerberos {
|
return $result; |
return $result; |
} |
} |
|
|
sub authform_internal{ |
sub authform_internal { |
my %in = ( |
my %in = ( |
formname => 'document.cu', |
formname => 'document.cu', |
kerb_def_dom => 'MSU.EDU', |
kerb_def_dom => 'MSU.EDU', |
@_, |
@_, |
); |
); |
my ($intcheck,$intarg,$result,$authtype,$autharg,$jscall); |
my ($intcheck,$intarg,$result,$authtype,$autharg,$jscall); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
if (defined($in{'curr_authtype'})) { |
if (defined($in{'curr_authtype'})) { |
if ($in{'curr_authtype'} eq 'int') { |
if ($in{'curr_authtype'} eq 'int') { |
if ($can_assign{'int'}) { |
if ($can_assign{'int'}) { |
Line 2556 sub authform_internal{
|
Line 2716 sub authform_internal{
|
if (defined($in{'mode'})) { |
if (defined($in{'mode'})) { |
if ($in{'mode'} eq 'modifycourse') { |
if ($in{'mode'} eq 'modifycourse') { |
if ($authnum == 1) { |
if ($authnum == 1) { |
$authtype = '<input type="hidden" name="login" value="int" />'; |
$authtype = '<input type="radio" name="login" value="int" />'; |
} |
} |
} |
} |
} |
} |
Line 2575 sub authform_internal{
|
Line 2735 sub authform_internal{
|
return $result; |
return $result; |
} |
} |
|
|
sub authform_local{ |
sub authform_local { |
my %in = ( |
my %in = ( |
formname => 'document.cu', |
formname => 'document.cu', |
kerb_def_dom => 'MSU.EDU', |
kerb_def_dom => 'MSU.EDU', |
@_, |
@_, |
); |
); |
my ($loccheck,$locarg,$result,$authtype,$autharg,$jscall); |
my ($loccheck,$locarg,$result,$authtype,$autharg,$jscall); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
if (defined($in{'curr_authtype'})) { |
if (defined($in{'curr_authtype'})) { |
if ($in{'curr_authtype'} eq 'loc') { |
if ($in{'curr_authtype'} eq 'loc') { |
if ($can_assign{'loc'}) { |
if ($can_assign{'loc'}) { |
Line 2611 sub authform_local{
|
Line 2771 sub authform_local{
|
if (defined($in{'mode'})) { |
if (defined($in{'mode'})) { |
if ($in{'mode'} eq 'modifycourse') { |
if ($in{'mode'} eq 'modifycourse') { |
if ($authnum == 1) { |
if ($authnum == 1) { |
$authtype = '<input type="hidden" name="login" value="loc" />'; |
$authtype = '<input type="radio" name="login" value="loc" />'; |
} |
} |
} |
} |
} |
} |
Line 2629 sub authform_local{
|
Line 2789 sub authform_local{
|
return $result; |
return $result; |
} |
} |
|
|
sub authform_filesystem{ |
sub authform_filesystem { |
my %in = ( |
my %in = ( |
formname => 'document.cu', |
formname => 'document.cu', |
kerb_def_dom => 'MSU.EDU', |
kerb_def_dom => 'MSU.EDU', |
@_, |
@_, |
); |
); |
my ($fsyscheck,$result,$authtype,$autharg,$jscall); |
my ($fsyscheck,$result,$authtype,$autharg,$jscall); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
if (defined($in{'curr_authtype'})) { |
if (defined($in{'curr_authtype'})) { |
if ($in{'curr_authtype'} eq 'fsys') { |
if ($in{'curr_authtype'} eq 'fsys') { |
if ($can_assign{'fsys'}) { |
if ($can_assign{'fsys'}) { |
Line 2662 sub authform_filesystem{
|
Line 2822 sub authform_filesystem{
|
if (defined($in{'mode'})) { |
if (defined($in{'mode'})) { |
if ($in{'mode'} eq 'modifycourse') { |
if ($in{'mode'} eq 'modifycourse') { |
if ($authnum == 1) { |
if ($authnum == 1) { |
$authtype = '<input type="hidden" name="login" value="fsys" />'; |
$authtype = '<input type="radio" name="login" value="fsys" />'; |
} |
} |
} |
} |
} |
} |
Line 2893 sub get_related_words {
|
Line 3053 sub get_related_words {
|
untie %thesaurus_db; |
untie %thesaurus_db; |
return @Words; |
return @Words; |
} |
} |
|
############################################################### |
|
# |
|
# Spell checking |
|
# |
|
|
=pod |
=pod |
|
|
|
=head1 Spell checking |
|
|
|
=over 4 |
|
|
|
=item * &check_spelling($wordlist $language) |
|
|
|
Takes a string containing words and feeds it to an external |
|
spellcheck program via a pipeline. Returns a string containing |
|
them mis-spelled words. |
|
|
|
Parameters: |
|
|
|
=over 4 |
|
|
|
=item - $wordlist |
|
|
|
String that will be fed into the spellcheck program. |
|
|
|
=item - $language |
|
|
|
Language string that specifies the language for which the spell |
|
check will be performed. |
|
|
=back |
=back |
|
|
|
=back |
|
|
|
Note: This sub assumes that aspell is installed. |
|
|
|
|
=cut |
=cut |
|
|
|
|
|
=pod |
|
|
|
=back |
|
|
|
=cut |
|
|
|
sub check_spelling { |
|
my ($wordlist, $language) = @_; |
|
my @misspellings; |
|
|
|
# Generate the speller and set the langauge. |
|
# if explicitly selected: |
|
|
|
my $speller = Text::Aspell->new; |
|
if ($language) { |
|
$speller->set_option('lang', $language); |
|
} |
|
|
|
# Turn the word list into an array of words by splittingon whitespace |
|
|
|
my @words = split(/\s+/, $wordlist); |
|
|
|
foreach my $word (@words) { |
|
if(! $speller->check($word)) { |
|
push(@misspellings, $word); |
|
} |
|
} |
|
return join(' ', @misspellings); |
|
|
|
} |
|
|
# -------------------------------------------------------------- Plaintext name |
# -------------------------------------------------------------- Plaintext name |
=pod |
=pod |
|
|
Line 3133 sub aboutmewrapper {
|
Line 3357 sub aboutmewrapper {
|
if (!defined($username) && !defined($domain)) { |
if (!defined($username) && !defined($domain)) { |
return; |
return; |
} |
} |
return '<a href="/adm/'.$domain.'/'.$username.'/aboutme?forcestudent=1"'. |
return '<a href="/adm/'.$domain.'/'.$username.'/aboutme"'. |
($target?' target="'.$target.'"':'').($class?' class="'.$class.'"':'').' title="'.&mt("View this user's personal information page").'">'.$link.'</a>'; |
($target?' target="'.$target.'"':'').($class?' class="'.$class.'"':'').' title="'.&mt("View this user's personal information page").'">'.$link.'</a>'; |
} |
} |
|
|
Line 4786 sub CSTR_pageheader {
|
Line 5010 sub CSTR_pageheader {
|
|
|
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; |
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; |
my ($udom,$uname,$thisdisfn)= |
my ($udom,$uname,$thisdisfn)= |
($trailfile =~ m{^\Q$londocroot\E/priv/([^/]+)/([^/]+)/(.*)$}); |
($trailfile =~ m{^\Q$londocroot\E/priv/([^/]+)/([^/]+)(?:|/(.*))$}); |
my $formaction = "/priv/$udom/$uname/$thisdisfn"; |
my $formaction = "/priv/$udom/$uname/$thisdisfn"; |
$formaction =~ s{/+}{/}g; |
$formaction =~ s{/+}{/}g; |
|
|
Line 4867 Inputs:
|
Line 5091 Inputs:
|
should it have jsmath forced on by the |
should it have jsmath forced on by the |
current page |
current page |
|
|
|
=item * $advtoolsref, optional argument, ref to an array containing |
|
inlineremote items to be added in "Functions" menu below |
|
breadcrumbs. |
|
|
=back |
=back |
|
|
Returns: A uniform header for LON-CAPA web pages. |
Returns: A uniform header for LON-CAPA web pages. |
Line 4878 other decorations will be returned.
|
Line 5106 other decorations will be returned.
|
|
|
sub bodytag { |
sub bodytag { |
my ($title,$function,$addentries,$bodyonly,$domain,$forcereg, |
my ($title,$function,$addentries,$bodyonly,$domain,$forcereg, |
$no_nav_bar,$bgcolor,$args)=@_; |
$no_nav_bar,$bgcolor,$args,$advtoolsref)=@_; |
|
|
my $public; |
my $public; |
if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) |
if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) |
Line 4927 sub bodytag {
|
Line 5155 sub bodytag {
|
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($args->{'inherit_jsmath'}); |
|
|
if ($bodyonly) { |
if (($bodyonly) || ($no_nav_bar) || ($env{'form.inhibitmenu'} eq 'yes')) { |
return $bodytag; |
return $bodytag; |
} |
} |
|
|
my $name = &plainname($env{'user.name'},$env{'user.domain'}); |
|
if ($public) { |
if ($public) { |
undef($role); |
undef($role); |
} else { |
|
$name = &aboutmewrapper($name,$env{'user.name'},$env{'user.domain'}, |
|
undef,'LC_menubuttons_link'); |
|
} |
} |
|
|
my $titleinfo = '<h1>'.$title.'</h1>'; |
my $titleinfo = '<h1>'.$title.'</h1>'; |
Line 4954 sub bodytag {
|
Line 5178 sub bodytag {
|
$role = '<span class="LC_nobreak">('.$role.')</span>' if $role; |
$role = '<span class="LC_nobreak">('.$role.')</span>' if $role; |
&get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']); |
&get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']); |
|
|
if ($no_nav_bar || $env{'form.inhibitmenu'} eq 'yes') { |
|
return $bodytag; |
|
} |
|
|
|
if ($env{'request.state'} eq 'construct') { $forcereg=1; } |
if ($env{'request.state'} eq 'construct') { $forcereg=1; } |
|
|
# if ($env{'request.state'} eq 'construct') { |
# if ($env{'request.state'} eq 'construct') { |
# $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls |
# $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls |
# } |
# } |
|
|
|
$bodytag .= Apache::lonhtmlcommon::scripttag( |
|
Apache::lonmenu::utilityfunctions(), 'start'); |
|
|
|
my ($left,$right) = Apache::lonmenu::primary_menu(); |
|
|
if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { |
if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { |
if ($dc_info) { |
if ($dc_info) { |
$dc_info = qq|<span class="LC_cusr_subheading">$dc_info</span>|; |
$dc_info = qq|<span class="LC_cusr_subheading">$dc_info</span>|; |
} |
} |
$bodytag .= qq|<div id="LC_nav_bar">$name $role<br /> |
$bodytag .= qq|<div id="LC_nav_bar">$left $role<br /> |
<em>$realm</em> $dc_info</div>|; |
<em>$realm</em> $dc_info</div>|; |
return $bodytag; |
return $bodytag; |
} |
} |
|
|
unless ($env{'request.symb'} =~ m/\.page___\d+___/) { |
unless ($env{'request.symb'} =~ m/\.page___\d+___/) { |
$bodytag .= qq|<div id="LC_nav_bar">$name $role</div>|; |
$bodytag .= qq|<div id="LC_nav_bar">$left $role</div>|; |
} |
} |
|
|
$bodytag .= Apache::lonhtmlcommon::scripttag( |
$bodytag .= $right; |
Apache::lonmenu::utilityfunctions(), 'start'); |
|
|
|
$bodytag .= Apache::lonmenu::primary_menu(); |
|
|
|
if ($dc_info) { |
if ($dc_info) { |
$dc_info = &dc_courseid_toggle($dc_info); |
$dc_info = &dc_courseid_toggle($dc_info); |
Line 4997 sub bodytag {
|
Line 5217 sub bodytag {
|
if ($env{'request.state'} eq 'construct') { |
if ($env{'request.state'} eq 'construct') { |
$bodytag .= &Apache::lonmenu::innerregister($forcereg, |
$bodytag .= &Apache::lonmenu::innerregister($forcereg, |
$args->{'bread_crumbs'}); |
$args->{'bread_crumbs'}); |
} elsif ($forcereg) { |
} elsif ($forcereg) { |
$bodytag .= &Apache::lonmenu::innerregister($forcereg); |
$bodytag .= &Apache::lonmenu::innerregister($forcereg,undef, |
|
$args->{'group'}); |
|
} else { |
|
$bodytag .= |
|
&Apache::lonmenu::prepare_functions($env{'request.noversionuri'}, |
|
$forcereg,$args->{'group'}, |
|
$args->{'bread_crumbs'}, |
|
$advtoolsref); |
} |
} |
}else{ |
}else{ |
# this is to seperate menu from content when there's no secondary |
# this is to seperate menu from content when there's no secondary |
Line 5070 i.e., $env{'internal.head.redirect'} exi
|
Line 5297 i.e., $env{'internal.head.redirect'} exi
|
|
|
sub endbodytag { |
sub endbodytag { |
my ($args) = @_; |
my ($args) = @_; |
my $endbodytag='</body>'; |
my $endbodytag; |
|
unless ((ref($args) eq 'HASH') && ($args->{'notbody'})) { |
|
$endbodytag='</body>'; |
|
} |
$endbodytag=&Apache::lontexconvert::jsMath_process()."\n".$endbodytag; |
$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'})) { |
Line 5172 form, .inline {
|
Line 5402 form, .inline {
|
vertical-align:middle; |
vertical-align:middle; |
} |
} |
|
|
|
.LC_floatleft { |
|
float: left; |
|
} |
|
|
|
.LC_floatright { |
|
float: right; |
|
} |
|
|
.LC_400Box { |
.LC_400Box { |
width:400px; |
width:400px; |
} |
} |
Line 5210 form, .inline {
|
Line 5448 form, .inline {
|
|
|
.LC_error { |
.LC_error { |
color: red; |
color: red; |
font-size: larger; |
|
} |
} |
|
|
.LC_warning, |
.LC_warning { |
|
color: darkorange; |
|
} |
|
|
.LC_diff_removed { |
.LC_diff_removed { |
color: red; |
color: red; |
} |
} |
Line 5376 td.LC_table_cell_checkbox {
|
Line 5616 td.LC_table_cell_checkbox {
|
text-align: left; |
text-align: left; |
} |
} |
|
|
.LC_head_subbox { |
.LC_head_subbox, .LC_actionbox { |
clear:both; |
clear:both; |
background: #F8F8F8; /* $sidebg; */ |
background: #F8F8F8; /* $sidebg; */ |
border: 1px solid $sidebg; |
border: 1px solid $sidebg; |
margin: 0 0 10px 0; |
margin: 0 0 10px 0; |
padding: 3px; |
padding: 3px; |
text-align: left; |
text-align: left; |
} |
} |
Line 5513 table.LC_nested tr.LC_empty_row td {
|
Line 5753 table.LC_nested tr.LC_empty_row td {
|
padding: 8px; |
padding: 8px; |
} |
} |
|
|
table.LC_data_table tr.LC_empty_row td { |
table.LC_data_table tr.LC_empty_row td, |
|
table.LC_data_table tr.LC_footer_row td { |
background-color: $sidebg; |
background-color: $sidebg; |
} |
} |
|
|
Line 6075 div.LC_docs_entry_move {
|
Line 6316 div.LC_docs_entry_move {
|
|
|
table.LC_data_table tr > td.LC_docs_entry_commands, |
table.LC_data_table tr > td.LC_docs_entry_commands, |
table.LC_data_table tr > td.LC_docs_entry_parameter { |
table.LC_data_table tr > td.LC_docs_entry_parameter { |
background: #DDDDDD; |
|
font-size: x-small; |
font-size: x-small; |
} |
} |
|
|
Line 6240 div.LC_edit_problem_saves {
|
Line 6480 div.LC_edit_problem_saves {
|
padding-bottom: 5px; |
padding-bottom: 5px; |
} |
} |
|
|
|
.LC_edit_opt { |
|
padding-left: 1em; |
|
white-space: nowrap; |
|
} |
|
|
img.stift { |
img.stift { |
border-width: 0; |
border-width: 0; |
vertical-align: middle; |
vertical-align: middle; |
Line 6254 div.LC_createcourse {
|
Line 6499 div.LC_createcourse {
|
} |
} |
|
|
.LC_dccid { |
.LC_dccid { |
|
float: right; |
margin: 0.2em 0 0 0; |
margin: 0.2em 0 0 0; |
padding: 0; |
padding: 0; |
font-size: 90%; |
font-size: 90%; |
Line 6351 fieldset > legend {
|
Line 6597 fieldset > legend {
|
} |
} |
|
|
ol.LC_primary_menu { |
ol.LC_primary_menu { |
float: right; |
|
margin: 0; |
margin: 0; |
|
padding: 0; |
background-color: $pgbg_or_bgcolor; |
background-color: $pgbg_or_bgcolor; |
} |
} |
|
|
Line 6361 ol#LC_PathBreadcrumbs {
|
Line 6607 ol#LC_PathBreadcrumbs {
|
} |
} |
|
|
ol.LC_primary_menu li { |
ol.LC_primary_menu li { |
display: inline; |
color: RGB(80, 80, 80); |
padding: 5px 5px 0 10px; |
vertical-align: middle; |
|
text-align: left; |
|
list-style: none; |
|
float: left; |
|
} |
|
|
|
ol.LC_primary_menu li a { |
|
display: block; |
|
margin: 0; |
|
padding: 0 5px 0 10px; |
|
text-decoration: none; |
|
} |
|
|
|
ol.LC_primary_menu li ul { |
|
display: none; |
|
width: 10em; |
|
background-color: $data_table_light; |
|
} |
|
|
|
ol.LC_primary_menu li:hover ul, ol.LC_primary_menu li.hover ul { |
|
display: block; |
|
position: absolute; |
|
margin: 0; |
|
padding: 0; |
|
z-index: 2; |
|
} |
|
|
|
ol.LC_primary_menu li:hover li, ol.LC_primary_menu li.hover li { |
|
font-size: 90%; |
vertical-align: top; |
vertical-align: top; |
|
float: none; |
|
border-left: 1px solid black; |
|
border-right: 1px solid black; |
|
} |
|
|
|
ol.LC_primary_menu li:hover li a, ol.LC_primary_menu li.hover li a { |
|
background-color:$data_table_light; |
|
} |
|
|
|
ol.LC_primary_menu li li a:hover { |
|
color:$button_hover; |
|
background-color:$data_table_dark; |
} |
} |
|
|
ol.LC_primary_menu li img { |
ol.LC_primary_menu li img { |
vertical-align: bottom; |
vertical-align: bottom; |
height: 1.1em; |
height: 1.1em; |
|
margin: 0.2em 0 0 0; |
} |
} |
|
|
ol.LC_primary_menu a { |
ol.LC_primary_menu a { |
Line 6406 ol.LC_docs_parameters li.LC_docs_paramet
|
Line 6693 ol.LC_docs_parameters li.LC_docs_paramet
|
} |
} |
|
|
ul#LC_secondary_menu { |
ul#LC_secondary_menu { |
clear: both; |
clear: right; |
color: $fontmenu; |
color: $fontmenu; |
background: $tabbg; |
background: $tabbg; |
list-style: none; |
list-style: none; |
Line 6414 ul#LC_secondary_menu {
|
Line 6701 ul#LC_secondary_menu {
|
margin: 0; |
margin: 0; |
width: 100%; |
width: 100%; |
text-align: left; |
text-align: left; |
|
float: left; |
} |
} |
|
|
ul#LC_secondary_menu li { |
ul#LC_secondary_menu li { |
font-weight: bold; |
font-weight: bold; |
line-height: 1.8em; |
line-height: 1.8em; |
|
border-right: 1px solid black; |
|
float: left; |
|
} |
|
|
|
ul#LC_secondary_menu li.LC_hoverable:hover, ul#LC_secondary_menu li.hover { |
|
background-color: $data_table_light; |
|
} |
|
|
|
ul#LC_secondary_menu li a { |
padding: 0 0.8em; |
padding: 0 0.8em; |
|
} |
|
|
|
ul#LC_secondary_menu li ul { |
|
display: none; |
|
} |
|
|
|
ul#LC_secondary_menu li:hover ul, ul#LC_secondary_menu li.hover ul { |
|
display: block; |
|
position: absolute; |
|
margin: 0; |
|
padding: 0; |
|
list-style:none; |
|
float: none; |
|
background-color: $data_table_light; |
|
z-index: 2; |
|
margin-left: -1px; |
|
} |
|
|
|
ul#LC_secondary_menu li ul li { |
|
font-size: 90%; |
|
vertical-align: top; |
|
border-left: 1px solid black; |
border-right: 1px solid black; |
border-right: 1px solid black; |
display: inline; |
background-color: $data_table_light; |
vertical-align: middle; |
list-style:none; |
|
float: none; |
|
} |
|
|
|
ul#LC_secondary_menu li ul li:hover, ul#LC_secondary_menu li ul li.hover { |
|
background-color: $data_table_dark; |
} |
} |
|
|
ul.LC_TabContent { |
ul.LC_TabContent { |
Line 6762 ul#LC_toolbar {
|
Line 7086 ul#LC_toolbar {
|
list-style:none; |
list-style:none; |
position:relative; |
position:relative; |
background-color:white; |
background-color:white; |
|
overflow: auto; |
} |
} |
|
|
ul#LC_toolbar li { |
ul#LC_toolbar li { |
Line 6771 ul#LC_toolbar li {
|
Line 7096 ul#LC_toolbar li {
|
float: left; |
float: left; |
display:inline; |
display:inline; |
vertical-align:middle; |
vertical-align:middle; |
|
white-space: nowrap; |
} |
} |
|
|
|
|
Line 6867 ul.LC_funclist li {
|
Line 7193 ul.LC_funclist li {
|
cursor:pointer; |
cursor:pointer; |
} |
} |
|
|
|
/* |
|
styles used by TTH when "Default set of options to pass to tth/m |
|
when converting TeX" in course settings has been set |
|
|
|
option passed: -t |
|
|
|
*/ |
|
|
|
td div.comp { margin-top: -0.6ex; margin-bottom: -1ex;} |
|
td div.comb { margin-top: -0.6ex; margin-bottom: -.6ex;} |
|
td div.hrcomp { line-height: 0.9; margin-top: -0.8ex; margin-bottom: -1ex;} |
|
td div.norm {line-height:normal;} |
|
|
|
/* |
|
option passed -y3 |
|
*/ |
|
|
|
span.roman {font-family: serif; font-style: normal; font-weight: normal;} |
|
span.overacc2 {position: relative; left: .8em; top: -1.2ex;} |
|
span.overacc1 {position: relative; left: .6em; top: -1.2ex;} |
|
|
END |
END |
} |
} |
|
|
Line 7136 $args - additional optional args support
|
Line 7483 $args - additional optional args support
|
current page |
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 |
|
specific group |
|
|
=back |
=back |
|
|
Line 7148 sub start_page {
|
Line 7497 sub start_page {
|
#&Apache::lonnet::logthis("start_page ".join(':',caller(0))); |
#&Apache::lonnet::logthis("start_page ".join(':',caller(0))); |
|
|
$env{'internal.start_page'}++; |
$env{'internal.start_page'}++; |
my $result; |
my ($result,@advtools); |
|
|
if (! exists($args->{'skip_phases'}{'head'}) ) { |
if (! exists($args->{'skip_phases'}{'head'}) ) { |
$result .= &xml_begin() . &headtag($title, $head_extra, $args); |
$result .= &xml_begin() . &headtag($title, $head_extra, $args); |
Line 7165 sub start_page {
|
Line 7514 sub start_page {
|
$args->{'function'}, $args->{'add_entries'}, |
$args->{'function'}, $args->{'add_entries'}, |
$args->{'only_body'}, $args->{'domain'}, |
$args->{'only_body'}, $args->{'domain'}, |
$args->{'force_register'}, $args->{'no_nav_bar'}, |
$args->{'force_register'}, $args->{'no_nav_bar'}, |
$args->{'bgcolor'}, $args); |
$args->{'bgcolor'}, $args, |
|
\@advtools); |
} |
} |
} |
} |
|
|
Line 7194 sub start_page {
|
Line 7544 sub start_page {
|
&Apache::lonhtmlcommon::add_breadcrumb($crumb); |
&Apache::lonhtmlcommon::add_breadcrumb($crumb); |
} |
} |
} |
} |
|
# if @advtools array contains items add then to the breadcrumbs |
|
if (@advtools > 0) { |
|
&Apache::lonmenu::advtools_crumbs(@advtools); |
|
} |
|
|
#if bread_crumbs_component exists show it as headline else show only the breadcrumbs |
#if bread_crumbs_component exists show it as headline else show only the breadcrumbs |
if(exists($args->{'bread_crumbs_component'})){ |
if(exists($args->{'bread_crumbs_component'})){ |
Line 7222 sub end_page {
|
Line 7576 sub end_page {
|
} else { |
} else { |
$result .= &endbodytag($args); |
$result .= &endbodytag($args); |
} |
} |
$result .= "\n</html>"; |
unless ($args->{'notbody'}) { |
|
$result .= "\n</html>"; |
|
} |
|
|
if ($args->{'js_ready'}) { |
if ($args->{'js_ready'}) { |
$result = &js_ready($result); |
$result = &js_ready($result); |
Line 7307 sub modal_link {
|
Line 7663 sub modal_link {
|
unless ($width) { $width=480; } |
unless ($width) { $width=480; } |
unless ($height) { $height=400; } |
unless ($height) { $height=400; } |
unless ($scrolling) { $scrolling='yes'; } |
unless ($scrolling) { $scrolling='yes'; } |
return '<a href="'.$link.'" target="'.$target.'" title="'.$title.'" onclick="openMyModal(\''.$link.'\','.$width.','.$height.',\''.$scrolling.'\'); return false;">'. |
my $target_attr; |
$linktext.'</a>'; |
if (defined($target)) { |
|
$target_attr = 'target="'.$target.'"'; |
|
} |
|
return <<"ENDLINK"; |
|
<a href="$link" $target_attr title="$title" onclick="javascript:openMyModal('$link',$width,$height,'$scrolling'); return false;"> |
|
$linktext</a> |
|
ENDLINK |
} |
} |
|
|
sub modal_adhoc_script { |
sub modal_adhoc_script { |
Line 7456 sub LCprogressbar {
|
Line 7818 sub LCprogressbar {
|
$LCcurrentid=$$.'_'.$LCidcnt; |
$LCcurrentid=$$.'_'.$LCidcnt; |
my $starting=&mt('Starting'); |
my $starting=&mt('Starting'); |
my $content=(<<ENDPROGBAR); |
my $content=(<<ENDPROGBAR); |
<p> |
|
<div id="progressbar$LCcurrentid"> |
<div id="progressbar$LCcurrentid"> |
<span class="pblabel">$starting</span> |
<span class="pblabel">$starting</span> |
</div> |
</div> |
</p> |
|
ENDPROGBAR |
ENDPROGBAR |
&r_print($r,$content.&LCprogressbar_script($LCcurrentid)); |
&r_print($r,$content.&LCprogressbar_script($LCcurrentid)); |
} |
} |
Line 7556 sub validate_page {
|
Line 7916 sub validate_page {
|
|
|
|
|
sub start_scrollbox { |
sub start_scrollbox { |
my ($outerwidth,$width,$height,$id)=@_; |
my ($outerwidth,$width,$height,$id,$bgcolor)=@_; |
unless ($outerwidth) { $outerwidth='520px'; } |
unless ($outerwidth) { $outerwidth='520px'; } |
unless ($width) { $width='500px'; } |
unless ($width) { $width='500px'; } |
unless ($height) { $height='200px'; } |
unless ($height) { $height='200px'; } |
my ($table_id,$div_id); |
my ($table_id,$div_id,$tdcol); |
if ($id ne '') { |
if ($id ne '') { |
$table_id = " id='table_$id'"; |
$table_id = " id='table_$id'"; |
$div_id = " id='div_$id'"; |
$div_id = " id='div_$id'"; |
} |
} |
return "<table style='width: $outerwidth; border: 1px solid none;'$table_id><tr><td style='width: $width;' bgcolor='#FFFFFF'><div style='overflow:auto; width:$width; height: $height;'$div_id>"; |
if ($bgcolor ne '') { |
|
$tdcol = "background-color: $bgcolor;"; |
|
} |
|
return <<"END"; |
|
<table style="width: $outerwidth; border: 1px solid none;"$table_id><tr><td style="width: $width;$tdcol"><div style="overflow:auto; width:$width; height: $height;"$div_id> |
|
END |
} |
} |
|
|
sub end_scrollbox { |
sub end_scrollbox { |
Line 7576 sub simple_error_page {
|
Line 7941 sub simple_error_page {
|
my ($r,$title,$msg) = @_; |
my ($r,$title,$msg) = @_; |
my $page = |
my $page = |
&Apache::loncommon::start_page($title). |
&Apache::loncommon::start_page($title). |
&mt($msg). |
'<p class="LC_error">'.&mt($msg).'</p>'. |
&Apache::loncommon::end_page(); |
&Apache::loncommon::end_page(); |
if (ref($r)) { |
if (ref($r)) { |
$r->print($page); |
$r->print($page); |
Line 7869 sub get_sections {
|
Line 8234 sub get_sections {
|
my %sectioncount; |
my %sectioncount; |
my $now = time; |
my $now = time; |
|
|
if (!defined($possible_roles) || (grep(/^st$/,@$possible_roles))) { |
my $check_students = 1; |
|
my $only_students = 0; |
|
if (ref($possible_roles) eq 'ARRAY') { |
|
if (grep(/^st$/,@{$possible_roles})) { |
|
if (@{$possible_roles} == 1) { |
|
$only_students = 1; |
|
} |
|
} else { |
|
$check_students = 0; |
|
} |
|
} |
|
|
|
if ($check_students) { |
my ($classlist) = &Apache::loncoursedata::get_classlist($cdom,$cnum); |
my ($classlist) = &Apache::loncoursedata::get_classlist($cdom,$cnum); |
my $sec_index = &Apache::loncoursedata::CL_SECTION(); |
my $sec_index = &Apache::loncoursedata::CL_SECTION(); |
my $status_index = &Apache::loncoursedata::CL_STATUS(); |
my $status_index = &Apache::loncoursedata::CL_STATUS(); |
Line 7896 sub get_sections {
|
Line 8273 sub get_sections {
|
} |
} |
} |
} |
} |
} |
|
if ($only_students) { |
|
return %sectioncount; |
|
} |
my %courseroles = &Apache::lonnet::dump('nohist_userroles',$cdom,$cnum); |
my %courseroles = &Apache::lonnet::dump('nohist_userroles',$cdom,$cnum); |
foreach my $user (sort(keys(%courseroles))) { |
foreach my $user (sort(keys(%courseroles))) { |
if ($user !~ /^(\w{2})/) { next; } |
if ($user !~ /^(\w{2})/) { next; } |
Line 8043 sub get_course_users {
|
Line 8423 sub get_course_users {
|
active => 'Active', |
active => 'Active', |
future => 'Future', |
future => 'Future', |
); |
); |
my %nothide; |
my (%nothide,@possdoms); |
if ($hidepriv) { |
if ($hidepriv) { |
my %coursehash=&Apache::lonnet::coursedescription($cdom.'_'.$cnum); |
my %coursehash=&Apache::lonnet::coursedescription($cdom.'_'.$cnum); |
foreach my $user (split(/\s*\,\s*/,$coursehash{'nothideprivileged'})) { |
foreach my $user (split(/\s*\,\s*/,$coursehash{'nothideprivileged'})) { |
Line 8053 sub get_course_users {
|
Line 8433 sub get_course_users {
|
$nothide{$user} = 1; |
$nothide{$user} = 1; |
} |
} |
} |
} |
|
my @possdoms = ($cdom); |
|
if ($coursehash{'checkforpriv'}) { |
|
push(@possdoms,split(/,/,$coursehash{'checkforpriv'})); |
|
} |
} |
} |
foreach my $person (sort(keys(%coursepersonnel))) { |
foreach my $person (sort(keys(%coursepersonnel))) { |
my $match = 0; |
my $match = 0; |
Line 8088 sub get_course_users {
|
Line 8472 sub get_course_users {
|
} |
} |
if ($uname ne '' && $udom ne '') { |
if ($uname ne '' && $udom ne '') { |
if ($hidepriv) { |
if ($hidepriv) { |
if ((&Apache::lonnet::privileged($uname,$udom)) && |
if ((&Apache::lonnet::privileged($uname,$udom,\@possdoms)) && |
(!$nothide{$uname.':'.$udom})) { |
(!$nothide{$uname.':'.$udom})) { |
next; |
next; |
} |
} |
Line 8693 sub user_rule_formats {
|
Line 9077 sub user_rule_formats {
|
my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($domain,$check); |
my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($domain,$check); |
if ((ref($rules) eq 'HASH') && (ref($ruleorder) eq 'ARRAY')) { |
if ((ref($rules) eq 'HASH') && (ref($ruleorder) eq 'ARRAY')) { |
if (@{$ruleorder} > 0) { |
if (@{$ruleorder} > 0) { |
$output = '<br />'.&mt("$text{$check} with the following format(s) may <span class=\"LC_cusr_emph\">only</span> be used for verified users at [_1]:",$domdesc).' <ul>'; |
$output = '<br />'. |
|
&mt($text{$check}.' with the following format(s) may [_1]only[_2] be used for verified users at [_3]:', |
|
'<span class="LC_cusr_emph">','</span>',$domdesc). |
|
' <ul>'; |
foreach my $rule (@{$ruleorder}) { |
foreach my $rule (@{$ruleorder}) { |
if (ref($curr_rules) eq 'ARRAY') { |
if (ref($curr_rules) eq 'ARRAY') { |
if (grep(/^\Q$rule\E$/,@{$curr_rules})) { |
if (grep(/^\Q$rule\E$/,@{$curr_rules})) { |
Line 9163 sub get_env_multiple {
|
Line 9550 sub get_env_multiple {
|
sub ask_for_embedded_content { |
sub ask_for_embedded_content { |
my ($actionurl,$state,$allfiles,$codebase,$args)=@_; |
my ($actionurl,$state,$allfiles,$codebase,$args)=@_; |
my (%subdependencies,%dependencies,%mapping,%existing,%newfiles,%pathchanges, |
my (%subdependencies,%dependencies,%mapping,%existing,%newfiles,%pathchanges, |
%currsubfile,%unused); |
%currsubfile,%unused,$rem); |
my $counter = 0; |
my $counter = 0; |
my $numnew = 0; |
my $numnew = 0; |
my $numremref = 0; |
my $numremref = 0; |
Line 9176 sub ask_for_embedded_content {
|
Line 9563 sub ask_for_embedded_content {
|
my $heading = &mt('Upload embedded files'); |
my $heading = &mt('Upload embedded files'); |
my $buttontext = &mt('Upload'); |
my $buttontext = &mt('Upload'); |
|
|
if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { |
my ($navmap,$cdom,$cnum); |
|
if ($env{'request.course.id'}) { |
|
if ($actionurl eq '/adm/dependencies') { |
|
$navmap = Apache::lonnavmaps::navmap->new(); |
|
} |
|
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
$cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
} |
|
if (($actionurl eq '/adm/portfolio') || |
|
($actionurl eq '/adm/coursegrp_portfolio')) { |
my $current_path='/'; |
my $current_path='/'; |
if ($env{'form.currentpath'}) { |
if ($env{'form.currentpath'}) { |
$current_path = $env{'form.currentpath'}; |
$current_path = $env{'form.currentpath'}; |
} |
} |
if ($actionurl eq '/adm/coursegrp_portfolio') { |
if ($actionurl eq '/adm/coursegrp_portfolio') { |
$udom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
$udom = $cdom; |
$uname = $env{'course.'.$env{'request.course.id'}.'.num'}; |
$uname = $cnum; |
$url = '/userfiles/groups/'.$env{'form.group'}.'/portfolio'; |
$url = '/userfiles/groups/'.$env{'form.group'}.'/portfolio'; |
} else { |
} else { |
$udom = $env{'user.domain'}; |
$udom = $env{'user.domain'}; |
Line 9205 sub ask_for_embedded_content {
|
Line 9601 sub ask_for_embedded_content {
|
if (ref($args) eq 'HASH') { |
if (ref($args) eq 'HASH') { |
$url = $args->{'docs_url'}; |
$url = $args->{'docs_url'}; |
$toplevel = $url; |
$toplevel = $url; |
|
if ($args->{'context'} eq 'paste') { |
|
($cdom,$cnum) = ($url =~ m{^\Q/uploaded/\E($match_domain)/($match_courseid)/}); |
|
($path) = |
|
($toplevel =~ m{^(\Q/uploaded/$cdom/$cnum/\E(?:docs|supplemental)/(?:default|\d+)/\d+)/}); |
|
$fileloc = &Apache::lonnet::filelocation('',$toplevel); |
|
$fileloc =~ s{^/}{}; |
|
} |
} |
} |
} elsif ($actionurl eq '/adm/dependencies') { |
} elsif ($actionurl eq '/adm/dependencies') { |
if ($env{'request.course.id'} ne '') { |
if ($env{'request.course.id'} ne '') { |
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
$cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
if (ref($args) eq 'HASH') { |
if (ref($args) eq 'HASH') { |
$url = $args->{'docs_url'}; |
$url = $args->{'docs_url'}; |
$title = $args->{'docs_title'}; |
$title = $args->{'docs_title'}; |
$toplevel = "/$url"; |
$toplevel = $url; |
($path) = |
unless ($toplevel =~ m{^/}) { |
($toplevel =~ m{^(\Q/uploaded/$cdom/$cnum/\E(?:docs|supplemental)/(?:default|\d+)/\d+)/}); |
$toplevel = "/$url"; |
|
} |
|
($rem) = ($toplevel =~ m{^(.+/)[^/]+$}); |
|
if ($toplevel =~ m{^(\Q/uploaded/$cdom/$cnum/portfolio/syllabus\E)}) { |
|
$path = $1; |
|
} else { |
|
($path) = |
|
($toplevel =~ m{^(\Q/uploaded/$cdom/$cnum/\E(?:docs|supplemental)/(?:default|\d+)/\d+)/}); |
|
} |
$fileloc = &Apache::lonnet::filelocation('',$toplevel); |
$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)"); |
} |
} |
} |
} |
} |
} elsif ($actionurl eq "/public/$cdom/$cnum/syllabus") { |
my $now = time(); |
$udom = $cdom; |
foreach my $embed_file (keys(%{$allfiles})) { |
$uname = $cnum; |
|
$url = "/uploaded/$cdom/$cnum/portfolio/syllabus"; |
|
$toplevel = $url; |
|
$path = $url; |
|
$fileloc = &Apache::lonnet::filelocation('',$toplevel).'/'; |
|
$fileloc =~ s{^/}{}; |
|
} |
|
foreach my $file (keys(%{$allfiles})) { |
|
my $embed_file; |
|
if (($path eq "/uploaded/$cdom/$cnum/portfolio/syllabus") && ($file =~ m{^\Q$path/\E(.+)$})) { |
|
$embed_file = $1; |
|
} else { |
|
$embed_file = $file; |
|
} |
my $absolutepath; |
my $absolutepath; |
if ($embed_file =~ m{^\w+://}) { |
if ($embed_file =~ m{^\w+://}) { |
$newfiles{$embed_file} = 1; |
$newfiles{$embed_file} = 1; |
Line 9262 sub ask_for_embedded_content {
|
Line 9684 sub ask_for_embedded_content {
|
my $dirptr = 16384; |
my $dirptr = 16384; |
foreach my $path (keys(%subdependencies)) { |
foreach my $path (keys(%subdependencies)) { |
$currsubfile{$path} = {}; |
$currsubfile{$path} = {}; |
if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { |
if (($actionurl eq '/adm/portfolio') || |
|
($actionurl eq '/adm/coursegrp_portfolio')) { |
my ($sublistref,$listerror) = |
my ($sublistref,$listerror) = |
&Apache::lonnet::dirlist($url.$path,$udom,$uname,$getpropath); |
&Apache::lonnet::dirlist($url.$path,$udom,$uname,$getpropath); |
if (ref($sublistref) eq 'ARRAY') { |
if (ref($sublistref) eq 'ARRAY') { |
Line 9276 sub ask_for_embedded_content {
|
Line 9699 sub ask_for_embedded_content {
|
my @subdir_list = grep(!/^\./,readdir($dir)); |
my @subdir_list = grep(!/^\./,readdir($dir)); |
map {$currsubfile{$path}{$_} = 1;} @subdir_list; |
map {$currsubfile{$path}{$_} = 1;} @subdir_list; |
} |
} |
} elsif ($actionurl eq '/adm/dependencies') { |
} elsif (($actionurl eq '/adm/dependencies') || |
|
(($actionurl eq '/adm/coursedocs') && (ref($args) eq 'HASH') && |
|
($args->{'context'} eq 'paste')) || |
|
($actionurl eq "/public/$cdom/$cnum/syllabus")) { |
if ($env{'request.course.id'} ne '') { |
if ($env{'request.course.id'} ne '') { |
my ($dir) = ($fileloc =~ m{^(.+/)[^/]+$}); |
my $dir; |
|
if ($actionurl eq "/public/$cdom/$cnum/syllabus") { |
|
$dir = $fileloc; |
|
} else { |
|
($dir) = ($fileloc =~ m{^(.+/)[^/]+$}); |
|
} |
if ($dir ne '') { |
if ($dir ne '') { |
my ($sublistref,$listerror) = |
my ($sublistref,$listerror) = |
&Apache::lonnet::dirlist($dir.$path,$cdom,$cnum,$getpropath,undef,'/'); |
&Apache::lonnet::dirlist($dir.$path,$cdom,$cnum,$getpropath,undef,'/'); |
Line 9312 sub ask_for_embedded_content {
|
Line 9743 sub ask_for_embedded_content {
|
if (ref($currsubfile{$path}) eq 'HASH') { |
if (ref($currsubfile{$path}) eq 'HASH') { |
foreach my $file (keys(%{$currsubfile{$path}})) { |
foreach my $file (keys(%{$currsubfile{$path}})) { |
unless ($subdependencies{$path}{$file}) { |
unless ($subdependencies{$path}{$file}) { |
|
next if (($rem ne '') && |
|
(($env{"httpref.$rem"."$path/$file"} ne '') || |
|
(ref($navmap) && |
|
(($navmap->getResourceByUrl($rem."$path/$file") ne '') || |
|
(($file =~ /^(.*\.s?html?)\.bak$/i) && |
|
($navmap->getResourceByUrl($rem."$path/$1"))))))); |
$unused{$path.'/'.$file} = 1; |
$unused{$path.'/'.$file} = 1; |
} |
} |
} |
} |
Line 9320 sub ask_for_embedded_content {
|
Line 9757 sub ask_for_embedded_content {
|
} |
} |
} |
} |
my %currfile; |
my %currfile; |
if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { |
if (($actionurl eq '/adm/portfolio') || |
|
($actionurl eq '/adm/coursegrp_portfolio')) { |
my ($dirlistref,$listerror) = |
my ($dirlistref,$listerror) = |
&Apache::lonnet::dirlist($url,$udom,$uname,$getpropath); |
&Apache::lonnet::dirlist($url,$udom,$uname,$getpropath); |
if (ref($dirlistref) eq 'ARRAY') { |
if (ref($dirlistref) eq 'ARRAY') { |
Line 9334 sub ask_for_embedded_content {
|
Line 9772 sub ask_for_embedded_content {
|
my @dir_list = grep(!/^\./,readdir($dir)); |
my @dir_list = grep(!/^\./,readdir($dir)); |
map {$currfile{$_} = 1;} @dir_list; |
map {$currfile{$_} = 1;} @dir_list; |
} |
} |
} elsif ($actionurl eq '/adm/dependencies') { |
} elsif (($actionurl eq '/adm/dependencies') || |
|
(($actionurl eq '/adm/coursedocs') && (ref($args) eq 'HASH') && |
|
($args->{'context'} eq 'paste')) || |
|
($actionurl eq "/public/$cdom/$cnum/syllabus")) { |
if ($env{'request.course.id'} ne '') { |
if ($env{'request.course.id'} ne '') { |
my ($dir) = ($fileloc =~ m{^(.+/)[^/]+$}); |
my ($dir) = ($fileloc =~ m{^(.+/)[^/]+$}); |
if ($dir ne '') { |
if ($dir ne '') { |
Line 9368 sub ask_for_embedded_content {
|
Line 9809 sub ask_for_embedded_content {
|
unless (($file eq $filename) || |
unless (($file eq $filename) || |
($file eq $filename.'.bak') || |
($file eq $filename.'.bak') || |
($dependencies{$file})) { |
($dependencies{$file})) { |
|
if ($actionurl eq '/adm/dependencies') { |
|
unless ($toplevel =~ m{^\Q/uploaded/$cdom/$cnum/portfolio/syllabus\E}) { |
|
next if (($rem ne '') && |
|
(($env{"httpref.$rem".$file} ne '') || |
|
(ref($navmap) && |
|
(($navmap->getResourceByUrl($rem.$file) ne '') || |
|
(($file =~ /^(.*\.s?html?)\.bak$/i) && |
|
($navmap->getResourceByUrl($rem.$1))))))); |
|
} |
|
} |
$unused{$file} = 1; |
$unused{$file} = 1; |
} |
} |
} |
} |
|
if (($actionurl eq '/adm/coursedocs') && (ref($args) eq 'HASH') && |
|
($args->{'context'} eq 'paste')) { |
|
$counter = scalar(keys(%existing)); |
|
$numpathchg = scalar(keys(%pathchanges)); |
|
return ($output,$counter,$numpathchg,\%existing); |
|
} elsif (($actionurl eq "/public/$cdom/$cnum/syllabus") && |
|
(ref($args) eq 'HASH') && ($args->{'context'} eq 'rewrites')) { |
|
$counter = scalar(keys(%existing)); |
|
$numpathchg = scalar(keys(%pathchanges)); |
|
return ($output,$counter,$numpathchg,\%existing,\%mapping); |
|
} |
foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%newfiles)) { |
foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%newfiles)) { |
if ($actionurl eq '/adm/dependencies') { |
if ($actionurl eq '/adm/dependencies') { |
next if ($embed_file =~ m{^\w+://}); |
next if ($embed_file =~ m{^\w+://}); |
} |
} |
$upload_output .= &start_data_table_row(). |
$upload_output .= &start_data_table_row(). |
'<td><img src="'.&icon($embed_file).'" /> '. |
'<td valign="top"><img src="'.&icon($embed_file).'" /> '. |
'<span class="LC_filename">'.$embed_file.'</span>'; |
'<span class="LC_filename">'.$embed_file.'</span>'; |
unless ($mapping{$embed_file} eq $embed_file) { |
unless ($mapping{$embed_file} eq $embed_file) { |
$upload_output .= '<br /><span class="LC_info" style="font-size:smaller;">'.&mt('changed from: [_1]',$mapping{$embed_file}).'</span>'; |
$upload_output .= '<br /><span class="LC_info" style="font-size:smaller;">'. |
|
&mt('changed from: [_1]',$mapping{$embed_file}).'</span>'; |
} |
} |
$upload_output .= '</td><td>'; |
$upload_output .= '</td>'; |
if ($args->{'ignore_remote_references'} && $embed_file =~ m{^\w+://}) { |
if ($args->{'ignore_remote_references'} && $embed_file =~ m{^\w+://}) { |
$upload_output.='<span class="LC_warning">'.&mt("URL points to other server.").'</span>'; |
$upload_output.='<td align="right">'. |
|
'<span class="LC_info LC_fontsize_medium">'. |
|
&mt("URL points to web address").'</span>'; |
$numremref++; |
$numremref++; |
} elsif ($args->{'error_on_invalid_names'} |
} elsif ($args->{'error_on_invalid_names'} |
&& $embed_file ne &Apache::lonnet::clean_filename($embed_file,{'keep_path' => 1,})) { |
&& $embed_file ne &Apache::lonnet::clean_filename($embed_file,{'keep_path' => 1,})) { |
|
$upload_output.='<td align="right"><span class="LC_warning">'. |
$upload_output.='<span class="LC_warning">'.&mt('Invalid characters').'</span>'; |
&mt('Invalid characters').'</span>'; |
$numinvalid++; |
$numinvalid++; |
} else { |
} else { |
$upload_output .= &embedded_file_element('upload_embedded',$counter, |
$upload_output .= '<td>'. |
|
&embedded_file_element('upload_embedded',$counter, |
$embed_file,\%mapping, |
$embed_file,\%mapping, |
$allfiles,$codebase,'upload'); |
$allfiles,$codebase,'upload'); |
$counter ++; |
$counter ++; |
Line 9420 sub ask_for_embedded_content {
|
Line 9886 sub ask_for_embedded_content {
|
$counter ++; |
$counter ++; |
} else { |
} else { |
$upload_output .= &start_data_table_row(). |
$upload_output .= &start_data_table_row(). |
'<td><span class="LC_filename">'.$embed_file.'</span></td>'; |
'<td valign="top"><img src="'.&icon($embed_file).'" /> '. |
'<td><span class="LC_warning">'.&mt('Already exists').'</span></td>'. |
'<span class="LC_filename">'.$embed_file.'</span></td>'. |
|
'<td align="right"><span class="LC_info LC_fontsize_medium">'.&mt('Already exists').'</span></td>'. |
&Apache::loncommon::end_data_table_row()."\n"; |
&Apache::loncommon::end_data_table_row()."\n"; |
} |
} |
} |
} |
Line 9516 sub ask_for_embedded_content {
|
Line 9983 sub ask_for_embedded_content {
|
$output = '<b>'.&mt('Referenced files').'</b>:<br />'; |
$output = '<b>'.&mt('Referenced files').'</b>:<br />'; |
if ($applies > 1) { |
if ($applies > 1) { |
$output .= |
$output .= |
&mt('No files need to be uploaded, as one of the following applies to each reference:').'<ul>'; |
&mt('No dependencies need to be uploaded, as one of the following applies to each reference:').'<ul>'; |
if ($numremref) { |
if ($numremref) { |
$output .= '<li>'.&mt('reference is to a URL which points to another server').'</li>'."\n"; |
$output .= '<li>'.&mt('reference is to a URL which points to another server').'</li>'."\n"; |
} |
} |
Line 9559 sub ask_for_embedded_content {
|
Line 10026 sub ask_for_embedded_content {
|
$chgcount ++; |
$chgcount ++; |
} |
} |
} |
} |
if ($counter) { |
if (($counter) || ($numunused)) { |
if ($numpathchg) { |
if ($numpathchg) { |
$output .= '<input type ="hidden" name="number_pathchange_items" value="'. |
$output .= '<input type ="hidden" name="number_pathchange_items" value="'. |
$numpathchg.'" />'."\n"; |
$numpathchg.'" />'."\n"; |
Line 9572 sub ask_for_embedded_content {
|
Line 10039 sub ask_for_embedded_content {
|
} elsif ($actionurl eq '/adm/dependencies') { |
} elsif ($actionurl eq '/adm/dependencies') { |
$output .= '<input type="hidden" name="action" value="process_changes" />'; |
$output .= '<input type="hidden" name="action" value="process_changes" />'; |
} |
} |
$output .= '<input type ="submit" value="'.$buttontext.'" />'."\n".'</form>'."\n"; |
$output .= '<input type ="submit" value="'.$buttontext.'" />'."\n".'</form>'."\n"; |
} elsif ($numpathchg) { |
} elsif ($numpathchg) { |
my %pathchange = (); |
my %pathchange = (); |
$output .= &modify_html_form('pathchange',$actionurl,$state,\%pathchange,$pathchange_output); |
$output .= &modify_html_form('pathchange',$actionurl,$state,\%pathchange,$pathchange_output); |
if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { |
if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { |
$output .= '<p>'.&mt('or').'</p>'; |
$output .= '<p>'.&mt('or').'</p>'; |
} |
} |
} |
} |
return ($output,$counter,$numpathchg); |
return ($output,$counter,$numpathchg); |
} |
} |
Line 9714 sub upload_embedded {
|
Line 10181 sub upload_embedded {
|
$output .= &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1).'<br />'; |
$output .= &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1).'<br />'; |
next; |
next; |
} elsif ($fname=~/\.(\d+)\.(\w+)$/) { |
} elsif ($fname=~/\.(\d+)\.(\w+)$/) { |
$output .= &mt('File name not allowed - rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2).'<br />'; |
$output .= &mt('Filename not allowed - rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2).'<br />'; |
next; |
next; |
} |
} |
$env{'form.embedded_item_'.$i.'.filename'}=$fname; |
$env{'form.embedded_item_'.$i.'.filename'}=$fname; |
|
my $subdir = $path; |
|
$subdir =~ s{/+$}{}; |
if ($context eq 'portfolio') { |
if ($context eq 'portfolio') { |
my $result; |
my $result; |
if ($state eq 'existingfile') { |
if ($state eq 'existingfile') { |
$result= |
$result= |
&Apache::lonnet::userfileupload('embedded_item_'.$i,'existingfile', |
&Apache::lonnet::userfileupload('embedded_item_'.$i,'existingfile', |
$dirpath.$env{'form.currentpath'}.$path); |
$dirpath.$env{'form.currentpath'}.$subdir); |
} else { |
} else { |
$result= |
$result= |
&Apache::lonnet::userfileupload('embedded_item_'.$i,'', |
&Apache::lonnet::userfileupload('embedded_item_'.$i,'', |
$dirpath. |
$dirpath. |
$env{'form.currentpath'}.$path); |
$env{'form.currentpath'}.$subdir); |
if ($result !~ m|^/uploaded/|) { |
if ($result !~ m|^/uploaded/|) { |
$output .= '<span class="LC_error">' |
$output .= '<span class="LC_error">' |
.&mt('An error occurred ([_1]) while trying to upload [_2] for embedded element [_3].' |
.&mt('An error occurred ([_1]) while trying to upload [_2] for embedded element [_3].' |
Line 9740 sub upload_embedded {
|
Line 10209 sub upload_embedded {
|
$path.$fname.'</span>').'<br />'; |
$path.$fname.'</span>').'<br />'; |
} |
} |
} |
} |
} elsif ($context eq 'coursedoc') { |
} elsif (($context eq 'coursedoc') || ($context eq 'syllabus')) { |
|
my $extendedsubdir = $dirpath.'/'.$subdir; |
|
$extendedsubdir =~ s{/+$}{}; |
my $result = |
my $result = |
&Apache::lonnet::userfileupload('embedded_item_'.$i,'coursedoc', |
&Apache::lonnet::userfileupload('embedded_item_'.$i,$context,$extendedsubdir); |
$dirpath.'/'.$path); |
|
if ($result !~ m|^/uploaded/|) { |
if ($result !~ m|^/uploaded/|) { |
$output .= '<span class="LC_error">' |
$output .= '<span class="LC_error">' |
.&mt('An error occurred ([_1]) while trying to upload [_2] for embedded element [_3].' |
.&mt('An error occurred ([_1]) while trying to upload [_2] for embedded element [_3].' |
Line 9753 sub upload_embedded {
|
Line 10223 sub upload_embedded {
|
} else { |
} else { |
$output .= &mt('Uploaded [_1]','<span class="LC_filename">'. |
$output .= &mt('Uploaded [_1]','<span class="LC_filename">'. |
$path.$fname.'</span>').'<br />'; |
$path.$fname.'</span>').'<br />'; |
|
if ($context eq 'syllabus') { |
|
&Apache::lonnet::make_public_indefinitely($result); |
|
} |
} |
} |
} else { |
} else { |
# Save the file |
# Save the file |
Line 9884 sub modify_html_form {
|
Line 10357 sub modify_html_form {
|
} |
} |
|
|
sub modify_html_refs { |
sub modify_html_refs { |
my ($context,$dirpath,$uname,$udom,$dir_root) = @_; |
my ($context,$dirpath,$uname,$udom,$dir_root,$url) = @_; |
my $container; |
my $container; |
if ($context eq 'portfolio') { |
if ($context eq 'portfolio') { |
$container = $env{'form.container'}; |
$container = $env{'form.container'}; |
Line 9893 sub modify_html_refs {
|
Line 10366 sub modify_html_refs {
|
} elsif ($context eq 'manage_dependencies') { |
} elsif ($context eq 'manage_dependencies') { |
(undef,undef,$container) = &Apache::lonnet::decode_symb($env{'form.symb'}); |
(undef,undef,$container) = &Apache::lonnet::decode_symb($env{'form.symb'}); |
$container = "/$container"; |
$container = "/$container"; |
|
} elsif ($context eq 'syllabus') { |
|
$container = $url; |
} else { |
} else { |
$container = $Apache::lonnet::perlvar{'lonDocRoot'}.$env{'form.filename'}; |
$container = $Apache::lonnet::perlvar{'lonDocRoot'}.$env{'form.filename'}; |
} |
} |
my (%allfiles,%codebase,$output,$content); |
my (%allfiles,%codebase,$output,$content); |
my @changes = &get_env_multiple('form.namechange'); |
my @changes = &get_env_multiple('form.namechange'); |
unless (@changes > 0) { |
unless ((@changes > 0) || ($context eq 'syllabus')) { |
if (wantarray) { |
if (wantarray) { |
return ('',0,0); |
return ('',0,0); |
} else { |
} else { |
Line 9906 sub modify_html_refs {
|
Line 10381 sub modify_html_refs {
|
} |
} |
} |
} |
if (($context eq 'portfolio') || ($context eq 'coursedoc') || |
if (($context eq 'portfolio') || ($context eq 'coursedoc') || |
($context eq 'manage_dependencies')) { |
($context eq 'manage_dependencies') || ($context eq 'syllabus')) { |
unless ($container =~ m{^/uploaded/\Q$udom\E/\Q$uname\E/}) { |
unless ($container =~ m{^/uploaded/\Q$udom\E/\Q$uname\E/}) { |
if (wantarray) { |
if (wantarray) { |
return ('',0,0); |
return ('',0,0); |
Line 9962 sub modify_html_refs {
|
Line 10437 sub modify_html_refs {
|
if ($content =~ m{($attrib_regexp\s*=\s*['"]?)\Q$ref\E(['"]?)}) { |
if ($content =~ m{($attrib_regexp\s*=\s*['"]?)\Q$ref\E(['"]?)}) { |
my $numchg = ($content =~ s{($attrib_regexp\s*=\s*['"]?)\Q$ref\E(['"]?)}{$1$newname$2}gi); |
my $numchg = ($content =~ s{($attrib_regexp\s*=\s*['"]?)\Q$ref\E(['"]?)}{$1$newname$2}gi); |
$count += $numchg; |
$count += $numchg; |
|
$allfiles{$newname} = $allfiles{$ref}; |
} |
} |
if ($env{'form.embedded_codebase_'.$i} ne '') { |
if ($env{'form.embedded_codebase_'.$i} ne '') { |
$codebase = &unescape($env{'form.embedded_codebase_'.$i}); |
$codebase = &unescape($env{'form.embedded_codebase_'.$i}); |
Line 9970 sub modify_html_refs {
|
Line 10446 sub modify_html_refs {
|
} |
} |
} |
} |
} |
} |
|
my $skiprewrites; |
if ($count || $codebasecount) { |
if ($count || $codebasecount) { |
my $saveresult; |
my $saveresult; |
if (($context eq 'portfolio') || ($context eq 'coursedoc') || |
if (($context eq 'portfolio') || ($context eq 'coursedoc') || |
($context eq 'manage_dependencies')) { |
($context eq 'manage_dependencies') || ($context eq 'syllabus')) { |
my $url = &Apache::lonnet::store_edited_file($container,$content,$udom,$uname,\$saveresult); |
my $url = &Apache::lonnet::store_edited_file($container,$content,$udom,$uname,\$saveresult); |
if ($url eq $container) { |
if ($url eq $container) { |
my ($fname) = ($container =~ m{/([^/]+)$}); |
my ($fname) = ($container =~ m{/([^/]+)$}); |
Line 9986 sub modify_html_refs {
|
Line 10463 sub modify_html_refs {
|
'<span class="LC_filename">'. |
'<span class="LC_filename">'. |
$container.'</span>').'</p>'; |
$container.'</span>').'</p>'; |
} |
} |
|
if ($context eq 'syllabus') { |
|
unless ($saveresult eq 'ok') { |
|
$skiprewrites = 1; |
|
} |
|
} |
} else { |
} else { |
if (open(my $fh,">$container")) { |
if (open(my $fh,">$container")) { |
print $fh $content; |
print $fh $content; |
Line 10001 sub modify_html_refs {
|
Line 10483 sub modify_html_refs {
|
} |
} |
} |
} |
} |
} |
|
if (($context eq 'syllabus') && (!$skiprewrites)) { |
|
my ($actionurl,$state); |
|
$actionurl = "/public/$udom/$uname/syllabus"; |
|
my ($ignore,$num,$numpathchanges,$existing,$mapping) = |
|
&ask_for_embedded_content($actionurl,$state,\%allfiles, |
|
\%codebase, |
|
{'context' => 'rewrites', |
|
'ignore_remote_references' => 1,}); |
|
if (ref($mapping) eq 'HASH') { |
|
my $rewrites = 0; |
|
foreach my $key (keys(%{$mapping})) { |
|
next if ($key =~ m{^https?://}); |
|
my $ref = $mapping->{$key}; |
|
my $newname = "/uploaded/$udom/$uname/portfolio/syllabus/$key"; |
|
my $attrib; |
|
if (ref($allfiles{$mapping->{$key}}) eq 'ARRAY') { |
|
$attrib = join('|',@{$allfiles{$mapping->{$key}}}); |
|
} |
|
if ($content =~ m{($attrib\s*=\s*['"]?)\Q$ref\E(['"]?)}) { |
|
my $numchg = ($content =~ s{($attrib\s*=\s*['"]?)\Q$ref\E(['"]?)}{$1$newname$2}gi); |
|
$rewrites += $numchg; |
|
} |
|
} |
|
if ($rewrites) { |
|
my $saveresult; |
|
my $url = &Apache::lonnet::store_edited_file($container,$content,$udom,$uname,\$saveresult); |
|
if ($url eq $container) { |
|
my ($fname) = ($container =~ m{/([^/]+)$}); |
|
$output .= '<p>'.&mt('Rewrote [quant,_1,link] as [quant,_1,absolute link] in [_2].', |
|
$count,'<span class="LC_filename">'. |
|
$fname.'</span>').'</p>'; |
|
} else { |
|
$output .= '<p class="LC_error">'. |
|
&mt('Error: could not update links in [_1].', |
|
'<span class="LC_filename">'. |
|
$container.'</span>').'</p>'; |
|
|
|
} |
|
} |
|
} |
|
} |
} else { |
} else { |
&logthis('Failed to parse '.$container. |
&logthis('Failed to parse '.$container. |
' to modify references: '.$parse_result); |
' to modify references: '.$parse_result); |
Line 10416 sub process_decompression {
|
Line 10939 sub process_decompression {
|
my ($docudom,$docuname,$file,$destination,$dir_root,$hiddenelem) = @_; |
my ($docudom,$docuname,$file,$destination,$dir_root,$hiddenelem) = @_; |
my ($dir,$error,$warning,$output); |
my ($dir,$error,$warning,$output); |
if ($file !~ /\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/) { |
if ($file !~ /\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/) { |
$error = &mt('File name not a supported archive file type.'). |
$error = &mt('Filename not a supported archive file type.'). |
'<br />'.&mt('File name should end with one of: [_1].', |
'<br />'.&mt('Filename should end with one of: [_1].', |
'.zip, .tar, .bz2, .gz, .tar.gz, .tar.bz2, .tgz'); |
'.zip, .tar, .bz2, .gz, .tar.gz, .tar.bz2, .tgz'); |
} else { |
} else { |
my $docuhome = &Apache::lonnet::homeserver($docuname,$docudom); |
my $docuhome = &Apache::lonnet::homeserver($docuname,$docudom); |
Line 10875 function dependencyCheck(form,count,offs
|
Line 11398 function dependencyCheck(form,count,offs
|
document.getElementById('arc_depon_'+count).style.display='block'; |
document.getElementById('arc_depon_'+count).style.display='block'; |
form.elements[depitem].options.length = 0; |
form.elements[depitem].options.length = 0; |
form.elements[depitem].options[0] = new Option('Select','',true,true); |
form.elements[depitem].options[0] = new Option('Select','',true,true); |
for (var i=1; i<count; i++) { |
for (var i=1; i<=numitems; i++) { |
|
if (i == count) { |
|
continue; |
|
} |
var startelement = $startcount + (i-1) * 7; |
var startelement = $startcount + (i-1) * 7; |
for (var j=1; j<6; j++) { |
for (var j=1; j<6; j++) { |
if ((j != 2) && (j!= 4)) { |
if ((j != 2) && (j!= 4)) { |
Line 10988 sub process_extracted_files {
|
Line 11514 sub process_extracted_files {
|
if ($env{'form.folderpath'}) { |
if ($env{'form.folderpath'}) { |
my @items = split('&',$env{'form.folderpath'}); |
my @items = split('&',$env{'form.folderpath'}); |
$folders{'0'} = $items[-2]; |
$folders{'0'} = $items[-2]; |
$containers{'0'}='sequence'; |
if ($env{'form.folderpath'} =~ /\:1$/) { |
} elsif ($env{'form.pagepath'}) { |
$containers{'0'}='page'; |
my @items = split('&',$env{'form.pagepath'}); |
} else { |
$folders{'0'} = $items[-2]; |
$containers{'0'}='sequence'; |
$containers{'0'}='page'; |
} |
} |
} |
my @archdirs = &get_env_multiple('form.archive_directory'); |
my @archdirs = &get_env_multiple('form.archive_directory'); |
if ($numitems) { |
if ($numitems) { |
Line 11016 sub process_extracted_files {
|
Line 11542 sub process_extracted_files {
|
my (%referrer,%orphaned,%todelete,%todeletedir,%newdest,%newseqid); |
my (%referrer,%orphaned,%todelete,%todeletedir,%newdest,%newseqid); |
if ($numitems) { |
if ($numitems) { |
for (my $i=1; $i<=$numitems; $i++) { |
for (my $i=1; $i<=$numitems; $i++) { |
|
next if ($env{'form.archive_'.$i} eq 'dependency'); |
my $path = $env{'form.archive_content_'.$i}; |
my $path = $env{'form.archive_content_'.$i}; |
if ($path =~ /^\Q$pathtocheck\E/) { |
if ($path =~ /^\Q$pathtocheck\E/) { |
if ($env{'form.archive_'.$i} eq 'discard') { |
if ($env{'form.archive_'.$i} eq 'discard') { |
Line 11066 sub process_extracted_files {
|
Line 11593 sub process_extracted_files {
|
my ($outtext,$errtext) = |
my ($outtext,$errtext) = |
&LONCAPA::map::storemap('/uploaded/'.$docudom.'/'. |
&LONCAPA::map::storemap('/uploaded/'.$docudom.'/'. |
$docuname.'/'.$folders{$outer}. |
$docuname.'/'.$folders{$outer}. |
'.'.$containers{$outer},1); |
'.'.$containers{$outer},1,1); |
$newseqid{$i} = $newidx; |
$newseqid{$i} = $newidx; |
unless ($errtext) { |
unless ($errtext) { |
$result .= '<li>'.&mt('Folder: [_1] added to course',$docstitle).'</li>'."\n"; |
$result .= '<li>'.&mt('Folder: [_1] added to course',$docstitle).'</li>'."\n"; |
Line 11099 sub process_extracted_files {
|
Line 11626 sub process_extracted_files {
|
my ($outtext,$errtext)= |
my ($outtext,$errtext)= |
&LONCAPA::map::storemap('/uploaded/'.$docudom.'/'. |
&LONCAPA::map::storemap('/uploaded/'.$docudom.'/'. |
$docuname.'/'.$folders{$outer}. |
$docuname.'/'.$folders{$outer}. |
'.'.$containers{$outer},1); |
'.'.$containers{$outer},1,1); |
unless ($errtext) { |
unless ($errtext) { |
if (-e "$prefix$dir/$docstype/$mapinner{$outer}/$newidx/$title") { |
if (-e "$prefix$dir/$docstype/$mapinner{$outer}/$newidx/$title") { |
$result .= '<li>'.&mt('File: [_1] added to course',$docstitle).'</li>'."\n"; |
$result .= '<li>'.&mt('File: [_1] added to course',$docstitle).'</li>'."\n"; |
Line 11107 sub process_extracted_files {
|
Line 11634 sub process_extracted_files {
|
} |
} |
} |
} |
} |
} |
} elsif ($env{'form.archive_'.$i} eq 'dependency') { |
} |
my ($title) = ($path =~ m{/([^/]+)$}); |
} else { |
$referrer{$i} = $env{'form.archive_dependent_on_'.$i}; |
$warning .= &mt('Item extracted from archive: [_1] has unexpected path.',$path).'<br />'; |
if ($env{'form.archive_'.$referrer{$i}} eq 'display') { |
} |
if (ref($dirorder{$i}) eq 'ARRAY') { |
} |
my ($itemidx,$fullpath,$relpath); |
for (my $i=1; $i<=$numitems; $i++) { |
|
next unless ($env{'form.archive_'.$i} eq 'dependency'); |
|
my $path = $env{'form.archive_content_'.$i}; |
|
if ($path =~ /^\Q$pathtocheck\E/) { |
|
my ($title) = ($path =~ m{/([^/]+)$}); |
|
$referrer{$i} = $env{'form.archive_dependent_on_'.$i}; |
|
if ($env{'form.archive_'.$referrer{$i}} eq 'display') { |
|
if (ref($dirorder{$i}) eq 'ARRAY') { |
|
my ($itemidx,$fullpath,$relpath); |
|
if (ref($dirorder{$referrer{$i}}) eq 'ARRAY') { |
|
my $container = $dirorder{$referrer{$i}}->[-1]; |
for (my $j=0; $j<@{$dirorder{$i}}; $j++) { |
for (my $j=0; $j<@{$dirorder{$i}}; $j++) { |
if (ref($dirorder{$referrer{$i}}) eq 'ARRAY') { |
if ($dirorder{$i}->[$j] eq $container) { |
my $container = $dirorder{$referrer{$i}}->[-1]; |
$itemidx = $j; |
for (my $j=0; $j<@{$dirorder{$i}}; $j++) { |
|
if ($dirorder{$i}->[$j] eq $container) { |
|
$itemidx = $j; |
|
} |
|
} |
|
} |
} |
} |
} |
if ($itemidx ne '') { |
} |
if (grep(/^\Q$referrer{$i}\E$/,@archdirs)) { |
if ($itemidx eq '') { |
if ($mapinner{$referrer{$i}}) { |
$itemidx = 0; |
$fullpath = "$prefix$dir/$docstype/$mapinner{$referrer{$i}}"; |
} |
for (my $j=$itemidx; $j<@{$dirorder{$i}}; $j++) { |
if (grep(/^\Q$referrer{$i}\E$/,@archdirs)) { |
if (grep(/^\Q$dirorder{$i}->[$j]\E$/,@archdirs)) { |
if ($mapinner{$referrer{$i}}) { |
unless (defined($newseqid{$dirorder{$i}->[$j]})) { |
$fullpath = "$prefix$dir/$docstype/$mapinner{$referrer{$i}}"; |
$fullpath .= '/'.$titles{$dirorder{$i}->[$j]}; |
for (my $j=$itemidx; $j<@{$dirorder{$i}}; $j++) { |
$relpath .= '/'.$titles{$dirorder{$i}->[$j]}; |
if (grep(/^\Q$dirorder{$i}->[$j]\E$/,@archdirs)) { |
if (!-e $fullpath) { |
unless (defined($newseqid{$dirorder{$i}->[$j]})) { |
mkdir($fullpath,0755); |
$fullpath .= '/'.$titles{$dirorder{$i}->[$j]}; |
} |
$relpath .= '/'.$titles{$dirorder{$i}->[$j]}; |
} |
if (!-e $fullpath) { |
} else { |
mkdir($fullpath,0755); |
last; |
|
} |
|
} |
|
} |
|
} elsif ($newdest{$referrer{$i}}) { |
|
$fullpath = $newdest{$referrer{$i}}; |
|
for (my $j=$itemidx; $j<@{$dirorder{$i}}; $j++) { |
|
if ($env{'form.archive_'.$dirorder{$i}->[$j]} eq 'discard') { |
|
$orphaned{$i} = $env{'form.archive_'.$dirorder{$i}->[$j]}; |
|
last; |
|
} elsif (grep(/^\Q$dirorder{$i}->[$j]\E$/,@archdirs)) { |
|
unless (defined($newseqid{$dirorder{$i}->[$j]})) { |
|
$fullpath .= '/'.$titles{$dirorder{$i}->[$j]}; |
|
$relpath .= '/'.$titles{$dirorder{$i}->[$j]}; |
|
if (!-e $fullpath) { |
|
mkdir($fullpath,0755); |
|
} |
|
} |
} |
} else { |
|
last; |
|
} |
} |
|
} else { |
|
last; |
} |
} |
} |
} |
if ($fullpath ne '') { |
} |
if (-e "$prefix$path") { |
} elsif ($newdest{$referrer{$i}}) { |
system("mv $prefix$path $fullpath/$title"); |
$fullpath = $newdest{$referrer{$i}}; |
} |
for (my $j=$itemidx; $j<@{$dirorder{$i}}; $j++) { |
if (-e "$fullpath/$title") { |
if ($env{'form.archive_'.$dirorder{$i}->[$j]} eq 'discard') { |
my $showpath; |
$orphaned{$i} = $env{'form.archive_'.$dirorder{$i}->[$j]}; |
if ($relpath ne '') { |
last; |
$showpath = "$relpath/$title"; |
} elsif (grep(/^\Q$dirorder{$i}->[$j]\E$/,@archdirs)) { |
} else { |
unless (defined($newseqid{$dirorder{$i}->[$j]})) { |
$showpath = "/$title"; |
$fullpath .= '/'.$titles{$dirorder{$i}->[$j]}; |
} |
$relpath .= '/'.$titles{$dirorder{$i}->[$j]}; |
$result .= '<li>'.&mt('[_1] included as a dependency',$showpath).'</li>'."\n"; |
if (!-e $fullpath) { |
} |
mkdir($fullpath,0755); |
unless ($ishome) { |
} |
my $fetch = "$fullpath/$title"; |
|
$fetch =~ s/^\Q$prefix$dir\E//; |
|
$prompttofetch{$fetch} = 1; |
|
} |
} |
|
} else { |
|
last; |
} |
} |
} |
} |
} |
} |
} elsif ($env{'form.archive_'.$referrer{$i}} eq 'discard') { |
if ($fullpath ne '') { |
$warning .= &mt('[_1] is a dependency of [_2], which was discarded.', |
if (-e "$prefix$path") { |
$path,$env{'form.archive_content_'.$referrer{$i}}).'<br />'; |
system("mv $prefix$path $fullpath/$title"); |
|
} |
|
if (-e "$fullpath/$title") { |
|
my $showpath; |
|
if ($relpath ne '') { |
|
$showpath = "$relpath/$title"; |
|
} else { |
|
$showpath = "/$title"; |
|
} |
|
$result .= '<li>'.&mt('[_1] included as a dependency',$showpath).'</li>'."\n"; |
|
} |
|
unless ($ishome) { |
|
my $fetch = "$fullpath/$title"; |
|
$fetch =~ s/^\Q$prefix$dir\E//; |
|
$prompttofetch{$fetch} = 1; |
|
} |
|
} |
} |
} |
|
} elsif ($env{'form.archive_'.$referrer{$i}} eq 'discard') { |
|
$warning .= &mt('[_1] is a dependency of [_2], which was discarded.', |
|
$path,$env{'form.archive_content_'.$referrer{$i}}).'<br />'; |
} |
} |
} else { |
} else { |
$warning .= &mt('Item extracted from archive: [_1] has unexpected path.',$path).'<br />'; |
$warning .= &mt('Item extracted from archive: [_1] has unexpected path.',$path).'<br />'; |
Line 11246 sub cleanup_empty_dirs {
|
Line 11779 sub cleanup_empty_dirs {
|
my $numitems = 0; |
my $numitems = 0; |
foreach my $item (@dircontents) { |
foreach my $item (@dircontents) { |
if (-d "$path/$item") { |
if (-d "$path/$item") { |
&recurse_dirs("$path/$item"); |
&cleanup_empty_dirs("$path/$item"); |
if (-e "$path/$item") { |
if (-e "$path/$item") { |
$numitems ++; |
$numitems ++; |
} |
} |
Line 11293 sub get_folder_hierarchy {
|
Line 11826 sub get_folder_hierarchy {
|
my @pcs = split(/,/,$pcslist); |
my @pcs = split(/,/,$pcslist); |
foreach my $pc (@pcs) { |
foreach my $pc (@pcs) { |
if ($pc == 1) { |
if ($pc == 1) { |
push(@pathitems,&mt('Main Course Documents')); |
push(@pathitems,&mt('Main Content')); |
} else { |
} else { |
my $res = $navmap->getByMapPc($pc); |
my $res = $navmap->getByMapPc($pc); |
if (ref($res)) { |
if (ref($res)) { |
Line 11308 sub get_folder_hierarchy {
|
Line 11841 sub get_folder_hierarchy {
|
} |
} |
if ($showitem) { |
if ($showitem) { |
if ($mapres->{ID} eq '0.0') { |
if ($mapres->{ID} eq '0.0') { |
push(@pathitems,&mt('Main Course Documents')); |
push(@pathitems,&mt('Main Content')); |
} else { |
} else { |
my $maptitle = $mapres->compTitle(); |
my $maptitle = $mapres->compTitle(); |
$maptitle =~ s/\W+/_/g; |
$maptitle =~ s/\W+/_/g; |
Line 12795 sub commit_customrole {
|
Line 13328 sub commit_customrole {
|
} |
} |
|
|
sub commit_standardrole { |
sub commit_standardrole { |
my ($udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context) = @_; |
my ($udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context,$credits) = @_; |
my ($output,$logmsg,$linefeed); |
my ($output,$logmsg,$linefeed); |
if ($context eq 'auto') { |
if ($context eq 'auto') { |
$linefeed = "\n"; |
$linefeed = "\n"; |
Line 12804 sub commit_standardrole {
|
Line 13337 sub commit_standardrole {
|
} |
} |
if ($three eq 'st') { |
if ($three eq 'st') { |
my $result = &commit_studentrole(\$logmsg,$udom,$uname,$url,$three,$start,$end, |
my $result = &commit_studentrole(\$logmsg,$udom,$uname,$url,$three,$start,$end, |
$one,$two,$sec,$context); |
$one,$two,$sec,$context,$credits); |
if (($result =~ /^error/) || ($result eq 'not_in_class') || |
if (($result =~ /^error/) || ($result eq 'not_in_class') || |
($result eq 'unknown_course') || ($result eq 'refused')) { |
($result eq 'unknown_course') || ($result eq 'refused')) { |
$output = $logmsg.' '.&mt('Error: ').$result."\n"; |
$output = $logmsg.' '.&mt('Error: ').$result."\n"; |
Line 12835 sub commit_standardrole {
|
Line 13368 sub commit_standardrole {
|
} |
} |
|
|
sub commit_studentrole { |
sub commit_studentrole { |
my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context) = @_; |
my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context, |
|
$credits) = @_; |
my ($result,$linefeed,$oldsecurl,$newsecurl); |
my ($result,$linefeed,$oldsecurl,$newsecurl); |
if ($context eq 'auto') { |
if ($context eq 'auto') { |
$linefeed = "\n"; |
$linefeed = "\n"; |
Line 12882 sub commit_studentrole {
|
Line 13416 sub commit_studentrole {
|
} |
} |
} |
} |
if (($expire_role_result eq 'ok') || ($secchange == 0)) { |
if (($expire_role_result eq 'ok') || ($secchange == 0)) { |
$modify_section_result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,'','',$cid,'',$context); |
$modify_section_result = |
|
&Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef, |
|
undef,undef,undef,$sec, |
|
$end,$start,'','',$cid, |
|
'',$context,$credits); |
if ($modify_section_result =~ /^ok/) { |
if ($modify_section_result =~ /^ok/) { |
if ($secchange == 1) { |
if ($secchange == 1) { |
if ($sec eq '') { |
if ($sec eq '') { |
Line 12904 sub commit_studentrole {
|
Line 13442 sub commit_studentrole {
|
} |
} |
} |
} |
} else { |
} else { |
if ($secchange) { |
if ($secchange) { |
$$logmsg .= &mt('Error when attempting section change for [_1] from old section "[_2]" to new section: "[_3]" in course [_4] -error:',$uname,$oldsec,$sec,$cid).' '.$modify_section_result.$linefeed; |
$$logmsg .= &mt('Error when attempting section change for [_1] from old section "[_2]" to new section: "[_3]" in course [_4] -error:',$uname,$oldsec,$sec,$cid).' '.$modify_section_result.$linefeed; |
} else { |
} else { |
$$logmsg .= &mt('Error when attempting to modify role for [_1] for section: "[_2]" in course [_3] -error:',$uname,$sec,$cid).' '.$modify_section_result.$linefeed; |
$$logmsg .= &mt('Error when attempting to modify role for [_1] for section: "[_2]" in course [_3] -error:',$uname,$sec,$cid).' '.$modify_section_result.$linefeed; |
Line 12913 sub commit_studentrole {
|
Line 13451 sub commit_studentrole {
|
$result = $modify_section_result; |
$result = $modify_section_result; |
} elsif ($secchange == 1) { |
} elsif ($secchange == 1) { |
if ($oldsec eq '') { |
if ($oldsec eq '') { |
$$logmsg .= &mt('Error when attempting to expire existing role without a section for [_1] in course [_3] -error: ',$uname,$cid).' '.$expire_role_result.$linefeed; |
$$logmsg .= &mt('Error when attempting to expire existing role without a section for [_1] in course [_2] -error: ',$uname,$cid).' '.$expire_role_result.$linefeed; |
} else { |
} else { |
$$logmsg .= &mt('Error when attempting to expire existing role for [_1] in section [_2] in course [_3] -error: ',$uname,$oldsec,$cid).' '.$expire_role_result.$linefeed; |
$$logmsg .= &mt('Error when attempting to expire existing role for [_1] in section [_2] in course [_3] -error: ',$uname,$oldsec,$cid).' '.$expire_role_result.$linefeed; |
} |
} |
Line 12939 sub commit_studentrole {
|
Line 13477 sub commit_studentrole {
|
return $result; |
return $result; |
} |
} |
|
|
|
sub show_role_extent { |
|
my ($scope,$context,$role) = @_; |
|
$scope =~ s{^/}{}; |
|
my @courseroles = &Apache::lonuserutils::roles_by_context('course',1); |
|
push(@courseroles,'co'); |
|
my @authorroles = &Apache::lonuserutils::roles_by_context('author'); |
|
if (($context eq 'course') || (grep(/^\Q$role\E/,@courseroles))) { |
|
$scope =~ s{/}{_}; |
|
return '<span class="LC_cusr_emph">'.$env{'course.'.$scope.'.description'}.'</span>'; |
|
} elsif (($context eq 'author') || (grep(/^\Q$role\E/,@authorroles))) { |
|
my ($audom,$auname) = split(/\//,$scope); |
|
return &mt('[_1] Author Space','<span class="LC_cusr_emph">'. |
|
&Apache::loncommon::plainname($auname,$audom).'</span>'); |
|
} else { |
|
$scope =~ s{/$}{}; |
|
return &mt('Domain: [_1]','<span class="LC_cusr_emph">'. |
|
&Apache::lonnet::domain($scope,'description').'</span>'); |
|
} |
|
} |
|
|
############################################################ |
############################################################ |
############################################################ |
############################################################ |
|
|
Line 13102 sub construct_course {
|
Line 13660 sub construct_course {
|
'pch.users.denied', |
'pch.users.denied', |
'plc.users.denied', |
'plc.users.denied', |
'hidefromcat', |
'hidefromcat', |
|
'checkforpriv', |
'categories'], |
'categories'], |
$$crsudom,$$crsunum); |
$$crsudom,$$crsunum); |
} |
} |
Line 13131 sub construct_course {
|
Line 13690 sub construct_course {
|
} else { |
} else { |
$cenv{'internal.courseowner'} = $args->{'curruser'}; |
$cenv{'internal.courseowner'} = $args->{'curruser'}; |
} |
} |
|
if ($args->{'defaultcredits'}) { |
|
$cenv{'internal.defaultcredits'} = $args->{'defaultcredits'}; |
|
} |
my @badclasses = (); # Used to accumulate sections/crosslistings that did not pass classlist access check for course owner. |
my @badclasses = (); # Used to accumulate sections/crosslistings that did not pass classlist access check for course owner. |
if ($args->{'crssections'}) { |
if ($args->{'crssections'}) { |
$cenv{'internal.sectionnums'} = ''; |
$cenv{'internal.sectionnums'} = ''; |
Line 13155 sub construct_course {
|
Line 13717 sub construct_course {
|
# do not hide course coordinator from staff listing, |
# do not hide course coordinator from staff listing, |
# even if privileged |
# even if privileged |
$cenv{'nothideprivileged'}=$args->{'ccuname'}.':'.$args->{'ccdomain'}; |
$cenv{'nothideprivileged'}=$args->{'ccuname'}.':'.$args->{'ccdomain'}; |
|
# add course coordinator's domain to domains to check for privileged users |
|
# if different to course domain |
|
if ($$crsudom ne $args->{'ccdomain'}) { |
|
$cenv{'checkforpriv'} = $args->{'ccdomain'}; |
|
} |
# add crosslistings |
# add crosslistings |
if ($args->{'crsxlist'}) { |
if ($args->{'crsxlist'}) { |
$cenv{'internal.crosslistings'}=''; |
$cenv{'internal.crosslistings'}=''; |
Line 13567 sub init_user_environment {
|
Line 14134 sub init_user_environment {
|
%domdef = &Apache::lonnet::get_domain_defaults($domain); |
%domdef = &Apache::lonnet::get_domain_defaults($domain); |
} |
} |
|
|
foreach my $tool ('aboutme','blog','portfolio') { |
foreach my $tool ('aboutme','blog','webdav','portfolio') { |
$userenv{'availabletools.'.$tool} = |
$userenv{'availabletools.'.$tool} = |
&Apache::lonnet::usertools_access($username,$domain,$tool,'reload', |
&Apache::lonnet::usertools_access($username,$domain,$tool,'reload', |
undef,\%userenv,\%domdef,\%is_adv); |
undef,\%userenv,\%domdef,\%is_adv); |
Line 13580 sub init_user_environment {
|
Line 14147 sub init_user_environment {
|
\%userenv,\%domdef,\%is_adv); |
\%userenv,\%domdef,\%is_adv); |
} |
} |
|
|
|
$userenv{'canrequest.author'} = |
|
&Apache::lonnet::usertools_access($username,$domain,'requestauthor', |
|
'reload','requestauthor', |
|
\%userenv,\%domdef,\%is_adv); |
|
my %reqauthor = &Apache::lonnet::get('requestauthor',['author_status','author'], |
|
$domain,$username); |
|
my $reqstatus = $reqauthor{'author_status'}; |
|
if ($reqstatus eq 'approval' || $reqstatus eq 'approved') { |
|
if (ref($reqauthor{'author'}) eq 'HASH') { |
|
$userenv{'requestauthorqueued'} = $reqstatus.':'. |
|
$reqauthor{'author'}{'timestamp'}; |
|
} |
|
} |
|
|
$env{'user.environment'} = "$lonids/$cookie.id"; |
$env{'user.environment'} = "$lonids/$cookie.id"; |
|
|
if (tie(my %disk_env,'GDBM_File',"$lonids/$cookie.id", |
if (tie(my %disk_env,'GDBM_File',"$lonids/$cookie.id", |
Line 13694 sub build_release_hashes {
|
Line 14275 sub build_release_hashes {
|
return; |
return; |
} |
} |
|
|
|
sub update_content_constraints { |
|
my ($cdom,$cnum,$chome,$cid) = @_; |
|
my %curr_reqd_hash = &Apache::lonnet::userenvironment($cdom,$cnum,'internal.releaserequired'); |
|
my ($reqdmajor,$reqdminor) = split(/\./,$curr_reqd_hash{'internal.releaserequired'}); |
|
my %checkresponsetypes; |
|
foreach my $key (keys(%Apache::lonnet::needsrelease)) { |
|
my ($item,$name,$value) = split(/:/,$key); |
|
if ($item eq 'resourcetag') { |
|
if ($name eq 'responsetype') { |
|
$checkresponsetypes{$value} = $Apache::lonnet::needsrelease{$key} |
|
} |
|
} |
|
} |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (defined($navmap)) { |
|
my %allresponses; |
|
foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_problem() },1,0)) { |
|
my %responses = $res->responseTypes(); |
|
foreach my $key (keys(%responses)) { |
|
next unless(exists($checkresponsetypes{$key})); |
|
$allresponses{$key} += $responses{$key}; |
|
} |
|
} |
|
foreach my $key (keys(%allresponses)) { |
|
my ($major,$minor) = split(/\./,$checkresponsetypes{$key}); |
|
if (($major > $reqdmajor) || ($major == $reqdmajor && $minor > $reqdminor)) { |
|
($reqdmajor,$reqdminor) = ($major,$minor); |
|
} |
|
} |
|
undef($navmap); |
|
} |
|
unless (($reqdmajor eq '') && ($reqdminor eq '')) { |
|
&Apache::lonnet::update_released_required($reqdmajor.'.'.$reqdminor,$cdom,$cnum,$chome,$cid); |
|
} |
|
return; |
|
} |
|
|
|
sub allmaps_incourse { |
|
my ($cdom,$cnum,$chome,$cid) = @_; |
|
if ($cdom eq '' || $cnum eq '' || $chome eq '' || $cid eq '') { |
|
$cid = $env{'request.course.id'}; |
|
$cdom = $env{'course.'.$cid.'.domain'}; |
|
$cnum = $env{'course.'.$cid.'.num'}; |
|
$chome = $env{'course.'.$cid.'.home'}; |
|
} |
|
my %allmaps = (); |
|
my $lastchange = |
|
&Apache::lonnet::get_coursechange($cdom,$cnum); |
|
if ($lastchange > $env{'request.course.tied'}) { |
|
my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum"); |
|
unless ($ferr) { |
|
&update_content_constraints($cdom,$cnum,$chome,$cid); |
|
} |
|
} |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (defined($navmap)) { |
|
foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_map() },1,0,1)) { |
|
$allmaps{$res->src()} = 1; |
|
} |
|
} |
|
return \%allmaps; |
|
} |
|
|
|
sub parse_supplemental_title { |
|
my ($title) = @_; |
|
|
|
my ($foldertitle,$renametitle); |
|
if ($title =~ /&&&/) { |
|
$title = &HTML::Entites::decode($title); |
|
} |
|
if ($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/) { |
|
$renametitle=$4; |
|
my ($time,$uname,$udom) = ($1,$2,$3); |
|
$foldertitle=&Apache::lontexconvert::msgtexconverted($4); |
|
my $name = &plainname($uname,$udom); |
|
$name = &HTML::Entities::encode($name,'"<>&\''); |
|
$renametitle = &HTML::Entities::encode($renametitle,'"<>&\''); |
|
$title='<i>'.&Apache::lonlocal::locallocaltime($time).'</i> '. |
|
$name.': <br />'.$foldertitle; |
|
} |
|
if (wantarray) { |
|
return ($title,$foldertitle,$renametitle); |
|
} |
|
return $title; |
|
} |
|
|
|
sub symb_to_docspath { |
|
my ($symb) = @_; |
|
return unless ($symb); |
|
my ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($symb); |
|
if ($resurl=~/\.(sequence|page)$/) { |
|
$mapurl=$resurl; |
|
} elsif ($resurl eq 'adm/navmaps') { |
|
$mapurl=$env{'course.'.$env{'request.course.id'}.'.url'}; |
|
} |
|
my $mapresobj; |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (ref($navmap)) { |
|
$mapresobj = $navmap->getResourceByUrl($mapurl); |
|
} |
|
$mapurl=~s{^.*/([^/]+)\.(\w+)$}{$1}; |
|
my $type=$2; |
|
my $path; |
|
if (ref($mapresobj)) { |
|
my $pcslist = $mapresobj->map_hierarchy(); |
|
if ($pcslist ne '') { |
|
foreach my $pc (split(/,/,$pcslist)) { |
|
next if ($pc <= 1); |
|
my $res = $navmap->getByMapPc($pc); |
|
if (ref($res)) { |
|
my $thisurl = $res->src(); |
|
$thisurl=~s{^.*/([^/]+)\.\w+$}{$1}; |
|
my $thistitle = $res->title(); |
|
$path .= '&'. |
|
&Apache::lonhtmlcommon::entity_encode($thisurl).'&'. |
|
&Apache::lonhtmlcommon::entity_encode($thistitle). |
|
':'.$res->randompick(). |
|
':'.$res->randomout(). |
|
':'.$res->encrypted(). |
|
':'.$res->randomorder(). |
|
':'.$res->is_page(); |
|
} |
|
} |
|
} |
|
$path =~ s/^\&//; |
|
my $maptitle = $mapresobj->title(); |
|
if ($mapurl eq 'default') { |
|
$maptitle = 'Main Content'; |
|
} |
|
$path .= (($path ne '')? '&' : ''). |
|
&Apache::lonhtmlcommon::entity_encode($mapurl).'&'. |
|
&Apache::lonhtmlcommon::entity_encode($maptitle). |
|
':'.$mapresobj->randompick(). |
|
':'.$mapresobj->randomout(). |
|
':'.$mapresobj->encrypted(). |
|
':'.$mapresobj->randomorder(). |
|
':'.$mapresobj->is_page(); |
|
} else { |
|
my $maptitle = &Apache::lonnet::gettitle($mapurl); |
|
my $ispage = (($type eq 'page')? 1 : ''); |
|
if ($mapurl eq 'default') { |
|
$maptitle = 'Main Content'; |
|
} |
|
$path = &Apache::lonhtmlcommon::entity_encode($mapurl).'&'. |
|
&Apache::lonhtmlcommon::entity_encode($maptitle).':::::'.$ispage; |
|
} |
|
unless ($mapurl eq 'default') { |
|
$path = 'default&'. |
|
&Apache::lonhtmlcommon::entity_encode('Main Content'). |
|
':::::&'.$path; |
|
} |
|
return $path; |
|
} |
|
|
|
sub captcha_display { |
|
my ($context,$lonhost) = @_; |
|
my ($output,$error); |
|
my ($captcha,$pubkey,$privkey) = &get_captcha_config($context,$lonhost); |
|
if ($captcha eq 'original') { |
|
$output = &create_captcha(); |
|
unless ($output) { |
|
$error = 'captcha'; |
|
} |
|
} elsif ($captcha eq 'recaptcha') { |
|
$output = &create_recaptcha($pubkey); |
|
unless ($output) { |
|
$error = 'recaptcha'; |
|
} |
|
} |
|
return ($output,$error); |
|
} |
|
|
|
sub captcha_response { |
|
my ($context,$lonhost) = @_; |
|
my ($captcha_chk,$captcha_error); |
|
my ($captcha,$pubkey,$privkey) = &get_captcha_config($context,$lonhost); |
|
if ($captcha eq 'original') { |
|
($captcha_chk,$captcha_error) = &check_captcha(); |
|
} elsif ($captcha eq 'recaptcha') { |
|
$captcha_chk = &check_recaptcha($privkey); |
|
} else { |
|
$captcha_chk = 1; |
|
} |
|
return ($captcha_chk,$captcha_error); |
|
} |
|
|
|
sub get_captcha_config { |
|
my ($context,$lonhost) = @_; |
|
my ($captcha,$pubkey,$privkey,$hashtocheck); |
|
my $hostname = &Apache::lonnet::hostname($lonhost); |
|
my $serverhomeID = &Apache::lonnet::get_server_homeID($hostname); |
|
my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID); |
|
if ($context eq 'usercreation') { |
|
my %domconfig = &Apache::lonnet::get_dom('configuration',[$context],$serverhomedom); |
|
if (ref($domconfig{$context}) eq 'HASH') { |
|
$hashtocheck = $domconfig{$context}{'cancreate'}; |
|
if (ref($hashtocheck) eq 'HASH') { |
|
if ($hashtocheck->{'captcha'} eq 'recaptcha') { |
|
if (ref($hashtocheck->{'recaptchakeys'}) eq 'HASH') { |
|
$pubkey = $hashtocheck->{'recaptchakeys'}{'public'}; |
|
$privkey = $hashtocheck->{'recaptchakeys'}{'private'}; |
|
} |
|
if ($privkey && $pubkey) { |
|
$captcha = 'recaptcha'; |
|
} else { |
|
$captcha = 'original'; |
|
} |
|
} elsif ($hashtocheck->{'captcha'} ne 'notused') { |
|
$captcha = 'original'; |
|
} |
|
} |
|
} else { |
|
$captcha = 'captcha'; |
|
} |
|
} elsif ($context eq 'login') { |
|
my %domconfhash = &Apache::loncommon::get_domainconf($serverhomedom); |
|
if ($domconfhash{$serverhomedom.'.login.captcha'} eq 'recaptcha') { |
|
$pubkey = $domconfhash{$serverhomedom.'.login.recaptchakeys_public'}; |
|
$privkey = $domconfhash{$serverhomedom.'.login.recaptchakeys_private'}; |
|
if ($privkey && $pubkey) { |
|
$captcha = 'recaptcha'; |
|
} else { |
|
$captcha = 'original'; |
|
} |
|
} elsif ($domconfhash{$serverhomedom.'.login.captcha'} eq 'original') { |
|
$captcha = 'original'; |
|
} |
|
} |
|
return ($captcha,$pubkey,$privkey); |
|
} |
|
|
|
sub create_captcha { |
|
my %captcha_params = &captcha_settings(); |
|
my ($output,$maxtries,$tries) = ('',10,0); |
|
while ($tries < $maxtries) { |
|
$tries ++; |
|
my $captcha = Authen::Captcha->new ( |
|
output_folder => $captcha_params{'output_dir'}, |
|
data_folder => $captcha_params{'db_dir'}, |
|
); |
|
my $md5sum = $captcha->generate_code($captcha_params{'numchars'}); |
|
|
|
if (-e $Apache::lonnet::perlvar{'lonCaptchaDir'}.'/'.$md5sum.'.png') { |
|
$output = '<input type="hidden" name="crypt" value="'.$md5sum.'" />'."\n". |
|
&mt('Type in the letters/numbers shown below').' '. |
|
'<input type="text" size="5" name="code" value="" /><br />'. |
|
'<img src="'.$captcha_params{'www_output_dir'}.'/'.$md5sum.'.png" />'; |
|
last; |
|
} |
|
} |
|
return $output; |
|
} |
|
|
|
sub captcha_settings { |
|
my %captcha_params = ( |
|
output_dir => $Apache::lonnet::perlvar{'lonCaptchaDir'}, |
|
www_output_dir => "/captchaspool", |
|
db_dir => $Apache::lonnet::perlvar{'lonCaptchaDb'}, |
|
numchars => '5', |
|
); |
|
return %captcha_params; |
|
} |
|
|
|
sub check_captcha { |
|
my ($captcha_chk,$captcha_error); |
|
my $code = $env{'form.code'}; |
|
my $md5sum = $env{'form.crypt'}; |
|
my %captcha_params = &captcha_settings(); |
|
my $captcha = Authen::Captcha->new( |
|
output_folder => $captcha_params{'output_dir'}, |
|
data_folder => $captcha_params{'db_dir'}, |
|
); |
|
$captcha_chk = $captcha->check_code($code,$md5sum); |
|
my %captcha_hash = ( |
|
0 => 'Code not checked (file error)', |
|
-1 => 'Failed: code expired', |
|
-2 => 'Failed: invalid code (not in database)', |
|
-3 => 'Failed: invalid code (code does not match crypt)', |
|
); |
|
if ($captcha_chk != 1) { |
|
$captcha_error = $captcha_hash{$captcha_chk} |
|
} |
|
return ($captcha_chk,$captcha_error); |
|
} |
|
|
|
sub create_recaptcha { |
|
my ($pubkey) = @_; |
|
my $captcha = Captcha::reCAPTCHA->new; |
|
return $captcha->get_options_setter({theme => 'white'})."\n". |
|
$captcha->get_html($pubkey). |
|
&mt('If either word is hard to read, [_1] will replace them.', |
|
'<image src="/res/adm/pages/refresh.gif" alt="reCAPTCHA refresh" />'). |
|
'<br /><br />'; |
|
} |
|
|
|
sub check_recaptcha { |
|
my ($privkey) = @_; |
|
my $captcha_chk; |
|
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; |
|
} |
|
|
=pod |
=pod |
|
|
=back |
=back |