'.
''.&mt('Mapping of Shibboleth environment variable names to user data fields (SSO auth)').' | '.
''."\n".
- ''."\n";
+ ''."\n";
for (my $i=0; $i<@fields; $i++) {
$rem = $i%($numperrow);
if ($rem == 0) {
@@ -5777,430 +4819,150 @@ sub print_selfcreation {
$$rowtotal ++;
} elsif ($position eq 'middle') {
my %domconf = &Apache::lonnet::get_dom('configuration',['usermodification'],$dom);
- my @posstypes;
+ my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
+ $usertypes->{'default'} = $othertitle;
if (ref($types) eq 'ARRAY') {
- @posstypes = @{$types};
- }
- unless (grep(/^default$/,@posstypes)) {
- push(@posstypes,'default');
- }
- my %usertypeshash;
- if (ref($usertypes) eq 'HASH') {
- %usertypeshash = %{$usertypes};
- }
- $usertypeshash{'default'} = $othertitle;
- foreach my $status (@posstypes) {
- $datatable .= &modifiable_userdata_row('selfcreate',$status,$domconf{'usermodification'},
- $numinrow,$$rowtotal,\%usertypeshash);
- $$rowtotal ++;
+ push(@{$types},'default');
+ $usertypes->{'default'} = $othertitle;
+ foreach my $status (@{$types}) {
+ $datatable .= &modifiable_userdata_row('selfcreate',$status,$domconf{'usermodification'},
+ $numinrow,$$rowtotal,$usertypes);
+ $$rowtotal ++;
+ }
}
} else {
my %choices = &Apache::lonlocal::texthash (
- 'cancreate_email' => 'Non-institutional username (via e-mail verification)',
+ cancreate_email => 'E-mail address as username',
);
my @toggles = sort(keys(%choices));
my %defaultchecked = (
'cancreate_email' => 'off',
);
- my $customclass = 'LC_selfcreate_email';
- my $classprefix = 'LC_canmodify_emailusername_';
- my $optionsprefix = 'LC_options_emailusername_';
+ my $itemcount = 0;
my $display = 'none';
- my $rowstyle = 'display:none';
if (grep(/^\Qemail\E$/,@selfcreate)) {
$display = 'block';
- $rowstyle = 'display:table-row';
}
- my $onclick = "toggleRows(this.form,'cancreate_email','selfassign','$customclass','$classprefix','$optionsprefix');";
- ($datatable,$$rowtotal) = &radiobutton_prefs(\%radiohash,\@toggles,\%defaultchecked,
- \%choices,$$rowtotal,$onclick);
- $datatable .= &print_requestmail($dom,'selfcreation',$createsettings,$rowtotal,$customclass,
- $rowstyle);
- $$rowtotal ++;
- $datatable .= &captcha_choice('cancreate',$createsettings,$$rowtotal,$customclass,
- $rowstyle);
- $$rowtotal ++;
- my (@ordered,@posstypes,%usertypeshash);
+ my $onclick = "toggleDisplay(this.form,'emailoptions');";
+ my $additional = '';
my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
- my ($emailrules,$emailruleorder) =
- &Apache::lonnet::inst_userrules($dom,'email');
- my $primary_id = &Apache::lonnet::domain($dom,'primary');
- my $intdom = &Apache::lonnet::internet_dom($primary_id);
- if (ref($types) eq 'ARRAY') {
- @posstypes = @{$types};
- }
- if (@posstypes) {
- unless (grep(/^default$/,@posstypes)) {
- push(@posstypes,'default');
- }
- if (ref($usertypes) eq 'HASH') {
- %usertypeshash = %{$usertypes};
- }
- my $currassign;
- if (ref($domdefaults{'inststatusguest'}) eq 'ARRAY') {
- $currassign = {
- selfassign => $domdefaults{'inststatusguest'},
- };
- @ordered = @{$domdefaults{'inststatusguest'}};
- } else {
- $currassign = { selfassign => [] };
- }
- my $onclicktypes = "toggleDataRow(this.form,'selfassign','$customclass','$optionsprefix',);".
- "toggleDataRow(this.form,'selfassign','$customclass','$classprefix',1);";
- $datatable .= &insttypes_row($currassign,$types,$usertypes,$dom,
- $numinrow,$othertitle,'selfassign',
- $rowtotal,$onclicktypes,$customclass,
- $rowstyle);
- $$rowtotal ++;
- $usertypeshash{'default'} = $othertitle;
- foreach my $status (@posstypes) {
- my $css_class;
- if ($$rowtotal%2) {
- $css_class = 'LC_odd_row ';
- }
- $css_class .= $customclass;
- my $rowid = $optionsprefix.$status;
- my $hidden = 1;
- my $currstyle = 'display:none';
- if (grep(/^\Q$status\E$/,@ordered)) {
- $currstyle = $rowstyle;
- $hidden = 0;
- }
- $datatable .= &noninst_users($processing,$emailverified,$emailoptions,$emaildomain,
- $emailrules,$emailruleorder,$settings,$status,$rowid,
- $usertypeshash{$status},$css_class,$currstyle,$intdom);
- unless ($hidden) {
- $$rowtotal ++;
+ my $usertypes = {};
+ my $order = [];
+ if ((ref($domdefaults{'inststatustypes'}) eq 'HASH') && (ref($domdefaults{'inststatusguest'}) eq 'ARRAY')) {
+ $usertypes = $domdefaults{'inststatustypes'};
+ $order = $domdefaults{'inststatusguest'};
+ }
+ if (ref($order) eq 'ARRAY') {
+ push(@{$order},'default');
+ if (@{$order} > 1) {
+ $usertypes->{'default'} = &mt('Other users');
+ $additional .= ' ';
+ foreach my $status (@{$order}) {
+ $additional .= ''.$usertypes->{$status}.' | ';
+ }
+ $additional .= ' ';
+ foreach my $status (@{$order}) {
+ $additional .= ''.&email_as_username($rowtotal,$processing,$status).' | ';
}
+ $additional .= '
';
+ } else {
+ $usertypes->{'default'} = &mt('All users');
+ $additional .= &email_as_username($rowtotal,$processing);
}
- } else {
- my $css_class;
- if ($$rowtotal%2) {
- $css_class = 'LC_odd_row ';
- }
- $css_class .= $customclass;
- $usertypeshash{'default'} = $othertitle;
- $datatable .= &noninst_users($processing,$emailverified,$emailoptions,$emaildomain,
- $emailrules,$emailruleorder,$settings,'default','',
- $othertitle,$css_class,$rowstyle,$intdom);
- $$rowtotal ++;
}
+ $additional .= ' '."\n";
+
+ ($datatable,$itemcount) = &radiobutton_prefs(\%radiohash,\@toggles,\%defaultchecked,
+ \%choices,$$rowtotal,$onclick,$additional);
+ $$rowtotal ++;
+ $datatable .= &print_requestmail($dom,'selfcreation',$createsettings,$rowtotal);
+ $$rowtotal ++;
my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info();
$numinrow = 1;
- if (@posstypes) {
- foreach my $status (@posstypes) {
- my $rowid = $classprefix.$status;
- my $datarowstyle = 'display:none';
- if (grep(/^\Q$status\E$/,@ordered)) {
- $datarowstyle = $rowstyle;
- }
+ if (ref($order) eq 'ARRAY') {
+ foreach my $status (@{$order}) {
$datatable .= &modifiable_userdata_row('cancreate','emailusername_'.$status,$settings,
- $numinrow,$$rowtotal,\%usertypeshash,$infofields,
- $infotitles,$rowid,$customclass,$datarowstyle);
- unless ($datarowstyle eq 'display:none') {
- $$rowtotal ++;
- }
+ $numinrow,$$rowtotal,$usertypes,$infofields,$infotitles);
+ $$rowtotal ++;
}
- } else {
- $datatable .= &modifiable_userdata_row('cancreate','emailusername_default',$settings,
- $numinrow,$$rowtotal,\%usertypeshash,$infofields,
- $infotitles,'',$customclass,$rowstyle);
}
- }
- return $datatable;
-}
-
-sub selfcreate_javascript {
- return <<"ENDSCRIPT";
-
-
-
-ENDSCRIPT
-}
-
-sub noninst_users {
- my ($processing,$emailverified,$emailoptions,$emaildomain,$emailrules,
- $emailruleorder,$settings,$type,$rowid,$typetitle,$css_class,$rowstyle,$intdom) = @_;
- my $class = 'LC_left_item';
- if ($css_class) {
- $css_class = ' class="'.$css_class.'"';
- }
- if ($rowid) {
- $rowid = ' id="'.$rowid.'"';
- }
- if ($rowstyle) {
- $rowstyle = ' style="'.$rowstyle.'"';
- }
- my ($output,$description);
- if ($type eq 'default') {
- $description = &mt('Requests for: [_1]',$typetitle);
- } else {
- $description = &mt('Requests for: [_1] (status self-reported)',$typetitle);
- }
- $output = ' | '.
- "$description | \n".
- ''.
- '';
- my %headers = &Apache::lonlocal::texthash(
- approve => 'Processing',
- email => 'E-mail',
- username => 'Username',
- );
- foreach my $item ('approve','email','username') {
- $output .= ''.$headers{$item}.' | ';
- }
- $output .= ' ';
- foreach my $item ('approve','email','username') {
- $output .= '';
- my (%choices,@options,$hashref,$defoption,$name,$onclick,$hascustom);
- if ($item eq 'approve') {
- %choices = &Apache::lonlocal::texthash (
- automatic => 'Automatically approved',
- approval => 'Queued for approval',
- );
- @options = ('automatic','approval');
- $hashref = $processing;
- $defoption = 'automatic';
- $name = 'cancreate_emailprocess_'.$type;
- } elsif ($item eq 'email') {
- %choices = &Apache::lonlocal::texthash (
- any => 'Any e-mail',
- inst => 'Institutional only',
- noninst => 'Non-institutional only',
- custom => 'Custom restrictions',
- );
- @options = ('any','inst','noninst');
- my $showcustom;
- if (ref($emailrules) eq 'HASH') {
- if (keys(%{$emailrules}) > 0) {
- push(@options,'custom');
- $showcustom = 'cancreate_emailrule';
- if (ref($settings) eq 'HASH') {
- if (ref($settings->{'email_rule'}) eq 'ARRAY') {
- foreach my $rule (@{$settings->{'email_rule'}}) {
- if (exists($emailrules->{$rule})) {
- $hascustom ++;
- }
- }
- } elsif (ref($settings->{'email_rule'}) eq 'HASH') {
- if (ref($settings->{'email_rule'}{$type}) eq 'ARRAY') {
- foreach my $rule (@{$settings->{'email_rule'}{$type}}) {
- if (exists($emailrules->{$rule})) {
- $hascustom ++;
- }
- }
- }
- }
+ if ($processing->{'default'} eq $option) {
+ $checked = ' checked="checked"';
}
}
- }
- $onclick = ' onclick="toggleEmailOptions(this.form,'."'cancreate_emailoptions','$showcustom',".
- "'cancreate_emaildomain','$type'".');"';
- $hashref = $emailoptions;
- $defoption = 'any';
- $name = 'cancreate_emailoptions_'.$type;
- } elsif ($item eq 'username') {
- %choices = &Apache::lonlocal::texthash (
- all => 'Same as e-mail',
- first => 'Omit @domain',
- free => 'Free to choose',
- );
- @options = ('all','first','free');
- $hashref = $emailverified;
- $defoption = 'all';
- $name = 'cancreate_usernameoptions_'.$type;
- }
- foreach my $option (@options) {
- my $checked;
- if (ref($hashref) eq 'HASH') {
- if ($type eq '') {
- if (!exists($hashref->{'default'})) {
- if ($option eq $defoption) {
- $checked = ' checked="checked"';
- }
- } else {
- if ($hashref->{'default'} eq $option) {
- $checked = ' checked="checked"';
- }
+ } else {
+ if (!exists($processing->{$type})) {
+ if ($option eq 'automatic') {
+ $checked = ' checked="checked"';
}
} else {
- if (!exists($hashref->{$type})) {
- if ($option eq $defoption) {
- $checked = ' checked="checked"';
- }
- } else {
- if ($hashref->{$type} eq $option) {
- $checked = ' checked="checked"';
- }
- }
- }
- } elsif (($item eq 'email') && ($hascustom)) {
- if ($option eq 'custom') {
- $checked = ' checked="checked"';
- }
- } elsif ($option eq $defoption) {
- $checked = ' checked="checked"';
- }
- $output .= ' ';
- if ($item eq 'email') {
- if ($option eq 'custom') {
- my $id = 'cancreate_emailrule_'.$type;
- my $display = 'none';
- if ($checked) {
- $display = 'inline';
- }
- my $numinrow = 2;
- $output .= '';
- } elsif (($option eq 'inst') || ($option eq 'noninst')) {
- my %text = &Apache::lonlocal::texthash (
- inst => 'must end:',
- noninst => 'cannot end:',
- );
- my $value;
- if (ref($emaildomain) eq 'HASH') {
- if (ref($emaildomain->{$type}) eq 'HASH') {
- $value = $emaildomain->{$type}->{$option};
- }
- }
- if ($value eq '') {
- $value = '@'.$intdom;
- }
- my $condition = 'cancreate_emaildomain_'.$option.'_'.$type;
- my $display = 'none';
- if ($checked) {
- $display = 'inline';
+ if ($processing->{$type} eq $option) {
+ $checked = ' checked="checked"';
}
- $output .= ''.
- ''.$text{$option}.' '.
- ''.
- ' ';
}
}
+ } elsif ($option eq 'automatic') {
+ $checked = ' checked="checked"';
+ }
+ my $name = 'cancreate_emailprocess';
+ if (($type ne '') && ($type ne 'default')) {
+ $name .= '_'.$type;
+ }
+ $output .= '';
+ if ($type eq '') {
+ $output .= ' ';
+ } else {
+ $output .= ' ';
}
- $output .= ' | '."\n";
}
- $output .= "
| \n";
+ $$rowtotal ++;
return $output;
}
sub captcha_choice {
- my ($context,$settings,$itemcount,$customcss,$rowstyle) = @_;
+ my ($context,$settings,$itemcount) = @_;
my ($keyentry,$currpub,$currpriv,%checked,$rowname,$pubtext,$privtext,
- $vertext,$currver);
+ $vertext,$currver);
my %lt = &captcha_phrases();
$keyentry = 'hidden';
- my $colspan=2;
if ($context eq 'cancreate') {
$rowname = &mt('CAPTCHA validation');
} elsif ($context eq 'login') {
$rowname = &mt('"Contact helpdesk" CAPTCHA validation');
- } elsif ($context eq 'passwords') {
- $rowname = &mt('"Forgot Password" CAPTCHA validation');
- $colspan=1;
}
if (ref($settings) eq 'HASH') {
if ($settings->{'captcha'}) {
@@ -6225,22 +4987,9 @@ sub captcha_choice {
} else {
$checked{'original'} = ' checked="checked"';
}
- my $css_class;
- if ($itemcount%2) {
- $css_class = 'LC_odd_row';
- }
- if ($customcss) {
- $css_class .= " $customcss";
- }
- $css_class =~ s/^\s+//;
- if ($css_class) {
- $css_class = ' class="'.$css_class.'"';
- }
- if ($rowstyle) {
- $css_class .= ' style="'.$rowstyle.'"';
- }
+ my $css_class = $itemcount%2?' class="LC_odd_row"':'';
my $output = ''.
- ''.$rowname.' | '."\n".
+ ' | '.$rowname.' | '."\n".
''."\n";
foreach my $option ('original','recaptcha','notused') {
$output .= ' | '.
+ ''.
+ ''.(' 'x2).
+ ' | ';
}
$css_class = $rownum%2?' class="LC_odd_row"':'';
my $chgstr = ' onchange="javascript:reorderTypes(this.form,'."'addinststatus_pos'".');"';
@@ -6523,6 +5274,11 @@ sub print_defaults {
''.
&mt('Name displayed:').
' | '.
+ ''.
+ ''.(' 'x2).
+ ' | ';
''."\n";
$rownum ++;
}
@@ -6552,9 +5308,6 @@ sub defaults_titles {
'timezone_def' => 'Default timezone',
'datelocale_def' => 'Default locale for dates',
'portal_def' => 'Portal/Default URL',
- 'intauth_cost' => 'Encryption cost for bcrypt (positive integer)',
- 'intauth_check' => 'Check bcrypt cost if authenticated',
- 'intauth_switch' => 'Existing crypt-based switched to bcrypt on authentication',
);
if ($dom) {
my $uprimary_id = &Apache::lonnet::domain($dom,'primary');
@@ -6569,58 +5322,6 @@ sub defaults_titles {
return (\%titles);
}
-sub print_scantron {
- my ($r,$position,$dom,$confname,$settings,$rowtotal) = @_;
- if ($position eq 'top') {
- return &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);
- } else {
- return &print_scantronconfig($dom,$settings,\$rowtotal);
- }
-}
-
-sub scantron_javascript {
- return <<"ENDSCRIPT";
-
-
-
-ENDSCRIPT
-
-}
-
sub print_scantronformat {
my ($r,$dom,$confname,$settings,$rowtotal) = @_;
my $itemcount = 1;
@@ -6647,8 +5348,8 @@ sub print_scantronformat {
if ($configuserok eq 'ok') {
if ($author_ok eq 'ok') {
my %legacyfile = (
- default => $Apache::lonnet::perlvar{'lonTabDir'}.'/default_scantronformat.tab',
- custom => $Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab',
+ default => $Apache::lonnet::perlvar{'lonTabDir'}.'/default_scantronformat.tab',
+ custom => $Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab',
);
my %md5chk;
foreach my $type (keys(%legacyfile)) {
@@ -6657,7 +5358,7 @@ sub print_scantronformat {
}
if ($md5chk{'default'} ne $md5chk{'custom'}) {
foreach my $type (keys(%legacyfile)) {
- ($scantronurls{$type},my $error) =
+ ($scantronurls{$type},my $error) =
&legacy_scantronformat($r,$dom,$confname,
$type,$legacyfile{$type},
$scantronurls{$type},
@@ -6668,13 +5369,13 @@ sub print_scantronformat {
}
if (keys(%error) == 0) {
$is_custom = 1;
- $confhash{'scantron'}{'scantronformat'} =
+ $confhash{'scantron'}{'scantronformat'} =
$scantronurls{'custom'};
- my $putresult =
+ my $putresult =
&Apache::lonnet::put_dom('configuration',
\%confhash,$dom);
if ($putresult ne 'ok') {
- $error{'custom'} =
+ $error{'custom'} =
''.
&mt('An error occurred updating the domain configuration: [_1]',$putresult).'';
}
@@ -6794,129 +5495,6 @@ sub legacy_scantronformat {
return ($url,$error);
}
-sub print_scantronconfig {
- my ($dom,$settings,$rowtotal) = @_;
- my $itemcount = 2;
- my $is_checked = ' checked="checked"';
- my %optionson = (
- hdr => ' checked="checked"',
- pad => ' checked="checked"',
- rem => ' checked="checked"',
- );
- my %optionsoff = (
- hdr => '',
- pad => '',
- rem => '',
- );
- my $currcsvsty = 'none';
- my ($datatable,%csvfields,%checked,%onclick,%csvoptions);
- my @fields = &scantroncsv_fields();
- my %titles = &scantronconfig_titles();
- if (ref($settings) eq 'HASH') {
- if (ref($settings->{config}) eq 'HASH') {
- if ($settings->{config}->{dat}) {
- $checked{'dat'} = $is_checked;
- }
- if (ref($settings->{config}->{csv}) eq 'HASH') {
- if (ref($settings->{config}->{csv}->{fields}) eq 'HASH') {
- %csvfields = %{$settings->{config}->{csv}->{fields}};
- if (keys(%csvfields) > 0) {
- $checked{'csv'} = $is_checked;
- $currcsvsty = 'block';
- }
- }
- if (ref($settings->{config}->{csv}->{options}) eq 'HASH') {
- %csvoptions = %{$settings->{config}->{csv}->{options}};
- foreach my $option (keys(%optionson)) {
- unless ($csvoptions{$option}) {
- $optionsoff{$option} = $optionson{$option};
- $optionson{$option} = '';
- }
- }
- }
- }
- } else {
- $checked{'dat'} = $is_checked;
- }
- } else {
- $checked{'dat'} = $is_checked;
- }
- $onclick{'csv'} = ' onclick="toggleScantron(this.form);"';
- my $css_class = $itemcount%2? ' class="LC_odd_row"':'';
- $datatable = ''.&mt('Supported formats').' | '.
- '';
- foreach my $item ('dat','csv') {
- my $id;
- if ($item eq 'csv') {
- $id = 'id="scantronconfcsv" ';
- }
- $datatable .= ''.(' 'x3);
- if ($item eq 'csv') {
- $datatable .= ''.
- '';
- $itemcount ++;
- }
- }
- $datatable .= ' | ';
- $$rowtotal ++;
- return $datatable;
-}
-
-sub scantronconfig_titles {
- return &Apache::lonlocal::texthash(
- dat => 'Standard format (.dat)',
- csv => 'Comma separated values (.csv)',
- hdr => 'Remove first line in file (contains column titles)',
- pad => 'Prepend 0s to PaperID',
- rem => 'Remove leading spaces (except Question Response columns)',
- CODE => 'CODE',
- ID => 'Student ID',
- PaperID => 'Paper ID',
- FirstName => 'First Name',
- LastName => 'Last Name',
- FirstQuestion => 'First Question Response',
- Section => 'Section',
- );
-}
-
-sub scantroncsv_fields {
- return ('PaperID','LastName','FirstName','ID','Section','CODE','FirstQuestion');
-}
-
sub print_coursecategories {
my ($position,$dom,$hdritem,$settings,$rowtotal) = @_;
my $datatable;
@@ -6959,7 +5537,7 @@ sub print_coursecategories {
''.$lt{$type}.' ';
}
- $datatable .= '';
+ $datatable .= '';
$itemcount ++;
}
$$rowtotal += $itemcount;
@@ -7170,7 +5748,7 @@ sub print_coursecategories {
$datatable .= &initialize_categories($itemcount);
}
} else {
- $datatable .= ''.$hdritem->{'header'}->[1]->{'col2'}.' | '
+ $datatable .= ''.$hdritem->{'header'}->[1]->{'col2'}.' | '
.&initialize_categories($itemcount);
}
$$rowtotal += $itemcount;
@@ -7218,7 +5796,7 @@ sub print_serverstatuses {
''.
''.
- ''."\n";
+ ''."\n";
}
$$rowtotal += $rownum;
return $datatable;
@@ -7233,7 +5811,7 @@ sub serverstatus_pages {
sub defaults_javascript {
my ($settings) = @_;
- return unless (ref($settings) eq 'HASH');
+ return unless (ref($settings) eq 'HASH');
if ((ref($settings->{'inststatusorder'}) eq 'ARRAY') && (ref($settings->{'inststatustypes'}) eq 'HASH')) {
my $maxnum = scalar(@{$settings->{'inststatusorder'}});
if ($maxnum eq '') {
@@ -7294,94 +5872,6 @@ ENDSCRIPT
}
}
-sub passwords_javascript {
- my %intalert = &Apache::lonlocal::texthash (
- authcheck => 'Warning: disallowing login for an authenticated user if the stored cost is less than the default will require a password reset by/for the user.',
- authcost => 'Warning: bcrypt encryption cost for internal authentication must be an integer.',
- passmin => 'Warning: minimum password length must be a positive integer greater than 6.',
- passmax => 'Warning: maximum password length must be a positive integer (or blank).',
- passexp => 'Warning: days before password expiration must be a positive integer (or blank).',
- passnum => 'Warning: number of previous passwords to save must be a positive integer (or blank).',
- );
- &js_escape(\%intalert);
- my $defmin = $Apache::lonnet::passwdmin;
- my $intauthjs = <<"ENDSCRIPT";
-
-function warnIntAuth(field) {
- if (field.name == 'intauth_check') {
- if (field.value == '2') {
- alert('$intalert{authcheck}');
- }
- }
- if (field.name == 'intauth_cost') {
- field.value.replace(/\s/g,'');
- if (field.value != '') {
- var regexdigit=/^\\d+\$/;
- if (!regexdigit.test(field.value)) {
- alert('$intalert{authcost}');
- }
- }
- }
- return;
-}
-
-function warnIntPass(field) {
- field.value.replace(/^\s+/,'');
- field.value.replace(/\s+\$/,'');
- var regexdigit=/^\\d+\$/;
- if (field.name == 'passwords_min') {
- if (field.value == '') {
- alert('$intalert{passmin}');
- field.value = '$defmin';
- } else {
- if (!regexdigit.test(field.value)) {
- alert('$intalert{passmin}');
- field.value = '$defmin';
- }
- var minval = parseInt(field.value,10);
- if (minval < $defmin) {
- alert('$intalert{passmin}');
- field.value = '$defmin';
- }
- }
- } else {
- if (field.value == '0') {
- field.value = '';
- }
- if (field.value != '') {
- if (field.name == 'passwords_expire') {
- var regexpposnum=/^\\d+(|\\.\\d*)\$/;
- if (!regexpposnum.test(field.value)) {
- alert('$intalert{passexp}');
- field.value = '';
- } else {
- var expval = parseFloat(field.value);
- if (expval == 0) {
- alert('$intalert{passexp}');
- field.value = '';
- }
- }
- } else {
- if (!regexdigit.test(field.value)) {
- if (field.name == 'passwords_max') {
- alert('$intalert{passmax}');
- } else {
- if (field.name == 'passwords_numsaved') {
- alert('$intalert{passnum}');
- }
- }
- }
- field.value = '';
- }
- }
- }
- return;
-}
-
-ENDSCRIPT
- return &Apache::lonhtmlcommon::scripttag($intauthjs);
-}
-
sub coursecategories_javascript {
my ($settings) = @_;
my ($output,$jstext,$cathash);
@@ -7499,7 +5989,7 @@ sub initialize_categories {
my $select1 = '';
foreach my $default ('instcode','communities') {
$css_class = $itemcount%2?' class="LC_odd_row"':'';
- $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','$default"."_pos','0'".');"';
+ $chgstr = ' onchange="javascript:reorderCats(this.form,'."'',$default"."_pos','0'".');"';
if ($default eq 'communities') {
$select1 = $select0;
$select0 = '';
@@ -7524,9 +6014,8 @@ sub initialize_categories {
.''
.''
.' '
- .&mt('Add category').'>'.&mt('Name:')
- .' '
- .'';
+ .&mt('Add category').''.&mt('Name:')
+ .' | ';
return $datatable;
}
@@ -7581,7 +6070,7 @@ sub build_category_rows {
pop(@{$path});
}
} else {
- $text .= &mt('Add subcategory:').' '.&mt('Add subcategory:').'';
+ $text .= ''.&mt('Add subcategory:').' | ';
}
}
}
@@ -7613,14 +6102,13 @@ sub build_category_rows {
}
sub modifiable_userdata_row {
- my ($context,$item,$settings,$numinrow,$rowcount,$usertypes,$fieldsref,$titlesref,
- $rowid,$customcss,$rowstyle) = @_;
+ my ($context,$item,$settings,$numinrow,$rowcount,$usertypes,$fieldsref,$titlesref) = @_;
my ($role,$rolename,$statustype);
$role = $item;
if ($context eq 'cancreate') {
- if ($item =~ /^(emailusername)_(.+)$/) {
- $role = $1;
- $statustype = $2;
+ if ($item =~ /^emailusername_(.+)$/) {
+ $statustype = $1;
+ $role = 'emailusername';
if (ref($usertypes) eq 'HASH') {
if ($usertypes->{$statustype}) {
$rolename = &mt('Data provided by [_1]',$usertypes->{$statustype});
@@ -7655,25 +6143,8 @@ sub modifiable_userdata_row {
%fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
}
my $output;
- my $css_class;
- if ($rowcount%2) {
- $css_class = 'LC_odd_row';
- }
- if ($customcss) {
- $css_class .= " $customcss";
- }
- $css_class =~ s/^\s+//;
- if ($css_class) {
- $css_class = ' class="'.$css_class.'"';
- }
- if ($rowstyle) {
- $css_class .= ' style="'.$rowstyle.'"';
- }
- if ($rowid) {
- $rowid = ' id="'.$rowid.'"';
- }
-
- $output = ''.
+ my $css_class = $rowcount%2?' class="LC_odd_row"':'';
+ $output = ' '.
''.$rolename.' | '.
'';
my $rem;
@@ -7707,10 +6178,9 @@ sub modifiable_userdata_row {
}
}
}
-
- my $total = scalar(@fields);
- for (my $i=0; $i<$total; $i++) {
- $rem = $i%($numinrow);
+
+ for (my $i=0; $i<@fields; $i++) {
+ my $rem = $i%($numinrow);
if ($rem == 0) {
if ($i > 0) {
$output .= '';
@@ -7720,7 +6190,7 @@ sub modifiable_userdata_row {
my $check = ' ';
unless ($role eq 'emailusername') {
if (exists($checks{$fields[$i]})) {
- $check = $checks{$fields[$i]};
+ $check = $checks{$fields[$i]}
} else {
if ($role eq 'st') {
if (ref($settings) ne 'HASH') {
@@ -7752,13 +6222,10 @@ sub modifiable_userdata_row {
'';
}
$output .= '';
+ $rem = @fields%($numinrow);
}
- $rem = $total%$numinrow;
- my $colsleft;
- if ($rem) {
- $colsleft = $numinrow - $rem;
- }
- if ($colsleft > 1) {
+ my $colsleft = $numinrow - $rem;
+ if ($colsleft > 1 ) {
$output .= ''.
' | ';
} elsif ($colsleft == 1) {
@@ -7769,14 +6236,11 @@ sub modifiable_userdata_row {
}
sub insttypes_row {
- my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle,$context,$rowtotal,$onclick,
- $customcss,$rowstyle) = @_;
+ my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle,$context,$rownum) = @_;
my %lt = &Apache::lonlocal::texthash (
cansearch => 'Users allowed to search',
statustocreate => 'Institutional affiliation(s) able to create own account (login/SSO)',
lockablenames => 'User preference to lock name',
- selfassign => 'Self-reportable affiliations',
- overrides => "Override domain's helpdesk settings based on requester's affiliation",
);
my $showdom;
if ($context eq 'cansearch') {
@@ -7786,22 +6250,9 @@ sub insttypes_row {
if ($context eq 'statustocreate') {
$class = 'LC_right_item';
}
- my $css_class;
- if ($$rowtotal%2) {
- $css_class = 'LC_odd_row';
- }
- if ($customcss) {
- $css_class .= ' '.$customcss;
- }
- $css_class =~ s/^\s+//;
- if ($css_class) {
- $css_class = ' class="'.$css_class.'"';
- }
- if ($rowstyle) {
- $css_class .= ' style="'.$rowstyle.'"';
- }
- if ($onclick) {
- $onclick = 'onclick="'.$onclick.'" ';
+ my $css_class = ' class="LC_odd_row"';
+ if ($rownum ne '') {
+ $css_class = ($rownum%2? ' class="LC_odd_row"':'');
}
my $output = ''.
''.$lt{$context}.$showdom.
@@ -7823,10 +6274,6 @@ sub insttypes_row {
if (grep(/^\Q$types->[$i]\E$/,@{$settings->{$context}})) {
$check = ' checked="checked" ';
}
- } elsif (ref($settings->{$context}) eq 'HASH') {
- if (ref($settings->{$context}->{$types->[$i]}) eq 'HASH') {
- $check = ' checked="checked" ';
- }
} elsif ($context eq 'statustocreate') {
$check = ' checked="checked" ';
}
@@ -7834,45 +6281,36 @@ sub insttypes_row {
$output .= ' | '.
' | ';
}
}
$rem = @{$types}%($numinrow);
}
my $colsleft = $numinrow - $rem;
- if ($context eq 'overrides') {
- if ($colsleft > 1) {
- $output .= '';
- } else {
- $output .= ' | ';
- }
- $output .= ' ';
+ if (($rem == 0) && (@{$types} > 0)) {
+ $output .= ' | ';
+ }
+ if ($colsleft > 1) {
+ $output .= '';
} else {
- if ($rem == 0) {
- $output .= ' | ';
- }
- if ($colsleft > 1) {
- $output .= '';
- } else {
- $output .= ' | ';
- }
- my $defcheck = ' ';
- if (ref($settings) eq 'HASH') {
- if (ref($settings->{$context}) eq 'ARRAY') {
- if (grep(/^default$/,@{$settings->{$context}})) {
- $defcheck = ' checked="checked" ';
- }
- } elsif ($context eq 'statustocreate') {
+ $output .= ' | ';
+ }
+ my $defcheck = ' ';
+ if (ref($settings) eq 'HASH') {
+ if (ref($settings->{$context}) eq 'ARRAY') {
+ if (grep(/^default$/,@{$settings->{$context}})) {
$defcheck = ' checked="checked" ';
}
+ } elsif ($context eq 'statustocreate') {
+ $defcheck = ' checked="checked" ';
}
- $output .= '';
}
- $output .= ' | | ';
+ $output .= ''.
+ '
| ';
return $output;
}
@@ -8157,7 +6595,7 @@ sub modify_login {
} elsif ($currheadtagurls{$lonhost}) {
$loginhash{'login'}{'headtag'}{$lonhost}{'url'} = $currheadtagurls{$lonhost};
if ($currexempt{$lonhost}) {
- if ((!exists($possexempt{$lonhost})) || ($possexempt{$lonhost} ne $currexempt{$lonhost})) {
+ if ((!exists($possexempt{$lonhost})) || ($possexempt{$lonhost} ne $currexempt{$lonhost})) {
$changes{'headtag'}{$lonhost} = 1;
}
} elsif ($possexempt{$lonhost}) {
@@ -8389,6 +6827,7 @@ sub modify_login {
return $resulttext;
}
+
sub check_exempt_addresses {
my ($iplist) = @_;
$iplist =~ s/^\s+//;
@@ -8832,7 +7271,7 @@ sub check_configuser {
my ($configuserok,%currroles);
if ($uhome eq 'no_host') {
srand( time() ^ ($$ + ($$ << 15)) ); # Seed rand.
- my $configpass = &LONCAPA::Enrollment::create_password($dom);
+ my $configpass = &LONCAPA::Enrollment::create_password();
$configuserok =
&Apache::lonnet::modifyuser($dom,$confname,'','internal',
$configpass,'','','','','',undef,$servadm);
@@ -8861,7 +7300,7 @@ sub check_authorstatus {
sub publishlogo {
my ($r,$action,$formname,$dom,$confname,$subdir,$thumbwidth,$thumbheight,$savefileas) = @_;
- my ($output,$fname,$logourl);
+ my ($output,$fname,$logourl,$madethumb);
if ($action eq 'upload') {
$fname=$env{'form.'.$formname.'.filename'};
chop($env{'form.'.$formname});
@@ -8906,14 +7345,14 @@ sub publishlogo {
} else {
my $source = $filepath.'/'.$file;
my $logfile;
- if (!open($logfile,">>",$source.'.log')) {
+ if (!open($logfile,">>$source".'.log')) {
return (&mt('No write permission to Authoring Space'));
}
print $logfile
"\n================= Publish ".localtime()." ================\n".
$env{'user.name'}.':'.$env{'user.domain'}."\n";
# Save the file
- if (!open(FH,">",$source)) {
+ if (!open(FH,'>'.$source)) {
&Apache::lonnet::logthis('Failed to create '.$source);
return (&mt('Failed to create file'));
}
@@ -8974,8 +7413,7 @@ $env{'user.name'}.':'.$env{'user.domain'
if ($fullwidth ne '' && $fullheight ne '') {
if ($fullwidth > $thumbwidth && $fullheight > $thumbheight) {
my $thumbsize = $thumbwidth.'x'.$thumbheight;
- my @args = ('convert','-sample',$thumbsize,$inputfile,$outfile);
- system({$args[0]} @args);
+ system("convert -sample $thumbsize $inputfile $outfile");
chmod(0660, $filepath.'/tn-'.$file);
if (-e $outfile) {
my $copyfile=$targetdir.'/tn-'.$file;
@@ -8990,6 +7428,7 @@ $env{'user.name'}.':'.$env{'user.domain'
$r->set_handlers('PerlCleanupHandler' => [\¬ifysubscribed,@{$handlers}]);
$registered_cleanup=1;
}
+ $madethumb = 1;
} else {
print $logfile "\nUnable to write ".$copyfile.
':'.$!."\n";
@@ -9002,7 +7441,7 @@ $env{'user.name'}.':'.$env{'user.domain'
$output = $versionresult;
}
}
- return ($output,$logourl);
+ return ($output,$logourl,$madethumb);
}
sub logo_versioning {
@@ -9054,7 +7493,7 @@ sub write_metadata {
{
print $logfile "\nWrite metadata file for ".$targetdir.'/'.$file;
my $mfh;
- if (open($mfh,">",$targetdir.'/'.$file.'.meta')) {
+ if (open($mfh,'>'.$targetdir.'/'.$file.'.meta')) {
foreach (sort(keys(%metadatafields))) {
unless ($_=~/\./) {
my $unikey=$_;
@@ -9088,7 +7527,7 @@ sub notifysubscribed {
next unless (ref($targetsource) eq 'ARRAY');
my ($target,$source)=@{$targetsource};
if ($source ne '') {
- if (open(my $logfh,">>",$source.'.log')) {
+ if (open(my $logfh,'>>'.$source.'.log')) {
print $logfh "\nCleanup phase: Notifications\n";
my @subscribed=&subscribed_hosts($target);
foreach my $subhost (@subscribed) {
@@ -9114,7 +7553,7 @@ sub notifysubscribed {
sub subscribed_hosts {
my ($target) = @_;
my @subscribed;
- if (open(my $fh,"<","$target.subscription")) {
+ if (open(my $fh,"<$target.subscription")) {
while (my $subline=<$fh>) {
if ($subline =~ /^($match_lonid):/) {
my $host = $1;
@@ -9299,7 +7738,7 @@ sub modify_quotas {
my $newpos = $env{'form.'.$itemid};
$newpos =~ s/\D+//g;
foreach my $item ('subject','title','publisher','author') {
- next if ((($item eq 'author') || ($item eq 'publisher')) &&
+ next if ((($item eq 'author') || ($item eq 'publisher')) &&
($type eq 'templates'));
$confhash{$type}{$key}{$item} = $env{'form.'.$type.'_'.$item.'_'.$i};
if ($domconfig{$action}{$type}{$key}{$item} ne $confhash{$type}{$key}{$item}) {
@@ -9313,20 +7752,16 @@ sub modify_quotas {
#FIXME need to obsolete item in RES space
} elsif ($env{'form.'.$type.'_image_'.$i.'.filename'}) {
my ($cdom,$cnum) = split(/_/,$key);
- if (&Apache::lonnet::homeserver($cnum,$cdom) eq 'no_host') {
- $errors .= ''.&mt('Image not saved: could not find textbook course').'';
- } else {
- my ($imgurl,$error) = &process_textbook_image($r,$dom,$confname,$type.'_image_'.$i,
- $cdom,$cnum,$type,$configuserok,
- $switchserver,$author_ok);
- if ($imgurl) {
- $confhash{$type}{$key}{'image'} = $imgurl;
- $changes{$type}{$key} = 1;
- }
- if ($error) {
- &Apache::lonnet::logthis($error);
- $errors .= ''.$error.'';
- }
+ my ($imgurl,$error) = &process_textbook_image($r,$dom,$confname,$type.'_image_'.$i,
+ $cdom,$cnum,$type,$configuserok,
+ $switchserver,$author_ok);
+ if ($imgurl) {
+ $confhash{$type}{$key}{'image'} = $imgurl;
+ $changes{$type}{$key} = 1;
+ }
+ if ($error) {
+ &Apache::lonnet::logthis($error);
+ $errors .= ''.$error.'';
}
} elsif ($domconfig{$action}{$type}{$key}{'image'}) {
$confhash{$type}{$key}{'image'} =
@@ -9360,19 +7795,15 @@ sub modify_quotas {
if ($type eq 'textbooks') {
if ($env{'form.'.$type.'_addbook_image.filename'} ne '') {
my ($cdom,$cnum) = split(/_/,$newbook{$type});
- if (&Apache::lonnet::homeserver($cnum,$cdom) eq 'no_host') {
- $errors .= ''.&mt('Image not saved: could not find textbook course').'';
- } else {
- my ($imageurl,$error) =
- &process_textbook_image($r,$dom,$confname,$type.'_addbook_image',$cdom,$cnum,$type,
- $configuserok,$switchserver,$author_ok);
- if ($imageurl) {
- $confhash{$type}{$newbook{$type}}{'image'} = $imageurl;
- }
- if ($error) {
- &Apache::lonnet::logthis($error);
- $errors .= ''.$error.'';
- }
+ my ($imageurl,$error) =
+ &process_textbook_image($r,$dom,$confname,$type.'_addbook_image',$cdom,$cnum,$type,
+ $configuserok,$switchserver,$author_ok);
+ if ($imageurl) {
+ $confhash{$type}{$newbook{$type}}{'image'} = $imageurl;
+ }
+ if ($error) {
+ &Apache::lonnet::logthis($error);
+ $errors .= ''.$error.'';
}
}
}
@@ -9452,7 +7883,7 @@ sub modify_quotas {
}
if ($env{'form.validationdc'}) {
my $newval = $env{'form.validationdc'};
- my %domcoords = &Apache::lonnet::get_active_domroles($dom,['dc']);
+ my %domcoords = &get_active_dcs($dom);
if (exists($domcoords{$newval})) {
$confhash{'validation'}{'dc'} = $newval;
}
@@ -9476,7 +7907,7 @@ sub modify_quotas {
}
} elsif ($confhash{'validation'}{'dc'} ne '') {
$changes{'validation'}{'dc'} = $confhash{'validation'}{'dc'};
- }
+ }
} else {
if (ref($domconfig{'requestcourses'}) eq 'HASH') {
if (ref($domconfig{'requestcourses'}{'validation'}) eq 'HASH') {
@@ -9864,7 +8295,7 @@ sub process_textbook_image {
} elsif ($author_ok eq 'ok') {
my ($result,$imageurl) =
&publishlogo($r,'upload',$caller,$dom,$confname,
- "$type/$cdom/$cnum/cover",$width,$height);
+ "$type/$dom/$cnum/cover",$width,$height);
if ($result eq 'ok') {
$url = $imageurl;
} else {
@@ -9879,6 +8310,495 @@ sub process_textbook_image {
return ($url,$error);
}
+sub modify_ltitools {
+ my ($r,$dom,$action,$lastactref,%domconfig) = @_;
+ my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
+ my ($newid,@allpos,%changes,%confhash,$errors,$resulttext);
+ my $confname = $dom.'-domainconfig';
+ my $servadm = $r->dir_config('lonAdmEMail');
+ my ($configuserok,$author_ok,$switchserver) = &config_check($dom,$confname,$servadm);
+ my (%posslti,%possfield);
+ my @courseroles = ('cc','in','ta','ep','st');
+ my @ltiroles = qw(Instructor ContentDeveloper TeachingAssistant Learner);
+ map { $posslti{$_} = 1; } @ltiroles;
+ my @allfields = ('fullname','firstname','lastname','email','user','roles');
+ map { $possfield{$_} = 1; } @allfields;
+ my %lt = <itools_names();
+ if ($env{'form.ltitools_add'}) {
+ my $title = $env{'form.ltitools_add_title'};
+ $title =~ s/(`)/'/g;
+ ($newid,my $error) = &get_ltitools_id($dom,$title);
+ if ($newid) {
+ my $position = $env{'form.ltitools_add_pos'};
+ $position =~ s/\D+//g;
+ if ($position ne '') {
+ $allpos[$position] = $newid;
+ }
+ $changes{$newid} = 1;
+ foreach my $item ('title','url','key','secret') {
+ $env{'form.ltitools_add_'.$item} =~ s/(`)/'/g;
+ if ($env{'form.ltitools_add_'.$item}) {
+ $confhash{$newid}{$item} = $env{'form.ltitools_add_'.$item};
+ }
+ }
+ if ($env{'form.ltitools_add_version'} eq 'LTI-1p0') {
+ $confhash{$newid}{'version'} = $env{'form.ltitools_add_version'};
+ }
+ if ($env{'form.ltitools_add_msgtype'} eq 'basic-lti-launch-request') {
+ $confhash{$newid}{'msgtype'} = $env{'form.ltitools_add_msgtype'};
+ }
+ foreach my $item ('width','height') {
+ $env{'form.ltitools_add_'.$item} =~ s/^\s+//;
+ $env{'form.ltitools_add_'.$item} =~ s/\s+$//;
+ if ($env{'form.ltitools_add_'.$item} =~ /^\d+$/) {
+ $confhash{$newid}{'display'}{$item} = $env{'form.ltitools_add_'.$item};
+ }
+ }
+ if ($env{'form.ltitools_add_target'} eq 'window') {
+ $confhash{$newid}{'display'}{'target'} = $env{'form.ltitools_add_target'};
+ } else {
+ $confhash{$newid}{'display'}{'target'} = 'iframe';
+ }
+ foreach my $item ('passback','roster') {
+ if ($env{'form.ltitools_add_'.$item}) {
+ $confhash{$newid}{$item} = 1;
+ }
+ }
+ if ($env{'form.ltitools_add_image.filename'} ne '') {
+ my ($imageurl,$error) =
+ &process_ltitools_image($r,$dom,$confname,'ltitools_add_image',$dom,
+ $configuserok,$switchserver,$author_ok);
+ if ($imageurl) {
+ $confhash{$newid}{'image'} = $imageurl;
+ }
+ if ($error) {
+ &Apache::lonnet::logthis($error);
+ $errors .= ''.$error.'';
+ }
+ }
+ my @fields = &Apache::loncommon::get_env_multiple('form.ltitools_add_fields');
+ foreach my $field (@fields) {
+ if ($possfield{$field}) {
+ if ($field eq 'roles') {
+ foreach my $role (@courseroles) {
+ my $choice = $env{'form.ltitools_add_roles_'.$role};
+ if (($choice ne '') && ($posslti{$choice})) {
+ $confhash{$newid}{'roles'}{$role} = $choice;
+ if ($role eq 'cc') {
+ $confhash{$newid}{'roles'}{'co'} = $choice;
+ }
+ }
+ }
+ } else {
+ $confhash{$newid}{'fields'}{$field} = 1;
+ }
+ }
+ }
+ if ($env{'form.ltitools_add_custom'}) {
+ my $name = $env{'form.ltitools_add_custom_name'};
+ my $value = $env{'form.ltitools_add_custom_value'};
+ $value =~ s/(`)/'/g;
+ $name =~ s/(`)/'/g;
+ $confhash{$newid}{'custom'}{$name} = $value;
+ }
+ } else {
+ my $error = &mt('Failed to acquire unique ID for new external tool');
+ $errors .= ''.$error.'';
+ }
+ }
+ if (ref($domconfig{$action}) eq 'HASH') {
+ my %deletions;
+ my @todelete = &Apache::loncommon::get_env_multiple('form.ltitools_del');
+ if (@todelete) {
+ map { $deletions{$_} = 1; } @todelete;
+ }
+ my %customadds;
+ my @newcustom = &Apache::loncommon::get_env_multiple('form.ltitools_customadd');
+ if (@newcustom) {
+ map { $customadds{$_} = 1; } @newcustom;
+ }
+ my %imgdeletions;
+ my @todeleteimages = &Apache::loncommon::get_env_multiple('form.ltitools_image_del');
+ if (@todeleteimages) {
+ map { $imgdeletions{$_} = 1; } @todeleteimages;
+ }
+ my $maxnum = $env{'form.ltitools_maxnum'};
+ for (my $i=0; $i<=$maxnum; $i++) {
+ my $itemid = $env{'form.ltitools_id_'.$i};
+ if (ref($domconfig{$action}{$itemid}) eq 'HASH') {
+ if ($deletions{$itemid}) {
+ if ($domconfig{$action}{$itemid}{'image'}) {
+ #FIXME need to obsolete item in RES space
+ }
+ $changes{$itemid} = $domconfig{$action}{$itemid}{'title'};
+ next;
+ } else {
+ my $newpos = $env{'form.ltitools_'.$itemid};
+ $newpos =~ s/\D+//g;
+ foreach my $item ('title','url','key','secret') {
+ $confhash{$itemid}{$item} = $env{'form.ltitools_'.$item.'_'.$i};
+ if ($domconfig{$action}{$itemid}{$item} ne $confhash{$itemid}{$item}) {
+ $changes{$itemid} = 1;
+ }
+ }
+ if ($env{'form.ltitools_version_'.$i} eq 'LTI-1p0') {
+ $confhash{$itemid}{'version'} = $env{'form.ltitools_version_'.$i};
+ }
+ if ($env{'form.ltitools_msgtype_'.$i} eq 'basic-lti-launch-request') {
+ $confhash{$itemid}{'msgtype'} = $env{'form.ltitools_msgtype_'.$i};
+ }
+ foreach my $size ('width','height') {
+ $env{'form.ltitools_'.$size.'_'.$i} =~ s/^\s+//;
+ $env{'form.ltitools_'.$size.'_'.$i} =~ s/\s+$//;
+ if ($env{'form.ltitools_'.$size.'_'.$i} =~ /^\d+$/) {
+ $confhash{$itemid}{'display'}{$size} = $env{'form.ltitools_'.$size.'_'.$i};
+ if (ref($domconfig{$action}{$itemid}{'display'}) eq 'HASH') {
+ if ($domconfig{$action}{$itemid}{'display'}{$size} ne $confhash{$itemid}{'display'}{$size}) {
+ $changes{$itemid} = 1;
+ }
+ } else {
+ $changes{$itemid} = 1;
+ }
+ }
+ }
+ if ($env{'form.ltitools_target_'.$i} eq 'window') {
+ $confhash{$itemid}{'display'}{'target'} = $env{'form.ltitools_target_'.$i};
+ } else {
+ $confhash{$itemid}{'display'}{'target'} = 'iframe';
+ }
+ if (ref($domconfig{$action}{$itemid}{'display'}) eq 'HASH') {
+ if ($domconfig{$action}{$itemid}{'display'}{'target'} ne $confhash{$itemid}{'display'}{'target'}) {
+ $changes{$itemid} = 1;
+ }
+ } else {
+ $changes{$itemid} = 1;
+ }
+ foreach my $extra ('passback','roster') {
+ if ($env{'form.ltitools_'.$extra.'_'.$i}) {
+ $confhash{$itemid}{$extra} = 1;
+ }
+ if ($domconfig{$action}{$itemid}{$extra} ne $confhash{$itemid}{$extra}) {
+ $changes{$itemid} = 1;
+ }
+ }
+ my @fields = &Apache::loncommon::get_env_multiple('form.ltitools_fields_'.$i);
+ foreach my $field (@fields) {
+ if ($possfield{$field}) {
+ if ($field eq 'roles') {
+ foreach my $role (@courseroles) {
+ my $choice = $env{'form.ltitools_roles_'.$role.'_'.$i};
+ if (($choice ne '') && ($posslti{$choice})) {
+ $confhash{$itemid}{'roles'}{$role} = $choice;
+ if ($role eq 'cc') {
+ $confhash{$itemid}{'roles'}{'co'} = $choice;
+ }
+ }
+ if (ref($domconfig{$action}{$itemid}{'roles'}) eq 'HASH') {
+ if ($domconfig{$action}{$itemid}{'roles'}{$role} ne $confhash{$itemid}{'roles'}{$role}) {
+ $changes{$itemid} = 1;
+ }
+ } elsif ($confhash{$itemid}{'roles'}{$role}) {
+ $changes{$itemid} = 1;
+ }
+ }
+ } else {
+ $confhash{$itemid}{'fields'}{$field} = 1;
+ if (ref($domconfig{$action}{$itemid}{'fields'}) eq 'HASH') {
+ if ($domconfig{$action}{$itemid}{'fields'}{$field} ne $confhash{$itemid}{'fields'}{$field}) {
+ $changes{$itemid} = 1;
+ }
+ } else {
+ $changes{$itemid} = 1;
+ }
+ }
+ }
+ }
+ $allpos[$newpos] = $itemid;
+ }
+ if ($imgdeletions{$itemid}) {
+ $changes{$itemid} = 1;
+ #FIXME need to obsolete item in RES space
+ } elsif ($env{'form.ltitools_image_'.$i.'.filename'}) {
+ my ($imgurl,$error) = &process_ltitools_image($r,$dom,$confname,'ltitools_image_'.$i,
+ $itemid,$configuserok,$switchserver,
+ $author_ok);
+ if ($imgurl) {
+ $confhash{$itemid}{'image'} = $imgurl;
+ $changes{$itemid} = 1;
+ }
+ if ($error) {
+ &Apache::lonnet::logthis($error);
+ $errors .= ''.$error.'';
+ }
+ } elsif ($domconfig{$action}{$itemid}{'image'}) {
+ $confhash{$itemid}{'image'} =
+ $domconfig{$action}{$itemid}{'image'};
+ }
+ if ($customadds{$i}) {
+ my $name = $env{'form.ltitools_custom_name_'.$i};
+ $name =~ s/(`)/'/g;
+ $name =~ s/^\s+//;
+ $name =~ s/\s+$//;
+ my $value = $env{'form.ltitools_custom_value_'.$i};
+ $value =~ s/(`)/'/g;
+ $value =~ s/^\s+//;
+ $value =~ s/\s+$//;
+ if ($name ne '') {
+ $confhash{$itemid}{'custom'}{$name} = $value;
+ $changes{$itemid} = 1;
+ }
+ }
+ my %customdels;
+ my @customdeletions = &Apache::loncommon::get_env_multiple('form.ltitools_customdel_'.$i);
+ if (@customdeletions) {
+ $changes{$itemid} = 1;
+ }
+ map { $customdels{$_} = 1; } @customdeletions;
+ if (ref($domconfig{$action}{$itemid}{'custom'}) eq 'HASH') {
+ foreach my $key (keys(%{$domconfig{$action}{$itemid}{'custom'}})) {
+ unless ($customdels{$key}) {
+ if ($env{'form.ltitools_customval_'.$key.'_'.$i} ne '') {
+ $confhash{$itemid}{'custom'}{$key} = $env{'form.ltitools_customval_'.$key.'_'.$i};
+ }
+ if ($domconfig{$action}{$itemid}{'custom'}{$key} ne $env{'form.ltitools_customval_'.$key.'_'.$i}) {
+ $changes{$itemid} = 1;
+ }
+ }
+ }
+ }
+ unless ($changes{$itemid}) {
+ foreach my $key (keys(%{$domconfig{$action}{$itemid}})) {
+ if (ref($domconfig{$action}{$itemid}{$key}) eq 'HASH') {
+ if (ref($confhash{$itemid}{$key}) eq 'HASH') {
+ foreach my $innerkey (keys(%{$domconfig{$action}{$itemid}{$key}})) {
+ unless (exists($confhash{$itemid}{$key}{$innerkey})) {
+ $changes{$itemid} = 1;
+ last;
+ }
+ }
+ } elsif (keys(%{$domconfig{$action}{$itemid}{$key}}) > 0) {
+ $changes{$itemid} = 1;
+ }
+ }
+ last if ($changes{$itemid});
+ }
+ }
+ }
+ }
+ }
+ if (@allpos > 0) {
+ my $idx = 0;
+ foreach my $itemid (@allpos) {
+ if ($itemid ne '') {
+ $confhash{$itemid}{'order'} = $idx;
+ if (ref($domconfig{$action}) eq 'HASH') {
+ if (ref($domconfig{$action}{$itemid}) eq 'HASH') {
+ if ($domconfig{$action}{$itemid}{'order'} ne $idx) {
+ $changes{$itemid} = 1;
+ }
+ }
+ }
+ $idx ++;
+ }
+ }
+ }
+ my %ltitoolshash = (
+ $action => { %confhash }
+ );
+ my $putresult = &Apache::lonnet::put_dom('configuration',\%ltitoolshash,
+ $dom);
+ if ($putresult eq 'ok') {
+ if (keys(%changes) > 0) {
+ my $cachetime = 24*60*60;
+ &Apache::lonnet::do_cache_new('ltitools',$dom,\%confhash,$cachetime);
+ if (ref($lastactref) eq 'HASH') {
+ $lastactref->{'ltitools'} = 1;
+ }
+ $resulttext = &mt('Changes made:').'';
+ my %bynum;
+ foreach my $itemid (sort(keys(%changes))) {
+ my $position = $confhash{$itemid}{'order'};
+ $bynum{$position} = $itemid;
+ }
+ foreach my $pos (sort { $a <=> $b } keys(%bynum)) {
+ my $itemid = $bynum{$pos};
+ if (ref($confhash{$itemid}) ne 'HASH') {
+ $resulttext .= '- '.&mt('Deleted: [_1]',$changes{$itemid}).'
';
+ } else {
+ $resulttext .= '- '.$confhash{$itemid}{'title'}.'';
+ if ($confhash{$itemid}{'image'}) {
+ $resulttext .= ' '.
+ '';
+ }
+ $resulttext .= '
';
+ my $position = $pos + 1;
+ $resulttext .= '- '.&mt('Order: [_1]',$position).'
';
+ foreach my $item ('version','msgtype','url','key') {
+ if ($confhash{$itemid}{$item} ne '') {
+ $resulttext .= '- '.$lt{$item}.': '.$confhash{$itemid}{$item}.'
';
+ }
+ }
+ if ($confhash{$itemid}{'secret'} ne '') {
+ $resulttext .= '- '.$lt{'secret'}.': ';
+ my $num = length($confhash{$itemid}{'secret'});
+ $resulttext .= ('*'x$num).'
';
+ }
+ foreach my $item ('passback','roster') {
+ $resulttext .= '- '.$lt{$item}.' ';
+ if ($confhash{$itemid}{$item}) {
+ $resulttext .= &mt('Yes');
+ } else {
+ $resulttext .= &mt('No');
+ }
+ $resulttext .= '
';
+ }
+ if (ref($confhash{$itemid}{'display'}) eq 'HASH') {
+ my $displaylist;
+ if ($confhash{$itemid}{'display'}{'target'}) {
+ $displaylist = &mt('Display target').': '.
+ $confhash{$itemid}{'display'}{'target'}.',';
+ }
+ foreach my $size ('width','height') {
+ if ($confhash{$itemid}{'display'}{$size}) {
+ $displaylist .= (' 'x2).$lt{$size}.': '.
+ $confhash{$itemid}{'display'}{$size}.',';
+ }
+ }
+ if ($displaylist) {
+ $displaylist =~ s/,$//;
+ $resulttext .= '- '.$displaylist.'
';
+ }
+ }
+ if (ref($confhash{$itemid}{'fields'}) eq 'HASH') {
+ my $fieldlist;
+ foreach my $field (@allfields) {
+ if ($confhash{$itemid}{'fields'}{$field}) {
+ $fieldlist .= (' 'x2).$lt{$field}.',';
+ }
+ }
+ if ($fieldlist) {
+ $fieldlist =~ s/,$//;
+ $resulttext .= '- '.&mt('Data sent').':'.$fieldlist.'
';
+ }
+ }
+ if (ref($confhash{$itemid}{'roles'}) eq 'HASH') {
+ my $rolemaps;
+ foreach my $role (@courseroles) {
+ if ($confhash{$itemid}{'roles'}{$role}) {
+ $rolemaps .= (' 'x2).&Apache::lonnet::plaintext($role,'Course').'='.
+ $confhash{$itemid}{'roles'}{$role}.',';
+ }
+ }
+ if ($rolemaps) {
+ $rolemaps =~ s/,$//;
+ $resulttext .= '- '.&mt('Role mapping:').$rolemaps.'
';
+ }
+ }
+ if (ref($confhash{$itemid}{'custom'}) eq 'HASH') {
+ my $customlist;
+ if (keys(%{$confhash{$itemid}{'custom'}})) {
+ foreach my $key (sort(keys(%{$confhash{$itemid}{'custom'}}))) {
+ $customlist .= $key.':'.$confhash{$itemid}{'custom'}{$key}.(' 'x2);
+ }
+ }
+ if ($customlist) {
+ $resulttext .= '- '.&mt('Custom items').':'.$customlist.'
';
+ }
+ }
+ $resulttext .= ' ';
+ }
+ }
+ $resulttext .= ' ';
+ } else {
+ $resulttext = &mt('No changes made.');
+ }
+ } else {
+ $errors .= ''.&mt('Failed to save changes').'';
+ }
+ if ($errors) {
+ $resulttext .= &mt('The following errors occurred: ').'';
+ }
+ return $resulttext;
+}
+
+sub process_ltitools_image {
+ my ($r,$dom,$confname,$caller,$itemid,$configuserok,$switchserver,$author_ok) = @_;
+ my $filename = $env{'form.'.$caller.'.filename'};
+ my ($error,$url);
+ my ($width,$height) = (21,21);
+ if ($configuserok eq 'ok') {
+ if ($switchserver) {
+ $error = &mt('Upload of Tool Provider (LTI) icon is not permitted to this server: [_1]',
+ $switchserver);
+ } elsif ($author_ok eq 'ok') {
+ my ($result,$imageurl,$madethumb) =
+ &publishlogo($r,'upload',$caller,$dom,$confname,
+ "ltitools/$itemid/icon",$width,$height);
+ if ($result eq 'ok') {
+ if ($madethumb) {
+ my ($path,$imagefile) = ($imageurl =~ m{^(.+)/([^/]+)$});
+ my $imagethumb = "$path/tn-".$imagefile;
+ $url = $imagethumb;
+ } else {
+ $url = $imageurl;
+ }
+ } else {
+ $error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$filename,$result);
+ }
+ } else {
+ $error = &mt("Upload of [_1] failed because an author role could not be assigned to a Domain Configuration user ([_2]) in domain: [_3]. Error was: [_4].",$filename,$confname,$dom,$author_ok);
+ }
+ } else {
+ $error = &mt("Upload of [_1] failed because a Domain Configuration user ([_2]) could not be created in domain: [_3]. Error was: [_4].",$filename,$confname,$dom,$configuserok);
+ }
+ return ($url,$error);
+}
+
+sub get_ltitools_id {
+ my ($cdom,$title) = @_;
+ # get lock on ltitools db
+ my $lockhash = {
+ lock => $env{'user.name'}.
+ ':'.$env{'user.domain'},
+ };
+ my $tries = 0;
+ my $gotlock = &Apache::lonnet::newput_dom('ltitools',$lockhash,$cdom);
+ my ($id,$error);
+
+ while (($gotlock ne 'ok') && ($tries<10)) {
+ $tries ++;
+ sleep (0.1);
+ $gotlock = &Apache::lonnet::newput_dom('ltitools',$lockhash,$cdom);
+ }
+ if ($gotlock eq 'ok') {
+ my %currids = &Apache::lonnet::dump_dom('ltitools',$cdom);
+ if ($currids{'lock'}) {
+ delete($currids{'lock'});
+ if (keys(%currids)) {
+ my @curr = sort { $a <=> $b } keys(%currids);
+ if ($curr[-1] =~ /^\d+$/) {
+ $id = 1 + $curr[-1];
+ }
+ } else {
+ $id = 1;
+ }
+ if ($id) {
+ unless (&Apache::lonnet::newput_dom('ltitools',{ $id => $title },$cdom) eq 'ok') {
+ $error = 'nostore';
+ }
+ } else {
+ $error = 'nonumber';
+ }
+ }
+ my $dellockoutcome = &Apache::lonnet::del_dom('ltitools',['lock'],$cdom);
+ } else {
+ $error = 'nolock';
+ }
+ return ($id,$error);
+}
+
sub modify_autoenroll {
my ($dom,$lastactref,%domconfig) = @_;
my ($resulttext,%changes);
@@ -9891,8 +8811,7 @@ sub modify_autoenroll {
my $autorun = &Apache::lonnet::auto_run(undef,$dom),
my %title = ( run => 'Auto-enrollment active',
sender => 'Sender for notification messages',
- coowners => 'Automatic assignment of co-ownership to instructors of record (institutional data)',
- failsafe => 'Failsafe for no drops if institutional data missing for a section');
+ coowners => 'Automatic assignment of co-ownership to instructors of record (institutional data)');
my @offon = ('off','on');
my $sender_uname = $env{'form.sender_uname'};
my $sender_domain = $env{'form.sender_domain'};
@@ -9902,17 +8821,11 @@ sub modify_autoenroll {
$sender_domain = '';
}
my $coowners = $env{'form.autoassign_coowners'};
- my $failsafe = $env{'form.autoenroll_failsafe'};
- $failsafe =~ s{^\s+|\s+$}{}g;
- if ($failsafe =~ /\D/) {
- undef($failsafe);
- }
my %autoenrollhash = (
autoenroll => { 'run' => $env{'form.autoenroll_run'},
'sender_uname' => $sender_uname,
'sender_domain' => $sender_domain,
'co-owners' => $coowners,
- 'autofailsafe' => $failsafe,
}
);
my $putresult = &Apache::lonnet::put_dom('configuration',\%autoenrollhash,
@@ -9939,10 +8852,7 @@ sub modify_autoenroll {
}
} elsif ($coowners) {
$changes{'coowners'} = 1;
- }
- if ($currautoenroll{'autofailsafe'} ne $failsafe) {
- $changes{'autofailsafe'} = 1;
- }
+ }
if (keys(%changes) > 0) {
$resulttext = &mt('Changes made:').'';
if ($changes{'run'}) {
@@ -9962,17 +8872,6 @@ sub modify_autoenroll {
$lastactref->{'domainconfig'} = 1;
}
}
- if ($changes{'autofailsafe'}) {
- if ($failsafe ne '') {
- $resulttext .= '- '.&mt('Failsafe for no drops if institutional data missing for a section set to: [_1]',$failsafe).'
';
- } else {
- $resulttext .= '- '.&mt('Failsafe for no drops if institutional data missing for a section: deleted');
- }
- &Apache::lonnet::get_domain_defaults($dom,1);
- if (ref($lastactref) eq 'HASH') {
- $lastactref->{'domdefaults'} = 1;
- }
- }
$resulttext .= '
';
} else {
$resulttext = &mt('No changes made to auto-enrollment settings');
@@ -10188,7 +9087,7 @@ sub modify_autocreate {
$newvals{$item} = 0 if ($newvals{$item} eq '');
}
$newvals{'xmldc'} = $env{'form.autocreate_xmldc'};
- my %domcoords = &Apache::lonnet::get_active_domroles($dom,['dc']);
+ my %domcoords = &get_active_dcs($dom);
unless (exists($domcoords{$newvals{'xmldc'}})) {
$newvals{'xmldc'} = '';
}
@@ -10245,7 +9144,7 @@ sub modify_autocreate {
}
sub modify_directorysrch {
- my ($dom,$lastactref,%domconfig) = @_;
+ my ($dom,%domconfig) = @_;
my ($resulttext,%changes);
my %currdirsrch;
if (ref($domconfig{'directorysrch'}) eq 'HASH') {
@@ -10253,10 +9152,8 @@ sub modify_directorysrch {
$currdirsrch{$key} = $domconfig{'directorysrch'}{$key};
}
}
- my %title = ( available => 'Institutional directory search available',
- localonly => 'Other domains can search institution',
- lcavailable => 'LON-CAPA directory search available',
- lclocalonly => 'Other domains can search LON-CAPA domain',
+ my %title = ( available => 'Directory search available',
+ localonly => 'Other domains can search',
searchby => 'Search types',
searchtypes => 'Search latitude');
my @offon = ('off','on');
@@ -10330,9 +9227,7 @@ sub modify_directorysrch {
my %dirsrch_hash = (
directorysrch => { available => $env{'form.dirsrch_available'},
cansearch => \@cansearch,
- localonly => $env{'form.dirsrch_instlocalonly'},
- lclocalonly => $env{'form.dirsrch_domlocalonly'},
- lcavailable => $env{'form.dirsrch_domavailable'},
+ localonly => $env{'form.dirsrch_localonly'},
searchby => \@searchby,
searchtypes => \@searchtypes,
}
@@ -10349,47 +9244,24 @@ sub modify_directorysrch {
$changes{'available'} = 1;
}
}
- if (exists($currdirsrch{'lcavailable'})) {
- if ($currdirsrch{'lcavailable'} ne $env{'form.dirsrch_domavailable'}) {
- $changes{'lcavailable'} = 1;
- }
- } else {
- if ($env{'form.dirsrch_lcavailable'} eq '1') {
- $changes{'lcavailable'} = 1;
- }
- }
if (exists($currdirsrch{'localonly'})) {
- if ($currdirsrch{'localonly'} ne $env{'form.dirsrch_instlocalonly'}) {
- $changes{'localonly'} = 1;
- }
+ if ($currdirsrch{'localonly'} ne $env{'form.dirsrch_localonly'}) {
+ $changes{'localonly'} = 1;
+ }
} else {
- if ($env{'form.dirsrch_instlocalonly'} eq '1') {
+ if ($env{'form.dirsrch_localonly'} eq '1') {
$changes{'localonly'} = 1;
}
}
- if (exists($currdirsrch{'lclocalonly'})) {
- if ($currdirsrch{'lclocalonly'} ne $env{'form.dirsrch_domlocalonly'}) {
- $changes{'lclocalonly'} = 1;
- }
- } else {
- if ($env{'form.dirsrch_domlocalonly'} eq '1') {
- $changes{'lclocalonly'} = 1;
- }
- }
if (keys(%changes) > 0) {
$resulttext = &mt('Changes made:').'';
if ($changes{'available'}) {
$resulttext .= '- '.&mt("$title{'available'} set to: $offon[$env{'form.dirsrch_available'}]").'
';
}
- if ($changes{'lcavailable'}) {
- $resulttext .= '- '.&mt("$title{'lcavailable'} set to: $offon[$env{'form.dirsrch_domavailable'}]").'
';
- }
if ($changes{'localonly'}) {
- $resulttext .= '- '.&mt("$title{'localonly'} set to: $otherdoms[$env{'form.dirsrch_instlocalonly'}]").'
';
- }
- if ($changes{'lclocalonly'}) {
- $resulttext .= '- '.&mt("$title{'lclocalonly'} set to: $otherdoms[$env{'form.dirsrch_domlocalonly'}]").'
';
+ $resulttext .= '- '.&mt("$title{'localonly'} set to: $otherdoms[$env{'form.dirsrch_localonly'}]").'
';
}
+
if (ref($changes{'cansearch'}) eq 'ARRAY') {
my $chgtext;
if (ref($usertypes) eq 'HASH') {
@@ -10439,12 +9311,8 @@ sub modify_directorysrch {
$resulttext .= '- '.&mt($title{'searchtypes'}.' set to: "[_1]"',$chgtext).'
';
}
$resulttext .= ' ';
- &Apache::lonnet::do_cache_new('directorysrch',$dom,$dirsrch_hash{'directorysrch'},3600);
- if (ref($lastactref) eq 'HASH') {
- $lastactref->{'directorysrch'} = 1;
- }
} else {
- $resulttext = &mt('No changes made to directory search settings');
+ $resulttext = &mt('No changes made to institution directory search settings');
}
} else {
$resulttext = ''.
@@ -10461,12 +9329,11 @@ sub modify_contacts {
$currsetting{$key} = $domconfig{'contacts'}{$key};
}
}
- my (%others,%to,%bcc,%includestr,%includeloc);
+ my (%others,%to,%bcc);
my @contacts = ('supportemail','adminemail');
- my @mailings = ('errormail','packagesmail','helpdeskmail','otherdomsmail',
- 'lonstatusmail','requestsmail','updatesmail','idconflictsmail','hostipmail');
+ my @mailings = ('errormail','packagesmail','helpdeskmail','lonstatusmail',
+ 'requestsmail','updatesmail','idconflictsmail');
my @toggles = ('reporterrors','reportupdates');
- my ($fields,$fieldtitles,$fieldoptions,$possoptions) = &helpform_fields();
foreach my $type (@mailings) {
@{$newsetting{$type}} =
&Apache::loncommon::get_env_multiple('form.'.$type);
@@ -10476,17 +9343,12 @@ sub modify_contacts {
} else {
$contacts_hash{contacts}{$type}{$item} = 0;
}
- }
+ }
$others{$type} = $env{'form.'.$type.'_others'};
$contacts_hash{contacts}{$type}{'others'} = $others{$type};
- if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) {
+ if ($type eq 'helpdeskmail') {
$bcc{$type} = $env{'form.'.$type.'_bcc'};
$contacts_hash{contacts}{$type}{'bcc'} = $bcc{$type};
- if (($env{'form.'.$type.'_includestr'} ne '') && ($env{'form.'.$type.'_includeloc'} =~ /^s|b$/)) {
- $includestr{$type} = $env{'form.'.$type.'_includestr'};
- $includeloc{$type} = $env{'form.'.$type.'_includeloc'};
- $contacts_hash{contacts}{$type}{'include'} = $includeloc{$type}.':'.&escape($includestr{$type});
- }
}
}
foreach my $item (@contacts) {
@@ -10498,63 +9360,6 @@ sub modify_contacts {
$contacts_hash{'contacts'}{$item} = $env{'form.'.$item};
}
}
- if ((ref($fields) eq 'ARRAY') && (ref($possoptions) eq 'HASH')) {
- foreach my $field (@{$fields}) {
- if (ref($possoptions->{$field}) eq 'ARRAY') {
- my $value = $env{'form.helpform_'.$field};
- $value =~ s/^\s+|\s+$//g;
- if (grep(/^\Q$value\E$/,@{$possoptions->{$field}})) {
- $contacts_hash{'contacts'}{'helpform'}{$field} = $value;
- if ($field eq 'screenshot') {
- $env{'form.helpform_maxsize'} =~ s/^\s+|\s+$//g;
- if ($env{'form.helpform_maxsize'} =~ /^\d+\.?\d*$/) {
- $contacts_hash{'contacts'}{'helpform'}{'maxsize'} = $env{'form.helpform_maxsize'};
- }
- }
- }
- }
- }
- }
- my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
- my (@statuses,%usertypeshash,@overrides);
- if ((ref($types) eq 'ARRAY') && (@{$types} > 0)) {
- @statuses = @{$types};
- if (ref($usertypes) eq 'HASH') {
- %usertypeshash = %{$usertypes};
- }
- }
- if (@statuses) {
- my @possoverrides = &Apache::loncommon::get_env_multiple('form.overrides');
- foreach my $type (@possoverrides) {
- if (($type ne '') && (grep(/^\Q$type\E$/,@statuses))) {
- push(@overrides,$type);
- }
- }
- if (@overrides) {
- foreach my $type (@overrides) {
- my @standard = &Apache::loncommon::get_env_multiple('form.override_'.$type);
- foreach my $item (@contacts) {
- if (grep(/^\Q$item\E$/,@standard)) {
- $contacts_hash{'contacts'}{'overrides'}{$type}{$item} = 1;
- $newsetting{'override_'.$type}{$item} = 1;
- } else {
- $contacts_hash{'contacts'}{'overrides'}{$type}{$item} = 0;
- $newsetting{'override_'.$type}{$item} = 0;
- }
- }
- $contacts_hash{'contacts'}{'overrides'}{$type}{'others'} = $env{'form.override_'.$type.'_others'};
- $contacts_hash{'contacts'}{'overrides'}{$type}{'bcc'} = $env{'form.override_'.$type.'_bcc'};
- $newsetting{'override_'.$type}{'others'} = $env{'form.override_'.$type.'_others'};
- $newsetting{'override_'.$type}{'bcc'} = $env{'form.override_'.$type.'_bcc'};
- if (($env{'form.override_'.$type.'_includestr'} ne '') && ($env{'form.override_'.$type.'_includeloc'} =~ /^s|b$/)) {
- $includestr{$type} = $env{'form.override_'.$type.'_includestr'};
- $includeloc{$type} = $env{'form.override_'.$type.'_includeloc'};
- $contacts_hash{'contacts'}{'overrides'}{$type}{'include'} = $includeloc{$type}.':'.&escape($includestr{$type});
- $newsetting{'override_'.$type}{'include'} = $contacts_hash{'contacts'}{'overrides'}{$type}{'include'};
- }
- }
- }
- }
if (keys(%currsetting) > 0) {
foreach my $item (@contacts) {
if ($to{$item} ne $currsetting{$item}) {
@@ -10574,66 +9379,10 @@ sub modify_contacts {
if ($others{$type} ne $currsetting{$type}{'others'}) {
push(@{$changes{$type}},'others');
}
- if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) {
+ if ($type eq 'helpdeskmail') {
if ($bcc{$type} ne $currsetting{$type}{'bcc'}) {
push(@{$changes{$type}},'bcc');
}
- my ($currloc,$currstr) = split(/:/,$currsetting{$type}{'include'},2);
- if (($includeloc{$type} ne $currloc) || (&escape($includestr{$type}) ne $currstr)) {
- push(@{$changes{$type}},'include');
- }
- }
- }
- if (ref($fields) eq 'ARRAY') {
- if (ref($currsetting{'helpform'}) eq 'HASH') {
- foreach my $field (@{$fields}) {
- if ($currsetting{'helpform'}{$field} ne $contacts_hash{'contacts'}{'helpform'}{$field}) {
- push(@{$changes{'helpform'}},$field);
- }
- if (($field eq 'screenshot') && ($contacts_hash{'contacts'}{'helpform'}{'screenshot'} ne 'no')) {
- if ($currsetting{'helpform'}{'maxsize'} ne $contacts_hash{'contacts'}{'helpform'}{'maxsize'}) {
- push(@{$changes{'helpform'}},'maxsize');
- }
- }
- }
- } else {
- foreach my $field (@{$fields}) {
- if ($contacts_hash{'contacts'}{'helpform'}{$field} ne 'yes') {
- push(@{$changes{'helpform'}},$field);
- }
- if (($field eq 'screenshot') && ($contacts_hash{'contacts'}{'helpform'}{'screenshot'} ne 'no')) {
- if ($contacts_hash{'contacts'}{'helpform'}{'maxsize'} != 1) {
- push(@{$changes{'helpform'}},'maxsize');
- }
- }
- }
- }
- }
- if (@statuses) {
- if (ref($currsetting{'overrides'}) eq 'HASH') {
- foreach my $key (keys(%{$currsetting{'overrides'}})) {
- if (ref($currsetting{'overrides'}{$key}) eq 'HASH') {
- if (ref($newsetting{'override_'.$key}) eq 'HASH') {
- foreach my $item (@contacts,'bcc','others','include') {
- if ($currsetting{'overrides'}{$key}{$item} ne $newsetting{'override_'.$key}{$item}) {
- push(@{$changes{'overrides'}},$key);
- last;
- }
- }
- } else {
- push(@{$changes{'overrides'}},$key);
- }
- }
- }
- foreach my $key (@overrides) {
- unless (exists($currsetting{'overrides'}{$key})) {
- push(@{$changes{'overrides'}},$key);
- }
- }
- } else {
- foreach my $key (@overrides) {
- push(@{$changes{'overrides'}},$key);
- }
}
}
} else {
@@ -10643,42 +9392,26 @@ sub modify_contacts {
$default{'errormail'} = 'adminemail';
$default{'packagesmail'} = 'adminemail';
$default{'helpdeskmail'} = 'supportemail';
- $default{'otherdomsmail'} = 'supportemail';
$default{'lonstatusmail'} = 'adminemail';
$default{'requestsmail'} = 'adminemail';
$default{'updatesmail'} = 'adminemail';
- $default{'hostipmail'} = 'adminemail';
foreach my $item (@contacts) {
if ($to{$item} ne $default{$item}) {
- $changes{$item} = 1;
+ $changes{$item} = 1;
}
}
foreach my $type (@mailings) {
if ((@{$newsetting{$type}} != 1) || ($newsetting{$type}[0] ne $default{$type})) {
+
push(@{$changes{$type}},@{$newsetting{$type}});
}
if ($others{$type} ne '') {
push(@{$changes{$type}},'others');
}
- if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) {
+ if ($type eq 'helpdeskmail') {
if ($bcc{$type} ne '') {
push(@{$changes{$type}},'bcc');
}
- if (($includeloc{$type} =~ /^b|s$/) && ($includestr{$type} ne '')) {
- push(@{$changes{$type}},'include');
- }
- }
- }
- if (ref($fields) eq 'ARRAY') {
- foreach my $field (@{$fields}) {
- if ($contacts_hash{'contacts'}{'helpform'}{$field} ne 'yes') {
- push(@{$changes{'helpform'}},$field);
- }
- if (($field eq 'screenshot') && ($contacts_hash{'contacts'}{'helpform'}{'screenshot'} ne 'no')) {
- if ($contacts_hash{'contacts'}{'helpform'}{'maxsize'} != 1) {
- push(@{$changes{'helpform'}},'maxsize');
- }
- }
}
}
}
@@ -10710,11 +9443,7 @@ sub modify_contacts {
}
foreach my $type (@mailings) {
if (ref($changes{$type}) eq 'ARRAY') {
- if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) {
- $resulttext .= ''.$titles->{$type}.' -- '.&mt('sent to').': ';
- } else {
- $resulttext .= ''.$titles->{$type}.': ';
- }
+ $resulttext .= ''.$titles->{$type}.': ';
my @text;
foreach my $item (@{$newsetting{$type}}) {
push(@text,$short_titles->{$item});
@@ -10722,89 +9451,16 @@ sub modify_contacts {
if ($others{$type} ne '') {
push(@text,$others{$type});
}
- if (@text) {
- $resulttext .= ''.
- join(', ',@text).'';
- }
- if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) {
+ $resulttext .= ''.
+ join(', ',@text).'';
+ if ($type eq 'helpdeskmail') {
if ($bcc{$type} ne '') {
- my $bcctext;
- if (@text) {
- $bcctext = ' '.&mt('with Bcc to');
- } else {
- $bcctext = '(Bcc)';
- }
- $resulttext .= $bcctext.': '.$bcc{$type}.'';
- } elsif (!@text) {
- $resulttext .= &mt('No one');
- }
- if ($includestr{$type} ne '') {
- if ($includeloc{$type} eq 'b') {
- $resulttext .= ' '.&mt('Text automatically added to e-mail body:').' '.$includestr{$type};
- } elsif ($includeloc{$type} eq 's') {
- $resulttext .= ' '.&mt('Text automatically added to e-mail subject:').' '.$includestr{$type};
- }
+ $resulttext .= ' '.&mt('with Bcc to').': '.$bcc{$type}.'';
}
- } elsif (!@text) {
- $resulttext .= &mt('No recipients');
}
$resulttext .= '';
}
}
- if (ref($changes{'overrides'}) eq 'ARRAY') {
- my @deletions;
- foreach my $type (@{$changes{'overrides'}}) {
- if ($usertypeshash{$type}) {
- if (grep(/^\Q$type\E/,@overrides)) {
- $resulttext .= ''.&mt("Overrides based on requester's affiliation set for [_1]",
- $usertypeshash{$type}).'- ';
- if (ref($newsetting{'override_'.$type}) eq 'HASH') {
- my @text;
- foreach my $item (@contacts) {
- if ($newsetting{'override_'.$type}{$item}) {
- push(@text,$short_titles->{$item});
- }
- }
- if ($newsetting{'override_'.$type}{'others'} ne '') {
- push(@text,$newsetting{'override_'.$type}{'others'});
- }
-
- if (@text) {
- $resulttext .= &mt('Helpdesk e-mail sent to: [_1]',
- ''.join(', ',@text).'');
- }
- if ($newsetting{'override_'.$type}{'bcc'} ne '') {
- my $bcctext;
- if (@text) {
- $bcctext = ' '.&mt('with Bcc to');
- } else {
- $bcctext = '(Bcc)';
- }
- $resulttext .= $bcctext.': '.$newsetting{'override_'.$type}{'bcc'}.'';
- } elsif (!@text) {
- $resulttext .= &mt('Helpdesk e-mail sent to no one');
- }
- $resulttext .= '
';
- if ($newsetting{'override_'.$type}{'include'} ne '') {
- my ($loc,$str) = split(/:/,$newsetting{'override_'.$type}{'include'});
- if ($loc eq 'b') {
- $resulttext .= '- '.&mt('Text automatically added to e-mail body:').' '.&unescape($str).'
';
- } elsif ($loc eq 's') {
- $resulttext .= '- '.&mt('Text automatically added to e-mail subject:').' '.&unescape($str).'
';
- }
- }
- }
- $resulttext .= ' ';
- } else {
- push(@deletions,$usertypeshash{$type});
- }
- }
- }
- if (@deletions) {
- $resulttext .= ''.&mt("Overrides based on requester's affiliation discontinued for: [_1]",
- join(', ',@deletions)).'';
- }
- }
my @offon = ('off','on');
if ($changes{'reporterrors'}) {
$resulttext .= ''.
@@ -10822,49 +9478,9 @@ sub modify_contacts {
&mt('LON-CAPA core group - MSU'),600,500)).
'';
}
- if ((ref($changes{'helpform'}) eq 'ARRAY') && (ref($fields) eq 'ARRAY')) {
- my (@optional,@required,@unused,$maxsizechg);
- foreach my $field (@{$changes{'helpform'}}) {
- if ($field eq 'maxsize') {
- $maxsizechg = 1;
- next;
- }
- if ($contacts_hash{'contacts'}{'helpform'}{$field} eq 'yes') {
- push(@optional,$field);
- } elsif ($contacts_hash{'contacts'}{'helpform'}{$field} eq 'no') {
- push(@unused,$field);
- } elsif ($contacts_hash{'contacts'}{'helpform'}{$field} eq 'req') {
- push(@required,$field);
- }
- }
- if (@optional) {
- $resulttext .= ''.
- &mt('Help form fields changed to "Optional": [_1].',
- ''.join(', ',map { $fieldtitles->{$_}; } @optional)).''.
- '';
- }
- if (@required) {
- $resulttext .= ''.
- &mt('Help form fields changed to "Required": [_1].',
- ''.join(', ',map { $fieldtitles->{$_}; } @required)).''.
- '';
- }
- if (@unused) {
- $resulttext .= ''.
- &mt('Help form fields changed to "Not shown": [_1].',
- ''.join(', ',map { $fieldtitles->{$_}; } @unused)).''.
- '';
- }
- if ($maxsizechg) {
- $resulttext .= ''.
- &mt('Max size for file uploaded to help form by logged-in user set to [_1] MB.',
- $contacts_hash{'contacts'}{'helpform'}{'maxsize'}).
- '';
- }
- }
$resulttext .= '';
} else {
- $resulttext = &mt('No changes made to contacts and form settings');
+ $resulttext = &mt('No changes made to contact information');
}
} else {
$resulttext = ''.
@@ -10873,526 +9489,6 @@ sub modify_contacts {
return $resulttext;
}
-sub modify_passwords {
- my ($r,$dom,$confname,$lastactref,%domconfig) = @_;
- my ($resulttext,%current,%changes,%newvalues,@oktypes,$errors,
- $updatedefaults,$updateconf);
- my $customfn = 'resetpw.html';
- if (ref($domconfig{'passwords'}) eq 'HASH') {
- %current = %{$domconfig{'passwords'}};
- }
- my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
- my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
- if (ref($types) eq 'ARRAY') {
- @oktypes = @{$types};
- }
- push(@oktypes,'default');
-
- my %titles = &Apache::lonlocal::texthash (
- intauth_cost => 'Encryption cost for bcrypt (positive integer)',
- intauth_check => 'Check bcrypt cost if authenticated',
- intauth_switch => 'Existing crypt-based switched to bcrypt on authentication',
- permanent => 'Permanent e-mail address',
- critical => 'Critical notification address',
- notify => 'Notification address',
- min => 'Minimum password length',
- max => 'Maximum password length',
- chars => 'Required characters',
- numsaved => 'Number of previous passwords to save',
- reset => 'Resetting Forgotten Password',
- intauth => 'Encryption of Stored Passwords (Internal Auth)',
- rules => 'Rules for LON-CAPA Passwords',
- crsownerchg => 'Course Owner Changing Student Passwords',
- username => 'Username',
- email => 'E-mail address',
- );
-
-#
-# Retrieve current domain configuration for internal authentication from $domconfig{'defaults'}.
-#
- my (%curr_defaults,%save_defaults);
- if (ref($domconfig{'defaults'}) eq 'HASH') {
- foreach my $key (keys(%{$domconfig{'defaults'}})) {
- if ($key =~ /^intauth_(cost|check|switch)$/) {
- $curr_defaults{$key} = $domconfig{'defaults'}{$key};
- } else {
- $save_defaults{$key} = $domconfig{'defaults'}{$key};
- }
- }
- }
- my %staticdefaults = (
- 'resetlink' => 2,
- 'resetcase' => \@oktypes,
- 'resetprelink' => 'both',
- 'resetemail' => ['critical','notify','permanent'],
- 'intauth_cost' => 10,
- 'intauth_check' => 0,
- 'intauth_switch' => 0,
- );
- $staticdefaults{'min'} = $Apache::lonnet::passwdmin;
- foreach my $type (@oktypes) {
- $staticdefaults{'resetpostlink'}{$type} = ['email','username'];
- }
- my $linklife = $env{'form.passwords_link'};
- $linklife =~ s/^\s+|\s+$//g;
- if (($linklife =~ /^\d+(|\.\d*)$/) && ($linklife > 0)) {
- $newvalues{'resetlink'} = $linklife;
- if ($current{'resetlink'}) {
- if ($current{'resetlink'} ne $linklife) {
- $changes{'reset'} = 1;
- }
- } elsif (!exists($domconfig{passwords})) {
- if ($staticdefaults{'resetlink'} ne $linklife) {
- $changes{'reset'} = 1;
- }
- }
- } elsif ($current{'resetlink'}) {
- $changes{'reset'} = 1;
- }
- my @casesens;
- my @posscase = &Apache::loncommon::get_env_multiple('form.passwords_case_sensitive');
- foreach my $case (sort(@posscase)) {
- if (grep(/^\Q$case\E$/,@oktypes)) {
- push(@casesens,$case);
- }
- }
- $newvalues{'resetcase'} = \@casesens;
- if (ref($current{'resetcase'}) eq 'ARRAY') {
- my @diffs = &Apache::loncommon::compare_arrays($current{'resetcase'},\@casesens);
- if (@diffs > 0) {
- $changes{'reset'} = 1;
- }
- } elsif (!exists($domconfig{passwords})) {
- my @diffs = &Apache::loncommon::compare_arrays($staticdefaults{'resetcase'},\@casesens);
- if (@diffs > 0) {
- $changes{'reset'} = 1;
- }
- }
- if ($env{'form.passwords_prelink'} =~ /^(both|either)$/) {
- $newvalues{'resetprelink'} = $env{'form.passwords_prelink'};
- if (exists($current{'resetprelink'})) {
- if ($current{'resetprelink'} ne $newvalues{'resetprelink'}) {
- $changes{'reset'} = 1;
- }
- } elsif (!exists($domconfig{passwords})) {
- if ($staticdefaults{'resetprelink'} ne $newvalues{'resetprelink'}) {
- $changes{'reset'} = 1;
- }
- }
- } elsif ($current{'resetprelink'}) {
- $changes{'reset'} = 1;
- }
- foreach my $type (@oktypes) {
- my @possplink = &Apache::loncommon::get_env_multiple('form.passwords_postlink_'.$type);
- my @postlink;
- foreach my $item (sort(@possplink)) {
- if ($item =~ /^(email|username)$/) {
- push(@postlink,$item);
- }
- }
- $newvalues{'resetpostlink'}{$type} = \@postlink;
- unless ($changes{'reset'}) {
- if (ref($current{'resetpostlink'}) eq 'HASH') {
- if (ref($current{'resetpostlink'}{$type}) eq 'ARRAY') {
- my @diffs = &Apache::loncommon::compare_arrays($current{'resetpostlink'}{$type},\@postlink);
- if (@diffs > 0) {
- $changes{'reset'} = 1;
- }
- } else {
- $changes{'reset'} = 1;
- }
- } elsif (!exists($domconfig{passwords})) {
- my @diffs = &Apache::loncommon::compare_arrays($staticdefaults{'resetpostlink'}{$type},\@postlink);
- if (@diffs > 0) {
- $changes{'reset'} = 1;
- }
- }
- }
- }
- my @possemailsrc = &Apache::loncommon::get_env_multiple('form.passwords_emailsrc');
- my @resetemail;
- foreach my $item (sort(@possemailsrc)) {
- if ($item =~ /^(permanent|critical|notify)$/) {
- push(@resetemail,$item);
- }
- }
- $newvalues{'resetemail'} = \@resetemail;
- unless ($changes{'reset'}) {
- if (ref($current{'resetemail'}) eq 'ARRAY') {
- my @diffs = &Apache::loncommon::compare_arrays($current{'resetemail'},\@resetemail);
- if (@diffs > 0) {
- $changes{'reset'} = 1;
- }
- } elsif (!exists($domconfig{passwords})) {
- my @diffs = &Apache::loncommon::compare_arrays($staticdefaults{'resetemail'},\@resetemail);
- if (@diffs > 0) {
- $changes{'reset'} = 1;
- }
- }
- }
- if ($env{'form.passwords_stdtext'} == 0) {
- $newvalues{'resetremove'} = 1;
- unless ($current{'resetremove'}) {
- $changes{'reset'} = 1;
- }
- } elsif ($current{'resetremove'}) {
- $changes{'reset'} = 1;
- }
- if ($env{'form.passwords_customfile.filename'} ne '') {
- my $servadm = $r->dir_config('lonAdmEMail');
- my $servadm = $r->dir_config('lonAdmEMail');
- my ($configuserok,$author_ok,$switchserver) =
- &config_check($dom,$confname,$servadm);
- my $error;
- if ($configuserok eq 'ok') {
- if ($switchserver) {
- $error = &mt("Upload of file containing domain-specific text is not permitted to this server: [_1]",$switchserver);
- } else {
- if ($author_ok eq 'ok') {
- my ($result,$customurl) =
- &publishlogo($r,'upload','passwords_customfile',$dom,
- $confname,'customtext/resetpw','','',$customfn);
- if ($result eq 'ok') {
- $newvalues{'resetcustom'} = $customurl;
- $changes{'reset'} = 1;
- } else {
- $error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$customfn,$result);
- }
- } else {
- $error = &mt("Upload of [_1] failed because an author role could not be assigned to a Domain Configuration user ([_2]) in domain: [_3]. Error was: [_4].",$customfn,$confname,$dom,$author_ok);
- }
- }
- } else {
- $error = &mt("Upload of [_1] failed because a Domain Configuration user ([_2]) could not be created in domain: [_3]. Error was: [_4].",$customfn,$confname,$dom,$configuserok);
- }
- if ($error) {
- &Apache::lonnet::logthis($error);
- $errors .= ''.$error.'';
- }
- } elsif ($current{'resetcustom'}) {
- if ($env{'form.passwords_custom_del'}) {
- $changes{'reset'} = 1;
- } else {
- $newvalues{'resetcustom'} = $current{'resetcustom'};
- }
- }
- $env{'form.intauth_cost'} =~ s/^\s+|\s+$//g;
- if (($env{'form.intauth_cost'} ne '') && ($env{'form.intauth_cost'} =~ /^\d+$/)) {
- $save_defaults{'intauth_cost'} = $env{'form.intauth_cost'};
- if ($save_defaults{'intauth_cost'} ne $curr_defaults{'intauth_cost'}) {
- $changes{'intauth'} = 1;
- }
- } else {
- $save_defaults{'intauth_cost'} = $curr_defaults{'intauth_cost'};
- }
- if ($env{'form.intauth_check'} =~ /^(0|1|2)$/) {
- $save_defaults{'intauth_check'} = $env{'form.intauth_check'};
- if ($save_defaults{'intauth_check'} ne $curr_defaults{'intauth_check'}) {
- $changes{'intauth'} = 1;
- }
- } else {
- $save_defaults{'intauth_check'} = $curr_defaults{'intauth_check'};
- }
- if ($env{'form.intauth_switch'} =~ /^(0|1|2)$/) {
- $save_defaults{'intauth_switch'} = $env{'form.intauth_switch'};
- if ($save_defaults{'intauth_switch'} ne $curr_defaults{'intauth_switch'}) {
- $changes{'intauth'} = 1;
- }
- } else {
- $save_defaults{'intauth_check'} = $curr_defaults{'intauth_check'};
- }
- foreach my $item ('cost','check','switch') {
- if ($save_defaults{'intauth_'.$item} ne $domdefaults{'intauth_'.$item}) {
- $domdefaults{'intauth_'.$item} = $save_defaults{'intauth_'.$item};
- $updatedefaults = 1;
- }
- }
- foreach my $rule ('min','max','numsaved') {
- $env{'form.passwords_'.$rule} =~ s/^\s+|\s+$//g;
- my $ruleok;
- if ($rule eq 'min') {
- if ($env{'form.passwords_'.$rule} =~ /^\d+$/) {
- if ($env{'form.passwords_'.$rule} >= $Apache::lonnet::passwdmin) {
- $ruleok = 1;
- }
- }
- } elsif (($env{'form.passwords_'.$rule} =~ /^\d+$/) &&
- ($env{'form.passwords_'.$rule} ne '0')) {
- $ruleok = 1;
- }
- if ($ruleok) {
- $newvalues{$rule} = $env{'form.passwords_'.$rule};
- if (exists($current{$rule})) {
- if ($newvalues{$rule} ne $current{$rule}) {
- $changes{'rules'} = 1;
- }
- } elsif ($rule eq 'min') {
- if ($staticdefaults{$rule} ne $newvalues{$rule}) {
- $changes{'rules'} = 1;
- }
- }
- } elsif (exists($current{$rule})) {
- $changes{'rules'} = 1;
- }
- }
- my @posschars = &Apache::loncommon::get_env_multiple('form.passwords_chars');
- my @chars;
- foreach my $item (sort(@posschars)) {
- if ($item =~ /^(uc|lc|num|spec)$/) {
- push(@chars,$item);
- }
- }
- $newvalues{'chars'} = \@chars;
- unless ($changes{'rules'}) {
- if (ref($current{'chars'}) eq 'ARRAY') {
- my @diffs = &Apache::loncommon::compare_arrays($current{'chars'},\@chars);
- if (@diffs > 0) {
- $changes{'rules'} = 1;
- }
- } else {
- if (@chars > 0) {
- $changes{'rules'} = 1;
- }
- }
- }
- my %crsownerchg = (
- by => [],
- for => [],
- );
- foreach my $item ('by','for') {
- my @posstypes = &Apache::loncommon::get_env_multiple('form.passwords_crsowner_'.$item);
- foreach my $type (sort(@posstypes)) {
- if (grep(/^\Q$type\E$/,@oktypes)) {
- push(@{$crsownerchg{$item}},$type);
- }
- }
- }
- $newvalues{'crsownerchg'} = \%crsownerchg;
- if (ref($current{'crsownerchg'}) eq 'HASH') {
- foreach my $item ('by','for') {
- if (ref($current{'crsownerchg'}{$item}) eq 'ARRAY') {
- my @diffs = &Apache::loncommon::compare_arrays($current{'crsownerchg'}{$item},$crsownerchg{$item});
- if (@diffs > 0) {
- $changes{'crsownerchg'} = 1;
- last;
- }
- }
- }
- } elsif (!exists($domconfig{passwords})) {
- foreach my $item ('by','for') {
- if (@{$crsownerchg{$item}} > 0) {
- $changes{'crsownerchg'} = 1;
- last;
- }
- }
- }
-
- my %confighash = (
- defaults => \%save_defaults,
- passwords => \%newvalues,
- );
- &process_captcha('passwords',\%changes,$confighash{'passwords'},$domconfig{'passwords'});
-
- my $putresult = &Apache::lonnet::put_dom('configuration',\%confighash,$dom);
- if ($putresult eq 'ok') {
- if (keys(%changes) > 0) {
- $resulttext = &mt('Changes made: ').'';
- foreach my $key ('reset','intauth','rules','crsownerchg') {
- if ($changes{$key}) {
- unless ($key eq 'intauth') {
- $updateconf = 1;
- }
- $resulttext .= '- '.$titles{$key}.':
';
- if ($key eq 'reset') {
- if ($confighash{'passwords'}{'captcha'} eq 'original') {
- $resulttext .= '- '.&mt('CAPTCHA validation set to use: original CAPTCHA').'
';
- } elsif ($confighash{'passwords'}{'captcha'} eq 'recaptcha') {
- $resulttext .= '- '.&mt('CAPTCHA validation set to use: reCAPTCHA').' '.
- &mt('version: [_1]',$confighash{'passwords'}{'recaptchaversion'}).'
'.
- &mt('Public key: [_1]',$confighash{'passwords'}{'recaptchapub'}).''.
- &mt('Private key: [_1]',$confighash{'passwords'}{'recaptchapriv'}).' ';
- } else {
- $resulttext .= '- '.&mt('No CAPTCHA validation').'
';
- }
- if ($confighash{'passwords'}{'resetlink'}) {
- $resulttext .= '- '.&mt('Reset link expiration set to [quant,_1,hour]',$confighash{'passwords'}{'resetlink'}).'
';
- } else {
- $resulttext .= '- '.&mt('No reset link expiration set.').' '.
- &mt('Will default to 2 hours').'
';
- }
- if (ref($confighash{'passwords'}{'resetcase'}) eq 'ARRAY') {
- if (@{$confighash{'passwords'}{'resetcase'}} == 0) {
- $resulttext .= '- '.&mt('User input for username and/or e-mail address not case sensitive for "Forgot Password" web form').'
';
- } else {
- my $casesens;
- foreach my $type (@{$confighash{'passwords'}{'resetcase'}}) {
- if ($type eq 'default') {
- $casesens .= $othertitle.', ';
- } elsif ($usertypes->{$type} ne '') {
- $casesens .= $usertypes->{$type}.', ';
- }
- }
- $casesens =~ s/\Q, \E$//;
- $resulttext .= '- '.&mt('"Forgot Password" web form input for username and/or e-mail address is case-sensitive for: [_1]',$casesens).'
';
- }
- } else {
- $resulttext .= '- '.&mt('Case-sensitivity not set for "Forgot Password" web form').' '.&mt('Will default to case-sensitive for username and/or e-mail address for all').'
';
- }
- if ($confighash{'passwords'}{'resetprelink'} eq 'either') {
- $resulttext .= '- '.&mt('Users can enter either a username or an e-mail address in "Forgot Password" web form').'
';
- } else {
- $resulttext .= '- '.&mt('Users can enter both a username and an e-mail address in "Forgot Password" web form').'
';
- }
- if (ref($confighash{'passwords'}{'resetpostlink'}) eq 'HASH') {
- my $output;
- if (ref($types) eq 'ARRAY') {
- foreach my $type (@{$types}) {
- if (ref($confighash{'passwords'}{'resetpostlink'}{$type}) eq 'ARRAY') {
- if (@{$confighash{'passwords'}{'resetpostlink'}{$type}} == 0) {
- $output .= $usertypes->{$type}.' -- '.&mt('none');
- } else {
- $output .= $usertypes->{$type}.' -- '.
- join(', ',map { $titles{$_}; } (@{$confighash{'passwords'}{'resetpostlink'}{$type}})).'; ';
- }
- }
- }
- }
- if (ref($confighash{'passwords'}{'resetpostlink'}{'default'}) eq 'ARRAY') {
- if (@{$confighash{'passwords'}{'resetpostlink'}{'default'}} == 0) {
- $output .= $othertitle.' -- '.&mt('none');
- } else {
- $output .= $othertitle.' -- '.
- join(', ',map { $titles{$_}; } (@{$confighash{'passwords'}{'resetpostlink'}{'default'}}));
- }
- }
- if ($output) {
- $resulttext .= '- '.&mt('Information required for new password form (by user type) set to: [_1]',$output).'
';
- } else {
- $resulttext .= '- '.&mt('Information required for new password form not set.').' '.&mt('Will default to requiring both the username and an e-mail address').'
';
- }
- } else {
- $resulttext .= '- '.&mt('Information required for new password form not set.').' '.&mt('Will default to requiring both the username and an e-mail address').'
';
- }
- if (ref($confighash{'passwords'}{'resetemail'}) eq 'ARRAY') {
- if (@{$confighash{'passwords'}{'resetemail'}} > 0) {
- $resulttext .= '- '.&mt('E-mail address(es) in LON-CAPA used for verification will include: [_1]',join(', ',map { $titles{$_}; } @{$confighash{'passwords'}{'resetemail'}})).'
';
- } else {
- $resulttext .= '- '.&mt('E-mail address(es) in LON-CAPA used for verification will include: [_1]',join(', ',map { $titles{$_}; } @{$staticdefaults{'resetemail'}})).'
';
- }
- } else {
- $resulttext .= '- '.&mt('E-mail address(es) in LON-CAPA usedfor verification will include: [_1]',join(', ',map { $titles{$_}; } @{$staticdefaults{'resetemail'}})).'
';
- }
- if ($confighash{'passwords'}{'resetremove'}) {
- $resulttext .= '- '.&mt('Preamble to "Forgot Password" web form not shown').'
';
- } else {
- $resulttext .= '- '.&mt('Preamble to "Forgot Password" web form is shown').'
';
- }
- if ($confighash{'passwords'}{'resetcustom'}) {
- my $customlink = &Apache::loncommon::modal_link($confighash{'passwords'}{'resetcustom'},
- $titles{custom},600,500);
- $resulttext .= '- '.&mt('Preamble to "Forgot Password" form includes [_1]',$customlink).'
';
- } else {
- $resulttext .= '- '.&mt('No custom text included in preamble to "Forgot Password" form').'
';
- }
- } elsif ($key eq 'intauth') {
- foreach my $item ('cost','switch','check') {
- my $value = $save_defaults{$key.'_'.$item};
- if ($item eq 'switch') {
- my %optiondesc = &Apache::lonlocal::texthash (
- 0 => 'No',
- 1 => 'Yes',
- 2 => 'Yes, and copy existing passwd file to passwd.bak file',
- );
- if ($value =~ /^(0|1|2)$/) {
- $value = $optiondesc{$value};
- } else {
- $value = &mt('none -- defaults to No');
- }
- } elsif ($item eq 'check') {
- my %optiondesc = &Apache::lonlocal::texthash (
- 0 => 'No',
- 1 => 'Yes, allow login then update passwd file using default cost (if higher)',
- 2 => 'Yes, disallow login if stored cost is less than domain default',
- );
- if ($value =~ /^(0|1|2)$/) {
- $value = $optiondesc{$value};
- } else {
- $value = &mt('none -- defaults to No');
- }
- }
- $resulttext .= '- '.&mt('[_1] set to "[_2]"',$titles{$key.'_'.$item},$value).'
';
- }
- } elsif ($key eq 'rules') {
- foreach my $rule ('min','max','numsaved') {
- if ($confighash{'passwords'}{$rule} eq '') {
- if ($rule eq 'min') {
- $resulttext .= '- '.&mt('[_1] not set.',$titles{$rule});
- ' '.&mt('Default of [_1] will be used',
- $Apache::lonnet::passwdmin).'
';
- } else {
- $resulttext .= '- '.&mt('[_1] set to none',$titles{$rule}).'
';
- }
- } else {
- $resulttext .= '- '.&mt('[_1] set to [_2]',$titles{$rule},$confighash{'passwords'}{$rule}).'
';
- }
- }
- } elsif ($key eq 'crsownerchg') {
- if (ref($confighash{'passwords'}{'crsownerchg'}) eq 'HASH') {
- if ((@{$confighash{'passwords'}{'crsownerchg'}{'by'}} == 0) ||
- (@{$confighash{'passwords'}{'crsownerchg'}{'for'}} == 0)) {
- $resulttext .= '- '.&mt('Course owner may not change student passwords.').'
';
- } else {
- my %crsownerstr;
- foreach my $item ('by','for') {
- if (ref($confighash{'passwords'}{'crsownerchg'}{$item}) eq 'ARRAY') {
- foreach my $type (@{$confighash{'passwords'}{'crsownerchg'}{$item}}) {
- if ($type eq 'default') {
- $crsownerstr{$item} .= $othertitle.', ';
- } elsif ($usertypes->{$type} ne '') {
- $crsownerstr{$item} .= $usertypes->{$type}.', ';
- }
- }
- $crsownerstr{$item} =~ s/\Q, \E$//;
- }
- }
- $resulttext .= '- '.&mt('Course owner (with status: [_1]) may change passwords for students (with status: [_2]).',
- $crsownerstr{'by'},$crsownerstr{'for'}).'
';
- }
- } else {
- $resulttext .= '- '.&mt('Course owner may not change student passwords.').'
';
- }
- }
- $resulttext .= ' ';
- }
- }
- $resulttext .= ' ';
- } else {
- $resulttext = &mt('No changes made to password settings');
- }
- my $cachetime = 24*60*60;
- if ($updatedefaults) {
- &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
- if (ref($lastactref) eq 'HASH') {
- $lastactref->{'domdefaults'} = 1;
- }
- }
- if ($updateconf) {
- &Apache::lonnet::do_cache_new('passwdconf',$dom,$confighash{'passwords'},$cachetime);
- if (ref($lastactref) eq 'HASH') {
- $lastactref->{'passwdconf'} = 1;
- }
- }
- } else {
- $resulttext = ''.
- &mt('An error occurred: [_1]',$putresult).'';
- }
- if ($errors) {
- $resulttext .= ''.&mt('The following errors occurred: ').' ';
- }
- return $resulttext;
-}
-
sub modify_usercreation {
my ($dom,%domconfig) = @_;
my ($resulttext,%curr_usercreation,%changes,%authallowed,%cancreate,%save_usercreate);
@@ -11402,10 +9498,12 @@ sub modify_usercreation {
if ($key eq 'cancreate') {
if (ref($domconfig{'usercreation'}{$key}) eq 'HASH') {
foreach my $item (keys(%{$domconfig{'usercreation'}{$key}})) {
- if (($item eq 'requestcrs') || ($item eq 'course') || ($item eq 'author')) {
- $curr_usercreation{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};
- } else {
+ if (($item eq 'selfcreate') || ($item eq 'statustocreate') ||
+ ($item eq 'captcha') || ($item eq 'recaptchakeys') ||
+ ($item eq 'recaptchaversion')) {
$save_usercreate{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};
+ } else {
+ $curr_usercreation{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};
}
}
}
@@ -11608,18 +9706,14 @@ sub modify_usercreation {
}
sub modify_selfcreation {
- my ($dom,$lastactref,%domconfig) = @_;
- my ($resulttext,$warningmsg,%curr_usercreation,%curr_usermodify,%curr_inststatus,%changes,%cancreate);
- my (%save_usercreate,%save_usermodify,%save_inststatus,@types,%usertypes);
- my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
- my ($othertitle,$usertypesref,$typesref) = &Apache::loncommon::sorted_inst_types($dom);
- if (ref($typesref) eq 'ARRAY') {
- @types = @{$typesref};
- }
- if (ref($usertypesref) eq 'HASH') {
- %usertypes = %{$usertypesref};
+ my ($dom,%domconfig) = @_;
+ my ($resulttext,$warningmsg,%curr_usercreation,%curr_usermodify,%changes,%cancreate);
+ my (%save_usercreate,%save_usermodify);
+ my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
+ if (ref($types) eq 'ARRAY') {
+ $usertypes->{'default'} = $othertitle;
+ push(@{$types},'default');
}
- $usertypes{'default'} = $othertitle;
#
# Retrieve current domain configuration for self-creation of usernames from $domconfig{'usercreation'}.
#
@@ -11629,11 +9723,10 @@ sub modify_selfcreation {
if (ref($domconfig{'usercreation'}{$key}) eq 'HASH') {
foreach my $item (keys(%{$domconfig{'usercreation'}{$key}})) {
if (($item eq 'selfcreate') || ($item eq 'statustocreate') ||
- ($item eq 'captcha') || ($item eq 'recaptchakeys') ||
- ($item eq 'recaptchaversion') || ($item eq 'notify') ||
- ($item eq 'emailusername') || ($item eq 'shibenv') ||
- ($item eq 'selfcreateprocessing') || ($item eq 'emailverified') ||
- ($item eq 'emailoptions') || ($item eq 'emaildomain')) {
+ ($item eq 'captcha') || ($item eq 'recaptchakeys') ||
+ ($item eq 'recaptchaversion') ||
+ ($item eq 'emailusername') || ($item eq 'notify') ||
+ ($item eq 'selfcreateprocessing') || ($item eq 'shibenv')) {
$curr_usercreation{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};
} else {
$save_usercreate{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};
@@ -11659,161 +9752,41 @@ sub modify_selfcreation {
}
}
}
-#
-# Retrieve current domain configuration for institutional status types from $domconfig{'inststatus'}.
-#
- if (ref($domconfig{'inststatus'}) eq 'HASH') {
- foreach my $key (keys(%{$domconfig{'inststatus'}})) {
- if ($key eq 'inststatusguest') {
- $curr_inststatus{$key} = $domconfig{'inststatus'}{$key};
- } else {
- $save_inststatus{$key} = $domconfig{'inststatus'}{$key};
- }
- }
- }
my @contexts = ('selfcreate');
@{$cancreate{'selfcreate'}} = ();
%{$cancreate{'emailusername'}} = ();
- if (@types) {
- @{$cancreate{'statustocreate'}} = ();
- }
+ @{$cancreate{'statustocreate'}} = ();
%{$cancreate{'selfcreateprocessing'}} = ();
%{$cancreate{'shibenv'}} = ();
- %{$cancreate{'emailverified'}} = ();
- %{$cancreate{'emailoptions'}} = ();
- %{$cancreate{'emaildomain'}} = ();
my %selfcreatetypes = (
sso => 'users authenticated by institutional single sign on',
login => 'users authenticated by institutional log-in',
- email => 'users verified by e-mail',
+ email => 'users who provide a valid e-mail address for use as username',
);
#
# Populate $cancreate{'selfcreate'} array reference with types of user, for which self-creation of user accounts
# is permitted.
#
- my ($emailrules,$emailruleorder) = &Apache::lonnet::inst_userrules($dom,'email');
+ my @statuses;
+ if (ref($domconfig{'inststatus'}) eq 'HASH') {
+ if (ref($domconfig{'inststatus'}{'inststatusguest'}) eq 'ARRAY') {
+ @statuses = @{$domconfig{'inststatus'}{'inststatusguest'}};
+ }
+ }
+ push(@statuses,'default');
- my (@statuses,%email_rule);
foreach my $item ('login','sso','email') {
if ($item eq 'email') {
if ($env{'form.cancreate_email'}) {
- if (@types) {
- my @poss_statuses = &Apache::loncommon::get_env_multiple('form.selfassign');
- foreach my $status (@poss_statuses) {
- if (grep(/^\Q$status\E$/,(@types,'default'))) {
- push(@statuses,$status);
- }
- }
- $save_inststatus{'inststatusguest'} = \@statuses;
- } else {
- push(@statuses,'default');
- }
- if (@statuses) {
- my %curr_rule;
- if (ref($curr_usercreation{'email_rule'}) eq 'ARRAY') {
- foreach my $type (@statuses) {
- $curr_rule{$type} = $curr_usercreation{'email_rule'};
- }
- } elsif (ref($curr_usercreation{'email_rule'}) eq 'HASH') {
- foreach my $type (@statuses) {
- $curr_rule{$type} = $curr_usercreation{'email_rule'}{$type};
- }
- }
- push(@{$cancreate{'selfcreate'}},'email');
- push(@contexts,('selfcreateprocessing','emailverified','emailoptions'));
- my %curremaildom;
- if (ref($curr_usercreation{'cancreate'}{'emaildomain'}) eq 'HASH') {
- %curremaildom = %{$curr_usercreation{'cancreate'}{'emaildomain'}};
- }
- foreach my $type (@statuses) {
- if ($env{'form.cancreate_emailprocess_'.$type} =~ /^(?:approval|automatic)$/) {
- $cancreate{'selfcreateprocessing'}{$type} = $env{'form.cancreate_emailprocess_'.$type};
- }
- if ($env{'form.cancreate_usernameoptions_'.$type} =~ /^(?:all|first|free)$/) {
- $cancreate{'emailverified'}{$type} = $env{'form.cancreate_usernameoptions_'.$type};
- }
- if ($env{'form.cancreate_emailoptions_'.$type} =~ /^(any|inst|noninst|custom)$/) {
-#
-# Retrieve rules (if any) governing types of e-mail address which may be used to verify a username.
-#
- my $chosen = $1;
- if (($chosen eq 'inst') || ($chosen eq 'noninst')) {
- my $emaildom;
- if ($env{'form.cancreate_emaildomain_'.$chosen.'_'.$type} =~ /^\@[^\@]+$/) {
- $emaildom = $env{'form.cancreate_emaildomain_'.$chosen.'_'.$type};
- $cancreate{'emaildomain'}{$type}{$chosen} = $emaildom;
- if (ref($curremaildom{$type}) eq 'HASH') {
- if (exists($curremaildom{$type}{$chosen})) {
- if ($curremaildom{$type}{$chosen} ne $emaildom) {
- push(@{$changes{'cancreate'}},'emaildomain');
- }
- } elsif ($emaildom ne '') {
- push(@{$changes{'cancreate'}},'emaildomain');
- }
- } elsif ($emaildom ne '') {
- push(@{$changes{'cancreate'}},'emaildomain');
- }
- }
- $cancreate{'emailoptions'}{$type} = $env{'form.cancreate_emailoptions_'.$type};
- } elsif ($chosen eq 'custom') {
- my @possemail_rules = &Apache::loncommon::get_env_multiple('form.email_rule_'.$type);
- $email_rule{$type} = [];
- if (ref($emailrules) eq 'HASH') {
- foreach my $rule (@possemail_rules) {
- if (exists($emailrules->{$rule})) {
- push(@{$email_rule{$type}},$rule);
- }
- }
- }
- if (@{$email_rule{$type}}) {
- $cancreate{'emailoptions'}{$type} = 'custom';
- if (ref($curr_rule{$type}) eq 'ARRAY') {
- if (@{$curr_rule{$type}} > 0) {
- foreach my $rule (@{$curr_rule{$type}}) {
- if (!grep(/^\Q$rule\E$/,@{$email_rule{$type}})) {
- push(@{$changes{'email_rule'}},$type);
- }
- }
- }
- foreach my $type (@{$email_rule{$type}}) {
- if (!grep(/^\Q$type\E$/,@{$curr_rule{$type}})) {
- push(@{$changes{'email_rule'}},$type);
- }
- }
- } else {
- push(@{$changes{'email_rule'}},$type);
- }
- }
- } else {
- $cancreate{'emailoptions'}{$type} = $env{'form.cancreate_emailoptions_'.$type};
- }
- }
- }
- if (@types) {
- if (ref($curr_inststatus{'inststatusguest'}) eq 'ARRAY') {
- my @changed = &Apache::loncommon::compare_arrays(\@statuses,$curr_inststatus{'inststatusguest'});
- if (@changed) {
- push(@{$changes{'inststatus'}},'inststatusguest');
- }
- } else {
- push(@{$changes{'inststatus'}},'inststatusguest');
- }
- }
- } else {
- delete($env{'form.cancreate_email'});
- if (ref($curr_inststatus{'inststatusguest'}) eq 'ARRAY') {
- if (@{$curr_inststatus{'inststatusguest'}} > 0) {
- push(@{$changes{'inststatus'}},'inststatusguest');
- }
- }
- }
- } else {
- $save_inststatus{'inststatusguest'} = [];
- if (ref($curr_inststatus{'inststatusguest'}) eq 'ARRAY') {
- if (@{$curr_inststatus{'inststatusguest'}} > 0) {
- push(@{$changes{'inststatus'}},'inststatusguest');
+ push(@{$cancreate{'selfcreate'}},'email');
+ push(@contexts,'selfcreateprocessing');
+ foreach my $type (@statuses) {
+ if ($type eq 'default') {
+ $cancreate{'selfcreateprocessing'}{$type} = $env{'form.cancreate_emailprocess'};
+ } else {
+ $cancreate{'selfcreateprocessing'}{$type} = $env{'form.cancreate_emailprocess_'.$type};
}
}
}
@@ -11823,7 +9796,7 @@ sub modify_selfcreation {
}
}
}
- my (%userinfo,%savecaptcha);
+ my (@email_rule,%userinfo,%savecaptcha);
my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info();
#
# Populate $cancreate{'emailusername'}{$type} hash ref with information fields (if new user will provide data
@@ -11832,8 +9805,8 @@ sub modify_selfcreation {
if ($env{'form.cancreate_email'}) {
push(@contexts,'emailusername');
- if (@statuses) {
- foreach my $type (@statuses) {
+ if (ref($types) eq 'ARRAY') {
+ foreach my $type (@{$types}) {
if (ref($infofields) eq 'ARRAY') {
foreach my $field (@{$infofields}) {
if ($env{'form.canmodify_emailusername_'.$type.'_'.$field} =~ /^(required|optional)$/) {
@@ -11845,7 +9818,7 @@ sub modify_selfcreation {
}
#
# Populate $cancreate{'notify'} hash ref with names of Domain Coordinators who are to be notified of
-# queued requests for self-creation of account verified by e-mail.
+# queued requests for self-creation of account using e-mail address as username
#
my @approvalnotify = &Apache::loncommon::get_env_multiple('form.selfcreationnotifyapproval');
@@ -11865,13 +9838,36 @@ sub modify_selfcreation {
push(@{$changes{'cancreate'}},'notify');
}
+#
+# Retrieve rules (if any) governing types of e-mail address which may be used as a username
+#
+ @email_rule = &Apache::loncommon::get_env_multiple('form.email_rule');
&process_captcha('cancreate',\%changes,\%savecaptcha,$curr_usercreation{'cancreate'});
+ if (ref($curr_usercreation{'email_rule'}) eq 'ARRAY') {
+ if (@{$curr_usercreation{'email_rule'}} > 0) {
+ foreach my $type (@{$curr_usercreation{'email_rule'}}) {
+ if (!grep(/^\Q$type\E$/,@email_rule)) {
+ push(@{$changes{'email_rule'}},$type);
+ }
+ }
+ }
+ if (@email_rule > 0) {
+ foreach my $type (@email_rule) {
+ if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'email_rule'}})) {
+ push(@{$changes{'email_rule'}},$type);
+ }
+ }
+ }
+ } elsif (@email_rule > 0) {
+ push(@{$changes{'email_rule'}},@email_rule);
+ }
}
#
# Check if domain default is set appropriately, if self-creation of accounts is to be available for
# institutional log-in.
#
if (grep(/^login$/,@{$cancreate{'selfcreate'}})) {
+ my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
if (!((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) ||
($domdefaults{'auth_def'} eq 'localauth'))) {
$warningmsg = &mt('Although account creation has been set to be available for institutional logins, currently default authentication in this domain has not been set to support this.').' '.
@@ -11890,10 +9886,14 @@ sub modify_selfcreation {
# which the user may supply, if institutional data is unavailable.
#
if (($env{'form.cancreate_login'}) || ($env{'form.cancreate_sso'})) {
- if (@types) {
- @{$cancreate{'statustocreate'}} = &Apache::loncommon::get_env_multiple('form.statustocreate');
- push(@contexts,'statustocreate');
- foreach my $type (@types) {
+ if (ref($types) eq 'ARRAY') {
+ if (@{$types} > 1) {
+ @{$cancreate{'statustocreate'}} = &Apache::loncommon::get_env_multiple('form.statustocreate');
+ push(@contexts,'statustocreate');
+ } else {
+ undef($cancreate{'statustocreate'});
+ }
+ foreach my $type (@{$types}) {
my @modifiable = &Apache::loncommon::get_env_multiple('form.canmodify_'.$type);
foreach my $field (@fields) {
if (grep(/^\Q$field\E$/,@modifiable)) {
@@ -11904,7 +9904,7 @@ sub modify_selfcreation {
}
}
if (ref($curr_usermodify{'selfcreate'}) eq 'HASH') {
- foreach my $type (@types) {
+ foreach my $type (@{$types}) {
if (ref($curr_usermodify{'selfcreate'}{$type}) eq 'HASH') {
foreach my $field (@fields) {
if ($save_usermodify{'selfcreate'}{$type}{$field} ne
@@ -11916,7 +9916,7 @@ sub modify_selfcreation {
}
}
} else {
- foreach my $type (@types) {
+ foreach my $type (@{$types}) {
push(@{$changes{'selfcreate'}},$type);
}
}
@@ -11965,28 +9965,34 @@ sub modify_selfcreation {
}
} elsif (ref($curr_usercreation{'cancreate'}{$item}) eq 'HASH') {
if (ref($cancreate{$item}) eq 'HASH') {
- foreach my $type (keys(%{$curr_usercreation{'cancreate'}{$item}})) {
- if (ref($curr_usercreation{'cancreate'}{$item}{$type}) eq 'HASH') {
- foreach my $field (keys(%{$curr_usercreation{'cancreate'}{$item}{$type}})) {
- unless ($curr_usercreation{'cancreate'}{$item}{$type}{$field} eq $cancreate{$item}{$type}{$field}) {
+ foreach my $curr (keys(%{$curr_usercreation{'cancreate'}{$item}})) {
+ if (ref($curr_usercreation{'cancreate'}{$item}{$curr}) eq 'HASH') {
+ foreach my $field (keys(%{$curr_usercreation{'cancreate'}{$item}{$curr}})) {
+ unless ($curr_usercreation{'cancreate'}{$item}{$curr}{$field} eq $cancreate{$item}{$curr}{$field}) {
if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
push(@{$changes{'cancreate'}},$item);
}
}
}
- } elsif (($item eq 'selfcreateprocessing') || ($item eq 'emailverified') || ($item eq 'emailoptions')) {
- if ($cancreate{$item}{$type} ne $curr_usercreation{'cancreate'}{$item}{$type}) {
+ } elsif ($item eq 'selfcreateprocessing') {
+ if ($cancreate{$item}{$curr} ne $curr_usercreation{'cancreate'}{$item}{$curr}) {
+ if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+ push(@{$changes{'cancreate'}},$item);
+ }
+ }
+ } else {
+ if (!$cancreate{$item}{$curr}) {
if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
push(@{$changes{'cancreate'}},$item);
}
}
}
}
- foreach my $type (keys(%{$cancreate{$item}})) {
- if (ref($cancreate{$item}{$type}) eq 'HASH') {
- foreach my $field (keys(%{$cancreate{$item}{$type}})) {
- if (ref($curr_usercreation{'cancreate'}{$item}{$type}) eq 'HASH') {
- unless ($curr_usercreation{'cancreate'}{$item}{$type}{$field} eq $cancreate{$item}{$type}{$field}) {
+ foreach my $field (keys(%{$cancreate{$item}})) {
+ if (ref($cancreate{$item}{$field}) eq 'HASH') {
+ foreach my $inner (keys(%{$cancreate{$item}{$field}})) {
+ if (ref($curr_usercreation{'cancreate'}{$item}{$field}) eq 'HASH') {
+ unless ($curr_usercreation{'cancreate'}{$item}{$field}{$inner} eq $cancreate{$item}{$field}{$inner}) {
if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
push(@{$changes{'cancreate'}},$item);
}
@@ -11997,8 +10003,14 @@ sub modify_selfcreation {
}
}
}
- } elsif (($item eq 'selfcreateprocessing') || ($item eq 'emailverified') || ($item eq 'emailoptions')) {
- if ($cancreate{$item}{$type} ne $curr_usercreation{'cancreate'}{$item}{$type}) {
+ } elsif ($item eq 'selfcreateprocessing') {
+ if ($cancreate{$item}{$field} ne $curr_usercreation{'cancreate'}{$item}{$field}) {
+ if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+ push(@{$changes{'cancreate'}},$item);
+ }
+ }
+ } else {
+ if (!$curr_usercreation{'cancreate'}{$item}{$field}) {
if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
push(@{$changes{'cancreate'}},$item);
}
@@ -12013,11 +10025,11 @@ sub modify_selfcreation {
push(@{$changes{'cancreate'}},$item);
}
}
- }
- } elsif (($item eq 'selfcreateprocessing') || ($item eq 'emailverified') || ($item eq 'emailoptions')) {
- if (ref($cancreate{$item}) eq 'HASH') {
- if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
- push(@{$changes{'cancreate'}},$item);
+ } elsif (ref($cancreate{$item}) eq 'HASH') {
+ if (!$cancreate{$item}{$curr_usercreation{'cancreate'}{$item}}) {
+ if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+ push(@{$changes{'cancreate'}},$item);
+ }
}
}
} elsif ($item eq 'emailusername') {
@@ -12050,15 +10062,6 @@ sub modify_selfcreation {
if (ref($cancreate{'selfcreateprocessing'}) eq 'HASH') {
$save_usercreate{'cancreate'}{'selfcreateprocessing'} = $cancreate{'selfcreateprocessing'};
}
- if (ref($cancreate{'emailverified'}) eq 'HASH') {
- $save_usercreate{'cancreate'}{'emailverified'} = $cancreate{'emailverified'};
- }
- if (ref($cancreate{'emailoptions'}) eq 'HASH') {
- $save_usercreate{'cancreate'}{'emailoptions'} = $cancreate{'emailoptions'};
- }
- if (ref($cancreate{'emaildomain'}) eq 'HASH') {
- $save_usercreate{'cancreate'}{'emaildomain'} = $cancreate{'emaildomain'};
- }
if (ref($cancreate{'statustocreate'}) eq 'ARRAY') {
$save_usercreate{'cancreate'}{'statustocreate'} = $cancreate{'statustocreate'};
}
@@ -12066,18 +10069,16 @@ sub modify_selfcreation {
$save_usercreate{'cancreate'}{'shibenv'} = $cancreate{'shibenv'};
}
$save_usercreate{'cancreate'}{'emailusername'} = $cancreate{'emailusername'};
- $save_usercreate{'email_rule'} = \%email_rule;
+ $save_usercreate{'emailrule'} = \@email_rule;
my %userconfig_hash = (
usercreation => \%save_usercreate,
usermodification => \%save_usermodify,
- inststatus => \%save_inststatus,
);
-
my $putresult = &Apache::lonnet::put_dom('configuration',\%userconfig_hash,
$dom);
#
-# Accumulate details of changes to domain configuration for self-creation of usernames in $resulttext
+# Accumulate details of changes to domain cofiguration for self-creation of usernames in $resulttext
#
if ($putresult eq 'ok') {
if (keys(%changes) > 0) {
@@ -12085,7 +10086,7 @@ sub modify_selfcreation {
if (ref($changes{'cancreate'}) eq 'ARRAY') {
my %lt = &selfcreation_types();
foreach my $type (@{$changes{'cancreate'}}) {
- my $chgtext = '';
+ my $chgtext;
if ($type eq 'selfcreate') {
if (@{$cancreate{$type}} == 0) {
$chgtext .= &mt('Self creation of a new user account is not permitted.');
@@ -12100,25 +10101,18 @@ sub modify_selfcreation {
if (grep(/^(login|sso)$/,@{$cancreate{$type}})) {
if (ref($cancreate{'statustocreate'}) eq 'ARRAY') {
if (@{$cancreate{'statustocreate'}} == 0) {
- $chgtext .= ''.
- &mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts via log-in or single sign-on.").
- ' ';
+ $chgtext .= ' '.
+ ''.
+ &mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts.").
+ '';
}
}
}
- if (grep(/^email$/,@{$cancreate{$type}})) {
- if (!@statuses) {
- $chgtext .= ''.
- &mt("However, e-mail verification is currently set to 'unavailable' for all user types (including 'other'), so self-creation of accounts is not possible for non-institutional log-in.").
- ' ';
-
- }
- }
}
}
} elsif ($type eq 'shibenv') {
if (keys(%{$cancreate{$type}}) == 0) {
- $chgtext .= &mt('Shibboleth-autheticated user does not use environment variables to set user information').' ';
+ $chgtext .= &mt('Shibboleth-autheticated user does not use environment variables to set user information');
} else {
$chgtext .= &mt('Shibboleth-autheticated user information set from environment variables, as follows:').
'';
@@ -12131,7 +10125,7 @@ sub modify_selfcreation {
}
}
$chgtext .= ' ';
- }
+ }
} elsif ($type eq 'statustocreate') {
if ((ref($cancreate{'selfcreate'}) eq 'ARRAY') &&
(ref($cancreate{'statustocreate'}) eq 'ARRAY')) {
@@ -12144,7 +10138,7 @@ sub modify_selfcreation {
&mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts.").
'';
}
- } elsif (keys(%usertypes) > 0) {
+ } elsif (ref($usertypes) eq 'HASH') {
if (grep(/^(login|sso)$/,@{$cancreate{'selfcreate'}})) {
$chgtext .= &mt('Creation of a new account for an institutional user is restricted to the following institutional affiliation(s):');
} else {
@@ -12155,12 +10149,12 @@ sub modify_selfcreation {
if ($case eq 'default') {
$chgtext .= ''.$othertitle.'';
} else {
- $chgtext .= ''.$usertypes{$case}.'';
+ $chgtext .= ''.$usertypes->{$case}.'';
}
}
$chgtext .= '';
if (!grep(/^(login|sso)$/,@{$cancreate{'selfcreate'}})) {
- $chgtext .= ''.
+ $chgtext .= ' '.
&mt('However, users authenticated by institutional login/single sign on are not currently permitted to create accounts.').
'';
}
@@ -12172,129 +10166,26 @@ sub modify_selfcreation {
$chgtext .= &mt('Although institutional affiliations permitted to create accounts were changed, self creation of accounts is not currently permitted for any authentication types.');
}
}
- $chgtext .= ' ';
}
} elsif ($type eq 'selfcreateprocessing') {
my %choices = &Apache::lonlocal::texthash (
automatic => 'Automatic approval',
approval => 'Queued for approval',
);
- if (@types) {
- if (@statuses) {
- $chgtext .= &mt('Processing of requests to create account with e-mail verification set as follows:').
- '';
- foreach my $status (@statuses) {
- if ($status eq 'default') {
- $chgtext .= '- '.$othertitle.' -- '.$choices{$cancreate{'selfcreateprocessing'}{$status}}.'
';
- } else {
- $chgtext .= '- '.$usertypes{$status}.' -- '.$choices{$cancreate{'selfcreateprocessing'}{$status}}.'
';
- }
- }
- $chgtext .= ' ';
- }
- } else {
- $chgtext .= &mt('Processing of requests to create account with e-mail verification set to: "[_1]"',
- $choices{$cancreate{'selfcreateprocessing'}{'default'}});
- }
- } elsif ($type eq 'emailverified') {
- my %options = &Apache::lonlocal::texthash (
- all => 'Same as e-mail',
- first => 'Omit @domain',
- free => 'Free to choose',
- );
- if (@types) {
- if (@statuses) {
- $chgtext .= &mt('For self-created accounts verified by e-mail address, username is set as follows:').
- '';
- foreach my $status (@statuses) {
- if ($status eq 'default') {
- $chgtext .= '- '.$othertitle.' -- '.$options{$cancreate{'emailverified'}{$status}}.'
';
- } else {
- $chgtext .= '- '.$usertypes{$status}.' -- '.$options{$cancreate{'emailverified'}{$status}}.'
';
- }
- }
- $chgtext .= ' ';
- }
- } else {
- $chgtext .= &mt("For self-created accounts verified by e-mail address, user's username is: '[_1]'",
- $options{$cancreate{'emailverified'}{'default'}});
- }
- } elsif ($type eq 'emailoptions') {
- my %options = &Apache::lonlocal::texthash (
- any => 'Any e-mail',
- inst => 'Institutional only',
- noninst => 'Non-institutional only',
- custom => 'Custom restrictions',
- );
- if (@types) {
- if (@statuses) {
- $chgtext .= &mt('For self-created accounts verified by e-mail address, requirements for e-mail address are as follows:').
- '';
- foreach my $status (@statuses) {
- if ($type eq 'default') {
- $chgtext .= '- '.$othertitle.' -- '.$options{$cancreate{'emailoptions'}{$status}}.'
';
- } else {
- $chgtext .= '- '.$usertypes{$status}.' -- '.$options{$cancreate{'emailoptions'}{$status}}.'
';
- }
- }
- $chgtext .= ' ';
- }
+ if (@statuses > 1) {
+ $chgtext .= &mt('Processing of requests to create account with e-mail address as username set as follows:').
+ '';
+ foreach my $type (@statuses) {
+ if ($type eq 'default') {
+ $chgtext .= '- '.$othertitle.' -- '.$choices{$cancreate{'selfcreateprocessing'}{$type}}.'
';
+ } else {
+ $chgtext .= '- '.$usertypes->{$type}.' -- '.$choices{$cancreate{'selfcreateprocessing'}{$type}}.'
';
+ }
+ }
+ $chgtext .= ' ';
} else {
- if ($cancreate{'emailoptions'}{'default'} eq 'any') {
- $chgtext .= &mt('For self-created accounts verified by e-mail address, any e-mail may be used');
- } else {
- $chgtext .= &mt('For self-created accounts verified by e-mail address, e-mail restricted to: "[_1]"',
- $options{$cancreate{'emailoptions'}{'default'}});
- }
- }
- } elsif ($type eq 'emaildomain') {
- my $output;
- if (@statuses) {
- foreach my $type (@statuses) {
- if (ref($cancreate{'emaildomain'}{$type}) eq 'HASH') {
- if ($cancreate{'emailoptions'}{$type} eq 'inst') {
- if ($type eq 'default') {
- if ((ref($cancreate{'emaildomain'}{$type}) ne 'HASH') ||
- ($cancreate{'emaildomain'}{$type}{'inst'} eq '')) {
- $output = ''.$othertitle.' -- '.&mt('No restriction on e-mail domain').'';
- } else {
- $output = ''.$othertitle.' -- '.&mt("User's e-mail address needs to end: [_1]",
- $cancreate{'emaildomain'}{$type}{'inst'}).'';
- }
- } else {
- if ((ref($cancreate{'emaildomain'}{$type}) ne 'HASH') ||
- ($cancreate{'emaildomain'}{$type}{'inst'} eq '')) {
- $output = ''.$usertypes{$type}.' -- '.&mt('No restriction on e-mail domain').'';
- } else {
- $output = ''.$usertypes{$type}.' -- '.&mt("User's e-mail address needs to end: [_1]",
- $cancreate{'emaildomain'}{$type}{'inst'}).'';
- }
- }
- } elsif ($cancreate{'emailoptions'}{$type} eq 'noninst') {
- if ($type eq 'default') {
- if ((ref($cancreate{'emaildomain'}{$type}) ne 'HASH') ||
- ($cancreate{'emaildomain'}{$type}{'noninst'} eq '')) {
- $output = ''.$othertitle.' -- '.&mt('No restriction on e-mail domain').'';
- } else {
- $output = ''.$othertitle.' -- '.&mt("User's e-mail address must not end: [_1]",
- $cancreate{'emaildomain'}{$type}{'noninst'}).'';
- }
- } else {
- if ((ref($cancreate{'emaildomain'}{$type}) ne 'HASH') ||
- ($cancreate{'emaildomain'}{$type}{'noninst'} eq '')) {
- $output = ''.$usertypes{$type}.' -- '.&mt('No restriction on e-mail domain').'';
- } else {
- $output = ''.$usertypes{$type}.' -- '.&mt("User's e-mail address must not end: [_1]",
- $cancreate{'emaildomain'}{$type}{'noninst'}).'';
- }
- }
- }
- }
- }
- }
- if ($output ne '') {
- $chgtext .= &mt('For self-created accounts verified by e-mail address:').
- '';
+ $chgtext .= &mt('Processing of requests to create account with e-mail address as username set to: "[_1]"',
+ $choices{$cancreate{'selfcreateprocessing'}{'default'}});
}
} elsif ($type eq 'captcha') {
if ($savecaptcha{$type} eq 'notused') {
@@ -12331,11 +10222,11 @@ sub modify_selfcreation {
}
} elsif ($type eq 'emailusername') {
if (ref($cancreate{'emailusername'}) eq 'HASH') {
- if (@statuses) {
- foreach my $type (@statuses) {
+ if (ref($types) eq 'ARRAY') {
+ foreach my $type (@{$types}) {
if (ref($cancreate{'emailusername'}{$type}) eq 'HASH') {
if (keys(%{$cancreate{'emailusername'}{$type}}) > 0) {
- $chgtext .= &mt('When self-creating account with e-mail verification, the following information will be provided by [_1]:',"'$usertypes{$type}'").
+ $chgtext .= &mt('When self-creating account with e-mail as username, the following information will be provided by [_1]:',"'$usertypes->{$type}'").
'';
foreach my $field (@{$infofields}) {
if ($cancreate{'emailusername'}{$type}{$field}) {
@@ -12344,86 +10235,48 @@ sub modify_selfcreation {
}
$chgtext .= ' ';
} else {
- $chgtext .= &mt('When self creating account with e-mail verification, no information besides e-mail address will be provided by [_1].',"'$usertypes{$type}'").' ';
+ $chgtext .= &mt('When self creating account with e-mail as username, no information besides e-mail address will be provided by [_1].',"'$usertypes->{$type}'").' ';
}
} else {
- $chgtext .= &mt('When self creating account with e-mail verification, no information besides e-mail address will be provided by [_1].',"'$usertypes{$type}'").' ';
+ $chgtext .= &mt('When self creating account with e-mail as username, no information besides e-mail address will be provided by [_1].',"'$usertypes->{$type}'").' ';
}
}
}
}
} elsif ($type eq 'notify') {
- my $numapprove = 0;
+ $chgtext = &mt('No Domain Coordinators will receive notification of username requests requiring approval.');
if (ref($changes{'cancreate'}) eq 'ARRAY') {
if ((grep(/^notify$/,@{$changes{'cancreate'}})) && (ref($cancreate{'notify'}) eq 'HASH')) {
if ($cancreate{'notify'}{'approval'}) {
- $chgtext .= &mt('Notification of username requests requiring approval will be sent to: ').$cancreate{'notify'}{'approval'};
- $numapprove ++;
+ $chgtext = &mt('Notification of username requests requiring approval will be sent to: ').$cancreate{'notify'}{'approval'};
}
}
}
- unless ($numapprove) {
- $chgtext .= &mt('No Domain Coordinators will receive notification of username requests requiring approval.');
- }
}
if ($chgtext) {
$resulttext .= ''.$chgtext.'';
}
}
}
- if ((ref($changes{'email_rule'}) eq 'ARRAY') && (@{$changes{'email_rule'}} > 0)) {
+ if (ref($changes{'email_rule'}) eq 'ARRAY') {
my ($emailrules,$emailruleorder) =
&Apache::lonnet::inst_userrules($dom,'email');
- foreach my $type (@{$changes{'email_rule'}}) {
- if (ref($email_rule{$type}) eq 'ARRAY') {
- my $chgtext = '';
- foreach my $rule (@{$email_rule{$type}}) {
- if (ref($emailrules->{$rule}) eq 'HASH') {
- $chgtext .= '- '.$emailrules->{$rule}{'name'}.'
';
- }
- }
- $chgtext .= ' ';
- my $typename;
- if (@types) {
- if ($type eq 'default') {
- $typename = $othertitle;
- } else {
- $typename = $usertypes{$type};
- }
- $chgtext .= &mt('(Affiliation: [_1])',$typename);
- }
- if (@{$email_rule{$type}} > 0) {
- $resulttext .= ''.
- &mt('Accounts may not be created by users verified by e-mail, for e-mail addresses of the following types: ',
- $usertypes{$type}).
- $chgtext.
- '';
- } else {
- $resulttext .= ''.
- &mt('There are now no restrictions on e-mail addresses which may be used for verification when a user requests an account.').
- ''.
- &mt('(Affiliation: [_1])',$typename);
- }
+ my $chgtext = '';
+ foreach my $type (@email_rule) {
+ if (ref($emailrules->{$type}) eq 'HASH') {
+ $chgtext .= '- '.$emailrules->{$type}{'name'}.'
';
}
}
- }
- if (ref($changes{'inststatus'}) eq 'ARRAY') {
- if (ref($save_inststatus{'inststatusguest'}) eq 'ARRAY') {
- if (@{$save_inststatus{'inststatusguest'}} > 0) {
- my $chgtext = '';
- foreach my $type (@{$save_inststatus{'inststatusguest'}}) {
- $chgtext .= '- '.$usertypes{$type}.'
';
- }
- $chgtext .= ' ';
- $resulttext .= '- '.
- &mt('A user will self-report one of the following affiliations when requesting an account verified by e-mail: ').
- $chgtext.
- '
';
- } else {
- $resulttext .= '- '.
- &mt('No affiliations available for self-reporting when requesting an account verified by e-mail.').
- '
';
- }
+ $chgtext .= ' ';
+ if (@email_rule > 0) {
+ $resulttext .= ''.
+ &mt('Accounts may not be created by users self-enrolling with e-mail addresses of the following types: ').
+ $chgtext.
+ '';
+ } else {
+ $resulttext .= ''.
+ &mt('There are now no restrictions on e-mail addresses which may be used as a username when self-enrolling.').
+ '';
}
}
if (ref($changes{'selfcreate'}) eq 'ARRAY') {
@@ -12431,9 +10284,9 @@ sub modify_selfcreation {
my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
foreach my $type (@{$changes{'selfcreate'}}) {
my $typename = $type;
- if (keys(%usertypes) > 0) {
- if ($usertypes{$type} ne '') {
- $typename = $usertypes{$type};
+ if (ref($usertypes) eq 'HASH') {
+ if ($usertypes->{$type} ne '') {
+ $typename = $usertypes->{$type};
}
}
my @modifiable;
@@ -12456,12 +10309,6 @@ sub modify_selfcreation {
$resulttext .= '';
}
$resulttext .= '';
- my $cachetime = 24*60*60;
- $domdefaults{'inststatusguest'} = $save_inststatus{'inststatusguest'};
- &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
- if (ref($lastactref) eq 'HASH') {
- $lastactref->{'domdefaults'} = 1;
- }
} else {
$resulttext = &mt('No changes made to self-creation settings');
}
@@ -12658,8 +10505,7 @@ sub modify_defaults {
my ($dom,$lastactref,%domconfig) = @_;
my ($resulttext,$mailmsgtxt,%newvalues,%changes,@errors);
my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
- my @items = ('auth_def','auth_arg_def','lang_def','timezone_def','datelocale_def',
- 'portal_def');
+ my @items = ('auth_def','auth_arg_def','lang_def','timezone_def','datelocale_def','portal_def');
my @authtypes = ('internal','krb4','krb5','localauth');
foreach my $item (@items) {
$newvalues{$item} = $env{'form.'.$item};
@@ -12709,18 +10555,6 @@ sub modify_defaults {
}
$domdefaults{$item} = $newvalues{$item};
}
- my %staticdefaults = (
- 'intauth_cost' => 10,
- 'intauth_check' => 0,
- 'intauth_switch' => 0,
- );
- foreach my $item ('intauth_cost','intauth_check','intauth_switch') {
- if (exists($domdefaults{$item})) {
- $newvalues{$item} = $domdefaults{$item};
- } else {
- $newvalues{$item} = $staticdefaults{$item};
- }
- }
my %defaults_hash = (
defaults => \%newvalues,
);
@@ -12739,18 +10573,9 @@ sub modify_defaults {
}
my @todelete = &Apache::loncommon::get_env_multiple('form.inststatus_delete');
my @allpos;
+ my %guests;
my %alltypes;
- my @inststatusguest;
- if (ref($currinststatus) eq 'HASH') {
- if (ref($currinststatus->{'inststatusguest'}) eq 'ARRAY') {
- foreach my $type (@{$currinststatus->{'inststatusguest'}}) {
- unless (grep(/^\Q$type\E$/,@todelete)) {
- push(@inststatusguest,$type);
- }
- }
- }
- }
- my ($currtitles,$currorder);
+ my ($currtitles,$currguests,$currorder);
if (ref($currinststatus) eq 'HASH') {
if (ref($currinststatus->{'inststatusorder'}) eq 'ARRAY') {
foreach my $type (@{$currinststatus->{'inststatusorder'}}) {
@@ -12765,8 +10590,14 @@ sub modify_defaults {
$allpos[$position] = $type;
$alltypes{$type} = $env{'form.inststatus_title_'.$type};
$alltypes{$type} =~ s/`//g;
+ if ($env{'form.inststatus_guest_'.$type}) {
+ $guests{$type} = 1;
+ }
}
}
+ if (ref($currinststatus->{'inststatusguest'}) eq 'ARRAY') {
+ $currguests = join(',',@{$currinststatus->{'inststatusguest'}});
+ }
$currorder = join(',',@{$currinststatus->{'inststatusorder'}});
$currtitles =~ s/,$//;
}
@@ -12775,6 +10606,9 @@ sub modify_defaults {
my $newtype = $env{'form.addinststatus'};
$newtype =~ s/\W//g;
unless (exists($alltypes{$newtype})) {
+ if ($env{'form.addinststatus_guest'}) {
+ $guests{$newtype} = 1;
+ }
$alltypes{$newtype} = $env{'form.addinststatus_title'};
$alltypes{$newtype} =~ s/`//g;
my $position = $env{'form.addinststatus_pos'};
@@ -12784,10 +10618,13 @@ sub modify_defaults {
}
}
}
- my @orderedstatus;
+ my (@orderedstatus,@orderedguests);
foreach my $type (@allpos) {
unless (($type eq '') || (grep(/^\Q$type\E$/,@orderedstatus))) {
push(@orderedstatus,$type);
+ if ($guests{$type}) {
+ push(@orderedguests,$type);
+ }
}
}
foreach my $type (keys(%alltypes)) {
@@ -12798,7 +10635,7 @@ sub modify_defaults {
$defaults_hash{'inststatus'} = {
inststatustypes => \%alltypes,
inststatusorder => \@orderedstatus,
- inststatusguest => \@inststatusguest,
+ inststatusguest => \@orderedguests,
};
if (ref($defaults_hash{'inststatus'}) eq 'HASH') {
foreach my $item ('inststatustypes','inststatusorder','inststatusguest') {
@@ -12808,6 +10645,9 @@ sub modify_defaults {
if ($currorder ne join(',',@orderedstatus)) {
$changes{'inststatus'}{'inststatusorder'} = 1;
}
+ if ($currguests ne join(',',@orderedguests)) {
+ $changes{'inststatus'}{'inststatusguest'} = 1;
+ }
my $newtitles;
foreach my $item (@orderedstatus) {
$newtitles .= $alltypes{$item}.',';
@@ -12826,15 +10666,26 @@ sub modify_defaults {
foreach my $item (sort(keys(%changes))) {
if ($item eq 'inststatus') {
if (ref($changes{'inststatus'}) eq 'HASH') {
- if (@orderedstatus) {
+ if (($changes{'inststatus'}{'inststatustypes'}) || $changes{'inststatus'}{'inststatusorder'}) {
$resulttext .= ''.&mt('Institutional user status types set to:').' ';
foreach my $type (@orderedstatus) {
$resulttext .= $alltypes{$type}.', ';
}
$resulttext =~ s/, $//;
$resulttext .= '';
- } else {
- $resulttext .= ''.&mt('Institutional user status types deleted').'';
+ }
+ if ($changes{'inststatus'}{'inststatusguest'}) {
+ $resulttext .= '';
+ if (@orderedguests) {
+ $resulttext .= &mt('Types assignable to "non-institutional" usernames set to:').' ';
+ foreach my $type (@orderedguests) {
+ $resulttext .= $alltypes{$type}.', ';
+ }
+ $resulttext =~ s/, $//;
+ } else {
+ $resulttext .= &mt('Types assignable to "non-institutional" usernames set to none.');
+ }
+ $resulttext .= '';
}
}
} else {
@@ -12898,7 +10749,7 @@ sub modify_scantron {
my $custom = 'custom.tab';
my $default = 'default.tab';
my $servadm = $r->dir_config('lonAdmEMail');
- my ($configuserok,$author_ok,$switchserver) =
+ my ($configuserok,$author_ok,$switchserver) =
&config_check($dom,$confname,$servadm);
if ($env{'form.scantronformat.filename'} ne '') {
my $error;
@@ -12933,67 +10784,6 @@ sub modify_scantron {
if ($env{'form.scantronformat_del'}) {
$confhash{'scantron'}{'scantronformat'} = '';
$changes{'scantronformat'} = 1;
- } else {
- $confhash{'scantron'}{'scantronformat'} = $domconfig{'scantron'}{'scantronformat'};
- }
- }
- }
- my @options = ('hdr','pad','rem');
- my @fields = &scantroncsv_fields();
- my %titles = &scantronconfig_titles();
- my @formats = &Apache::loncommon::get_env_multiple('form.scantronconfig');
- my ($newdat,$currdat,%newcol,%currcol);
- if (grep(/^dat$/,@formats)) {
- $confhash{'scantron'}{config}{dat} = 1;
- $newdat = 1;
- } else {
- $newdat = 0;
- }
- if (grep(/^csv$/,@formats)) {
- my %bynum;
- foreach my $field (@fields) {
- if ($env{'form.scantronconfig_csv_'.$field} =~ /^(\d+)$/) {
- my $posscol = $1;
- if (($posscol < 20) && (!$bynum{$posscol})) {
- $confhash{'scantron'}{config}{csv}{fields}{$field} = $posscol;
- $bynum{$posscol} = $field;
- $newcol{$field} = $posscol;
- }
- }
- }
- if (keys(%newcol)) {
- foreach my $option (@options) {
- if ($env{'form.scantroncsv_'.$option}) {
- $confhash{'scantron'}{config}{csv}{options}{$option} = 1;
- }
- }
- }
- }
- $currdat = 1;
- if (ref($domconfig{'scantron'}) eq 'HASH') {
- if (ref($domconfig{'scantron'}{'config'}) eq 'HASH') {
- unless (exists($domconfig{'scantron'}{'config'}{'dat'})) {
- $currdat = 0;
- }
- if (ref($domconfig{'scantron'}{'config'}{'csv'}) eq 'HASH') {
- if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') {
- %currcol = %{$domconfig{'scantron'}{'config'}{'csv'}{'fields'}};
- }
- }
- }
- }
- if ($currdat != $newdat) {
- $changes{'config'} = 1;
- } else {
- foreach my $field (@fields) {
- if ($currcol{$field} ne '') {
- if ($currcol{$field} ne $newcol{$field}) {
- $changes{'config'} = 1;
- last;
- }
- } elsif ($newcol{$field} ne '') {
- $changes{'config'} = 1;
- last;
}
}
}
@@ -13004,64 +10794,29 @@ sub modify_scantron {
if (keys(%changes) > 0) {
if (ref($confhash{'scantron'}) eq 'HASH') {
$resulttext = &mt('Changes made:').'';
- if ($changes{'scantronformat'}) {
- if ($confhash{'scantron'}{'scantronformat'} eq '') {
- $resulttext .= '- '.&mt('[_1] bubblesheet format file removed; [_2] file will be used for courses in this domain.',$custom,$default).'
';
- } else {
- $resulttext .= '- '.&mt('Custom bubblesheet format file ([_1]) uploaded for use with courses in this domain.',$custom).'
';
- }
- }
- if ($changes{'config'}) {
- if (ref($confhash{'scantron'}{'config'}) eq 'HASH') {
- if ($confhash{'scantron'}{'config'}{'dat'}) {
- $resulttext .= '- '.&mt('Bubblesheet data upload formats includes .dat format').'
';
- }
- if (ref($confhash{'scantron'}{'config'}{'csv'}) eq 'HASH') {
- if (ref($confhash{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') {
- if (keys(%{$confhash{'scantron'}{'config'}{'csv'}{'fields'}})) {
- $resulttext .= '- '.&mt('Bubblesheet data upload formats includes .csv format, with following fields/column numbers supported:').'
';
- foreach my $field (@fields) {
- if ($confhash{'scantron'}{'config'}{'csv'}{'fields'}{$field} ne '') {
- my $showcol = $confhash{'scantron'}{'config'}{'csv'}{'fields'}{$field} + 1;
- $resulttext .= '- '.$titles{$field}.': '.$showcol.'
';
- }
- }
- $resulttext .= ' ';
- if (ref($confhash{'scantron'}{'config'}{'csv'}{'options'}) eq 'HASH') {
- if (keys(%{$confhash{'scantron'}{'config'}{'csv'}{'options'}})) {
- $resulttext .= '- '.&mt('Bubblesheet data upload formats includes .csv format, with following options:').'
';
- foreach my $option (@options) {
- if ($confhash{'scantron'}{'config'}{'csv'}{'options'}{$option} ne '') {
- $resulttext .= '- '.$titles{$option}.'
';
- }
- }
- $resulttext .= ' ';
- }
- }
- }
- }
- }
- } else {
- $resulttext .= '- '.&mt('No bubblesheet data upload formats set -- will default to assuming .dat format').'
';
- }
+ if ($confhash{'scantron'}{'scantronformat'} eq '') {
+ $resulttext .= '- '.&mt('[_1] bubblesheet format file removed; [_2] file will be used for courses in this domain.',$custom,$default).'
';
+ } else {
+ $resulttext .= '- '.&mt('Custom bubblesheet format file ([_1]) uploaded for use with courses in this domain.',$custom).'
';
}
$resulttext .= ' ';
} else {
$resulttext = &mt('Changes made to bubblesheet format file.');
}
+ $resulttext .= '';
&Apache::loncommon::devalidate_domconfig_cache($dom);
if (ref($lastactref) eq 'HASH') {
$lastactref->{'domainconfig'} = 1;
}
} else {
- $resulttext = &mt('No changes made to bubblesheet format settings');
+ $resulttext = &mt('No changes made to bubblesheet format file');
}
} else {
$resulttext = ''.
&mt('An error occurred: [_1]',$putresult).'';
}
} else {
- $resulttext = &mt('No changes made to bubblesheet format settings');
+ $resulttext = &mt('No changes made to bubblesheet format file');
}
if ($errors) {
$resulttext .= &mt('The following errors occurred: ').''.
@@ -13310,10 +11065,6 @@ sub modify_coursecategories {
}
$resulttext .= ' ';
}
- &Apache::lonnet::do_cache_new('cats',$dom,$cathash,3600);
- if (ref($lastactref) eq 'HASH') {
- $lastactref->{'cats'} = 1;
- }
}
$resulttext .= '';
if ($changes{'unauth'} || $changes{'auth'}) {
@@ -13465,210 +11216,32 @@ sub modify_serverstatuses {
}
sub modify_helpsettings {
- my ($r,$dom,$confname,$lastactref,%domconfig) = @_;
+ my ($r,$dom,$confname,%domconfig) = @_;
my ($resulttext,$errors,%changes,%helphash);
my %defaultchecked = ('submitbugs' => 'on');
my @offon = ('off','on');
my @toggles = ('submitbugs');
- my %current = ('submitbugs' => '',
- 'adhoc' => {},
- );
if (ref($domconfig{'helpsettings'}) eq 'HASH') {
- %current = %{$domconfig{'helpsettings'}};
- }
- my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
- foreach my $item (@toggles) {
- if ($defaultchecked{$item} eq 'on') {
- if ($current{$item} eq '') {
- if ($env{'form.'.$item} eq '0') {
- $changes{$item} = 1;
- }
- } elsif ($current{$item} ne $env{'form.'.$item}) {
- $changes{$item} = 1;
- }
- } elsif ($defaultchecked{$item} eq 'off') {
- if ($current{$item} eq '') {
- if ($env{'form.'.$item} eq '1') {
- $changes{$item} = 1;
- }
- } elsif ($current{$item} ne $env{'form.'.$item}) {
- $changes{$item} = 1;
- }
- }
- if (($env{'form.'.$item} eq '0') || ($env{'form.'.$item} eq '1')) {
- $helphash{'helpsettings'}{$item} = $env{'form.'.$item};
- }
- }
- my $maxnum = $env{'form.helproles_maxnum'};
- my $confname = $dom.'-domainconfig';
- my %existing=&Apache::lonnet::dump('roles',$dom,$confname,'rolesdef_');
- my (@allpos,%newsettings,%changedprivs,$newrole);
- my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
- my @accesstypes = ('all','dh','da','none','status','inc','exc');
- my %domhelpdesk = &Apache::lonnet::get_active_domroles($dom,['dh','da']);
- my %lt = &Apache::lonlocal::texthash(
- s => 'system',
- d => 'domain',
- order => 'Display order',
- access => 'Role usage',
- all => 'All with domain helpdesk or helpdesk assistant role',
- dh => 'All with domain helpdesk role',
- da => 'All with domain helpdesk assistant role',
- none => 'None',
- status => 'Determined based on institutional status',
- inc => 'Include all, but exclude specific personnel',
- exc => 'Exclude all, but include specific personnel',
- );
- for (my $num=0; $num<=$maxnum; $num++) {
- my ($prefix,$identifier,$rolename,%curr);
- if ($num == $maxnum) {
- next unless ($env{'form.newcusthelp'} == $maxnum);
- $identifier = 'custhelp'.$num;
- $prefix = 'helproles_'.$num;
- $rolename = $env{'form.custhelpname'.$num};
- $rolename=~s/[^A-Za-z0-9]//gs;
- next if ($rolename eq '');
- next if (exists($existing{'rolesdef_'.$rolename}));
- my %newprivs = &Apache::lonuserutils::custom_role_update($rolename,$identifier);
- my $result = &Apache::lonnet::definerole($rolename,$newprivs{'s'},$newprivs{'d'},
- $newprivs{'c'},$confname,$dom);
- if ($result ne 'ok') {
- $errors .= ''.
- &mt('An error occurred storing the new custom role: [_1]',
- $result).'';
- next;
- } else {
- $changedprivs{$rolename} = \%newprivs;
- $newrole = $rolename;
- }
- } else {
- $prefix = 'helproles_'.$num;
- $rolename = $env{'form.'.$prefix};
- next if ($rolename eq '');
- next unless (exists($existing{'rolesdef_'.$rolename}));
- $identifier = 'custhelp'.$num;
- my %newprivs = &Apache::lonuserutils::custom_role_update($rolename,$identifier);
- my %currprivs;
- ($currprivs{'s'},$currprivs{'d'},$currprivs{'c'}) =
- split(/\_/,$existing{'rolesdef_'.$rolename});
- foreach my $level ('c','d','s') {
- if ($newprivs{$level} ne $currprivs{$level}) {
- my $result = &Apache::lonnet::definerole($rolename,$newprivs{'s'},$newprivs{'d'},
- $newprivs{'c'},$confname,$dom);
- if ($result ne 'ok') {
- $errors .= ''.
- &mt('An error occurred storing privileges for existing role [_1]: [_2]',
- $rolename,$result).'';
- } else {
- $changedprivs{$rolename} = \%newprivs;
- }
- last;
- }
- }
- if (ref($current{'adhoc'}) eq 'HASH') {
- if (ref($current{'adhoc'}{$rolename}) eq 'HASH') {
- %curr = %{$current{'adhoc'}{$rolename}};
- }
- }
- }
- my $newpos = $env{'form.'.$prefix.'_pos'};
- $newpos =~ s/\D+//g;
- $allpos[$newpos] = $rolename;
- my $newdesc = $env{'form.'.$prefix.'_desc'};
- $helphash{'helpsettings'}{'adhoc'}{$rolename}{'desc'} = $newdesc;
- if ($curr{'desc'}) {
- if ($curr{'desc'} ne $newdesc) {
- $changes{'customrole'}{$rolename}{'desc'} = 1;
- $newsettings{$rolename}{'desc'} = $newdesc;
- }
- } elsif ($newdesc ne '') {
- $changes{'customrole'}{$rolename}{'desc'} = 1;
- $newsettings{$rolename}{'desc'} = $newdesc;
- }
- my $access = $env{'form.'.$prefix.'_access'};
- if (grep(/^\Q$access\E$/,@accesstypes)) {
- $helphash{'helpsettings'}{'adhoc'}{$rolename}{'access'} = $access;
- if ($access eq 'status') {
- my @statuses = &Apache::loncommon::get_env_multiple('form.'.$prefix.'_status');
- if (scalar(@statuses) == 0) {
- $helphash{'helpsettings'}{'adhoc'}{$rolename}{'access'} = 'none';
- } else {
- my (@shownstatus,$numtypes);
- $helphash{'helpsettings'}{'adhoc'}{$rolename}{$access} = [];
- if (ref($types) eq 'ARRAY') {
- $numtypes = scalar(@{$types});
- foreach my $type (sort(@statuses)) {
- if ($type eq 'default') {
- push(@{$helphash{'helpsettings'}{'adhoc'}{$rolename}{$access}},$type);
- } elsif (grep(/^\Q$type\E$/,@{$types})) {
- push(@{$helphash{'helpsettings'}{'adhoc'}{$rolename}{$access}},$type);
- push(@shownstatus,$usertypes->{$type});
- }
- }
- }
- if (grep(/^default$/,@statuses)) {
- push(@shownstatus,$othertitle);
- }
- if (scalar(@shownstatus) == 1+$numtypes) {
- $helphash{'helpsettings'}{'adhoc'}{$rolename}{'access'} = 'all';
- delete($helphash{'helpsettings'}{'adhoc'}{$rolename}{'status'});
- } else {
- $newsettings{$rolename}{'status'} = join(' '.&mt('or').' ',@shownstatus);
- if (ref($curr{'status'}) eq 'ARRAY') {
- my @diffs = &Apache::loncommon::compare_arrays($helphash{'helpsettings'}{'adhoc'}{$rolename}{$access},$curr{$access});
- if (@diffs) {
- $changes{'customrole'}{$rolename}{$access} = 1;
- }
- } elsif (@{$helphash{'helpsettings'}{'adhoc'}{$rolename}{$access}}) {
- $changes{'customrole'}{$rolename}{$access} = 1;
- }
- }
- }
- } elsif (($access eq 'inc') || ($access eq 'exc')) {
- my @personnel = &Apache::loncommon::get_env_multiple('form.'.$prefix.'_staff_'.$access);
- my @newspecstaff;
- $helphash{'helpsettings'}{'adhoc'}{$rolename}{$access} = [];
- foreach my $person (sort(@personnel)) {
- if ($domhelpdesk{$person}) {
- push(@{$helphash{'helpsettings'}{'adhoc'}{$rolename}{$access}},$person);
+ foreach my $item (@toggles) {
+ if ($defaultchecked{$item} eq 'on') {
+ if ($domconfig{'helpsettings'}{$item} eq '') {
+ if ($env{'form.'.$item} eq '0') {
+ $changes{$item} = 1;
}
+ } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {
+ $changes{$item} = 1;
}
- if (ref($curr{$access}) eq 'ARRAY') {
- my @diffs = &Apache::loncommon::compare_arrays($helphash{'helpsettings'}{'adhoc'}{$rolename}{$access},$curr{$access});
- if (@diffs) {
- $changes{'customrole'}{$rolename}{$access} = 1;
+ } elsif ($defaultchecked{$item} eq 'off') {
+ if ($domconfig{'helpsettings'}{$item} eq '') {
+ if ($env{'form.'.$item} eq '1') {
+ $changes{$item} = 1;
}
- } elsif (@{$helphash{'helpsettings'}{'adhoc'}{$rolename}{$access}}) {
- $changes{'customrole'}{$rolename}{$access} = 1;
- }
- foreach my $person (@{$helphash{'helpsettings'}{'adhoc'}{$rolename}{$access}}) {
- my ($uname,$udom) = split(/:/,$person);
- push(@newspecstaff,&Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom,'lastname'),$uname,$udom));
+ } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {
+ $changes{$item} = 1;
}
- $newsettings{$rolename}{$access} = join(', ',sort(@newspecstaff));
}
- } else {
- $helphash{'helpsettings'}{'adhoc'}{$rolename}{'access'}= 'all';
- }
- unless ($curr{'access'} eq $access) {
- $changes{'customrole'}{$rolename}{'access'} = 1;
- $newsettings{$rolename}{'access'} = $lt{$helphash{'helpsettings'}{'adhoc'}{$rolename}{'access'}};
- }
- }
- if (@allpos > 0) {
- my $idx = 0;
- foreach my $rolename (@allpos) {
- if ($rolename ne '') {
- $helphash{'helpsettings'}{'adhoc'}{$rolename}{'order'} = $idx;
- if (ref($current{'adhoc'}) eq 'HASH') {
- if (ref($current{'adhoc'}{$rolename}) eq 'HASH') {
- if ($current{'adhoc'}{$rolename}{'order'} ne $idx) {
- $changes{'customrole'}{$rolename}{'order'} = 1;
- $newsettings{$rolename}{'order'} = $idx+1;
- }
- }
- }
- $idx ++;
+ if (($env{'form.'.$item} eq '0') || ($env{'form.'.$item} eq '1')) {
+ $helphash{'helpsettings'}{$item} = $env{'form.'.$item};
}
}
}
@@ -13676,115 +11249,25 @@ sub modify_helpsettings {
if (keys(%changes) > 0) {
$putresult = &Apache::lonnet::put_dom('configuration',\%helphash,$dom);
if ($putresult eq 'ok') {
- if (ref($helphash{'helpsettings'}) eq 'HASH') {
- $domdefaults{'submitbugs'} = $helphash{'helpsettings'}{'submitbugs'};
- if (ref($helphash{'helpsettings'}{'adhoc'}) eq 'HASH') {
- $domdefaults{'adhocroles'} = $helphash{'helpsettings'}{'adhoc'};
- }
- }
- my $cachetime = 24*60*60;
- &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
- if (ref($lastactref) eq 'HASH') {
- $lastactref->{'domdefaults'} = 1;
- }
- } else {
- $errors .= ''.
- &mt('An error occurred storing the settings: [_1]',
- $putresult).'';
- }
- }
- if ((keys(%changes) && ($putresult eq 'ok')) || (keys(%changedprivs))) {
- $resulttext = &mt('Changes made:').'';
- my (%shownprivs,@levelorder);
- @levelorder = ('c','d','s');
- if ((keys(%changes)) && ($putresult eq 'ok')) {
+ $resulttext = &mt('Changes made:').'';
foreach my $item (sort(keys(%changes))) {
if ($item eq 'submitbugs') {
$resulttext .= '- '.&mt('Display link to: [_1] set to "'.$offon[$env{'form.'.$item}].'".',
&Apache::loncommon::modal_link('http://bugs.loncapa.org',
&mt('LON-CAPA bug tracker'),600,500)).'
';
- } elsif ($item eq 'customrole') {
- if (ref($changes{'customrole'}) eq 'HASH') {
- my @keyorder = ('order','desc','access','status','exc','inc');
- my %keytext = &Apache::lonlocal::texthash(
- order => 'Order',
- desc => 'Role description',
- access => 'Role usage',
- status => 'Allowed institutional types',
- exc => 'Allowed personnel',
- inc => 'Disallowed personnel',
- );
- foreach my $role (sort(keys(%{$changes{'customrole'}}))) {
- if (ref($changes{'customrole'}{$role}) eq 'HASH') {
- if ($role eq $newrole) {
- $resulttext .= '- '.&mt('New custom role added: [_1]',
- $role).'
';
- } else {
- $resulttext .= '- '.&mt('Existing custom role modified: [_1]',
- $role).'
';
- }
- foreach my $key (@keyorder) {
- if ($changes{'customrole'}{$role}{$key}) {
- $resulttext .= '- '.&mt("[_1] set to: [_2]",
- $keytext{$key},$newsettings{$role}{$key}).
- '
';
- }
- }
- if (ref($changedprivs{$role}) eq 'HASH') {
- $shownprivs{$role} = 1;
- $resulttext .= '- '.&mt('Privileges set to :').'
';
- foreach my $level (@levelorder) {
- foreach my $item (split(/\:/,$changedprivs{$role}{$level})) {
- next if ($item eq '');
- my ($priv) = split(/\&/,$item,2);
- if (&Apache::lonnet::plaintext($priv)) {
- $resulttext .= '- '.&Apache::lonnet::plaintext($priv);
- unless ($level eq 'c') {
- $resulttext .= ' ('.$lt{$level}.')';
- }
- $resulttext .= '
';
- }
- }
- }
- $resulttext .= ' ';
- }
- $resulttext .= ' ';
- }
- }
- }
- }
- }
- }
- if (keys(%changedprivs)) {
- foreach my $role (sort(keys(%changedprivs))) {
- unless ($shownprivs{$role}) {
- $resulttext .= '- '.&mt('Existing custom role modified: [_1]',
- $role).'
'.
- '- '.&mt('Privileges set to :').'
';
- foreach my $level (@levelorder) {
- foreach my $item (split(/\:/,$changedprivs{$role}{$level})) {
- next if ($item eq '');
- my ($priv) = split(/\&/,$item,2);
- if (&Apache::lonnet::plaintext($priv)) {
- $resulttext .= '- '.&Apache::lonnet::plaintext($priv);
- unless ($level eq 'c') {
- $resulttext .= ' ('.$lt{$level}.')';
- }
- $resulttext .= '
';
- }
- }
- }
- $resulttext .= ' ';
}
}
+ $resulttext .= ' ';
+ } else {
+ $resulttext = &mt('No changes made to help settings');
+ $errors .= ' - '.
+ &mt('An error occurred storing the settings: [_1]',
+ $putresult).'
';
}
- $resulttext .= ' ';
- } else {
- $resulttext = &mt('No changes made to help settings');
}
if ($errors) {
$resulttext .= ' '.&mt('The following errors occurred: ').'';
+ $errors.' ';
}
return $resulttext;
}
@@ -13793,25 +11276,20 @@ sub modify_coursedefaults {
my ($dom,$lastactref,%domconfig) = @_;
my ($resulttext,$errors,%changes,%defaultshash);
my %defaultchecked = (
+ 'canuse_pdfforms' => 'off',
'uselcmath' => 'on',
'usejsme' => 'on'
);
- my @toggles = ('uselcmath','usejsme');
+ my @toggles = ('canuse_pdfforms','uselcmath','usejsme');
my @numbers = ('anonsurvey_threshold','uploadquota_official','uploadquota_unofficial',
- 'uploadquota_community','uploadquota_textbook','mysqltables_official',
- 'mysqltables_unofficial','mysqltables_community','mysqltables_textbook');
+ 'uploadquota_community','uploadquota_textbook');
my @types = ('official','unofficial','community','textbook');
my %staticdefaults = (
anonsurvey_threshold => 10,
uploadquota => 500,
postsubmit => 60,
- mysqltables => 172800,
);
- my %texoptions = (
- MathJax => 'MathJax',
- mimetex => &mt('Convert to Images'),
- tth => &mt('TeX to HTML'),
- );
+
$defaultshash{'coursedefaults'} = {};
if (ref($domconfig{'coursedefaults'}) ne 'HASH') {
@@ -13850,41 +11328,26 @@ sub modify_coursedefaults {
}
$defaultshash{'coursedefaults'}{$item} = $newdef;
} else {
- my ($setting,$type) = ($item =~ /^(uploadquota|mysqltables)_(\w+)$/);
- if (ref($domconfig{'coursedefaults'}{$setting}) eq 'HASH') {
- $currdef = $domconfig{'coursedefaults'}{$setting}{$type};
+ my ($type) = ($item =~ /^\Quploadquota_\E(\w+)$/);
+ if (ref($domconfig{'coursedefaults'}{'uploadquota'}) eq 'HASH') {
+ $currdef = $domconfig{'coursedefaults'}{'uploadquota'}{$type};
}
$newdef =~ s/[^\w.\-]//g;
- $defaultshash{'coursedefaults'}{$setting}{$type} = $newdef;
+ $defaultshash{'coursedefaults'}{'uploadquota'}{$type} = $newdef;
}
if ($currdef ne $newdef) {
+ my $staticdef;
if ($item eq 'anonsurvey_threshold') {
unless (($currdef eq '') && ($newdef == $staticdefaults{$item})) {
$changes{$item} = 1;
}
- } elsif ($item =~ /^(uploadquota|mysqltables)_/) {
- my $setting = $1;
- unless (($currdef eq '') && ($newdef == $staticdefaults{$setting})) {
- $changes{$setting} = 1;
+ } else {
+ unless (($currdef eq '') && ($newdef == $staticdefaults{'uploadquota'})) {
+ $changes{'uploadquota'} = 1;
}
}
}
}
- my $texengine;
- if ($env{'form.texengine'} =~ /^(MathJax|mimetex|tth)$/) {
- $texengine = $env{'form.texengine'};
- my $currdef = $domconfig{'coursedefaults'}{'texengine'};
- if ($currdef eq '') {
- unless ($texengine eq $Apache::lonnet::deftex) {
- $changes{'texengine'} = 1;
- }
- } elsif ($currdef ne $texengine) {
- $changes{'texengine'} = 1;
- }
- }
- if ($texengine ne '') {
- $defaultshash{'coursedefaults'}{'texengine'} = $texengine;
- }
my $currclone = $domconfig{'coursedefaults'}{'canclone'};
my @currclonecode;
if (ref($currclone) eq 'HASH') {
@@ -13893,7 +11356,7 @@ sub modify_coursedefaults {
}
}
my $newclone;
- if ($env{'form.canclone'} =~ /^(none|domain|instcode)$/) {
+ if ($env{'form.canclone'} =~ /^(none|domain|instcode)$/) {
$newclone = $env{'form.canclone'};
}
if ($newclone eq 'instcode') {
@@ -13916,8 +11379,8 @@ sub modify_coursedefaults {
$newclone eq '';
}
} elsif ($newclone ne '') {
- $defaultshash{'coursedefaults'}{'canclone'} = $newclone;
- }
+ $defaultshash{'coursedefaults'}{'canclone'} = $newclone;
+ }
if ($newclone ne $currclone) {
$changes{'canclone'} = 1;
}
@@ -13935,10 +11398,10 @@ sub modify_coursedefaults {
$defaultshash{'coursedefaults'}{'coursecredits'}{$type} = $credits{$type};
}
} else {
- if ($env{'form.coursecredits'} eq '1') {
+ if ($env{'form.coursecredits'} eq '1') {
foreach my $type (@types) {
unless ($type eq 'community') {
- if ($domconfig{'coursedefaults'}{'coursecredits'}{$type} ne $credits{$type}) {
+ if ($domconfig{'coursedefaults'}{'coursecredits'}{$type} ne $credits{$type}) {
$changes{'coursecredits'} = 1;
}
$defaultshash{'coursedefaults'}{'coursecredits'}{$type} = $credits{$type};
@@ -13981,7 +11444,7 @@ sub modify_coursedefaults {
}
if (exists($currtimeout{$type})) {
if ($timeout ne $currtimeout{$type}) {
- $changes{'postsubmit'} = 1;
+ $changes{'postsubmit'} = 1;
}
} elsif ($timeout ne '') {
$changes{'postsubmit'} = 1;
@@ -14003,14 +11466,14 @@ sub modify_coursedefaults {
if ($putresult eq 'ok') {
if (keys(%changes) > 0) {
my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
- if (($changes{'uploadquota'}) || ($changes{'postsubmit'}) ||
+ if (($changes{'canuse_pdfforms'}) || ($changes{'uploadquota'}) || ($changes{'postsubmit'}) ||
($changes{'coursecredits'}) || ($changes{'uselcmath'}) || ($changes{'usejsme'}) ||
- ($changes{'canclone'}) || ($changes{'mysqltables'}) || ($changes{'texengine'})) {
- foreach my $item ('uselcmath','usejsme','texengine') {
+ ($changes{'canclone'})) {
+ foreach my $item ('canuse_pdfforms','uselcmath','usejsme') {
if ($changes{$item}) {
$domdefaults{$item}=$defaultshash{'coursedefaults'}{$item};
}
- }
+ }
if ($changes{'coursecredits'}) {
if (ref($defaultshash{'coursedefaults'}{'coursecredits'}) eq 'HASH') {
foreach my $type (keys(%{$defaultshash{'coursedefaults'}{'coursecredits'}})) {
@@ -14057,7 +11520,13 @@ sub modify_coursedefaults {
}
$resulttext = &mt('Changes made:').'';
foreach my $item (sort(keys(%changes))) {
- if ($item eq 'uselcmath') {
+ if ($item eq 'canuse_pdfforms') {
+ if ($env{'form.'.$item} eq '1') {
+ $resulttext .= '- '.&mt("Course/Community users can create/upload PDF forms set to 'on'").'
';
+ } else {
+ $resulttext .= '- '.&mt('Course/Community users can create/upload PDF forms set to "off"').'
';
+ }
+ } elsif ($item eq 'uselcmath') {
if ($env{'form.'.$item} eq '1') {
$resulttext .= '- '.&mt('Math preview uses LON-CAPA previewer (javascript), if supported by browser.').'
';
} else {
@@ -14067,12 +11536,7 @@ sub modify_coursedefaults {
if ($env{'form.'.$item} eq '1') {
$resulttext .= '- '.&mt('Molecule editor uses JSME (HTML5), if supported by browser.').'
';
} else {
- $resulttext .= '- '.&mt('Molecule editor uses JME (Java), if supported by client OS.').'
';
- }
- } elsif ($item eq 'texengine') {
- if ($defaultshash{'coursedefaults'}{'texengine'} ne '') {
- $resulttext .= '- '.&mt('Default method to display mathematics set to: "[_1]"',
- $texoptions{$defaultshash{'coursedefaults'}{'texengine'}}).'
';
+ $resulttext .= '- '.&mt('Molecule editor uses JME (Java), if supported by client OS.').'
';
}
} elsif ($item eq 'anonsurvey_threshold') {
$resulttext .= '- '.&mt('Responder count required for display of anonymous survey submissions set to [_1].',$defaultshash{'coursedefaults'}{'anonsurvey_threshold'}).'
';
@@ -14089,24 +11553,12 @@ sub modify_coursedefaults {
} else {
$resulttext .= '- '.&mt('Default quota for content uploaded via Course Editor remains default: [_1] MB',$staticdefaults{'uploadquota'}).'
';
}
- } elsif ($item eq 'mysqltables') {
- if (ref($defaultshash{'coursedefaults'}{'mysqltables'}) eq 'HASH') {
- $resulttext .= '- '.&mt('Lifetime of "Temporary" MySQL tables (student performance data) on homeserver').'
'.
- '- '.&mt('Official courses: [_1] s',''.$defaultshash{'coursedefaults'}{'mysqltables'}{'official'}.'').'
'.
- '- '.&mt('Unofficial courses: [_1] s',''.$defaultshash{'coursedefaults'}{'mysqltables'}{'unofficial'}.'').'
'.
- '- '.&mt('Textbook courses: [_1] s',''.$defaultshash{'coursedefaults'}{'mysqltables'}{'textbook'}.'').'
'.
- '- '.&mt('Communities: [_1] s',''.$defaultshash{'coursedefaults'}{'mysqltables'}{'community'}.'').'
'.
- ' '.
- ' ';
- } else {
- $resulttext .= '- '.&mt('Lifetime of "Temporary" MySQL tables (student performance data) on homeserver remains default: [_1] s',$staticdefaults{'uploadquota'}).'
';
- }
} elsif ($item eq 'postsubmit') {
if ($domdefaults{'postsubmit'} eq 'off') {
$resulttext .= '- '.&mt('Submit button(s) remain enabled on page after student makes submission.');
} else {
$resulttext .= '
- '.&mt('Submit button(s) disabled on page after student makes submission').'; ';
- if (ref($defaultshash{'coursedefaults'}{'postsubmit'}) eq 'HASH') {
+ if (ref($defaultshash{'coursedefaults'}{'postsubmit'}) eq 'HASH') {
$resulttext .= &mt('durations:').'
';
foreach my $type (@types) {
$resulttext .= '- ';
@@ -14135,7 +11587,7 @@ sub modify_coursedefaults {
}
$resulttext .= '
';
}
- $resulttext .= ' ';
+ $resulttext .= '';
}
} elsif ($item eq 'coursecredits') {
if (ref($defaultshash{'coursedefaults'}{'coursecredits'}) eq 'HASH') {
@@ -14163,7 +11615,7 @@ sub modify_coursedefaults {
} elsif ($defaultshash{'coursedefaults'}{'canclone'} eq 'domain') {
$resulttext .= '- '.&mt('By default, a course requester can clone any course from his/her domain.').'
';
} else {
- $resulttext .= '- '.&mt('By default, only course owner and coordinators may clone a course.').'
';
+ $resulttext .= '- '.&mt('By default, only course owner and coordinators may clone a course.').'
';
}
}
}
@@ -14398,12 +11850,12 @@ sub modify_selfenrollment {
$resulttext .= ' ';
}
}
- }
- if ((exists($changes{'admin'})) || (exists($changes{'default'}))) {
- my $cachetime = 24*60*60;
- &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
- if (ref($lastactref) eq 'HASH') {
- $lastactref->{'domdefaults'} = 1;
+ if ((exists($changes{'admin'})) || (exists($changes{'default'}))) {
+ my $cachetime = 24*60*60;
+ &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
+ if (ref($lastactref) eq 'HASH') {
+ $lastactref->{'domdefaults'} = 1;
+ }
}
}
$resulttext .= '';
@@ -14618,7 +12070,7 @@ sub modify_usersessions {
}
}
unless ($changes{'offloadnow'}) {
- foreach my $lonhost (keys(%{$defaultshash{'usersessions'}{'offloadnow'}})) {
+ foreach my $lonhost (keys(%{$defaultshash{'usersessions'}{'offloadnow'}})) {
unless ($domconfig{'usersessions'}{'offloadnow'}{$lonhost}) {
$changes{'offloadnow'} = 1;
last;
@@ -14649,10 +12101,8 @@ sub modify_usersessions {
}
my $cachetime = 24*60*60;
&Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
- &Apache::lonnet::do_cache_new('usersessions',$dom,$defaultshash{'usersessions'},3600);
if (ref($lastactref) eq 'HASH') {
$lastactref->{'domdefaults'} = 1;
- $lastactref->{'usersessions'} = 1;
}
if (keys(%changes) > 0) {
my %lt = &usersession_titles();
@@ -14756,12 +12206,12 @@ sub modify_loadbalancing {
my @sparestypes = ('primary','default');
my %typetitles = &sparestype_titles();
my $resulttext;
- my (%currbalancer,%currtargets,%currrules,%existing,%currcookies);
+ my (%currbalancer,%currtargets,%currrules,%existing);
if (ref($domconfig{'loadbalancing'}) eq 'HASH') {
%existing = %{$domconfig{'loadbalancing'}};
}
&get_loadbalancers_config(\%servers,\%existing,\%currbalancer,
- \%currtargets,\%currrules,\%currcookies);
+ \%currtargets,\%currrules);
my ($saveloadbalancing,%defaultshash,%changes);
my ($alltypes,$othertypes,$titles) =
&loadbalancing_titles($dom,$intdom,$usertypes,$types);
@@ -14805,24 +12255,7 @@ sub modify_loadbalancing {
push(@offloadto,$target);
}
}
- }
- if ($env{'form.loadbalancing_target_'.$i.'_hosthere'} eq $sparetype) {
- unless(grep(/^\Q$balancer\E$/,@offloadto)) {
- push(@offloadto,$balancer);
- }
- }
- $defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype} = \@offloadto;
- }
- if ($env{'form.loadbalancing_cookie_'.$i}) {
- $defaultshash{'loadbalancing'}{$balancer}{'cookie'} = 1;
- if (exists($currbalancer{$balancer})) {
- unless ($currcookies{$balancer}) {
- $changes{'curr'}{$balancer}{'cookie'} = 1;
- }
- }
- } elsif (exists($currbalancer{$balancer})) {
- if ($currcookies{$balancer}) {
- $changes{'curr'}{$balancer}{'cookie'} = 1;
+ $defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype} = \@offloadto;
}
}
if (ref($currtargets{$balancer}) eq 'HASH') {
@@ -14862,7 +12295,7 @@ sub modify_loadbalancing {
}
if ($rule eq 'specific') {
my $specifiedhost = $env{'form.loadbalancing_singleserver_'.$i.'_'.$type};
- if (exists($servers{$specifiedhost})) {
+ if (exists($servers{$specifiedhost})) {
$rule = $specifiedhost;
}
}
@@ -14938,7 +12371,7 @@ sub modify_loadbalancing {
if ($rule eq '') {
$balancetext = $ruletitles{'default'};
} elsif (($rule eq 'homeserver') || ($rule eq 'externalbalancer') ||
- ($type eq '_LC_ipchange') || ($type eq '_LC_ipchangesso')) {
+ ($type eq '_LC_ipchange') || ($type eq '_LC_ipchangesso')) {
if (($type eq '_LC_ipchange') || ($type eq '_LC_ipchangesso')) {
foreach my $sparetype (@sparestypes) {
if (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}) eq 'ARRAY') {
@@ -14978,10 +12411,6 @@ sub modify_loadbalancing {
}
}
}
- if ($changes{'curr'}{$balancer}{'cookie'}) {
- $resulttext .= ''.&mt('Load Balancer: [_1] -- cookie use enabled',
- $balancer).'';
- }
if (keys(%toupdate)) {
my %thismachine;
my $updatedhere;
@@ -15061,9 +12490,24 @@ sub recurse_cat_deletes {
return;
}
+sub get_active_dcs {
+ my ($dom) = @_;
+ my $now = time;
+ my %dompersonnel = &Apache::lonnet::get_domain_roles($dom,['dc'],$now,$now);
+ my %domcoords;
+ my $numdcs = 0;
+ foreach my $server (keys(%dompersonnel)) {
+ foreach my $user (sort(keys(%{$dompersonnel{$server}}))) {
+ my ($trole,$uname,$udom,$runame,$rudom,$rsec) = split(/:/,$user);
+ $domcoords{$uname.':'.$udom} = $dompersonnel{$server}{$user};
+ }
+ }
+ return %domcoords;
+}
+
sub active_dc_picker {
my ($dom,$numinrow,$inputtype,$name,%currhash) = @_;
- my %domcoords = &Apache::lonnet::get_active_domroles($dom,['dc']);
+ my %domcoords = &get_active_dcs($dom);
my @domcoord = keys(%domcoords);
if (keys(%currhash)) {
foreach my $dc (keys(%currhash)) {
@@ -15211,12 +12655,12 @@ sub lonbalance_targets_js {
}
push(@alltypes,'default','_LC_adv','_LC_author','_LC_internetdom','_LC_external');
$allinsttypes = join("','",@alltypes);
- my (%currbalancer,%currtargets,%currrules,%existing,%currcookies);
+ my (%currbalancer,%currtargets,%currrules,%existing);
if (ref($settings) eq 'HASH') {
%existing = %{$settings};
}
&get_loadbalancers_config($servers,\%existing,\%currbalancer,
- \%currtargets,\%currrules,\%currcookies);
+ \%currtargets,\%currrules);
my $balancers = join("','",sort(keys(%currbalancer)));
return <<"END";
@@ -15669,7 +13113,7 @@ function updateCaptcha(caller,context) {
privtext.innerHTML = "$lt{'priv'}";
versionitem.type = 'text';
versionitem.size = '3';
- versiontext.innerHTML = "$lt{'ver'}";
+ versiontext.innerHTML = "$lt{'ver'}";
} else {
pubitem.type = 'hidden';
privitem.type = 'hidden';
@@ -15701,7 +13145,6 @@ function toggleDisplay(domForm,caller) {
var optionsElement = domForm.coursecredits;
var checkval = 1;
var dispval = 'block';
- var selfcreateRegExp = /^cancreate_emailverified/;
if (caller == 'emailoptions') {
optionsElement = domForm.cancreate_email;
}
@@ -15712,11 +13155,6 @@ function toggleDisplay(domForm,caller) {
optionsElement = domForm.canclone;
checkval = 'instcode';
}
- if (selfcreateRegExp.test(caller)) {
- optionsElement = domForm.elements[caller];
- checkval = 'other';
- dispval = 'inline'
- }
if (optionsElement.length) {
var currval;
for (var i=0; i 'original (CAPTCHA)',
recaptcha => 'successor (ReCAPTCHA)',
notused => 'unused',
- ver => 'ReCAPTCHA version (1 or 2)',
+ ver => 'ReCAPTCHA version (1 or 2)',
);
}
@@ -15758,8 +13196,7 @@ sub devalidate_remote_domconfs {
my %servers = &Apache::lonnet::internet_dom_servers($dom);
my %thismachine;
map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids();
- my @posscached = ('domainconfig','domdefaults','usersessions',
- 'directorysrch','passwdconf','cats');
+ my @posscached = ('domainconfig','domdefaults','ltitools');
if (keys(%servers)) {
foreach my $server (keys(%servers)) {
next if ($thismachine{$server});
|