';
+ '';
+ if ($type eq 'email') {
+ $output .= &mt("Formats disallowed for $text{$type}: ");
+ } else {
+ $output .= &mt("Format rules to check for $text{$type}: ");
+ }
+ $output .= ' '.
+ '';
my $rem;
if (ref($ruleorder) eq 'ARRAY') {
for (my $i=0; $i<@{$ruleorder}; $i++) {
@@ -1532,13 +1815,17 @@ sub usercreation_types {
my %lt = &Apache::lonlocal::texthash (
author => 'When adding a co-author',
course => 'When adding a user to a course',
+ selfcreate => 'User creates own account',
any => 'Any',
official => 'Institutional only ',
unofficial => 'Non-institutional only',
+ email => 'Email address',
+ login => 'Institutional Login',
+ sso => 'SSO',
none => 'None',
);
return %lt;
-}
+}
sub authtype_names {
my %lt = &Apache::lonlocal::texthash(
@@ -1572,7 +1859,7 @@ sub print_usermodification {
$$rowtotal ++;
$rowcount ++;
}
- } else {
+ } elsif ($position eq 'middle') {
$context = 'course';
$rowcount = 0;
foreach my $role ('st','ep','ta','in','cr') {
@@ -1581,17 +1868,673 @@ sub print_usermodification {
$$rowtotal ++;
$rowcount ++;
}
+ } elsif ($position eq 'bottom') {
+ $context = 'selfcreate';
+ my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
+ $usertypes->{'default'} = $othertitle;
+ if (ref($types) eq 'ARRAY') {
+ push(@{$types},'default');
+ $usertypes->{'default'} = $othertitle;
+ foreach my $status (@{$types}) {
+ $datatable .= &modifiable_userdata_row($context,$status,$settings,
+ $numinrow,$rowcount,$usertypes);
+ $$rowtotal ++;
+ $rowcount ++;
+ }
+ }
}
return $datatable;
}
+sub print_defaults {
+ my ($dom,$rowtotal) = @_;
+ my @items = ('auth_def','auth_arg_def','lang_def','timezone_def',
+ 'datelocale_def');
+ my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
+ my $titles = &defaults_titles();
+ my $rownum = 0;
+ my ($datatable,$css_class);
+ foreach my $item (@items) {
+ if ($rownum%2) {
+ $css_class = '';
+ } else {
+ $css_class = ' class="LC_odd_row" ';
+ }
+ $datatable .= ''.
+ ''.$titles->{$item}.
+ ' ';
+ if ($item eq 'auth_def') {
+ my @authtypes = ('internal','krb4','krb5','localauth');
+ my %shortauth = (
+ internal => 'int',
+ krb4 => 'krb4',
+ krb5 => 'krb5',
+ localauth => 'loc'
+ );
+ my %authnames = &authtype_names();
+ foreach my $auth (@authtypes) {
+ my $checked = ' ';
+ if ($domdefaults{$item} eq $auth) {
+ $checked = ' checked="checked" ';
+ }
+ $datatable .= ' '.
+ $authnames{$shortauth{$auth}}.' ';
+ }
+ } elsif ($item eq 'timezone_def') {
+ my $includeempty = 1;
+ $datatable .= &Apache::loncommon::select_timezone($item,$domdefaults{$item},undef,$includeempty);
+ } elsif ($item eq 'datelocale_def') {
+ my $includeempty = 1;
+ $datatable .= &Apache::loncommon::select_datelocale($item,$domdefaults{$item},undef,$includeempty);
+ } else {
+ $datatable .= ' ';
+ }
+ $datatable .= ' ';
+ $rownum ++;
+ }
+ $$rowtotal += $rownum;
+ return $datatable;
+}
+
+sub defaults_titles {
+ my %titles = &Apache::lonlocal::texthash (
+ 'auth_def' => 'Default authentication type',
+ 'auth_arg_def' => 'Default authentication argument',
+ 'lang_def' => 'Default language',
+ 'timezone_def' => 'Default timezone',
+ 'datelocale_def' => 'Default locale for dates',
+ );
+ return (\%titles);
+}
+
+sub print_scantronformat {
+ my ($r,$dom,$confname,$settings,$rowtotal) = @_;
+ my $itemcount = 1;
+ my ($datatable,$css_class,$scantronurl,$is_custom,%error,%scantronurls,
+ %confhash);
+ my $switchserver = &check_switchserver($dom,$confname);
+ my %lt = &Apache::lonlocal::texthash (
+ default => 'Default scantron format file error',
+ custom => 'Custom scantron format file error',
+ );
+ my %scantronfiles = (
+ default => 'default.tab',
+ custom => 'custom.tab',
+ );
+ foreach my $key (keys(%scantronfiles)) {
+ $scantronurls{$key} = '/res/'.$dom.'/'.$confname.'/scantron/'
+ .$scantronfiles{$key};
+ }
+ my @defaultinfo = &Apache::lonnet::stat_file($scantronurls{'default'});
+ if ((!@defaultinfo) || ($defaultinfo[0] eq 'no_such_dir')) {
+ if (!$switchserver) {
+ my $servadm = $r->dir_config('lonAdmEMail');
+ my ($configuserok,$author_ok) = &config_check($dom,$confname,$servadm);
+ 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',
+ );
+ my %md5chk;
+ foreach my $type (keys(%legacyfile)) {
+ ($md5chk{$type}) = split(/ /,`md5sum $legacyfile{$type}`);
+ chomp($md5chk{$type});
+ }
+ if ($md5chk{'default'} ne $md5chk{'custom'}) {
+ foreach my $type (keys(%legacyfile)) {
+ ($scantronurls{$type},my $error) =
+ &legacy_scantronformat($r,$dom,$confname,
+ $type,$legacyfile{$type},
+ $scantronurls{$type},
+ $scantronfiles{$type});
+ if ($error ne '') {
+ $error{$type} = $error;
+ }
+ }
+ if (keys(%error) == 0) {
+ $is_custom = 1;
+ $confhash{'scantron'}{'scantronformat'} =
+ $scantronurls{'custom'};
+ my $putresult =
+ &Apache::lonnet::put_dom('configuration',
+ \%confhash,$dom);
+ if ($putresult ne 'ok') {
+ $error{'custom'} =
+ ''.
+ &mt('An error occurred updating the domain configuration: [_1]',$putresult).' ';
+ }
+ }
+ } else {
+ ($scantronurls{'default'},my $error) =
+ &legacy_scantronformat($r,$dom,$confname,
+ 'default',$legacyfile{'default'},
+ $scantronurls{'default'},
+ $scantronfiles{'default'});
+ if ($error eq '') {
+ $confhash{'scantron'}{'scantronformat'} = '';
+ my $putresult =
+ &Apache::lonnet::put_dom('configuration',
+ \%confhash,$dom);
+ if ($putresult ne 'ok') {
+ $error{'default'} =
+ ''.
+ &mt('An error occurred updating the domain configuration: [_1]',$putresult).' ';
+ }
+ } else {
+ $error{'default'} = $error;
+ }
+ }
+ }
+ }
+ } else {
+ $error{'default'} = &mt("Unable to copy default scantron formatfile to domain's RES space: [_1]",$switchserver);
+ }
+ }
+ if (ref($settings) eq 'HASH') {
+ if ($settings->{'scantronformat'} eq "/res/$dom/$confname/scantron/custom.tab") {
+ my @info = &Apache::lonnet::stat_file($settings->{'scantronformat'});
+ if ((!@info) || ($info[0] eq 'no_such_dir')) {
+ $scantronurl = '';
+ } else {
+ $scantronurl = $settings->{'scantronformat'};
+ }
+ $is_custom = 1;
+ } else {
+ $scantronurl = $scantronurls{'default'};
+ }
+ } else {
+ if ($is_custom) {
+ $scantronurl = $scantronurls{'custom'};
+ } else {
+ $scantronurl = $scantronurls{'default'};
+ }
+ }
+ $css_class = $itemcount%2?' class="LC_odd_row"':'';
+ $datatable .= '';
+ if (!$is_custom) {
+ $datatable .= ''.&mt('Default in use:').' '.
+ '';
+ if ($scantronurl) {
+ $datatable .= ''.
+ &mt('Default scantron format file').' ';
+ } else {
+ $datatable = &mt('File unavailable for display');
+ }
+ $datatable .= ' ';
+ if (keys(%error) == 0) {
+ $datatable .= '';
+ if (!$switchserver) {
+ $datatable .= &mt('Upload:').' ';
+ }
+ } else {
+ my $errorstr;
+ foreach my $key (sort(keys(%error))) {
+ $errorstr .= $lt{$key}.': '.$error{$key}.' ';
+ }
+ $datatable .= ' '.$errorstr;
+ }
+ } else {
+ if (keys(%error) > 0) {
+ my $errorstr;
+ foreach my $key (sort(keys(%error))) {
+ $errorstr .= $lt{$key}.': '.$error{$key}.' ';
+ }
+ $datatable .= ' '.$errorstr.' ';
+ } elsif ($scantronurl) {
+ $datatable .= ' '.
+ ''.
+ &mt('Custom scantron format file').' '.
+ ' '.&mt('Delete?').' '.
+ ' '.
+ &mt('Replace:').' ';
+ }
+ }
+ if (keys(%error) == 0) {
+ if ($switchserver) {
+ $datatable .= &mt('Upload to library server: [_1]',$switchserver);
+ } else {
+ $datatable .=' '.
+ ' ';
+ }
+ }
+ $datatable .= ' ';
+ $$rowtotal ++;
+ return $datatable;
+}
+
+sub legacy_scantronformat {
+ my ($r,$dom,$confname,$file,$legacyfile,$newurl,$newfile) = @_;
+ my ($url,$error);
+ my @statinfo = &Apache::lonnet::stat_file($newurl);
+ if ((!@statinfo) || ($statinfo[0] eq 'no_such_dir')) {
+ (my $result,$url) =
+ &publishlogo($r,'copy',$legacyfile,$dom,$confname,'scantron',
+ '','',$newfile);
+ if ($result ne 'ok') {
+ $error = &mt("An error occurred publishing the [_1] scantron format file in RES space. Error was: [_2].",$newfile,$result);
+ }
+ }
+ return ($url,$error);
+}
+
+sub print_coursecategories {
+ my ($position,$dom,$hdritem,$settings,$rowtotal) = @_;
+ my $datatable;
+ if ($position eq 'top') {
+ my $toggle_cats_crs = ' ';
+ my $toggle_cats_dom = ' checked="checked" ';
+ my $can_cat_crs = ' ';
+ my $can_cat_dom = ' checked="checked" ';
+ if (ref($settings) eq 'HASH') {
+ if ($settings->{'togglecats'} eq 'crs') {
+ $toggle_cats_crs = $toggle_cats_dom;
+ $toggle_cats_dom = ' ';
+ }
+ if ($settings->{'categorize'} eq 'crs') {
+ $can_cat_crs = $can_cat_dom;
+ $can_cat_dom = ' ';
+ }
+ }
+ my %title = &Apache::lonlocal::texthash (
+ togglecats => 'Show/Hide a course in the catalog',
+ categorize => 'Assign a category to a course',
+ );
+ my %level = &Apache::lonlocal::texthash (
+ dom => 'Set in "Modify Course" (Domain)',
+ crs => 'Set in "Modify Parameters" (Course)',
+ );
+ $datatable = ''.
+ ''.$title{'togglecats'}.' '.
+ ''.
+ ' '.$level{'dom'}.' '.
+ ' '.$level{'crs'}.' '.
+ ' '.
+ ''.$title{'categorize'}.' '.
+ ''.
+ ' '.$level{'dom'}.' '.
+ ' '.$level{'crs'}.' '.
+ ' ';
+ $$rowtotal += 2;
+ } else {
+ my $css_class;
+ my $itemcount = 1;
+ my $cathash;
+ if (ref($settings) eq 'HASH') {
+ $cathash = $settings->{'cats'};
+ }
+ if (ref($cathash) eq 'HASH') {
+ my (@cats,@trails,%allitems,%idx,@jsarray);
+ &Apache::loncommon::extract_categories($cathash,\@cats,\@trails,
+ \%allitems,\%idx,\@jsarray);
+ my $maxdepth = scalar(@cats);
+ my $colattrib = '';
+ if ($maxdepth > 2) {
+ $colattrib = ' colspan="2" ';
+ }
+ my @path;
+ if (@cats > 0) {
+ if (ref($cats[0]) eq 'ARRAY') {
+ my $numtop = @{$cats[0]};
+ my $maxnum = $numtop;
+ if ((!grep(/^instcode$/,@{$cats[0]})) || ($cathash->{'instcode::0'} eq '')) {
+ $maxnum ++;
+ }
+ my $lastidx;
+ for (my $i=0; $i<$numtop; $i++) {
+ my $parent = $cats[0][$i];
+ $css_class = $itemcount%2?' class="LC_odd_row"':'';
+ my $item = &escape($parent).'::0';
+ my $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','$item','$idx{$item}'".');"';
+ $lastidx = $idx{$item};
+ $datatable .= ''
+ .'';
+ for (my $k=0; $k<=$maxnum; $k++) {
+ my $vpos = $k+1;
+ my $selstr;
+ if ($k == $i) {
+ $selstr = ' selected="selected" ';
+ }
+ $datatable .= ''.$vpos.' ';
+ }
+ $datatable .= ' ';
+ if ($parent eq 'instcode') {
+ $datatable .= ''.&mt('Official courses')
+ .' ('
+ .&mt('with institutional codes').') '
+ .' '
+ .&mt('Display').' '
+ .' '
+ .&mt('Do not display').' ';
+ } else {
+ $datatable .= $parent
+ .' '.&mt('Delete').' ';
+ }
+ my $depth = 1;
+ push(@path,$parent);
+ $datatable .= &build_category_rows($itemcount,\@cats,$depth,$parent,\@path,\%idx);
+ pop(@path);
+ $datatable .= ' ';
+ $itemcount ++;
+ }
+ $css_class = $itemcount%2?' class="LC_odd_row"':'';
+ my $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','addcategory_pos','$lastidx'".');"';
+ $datatable .= '';
+ for (my $k=0; $k<=$maxnum; $k++) {
+ my $vpos = $k+1;
+ my $selstr;
+ if ($k == $numtop) {
+ $selstr = ' selected="selected" ';
+ }
+ $datatable .= ''.$vpos.' ';
+ }
+ $datatable .= ' '.&mt('Add category:').' '
+ .' '
+ .' '."\n";
+ $itemcount ++;
+ if ((!grep(/^instcode$/,@{$cats[0]})) || ($cathash->{'instcode::0'} eq '')) {
+ $css_class = $itemcount%2?' class="LC_odd_row"':'';
+ my $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','instcode_pos','$lastidx'".');"';
+ $datatable .= ''.
+ '';
+ for (my $k=0; $k<=$maxnum; $k++) {
+ my $vpos = $k+1;
+ my $selstr;
+ if ($k == $maxnum) {
+ $selstr = ' selected="selected" ';
+ }
+ $datatable .= ''.$vpos.' ';
+ }
+ $datatable .= ' '
+ .&mt('Official courses').' '.'('
+ .&mt('with institutional codes').') '
+ .' '
+ .&mt('Display').' '
+ .' '
+ .&mt('Do not display').' ';
+ }
+ }
+ } else {
+ $datatable .= &initialize_categories($itemcount);
+ }
+ } else {
+ $datatable .= ''.$hdritem->{'header'}->[0]->{'col2'}.' '
+ .&initialize_categories($itemcount);
+ }
+ $$rowtotal += $itemcount;
+ }
+ return $datatable;
+}
+
+sub print_serverstatuses {
+ my ($dom,$settings,$rowtotal) = @_;
+ my $datatable;
+ my @pages = &serverstatus_pages();
+ my (%namedaccess,%machineaccess);
+ foreach my $type (@pages) {
+ $namedaccess{$type} = '';
+ $machineaccess{$type}= '';
+ }
+ if (ref($settings) eq 'HASH') {
+ foreach my $type (@pages) {
+ if (exists($settings->{$type})) {
+ if (ref($settings->{$type}) eq 'HASH') {
+ foreach my $key (keys(%{$settings->{$type}})) {
+ if ($key eq 'namedusers') {
+ $namedaccess{$type} = $settings->{$type}->{$key};
+ } elsif ($key eq 'machines') {
+ $machineaccess{$type} = $settings->{$type}->{$key};
+ }
+ }
+ }
+ }
+ }
+ }
+ my $titles= &LONCAPA::loncgi::serverstatus_titles();
+ my $rownum = 0;
+ my $css_class;
+ foreach my $type (@pages) {
+ $rownum ++;
+ $css_class = $rownum%2?' class="LC_odd_row"':'';
+ $datatable .= ''.
+ ''.
+ $titles->{$type}.' '.
+ ''.
+ ' '.
+ ''.
+ ''.
+ ' '.
+ ' '."\n";
+ }
+ $$rowtotal += $rownum;
+ return $datatable;
+}
+
+sub serverstatus_pages {
+ return ('userstatus','lonstatus','loncron','server-status','codeversions',
+ 'clusterstatus','metadata_keywords','metadata_harvest',
+ 'takeoffline','takeonline','showenv');
+}
+
+sub coursecategories_javascript {
+ my ($settings) = @_;
+ my ($output,$jstext,$cathash);
+ if (ref($settings) eq 'HASH') {
+ $cathash = $settings->{'cats'};
+ }
+ if (ref($cathash) eq 'HASH') {
+ my (@cats,@jsarray,%idx);
+ &Apache::loncommon::gather_categories($cathash,\@cats,\%idx,\@jsarray);
+ if (@jsarray > 0) {
+ $jstext = ' var categories = Array('.scalar(@jsarray).');'."\n";
+ for (my $i=0; $i<@jsarray; $i++) {
+ if (ref($jsarray[$i]) eq 'ARRAY') {
+ my $catstr = join('","',@{$jsarray[$i]});
+ $jstext .= ' categories['.$i.'] = Array("'.$catstr.'");'."\n";
+ }
+ }
+ }
+ } else {
+ $jstext = ' var categories = Array(1);'."\n".
+ ' categories[0] = Array("instcode_pos");'."\n";
+ }
+ $output = <<"ENDSCRIPT";
+
+
+ENDSCRIPT
+ return $output;
+}
+
+sub initialize_categories {
+ my ($itemcount) = @_;
+ my $datatable;
+ my $css_class = $itemcount%2?' class="LC_odd_row"':'';
+ my $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','instcode_pos','0'".');"';
+
+ $datatable = ''
+ .'1 '
+ .'2 '
+ .&mt('Official courses (with institutional codes)')
+ .' '
+ .' '
+ .&mt('Display').' '
+ .' '.&mt('Do not display')
+ .' ';
+ $itemcount ++;
+ $css_class = $itemcount%2?' class="LC_odd_row"':'';
+ $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','addcategory_pos','0'".');"';
+ $datatable .= ''
+ .'1 '
+ .'2 '
+ .&mt('Add category').' '.&mt('Name:')
+ .' ';
+ return $datatable;
+}
+
+sub build_category_rows {
+ my ($itemcount,$cats,$depth,$parent,$path,$idx) = @_;
+ my ($text,$name,$item,$chgstr);
+ if (ref($cats) eq 'ARRAY') {
+ my $maxdepth = scalar(@{$cats});
+ if (ref($cats->[$depth]) eq 'HASH') {
+ if (ref($cats->[$depth]{$parent}) eq 'ARRAY') {
+ my $numchildren = @{$cats->[$depth]{$parent}};
+ my $css_class = $itemcount%2?' class="LC_odd_row"':'';
+ $text .= '';
+ my ($idxnum,$parent_name,$parent_item);
+ my $higher = $depth - 1;
+ if ($higher == 0) {
+ $parent_name = &escape($parent).'::'.$higher;
+ } else {
+ if (ref($path) eq 'ARRAY') {
+ $parent_name = &escape($parent).':'.&escape($path->[-2]).':'.$higher;
+ }
+ }
+ $parent_item = 'addcategory_pos_'.$parent_name;
+ for (my $j=0; $j<=$numchildren; $j++) {
+ if ($j < $numchildren) {
+ $name = $cats->[$depth]{$parent}[$j];
+ $item = &escape($name).':'.&escape($parent).':'.$depth;
+ $idxnum = $idx->{$item};
+ } else {
+ $name = $parent_name;
+ $item = $parent_item;
+ }
+ $chgstr = ' onchange="javascript:reorderCats(this.form,'."'$parent_name','$item','$idxnum'".');"';
+ $text .= '';
+ for (my $i=0; $i<=$numchildren; $i++) {
+ my $vpos = $i+1;
+ my $selstr;
+ if ($j == $i) {
+ $selstr = ' selected="selected" ';
+ }
+ $text .= ''.$vpos.' ';
+ }
+ $text .= ' ';
+ if ($j < $numchildren) {
+ my $deeper = $depth+1;
+ $text .= $name.' '
+ .' '.&mt('Delete').'';
+ if(ref($path) eq 'ARRAY') {
+ push(@{$path},$name);
+ $text .= &build_category_rows($itemcount,$cats,$deeper,$name,$path,$idx);
+ pop(@{$path});
+ }
+ } else {
+ $text .= &mt('Add subcategory:').' ';
+ }
+ $text .= ' ';
+ }
+ $text .= '
';
+ } else {
+ my $higher = $depth-1;
+ if ($higher == 0) {
+ $name = &escape($parent).'::'.$higher;
+ } else {
+ if (ref($path) eq 'ARRAY') {
+ $name = &escape($parent).':'.&escape($path->[-2]).':'.$higher;
+ }
+ }
+ my $colspan;
+ if ($parent ne 'instcode') {
+ $colspan = $maxdepth - $depth - 1;
+ $text .= ''.&mt('Add subcategory:').' ';
+ }
+ }
+ }
+ }
+ return $text;
+}
+
sub modifiable_userdata_row {
- my ($context,$role,$settings,$numinrow,$rowcount) = @_;
+ my ($context,$role,$settings,$numinrow,$rowcount,$usertypes) = @_;
my $rolename;
- if ($role eq 'cr') {
- $rolename = &mt('Custom role');
+ if ($context eq 'selfcreate') {
+ if (ref($usertypes) eq 'HASH') {
+ $rolename = $usertypes->{$role};
+ } else {
+ $rolename = $role;
+ }
} else {
- $rolename = &Apache::lonnet::plaintext($role);
+ if ($role eq 'cr') {
+ $rolename = &mt('Custom role');
+ } else {
+ $rolename = &Apache::lonnet::plaintext($role);
+ }
}
my @fields = ('lastname','firstname','middlename','generation',
'permanentemail','id');
@@ -1702,25 +2645,6 @@ sub users_cansearch_row {
return $output;
}
-sub sorted_inst_types {
- my ($dom) = @_;
- my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);
- my $othertitle = &mt('All users');
- my @types;
- if (ref($order) eq 'ARRAY') {
- @types = @{$order};
- }
- if (@types == 0) {
- if (ref($usertypes) eq 'HASH') {
- @types = sort(keys(%{$usertypes}));
- }
- }
- if (keys(%{$usertypes}) > 0) {
- $othertitle = &mt('Other users');
- }
- return ($othertitle,$usertypes,\@types);
-}
-
sub sorted_searchtitles {
my %searchtitles = &Apache::lonlocal::texthash(
'uname' => 'username',
@@ -1795,13 +2719,18 @@ sub modify_login {
my ($r,$dom,$confname,%domconfig) = @_;
my ($resulttext,$errors,$colchgtext,%changes,%colchanges);
my %title = ( coursecatalog => 'Display course catalog',
- adminmail => 'Display administrator E-mail address');
+ adminmail => 'Display administrator E-mail address',
+ newuser => 'Link for visitors to create a user account',
+ loginheader => 'Log-in box header');
my @offon = ('off','on');
my %loginhash;
($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],
\%domconfig,\%loginhash);
- $loginhash{login}{coursecatalog} = $env{'form.coursecatalog'};
- $loginhash{login}{adminmail} = $env{'form.adminmail'};
+ my @toggles = ('coursecatalog','adminmail','newuser');
+ foreach my $item (@toggles) {
+ $loginhash{login}{$item} = $env{'form.'.$item};
+ }
+ $loginhash{login}{loginheader} = $env{'form.loginheader'};
if (ref($colchanges{'login'}) eq 'HASH') {
$colchgtext = &display_colorchgs($dom,\%colchanges,['login'],
\%loginhash);
@@ -1809,26 +2738,52 @@ sub modify_login {
my $putresult = &Apache::lonnet::put_dom('configuration',\%loginhash,
$dom);
if ($putresult eq 'ok') {
- if (($domconfig{'login'}{'coursecatalog'} eq '0') &&
- ($env{'form.coursecatalog'} eq '1')) {
- $changes{'coursecatalog'} = 1;
- } elsif (($domconfig{'login'}{'coursecatalog'} eq '' ||
- $domconfig{'login'}{'coursecatalog'} eq '1') &&
- ($env{'form.coursecatalog'} eq '0')) {
- $changes{'coursecatalog'} = 1;
- }
- if (($domconfig{'login'}{'adminmail'} eq '1') &&
- ($env{'form.adminmail'} eq '0')) {
- $changes{'adminmail'} = 1;
- } elsif (($domconfig{'login'}{'adminmail'} eq '' ||
- $domconfig{'login'}{'adminmail'} eq '0') &&
- ($env{'form.adminmail'} eq '1')) {
- $changes{'adminmail'} = 1;
+ my @toggles = ('coursecatalog','adminmail','newuser');
+ my %defaultchecked = (
+ 'coursecatalog' => 'on',
+ 'adminmail' => 'off',
+ 'newuser' => 'off',
+ );
+ if (ref($domconfig{'login'}) eq 'HASH') {
+ foreach my $item (@toggles) {
+ if ($defaultchecked{$item} eq 'on') {
+ if (($domconfig{'login'}{$item} eq '0') &&
+ ($env{'form.'.$item} eq '1')) {
+ $changes{$item} = 1;
+ } elsif (($domconfig{'login'}{$item} eq '' ||
+ $domconfig{'login'}{$item} eq '1') &&
+ ($env{'form.'.$item} eq '0')) {
+ $changes{$item} = 1;
+ }
+ } elsif ($defaultchecked{$item} eq 'off') {
+ if (($domconfig{'login'}{$item} eq '1') &&
+ ($env{'form.'.$item} eq '0')) {
+ $changes{$item} = 1;
+ } elsif (($domconfig{'login'}{$item} eq '' ||
+ $domconfig{'login'}{$item} eq '0') &&
+ ($env{'form.'.$item} eq '1')) {
+ $changes{$item} = 1;
+ }
+ }
+ }
+ if (($domconfig{'login'}{'loginheader'} eq 'text') &&
+ ($env{'form.loginheader'} eq 'image')) {
+ $changes{'loginheader'} = 1;
+ } elsif (($domconfig{'login'}{'loginheader'} eq '' ||
+ $domconfig{'login'}{'loginheader'} eq 'image') &&
+ ($env{'form.loginheader'} eq 'text')) {
+ $changes{'loginheader'} = 1;
+ }
}
if (keys(%changes) > 0 || $colchgtext) {
+ &Apache::loncommon::devalidate_domconfig_cache($dom);
$resulttext = &mt('Changes made:').'';
foreach my $item (sort(keys(%changes))) {
- $resulttext .= ''.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").' ';
+ if ($item eq 'loginheader') {
+ $resulttext .= ''.&mt("$title{$item} set to $env{'form.loginheader'}").' ';
+ } else {
+ $resulttext .= ''.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").' ';
+ }
}
$resulttext .= $colchgtext.' ';
} else {
@@ -1851,8 +2806,9 @@ sub color_font_choices {
img => "Header",
bgs => "Background colors",
links => "Link colors",
+ images => "Images",
font => "Font color",
- pgbg => "Page",
+ pgbg => "Header",
tabbg => "Header",
sidebg => "Border",
link => "Link",
@@ -1866,12 +2822,18 @@ sub modify_rolecolors {
my ($r,$dom,$confname,$roles,%domconfig) = @_;
my ($resulttext,%rolehash);
$rolehash{'rolecolors'} = {};
+ if (ref($domconfig{'rolecolors'}) ne 'HASH') {
+ if ($domconfig{'rolecolors'} eq '') {
+ $domconfig{'rolecolors'} = {};
+ }
+ }
my ($errors,%changes) = &modify_colors($r,$dom,$confname,$roles,
$domconfig{'rolecolors'},$rolehash{'rolecolors'});
my $putresult = &Apache::lonnet::put_dom('configuration',\%rolehash,
$dom);
if ($putresult eq 'ok') {
if (keys(%changes) > 0) {
+ &Apache::loncommon::devalidate_domconfig_cache($dom);
$resulttext = &display_colorchgs($dom,\%changes,$roles,
$rolehash{'rolecolors'});
} else {
@@ -1891,41 +2853,44 @@ sub modify_rolecolors {
sub modify_colors {
my ($r,$dom,$confname,$roles,$domconfig,$confhash) = @_;
my (%changes,%choices);
- my @bgs = ('pgbg','mainbg','sidebg');
+ my @bgs;
my @links = ('link','alink','vlink');
+ my @logintext;
my @images;
my $servadm = $r->dir_config('lonAdmEMail');
my $errors;
foreach my $role (@{$roles}) {
if ($role eq 'login') {
%choices = &login_choices();
+ @logintext = ('textcol','bgcol');
} else {
%choices = &color_font_choices();
}
if ($role eq 'login') {
- @images = ('img','logo','domlogo');
+ @images = ('img','logo','domlogo','login');
+ @bgs = ('pgbg','mainbg','sidebg');
} else {
@images = ('img');
+ @bgs = ('pgbg','tabbg','sidebg');
}
$confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};
- foreach my $item (@bgs,@links) {
+ foreach my $item (@bgs,@links,@logintext) {
$confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};
}
- my ($configuserok,$author_ok,$switchserver,%currroles);
- my $uhome = &Apache::lonnet::homeserver($confname,$dom,1);
- ($configuserok,%currroles) = &check_configuser($uhome,$dom,
- $confname,$servadm);
- if ($configuserok eq 'ok') {
- $switchserver = &check_switchserver($dom,$confname);
- if ($switchserver eq '') {
- $author_ok = &check_authorstatus($dom,$confname,%currroles);
- }
- }
+ my ($configuserok,$author_ok,$switchserver) =
+ &config_check($dom,$confname,$servadm);
my ($width,$height) = &thumb_dimensions();
if (ref($domconfig->{$role}) ne 'HASH') {
$domconfig->{$role} = {};
}
foreach my $img (@images) {
+ if (($role eq 'login') && (($img eq 'img') || ($img eq 'logo'))) {
+ if (defined($env{'form.login_showlogo_'.$img})) {
+ $confhash->{$role}{'showlogo'}{$img} = 1;
+ } else {
+ $confhash->{$role}{'showlogo'}{$img} = 0;
+ }
+ }
if ( ! $env{'form.'.$role.'_'.$img.'.filename'}
&& !defined($domconfig->{$role}{$img})
&& !$env{'form.'.$role.'_del_'.$img}
@@ -1952,11 +2917,11 @@ sub modify_colors {
$error = &mt("Upload of [_1] image for $role page(s) failed because an error occurred publishing the file in RES space. Error was: [_2].",$choices{img},$result);
}
} else {
- $error = &mt("Upload of [_1] image for $role page(s) failed because an author role could not be assigned to a Domain Configuation user ([_2]) in domain: [_3]. Error was: [_4].",$choices{$img},$confname,$dom,$author_ok);
+ $error = &mt("Upload of [_1] image for $role page(s) failed because an author role could not be assigned to a Domain Configuration user ([_2]) in domain: [_3]. Error was: [_4].",$choices{$img},$confname,$dom,$author_ok);
}
}
} else {
- $error = &mt("Upload of [_1] image for $role page(s) failed because a Domain Configuation user ([_2]) could not be created in domain: [_3]. Error was: [_4].",$choices{$img},$confname,$dom,$configuserok);
+ $error = &mt("Upload of [_1] image for $role page(s) failed because a Domain Configuration user ([_2]) could not be created in domain: [_3]. Error was: [_4].",$choices{$img},$confname,$dom,$configuserok);
}
if ($error) {
&Apache::lonnet::logthis($error);
@@ -2000,7 +2965,19 @@ sub modify_colors {
$changes{$role}{'images'}{$img} = 1;
}
}
- }
+ if (($role eq 'login') && (($img eq 'logo') || ($img eq 'img'))) {
+ if (ref($domconfig->{'login'}{'showlogo'}) eq 'HASH') {
+ if ($confhash->{$role}{'showlogo'}{$img} ne
+ $domconfig->{$role}{'showlogo'}{$img}) {
+ $changes{$role}{'showlogo'}{$img} = 1;
+ }
+ } else {
+ if ($confhash->{$role}{'showlogo'}{$img} == 0) {
+ $changes{$role}{'showlogo'}{$img} = 1;
+ }
+ }
+ }
+ }
if ($domconfig->{$role}{'font'} ne '') {
if ($confhash->{$role}{'font'} ne $domconfig->{$role}{'font'}) {
$changes{$role}{'font'} = 1;
@@ -2032,20 +3009,46 @@ sub modify_colors {
}
}
}
+ foreach my $item (@logintext) {
+ if ($domconfig->{$role}{$item} ne '') {
+ if ($confhash->{$role}{$item} ne $domconfig->{$role}{$item}) {
+ $changes{$role}{'logintext'}{$item} = 1;
+ }
+ } else {
+ if ($confhash->{$role}{$item}) {
+ $changes{$role}{'logintext'}{$item} = 1;
+ }
+ }
+ }
} else {
&default_change_checker($role,\@images,\@links,\@bgs,
- $confhash,\%changes);
+ \@logintext,$confhash,\%changes);
}
} else {
&default_change_checker($role,\@images,\@links,\@bgs,
- $confhash,\%changes);
+ \@logintext,$confhash,\%changes);
}
}
return ($errors,%changes);
}
+sub config_check {
+ my ($dom,$confname,$servadm) = @_;
+ my ($configuserok,$author_ok,$switchserver,%currroles);
+ my $uhome = &Apache::lonnet::homeserver($confname,$dom,1);
+ ($configuserok,%currroles) = &check_configuser($uhome,$dom,
+ $confname,$servadm);
+ if ($configuserok eq 'ok') {
+ $switchserver = &check_switchserver($dom,$confname);
+ if ($switchserver eq '') {
+ $author_ok = &check_authorstatus($dom,$confname,%currroles);
+ }
+ }
+ return ($configuserok,$author_ok,$switchserver);
+}
+
sub default_change_checker {
- my ($role,$images,$links,$bgs,$confhash,$changes) = @_;
+ my ($role,$images,$links,$bgs,$logintext,$confhash,$changes) = @_;
foreach my $item (@{$links}) {
if ($confhash->{$role}{$item}) {
$changes->{$role}{'links'}{$item} = 1;
@@ -2056,21 +3059,30 @@ sub default_change_checker {
$changes->{$role}{'bgs'}{$item} = 1;
}
}
+ foreach my $item (@{$logintext}) {
+ if ($confhash->{$role}{$item}) {
+ $changes->{$role}{'logintext'}{$item} = 1;
+ }
+ }
foreach my $img (@{$images}) {
if ($env{'form.'.$role.'_del_'.$img}) {
$confhash->{$role}{$img} = '';
$changes->{$role}{'images'}{$img} = 1;
}
+ if ($role eq 'login') {
+ if ($confhash->{$role}{'showlogo'}{$img} == 0) {
+ $changes->{$role}{'showlogo'}{$img} = 1;
+ }
+ }
}
if ($confhash->{$role}{'font'}) {
$changes->{$role}{'font'} = 1;
}
-}
+}
sub display_colorchgs {
my ($dom,$changes,$roles,$confhash) = @_;
my (%choices,$resulttext);
- &Apache::loncommon::devalidate_domconfig_cache($dom);
if (!grep(/^login$/,@{$roles})) {
$resulttext = &mt('Changes made:').' ';
}
@@ -2093,7 +3105,13 @@ sub display_colorchgs {
$resulttext .= ''.&mt($choices{$key}).':';
}
foreach my $item (sort(keys(%{$changes->{$role}{$key}}))) {
- if ($confhash->{$role}{$item} eq '') {
+ if (($role eq 'login') && ($key eq 'showlogo')) {
+ if ($confhash->{$role}{$key}{$item}) {
+ $resulttext .= ''.&mt("$choices{$item} set to be displayed").' ';
+ } else {
+ $resulttext .= ''.&mt("$choices{$item} set to not be displayed").' ';
+ }
+ } elsif ($confhash->{$role}{$item} eq '') {
$resulttext .= ''.&mt("$choices{$item} set to default").' ';
} else {
my $newitem = $confhash->{$role}{$item};
@@ -2171,7 +3189,7 @@ sub check_authorstatus {
my $end = 0;
$author_ok =
&Apache::lonnet::assignrole($dom,$confname,'/'.$dom.'/',
- 'au',$end,$start);
+ 'au',$end,$start,'','','domconfig');
} else {
$author_ok = 'ok';
}
@@ -2179,7 +3197,7 @@ sub check_authorstatus {
}
sub publishlogo {
- my ($r,$action,$formname,$dom,$confname,$subdir,$thumbwidth,$thumbheight) = @_;
+ my ($r,$action,$formname,$dom,$confname,$subdir,$thumbwidth,$thumbheight,$savefileas) = @_;
my ($output,$fname,$logourl);
if ($action eq 'upload') {
$fname=$env{'form.'.$formname.'.filename'};
@@ -2187,6 +3205,9 @@ sub publishlogo {
} else {
($fname) = ($formname =~ /([^\/]+)$/);
}
+ if ($savefileas ne '') {
+ $fname = $savefileas;
+ }
$fname=&Apache::lonnet::clean_filename($fname);
# See if there is anything left
unless ($fname) { return ('error: no uploaded file'); }
@@ -2214,7 +3235,7 @@ sub publishlogo {
!defined(&Apache::loncommon::fileembstyle($1))) {
$output = &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1);
} elsif ($file=~/\.(\d+)\.(\w+)$/) {
- $output = &mt('File name not allowed a rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2);
+ $output = &mt('File name not allowed - rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2);
} elsif (-d "$filepath/$file") {
$output = &mt('File name is a directory name - rename the file and re-upload');
} else {
@@ -2410,7 +3431,7 @@ END
sub modify_quotas {
my ($dom,%domconfig) = @_;
my ($resulttext,%changes);
- my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
+ my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
my %formhash;
foreach my $key (keys(%env)) {
if ($key =~ /^form\.quota_(.+)$/) {
@@ -2431,7 +3452,11 @@ sub modify_quotas {
}
foreach my $key (keys(%formhash)) {
if ($formhash{$key} ne '') {
- if (!exists($domconfig{'quotas'}{$key})) {
+ if (ref($domconfig{'quotas'}) eq 'HASH') {
+ if (!exists($domconfig{'quotas'}{$key})) {
+ $changes{$key} = 1;
+ }
+ } else {
$changes{$key} = 1;
}
}
@@ -2545,7 +3570,7 @@ sub modify_autoupdate {
run => 'Auto-update:',
classlists => 'Updates to user information in classlists?'
);
- my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
+ my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
my %fieldtitles = &Apache::lonlocal::texthash (
id => 'Student/Employee ID',
permanentemail => 'E-mail address',
@@ -2674,7 +3699,7 @@ sub modify_directorysrch {
my @cansearch = &Apache::loncommon::get_env_multiple('form.cansearch');
my @searchby = &Apache::loncommon::get_env_multiple('form.searchby');
- my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
+ my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
if (keys(%{$usertypes}) == 0) {
@cansearch = ('default');
} else {
@@ -2940,30 +3965,96 @@ sub modify_contacts {
sub modify_usercreation {
my ($dom,%domconfig) = @_;
my ($resulttext,%curr_usercreation,%changes,%authallowed,%cancreate);
+ my $warningmsg;
if (ref($domconfig{'usercreation'}) eq 'HASH') {
foreach my $key (keys(%{$domconfig{'usercreation'}})) {
$curr_usercreation{$key} = $domconfig{'usercreation'}{$key};
}
}
- my %title = &Apache::lonlocal::texthash (
- author => 'adding co-authors/assistant authors',
- course => 'adding users to a course',
- );
my @username_rule = &Apache::loncommon::get_env_multiple('form.username_rule');
my @id_rule = &Apache::loncommon::get_env_multiple('form.id_rule');
- my @contexts = ('author','course');
+ my @email_rule = &Apache::loncommon::get_env_multiple('form.email_rule');
+ my @contexts = ('author','course','selfcreate');
foreach my $item(@contexts) {
- $cancreate{$item} = $env{'form.can_createuser_'.$item};
+ if ($item eq 'selfcreate') {
+ @{$cancreate{$item}} = &Apache::loncommon::get_env_multiple('form.can_createuser_'.$item);
+ my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
+ if (!((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth'))) {
+ if (ref($cancreate{$item}) eq 'ARRAY') {
+ if (grep(/^login$/,@{$cancreate{$item}})) {
+ $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.').' '.&mt('You need to set the default authentication type to Kerberos 4 or 5 (with a Kerberos domain specified), or to Local authentication, if the localauth module has been customized in your domain to authenticate institutional logins.');
+ }
+ }
+ }
+ } else {
+ $cancreate{$item} = $env{'form.can_createuser_'.$item};
+ }
}
if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {
foreach my $item (@contexts) {
- if ($curr_usercreation{'cancreate'}{$item} ne $cancreate{$item}) {
- push(@{$changes{'cancreate'}},$item);
- }
+ if ($item eq 'selfcreate') {
+ if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') {
+ foreach my $curr (@{$curr_usercreation{'cancreate'}{$item}}) {
+ if (!grep(/^$curr$/,@{$cancreate{$item}})) {
+ if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+ push(@{$changes{'cancreate'}},$item);
+ }
+ }
+ }
+ } else {
+ if ($curr_usercreation{'cancreate'}{$item} eq '') {
+ if (@{$cancreate{$item}} > 0) {
+ if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+ push(@{$changes{'cancreate'}},$item);
+ }
+ }
+ } else {
+ if ($curr_usercreation{'cancreate'}{$item} eq 'any') {
+ if (@{$cancreate{$item}} < 3) {
+ if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+ push(@{$changes{'cancreate'}},$item);
+ }
+ }
+ } elsif ($curr_usercreation{'cancreate'}{$item} eq 'none') {
+ if (@{$cancreate{$item}} > 0) {
+ if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+ push(@{$changes{'cancreate'}},$item);
+ }
+ }
+ } elsif (!grep(/^$curr_usercreation{'cancreate'}{$item}$/,@{$cancreate{$item}})) {
+ if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+ push(@{$changes{'cancreate'}},$item);
+ }
+ }
+ }
+ }
+ if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+ foreach my $type (@{$cancreate{$item}}) {
+ if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') {
+ if (!grep(/^$type$/,@{$curr_usercreation{'cancreate'}{$item}})) {
+ if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+ push(@{$changes{'cancreate'}},$item);
+ }
+ }
+ } elsif (($curr_usercreation{'cancreate'}{$item} ne 'any') &&
+ ($curr_usercreation{'cancreate'}{$item} ne 'none')) {
+ if ($curr_usercreation{'cancreate'}{$item} ne $type) {
+ if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
+ push(@{$changes{'cancreate'}},$item);
+ }
+ }
+ }
+ }
+ }
+ } else {
+ if ($curr_usercreation{'cancreate'}{$item} ne $cancreate{$item}) {
+ push(@{$changes{'cancreate'}},$item);
+ }
+ }
}
} elsif (ref($curr_usercreation{'cancreate'}) eq 'ARRAY') {
foreach my $item (@contexts) {
- if (grep(/^\Q$item\E$/,@{$curr_usercreation{'cancreate'}})) {
+ if (!grep(/^\Q$item\E$/,@{$curr_usercreation{'cancreate'}})) {
if ($cancreate{$item} ne 'any') {
push(@{$changes{'cancreate'}},$item);
}
@@ -2974,7 +4065,7 @@ sub modify_usercreation {
}
}
} else {
- foreach my $item ('author','course') {
+ foreach my $item (@contexts) {
push(@{$changes{'cancreate'}},$item);
}
}
@@ -3009,10 +4100,25 @@ sub modify_usercreation {
push(@{$changes{'id_rule'}},@id_rule);
}
- my @contexts = ('author','course','domain');
+ if (ref($curr_usercreation{'email_rule'}) eq 'ARRAY') {
+ foreach my $type (@{$curr_usercreation{'email_rule'}}) {
+ if (!grep(/^\Q$type\E$/,@email_rule)) {
+ push(@{$changes{'email_rule'}},$type);
+ }
+ }
+ foreach my $type (@email_rule) {
+ if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'email_rule'}})) {
+ push(@{$changes{'email_rule'}},$type);
+ }
+ }
+ } else {
+ push(@{$changes{'email_rule'}},@email_rule);
+ }
+
+ my @authen_contexts = ('author','course','domain');
my @authtypes = ('int','krb4','krb5','loc');
my %authhash;
- foreach my $item (@contexts) {
+ foreach my $item (@authen_contexts) {
my @authallowed = &Apache::loncommon::get_env_multiple('form.'.$item.'_auth');
foreach my $auth (@authtypes) {
if (grep(/^\Q$auth\E$/,@authallowed)) {
@@ -3023,7 +4129,7 @@ sub modify_usercreation {
}
}
if (ref($curr_usercreation{'authtypes'}) eq 'HASH') {
- foreach my $item (@contexts) {
+ foreach my $item (@authen_contexts) {
if (ref($curr_usercreation{'authtypes'}{$item}) eq 'HASH') {
foreach my $auth (@authtypes) {
if ($authhash{$item}{$auth} ne $curr_usercreation{'authtypes'}{$item}{$auth}) {
@@ -3034,7 +4140,7 @@ sub modify_usercreation {
}
}
} else {
- foreach my $item (@contexts) {
+ foreach my $item (@authen_contexts) {
push(@{$changes{'authtypes'}},$item);
}
}
@@ -3044,27 +4150,46 @@ sub modify_usercreation {
cancreate => \%cancreate,
username_rule => \@username_rule,
id_rule => \@id_rule,
+ email_rule => \@email_rule,
authtypes => \%authhash,
}
);
my $putresult = &Apache::lonnet::put_dom('configuration',\%usercreation_hash,
$dom);
+
+ my %selfcreatetypes = (
+ sso => 'users authenticated by institutional single sign on',
+ login => 'users authenticated by institutional log-in',
+ email => 'users who provide a valid e-mail address for use as the username',
+ );
if ($putresult eq 'ok') {
if (keys(%changes) > 0) {
$resulttext = &mt('Changes made:').'';
if (ref($changes{'cancreate'}) eq 'ARRAY') {
my %lt = &usercreation_types();
foreach my $type (@{$changes{'cancreate'}}) {
- my $chgtext;
- if ($cancreate{$type} eq 'none') {
- $chgtext = $lt{$type}.' '.&mt('creation of new users is not permitted, except by a Domain Coordinator.');
- } elsif ($cancreate{$type} eq 'any') {
- $chgtext = $lt{$type}.' '.&mt('creation of new users is permitted for both institutional and non-institutional usernames.');
- } elsif ($cancreate{$type} eq 'official') {
- $chgtext = $lt{$type}.' '.&mt('creation of new users is only permitted for institutional usernames.',$lt{$type});
- } elsif ($cancreate{$type} eq 'unofficial') {
- $chgtext = $lt{$type}.' '.&mt('creation of new users is only permitted for non-institutional usernames.',$lt{$type});
+ my $chgtext = $lt{$type}.', ';
+ if ($type eq 'selfcreate') {
+ if (@{$cancreate{$type}} == 0) {
+ $chgtext .= &mt('creation of a new user account is not permitted.');
+ } else {
+ $chgtext .= &mt('creation of a new account is permitted for:');
+ foreach my $case (@{$cancreate{$type}}) {
+ $chgtext .= ''.$selfcreatetypes{$case}.' ';
+ }
+ $chgtext .= ' ';
+ }
+ } else {
+ if ($cancreate{$type} eq 'none') {
+ $chgtext .= &mt('creation of new users is not permitted, except by a Domain Coordinator.');
+ } elsif ($cancreate{$type} eq 'any') {
+ $chgtext .= &mt('creation of new users is permitted for both institutional and non-institutional usernames.');
+ } elsif ($cancreate{$type} eq 'official') {
+ $chgtext .= &mt('creation of new users is only permitted for institutional usernames.');
+ } elsif ($cancreate{$type} eq 'unofficial') {
+ $chgtext .= &mt('creation of new users is only permitted for non-institutional usernames.');
+ }
}
$resulttext .= ''.$chgtext.' ';
}
@@ -3101,6 +4226,23 @@ sub modify_usercreation {
$resulttext .= ''.&mt('There are now no ID formats restricted to verified users in the institutional directory.').' ';
}
}
+ if (ref($changes{'email_rule'}) eq 'ARRAY') {
+ my ($emailrules,$emailruleorder) =
+ &Apache::lonnet::inst_userrules($dom,'email');
+ my $chgtext = '';
+ foreach my $type (@email_rule) {
+ if (ref($emailrules->{$type}) eq 'HASH') {
+ $chgtext .= ''.$emailrules->{$type}{'name'}.' ';
+ }
+ }
+ $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.').' ';
+ }
+ }
+
my %authname = &authtype_names();
my %context_title = &context_names();
if (ref($changes{'authtypes'}) eq 'ARRAY') {
@@ -3113,7 +4255,11 @@ sub modify_usercreation {
push(@allowed,$authname{$auth});
}
}
- $chgtext .= join(', ',@allowed).' ';
+ if (@allowed > 0) {
+ $chgtext .= join(', ',@allowed).'';
+ } else {
+ $chgtext .= &mt('none').'';
+ }
}
$chgtext .= '';
$resulttext .= ''.&mt('Authentication types available for assignment to new users').' '.$chgtext;
@@ -3127,6 +4273,9 @@ sub modify_usercreation {
$resulttext = ''.
&mt('An error occurred: [_1]',$putresult).' ';
}
+ if ($warningmsg ne '') {
+ $resulttext .= ''.$warningmsg.' ';
+ }
return $resulttext;
}
@@ -3138,10 +4287,11 @@ sub modify_usermodification {
$curr_usermodification{$key} = $domconfig{'usermodification'}{$key};
}
}
- my @contexts = ('author','course');
+ my @contexts = ('author','course','selfcreate');
my %context_title = (
author => 'In author context',
course => 'In course context',
+ selfcreate => 'When self creating account',
);
my @fields = ('lastname','firstname','middlename','generation',
'permanentemail','id');
@@ -3149,6 +4299,12 @@ sub modify_usermodification {
author => ['ca','aa'],
course => ['st','ep','ta','in','cr'],
);
+ my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
+ if (ref($types) eq 'ARRAY') {
+ push(@{$types},'default');
+ $usertypes->{'default'} = $othertitle;
+ }
+ $roles{'selfcreate'} = $types;
my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
my %modifyhash;
foreach my $context (@contexts) {
@@ -3196,13 +4352,26 @@ sub modify_usermodification {
if (ref($changes{$context}) eq 'ARRAY') {
foreach my $role (@{$changes{$context}}) {
my $rolename;
- if ($role eq 'cr') {
- $rolename = &mt('Custom');
+ if ($context eq 'selfcreate') {
+ $rolename = $role;
+ if (ref($usertypes) eq 'HASH') {
+ if ($usertypes->{$role} ne '') {
+ $rolename = $usertypes->{$role};
+ }
+ }
} else {
- $rolename = &Apache::lonnet::plaintext($role);
+ if ($role eq 'cr') {
+ $rolename = &mt('Custom');
+ } else {
+ $rolename = &Apache::lonnet::plaintext($role);
+ }
}
my @modifiable;
- $resulttext .= ' '.&mt('Target user with [_1] role',$rolename).' - '.&mt('modifiable fields: ');
+ if ($context eq 'selfcreate') {
+ $resulttext .= ''.&mt('Self-creation of account by users with status: [_1] ',$rolename).' - '.&mt('modifiable fields (if institutional data blank): ');
+ } else {
+ $resulttext .= ''.&mt('Target user with [_1] role',$rolename).' - '.&mt('modifiable fields: ');
+ }
foreach my $field (@fields) {
if ($modifyhash{$context}{$role}{$field}) {
push(@modifiable,$fieldtitles{$field});
@@ -3230,4 +4399,535 @@ sub modify_usermodification {
return $resulttext;
}
+sub modify_defaults {
+ my ($dom,$r) = @_;
+ my ($resulttext,$mailmsgtxt,%newvalues,%changes,@errors);
+ my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
+ my @items = ('auth_def','auth_arg_def','lang_def','timezone_def','datelocale_def');
+ my @authtypes = ('internal','krb4','krb5','localauth');
+ foreach my $item (@items) {
+ $newvalues{$item} = $env{'form.'.$item};
+ if ($item eq 'auth_def') {
+ if ($newvalues{$item} ne '') {
+ if (!grep(/^\Q$newvalues{$item}\E$/,@authtypes)) {
+ push(@errors,$item);
+ }
+ }
+ } elsif ($item eq 'lang_def') {
+ if ($newvalues{$item} ne '') {
+ if ($newvalues{$item} =~ /^(\w+)/) {
+ my $langcode = $1;
+ if (code2language($langcode) eq '') {
+ push(@errors,$item);
+ }
+ } else {
+ push(@errors,$item);
+ }
+ }
+ } elsif ($item eq 'timezone_def') {
+ if ($newvalues{$item} ne '') {
+ if (!DateTime::TimeZone->is_valid_name($newvalues{$item})) {
+ push(@errors,$item);
+ }
+ }
+ } elsif ($item eq 'datelocale_def') {
+ if ($newvalues{$item} ne '') {
+ my @datelocale_ids = DateTime::Locale->ids();
+ if (!grep(/^\Q$newvalues{$item}\E$/,@datelocale_ids)) {
+ push(@errors,$item);
+ }
+ }
+ }
+ if (grep(/^\Q$item\E$/,@errors)) {
+ $newvalues{$item} = $domdefaults{$item};
+ } elsif ($domdefaults{$item} ne $newvalues{$item}) {
+ $changes{$item} = 1;
+ }
+ }
+ my %defaults_hash = (
+ defaults => { auth_def => $newvalues{'auth_def'},
+ auth_arg_def => $newvalues{'auth_arg_def'},
+ lang_def => $newvalues{'lang_def'},
+ timezone_def => $newvalues{'timezone_def'},
+ datelocale_def => $newvalues{'datelocale_def'},
+ }
+ );
+ my $title = &defaults_titles();
+ my $putresult = &Apache::lonnet::put_dom('configuration',\%defaults_hash,
+ $dom);
+ if ($putresult eq 'ok') {
+ if (keys(%changes) > 0) {
+ $resulttext = &mt('Changes made:').'';
+ my $version = $r->dir_config('lonVersion');
+ my $mailmsgtext = "Changes made to domain settings in a LON-CAPA installation - domain: $dom (running version: $version) - dns_domain.tab needs to be updated with the following changes, to support legacy 2.4, 2.5 and 2.6 versions of LON-CAPA.\n\n";
+ foreach my $item (sort(keys(%changes))) {
+ my $value = $env{'form.'.$item};
+ if ($value eq '') {
+ $value = &mt('none');
+ } elsif ($item eq 'auth_def') {
+ my %authnames = &authtype_names();
+ my %shortauth = (
+ internal => 'int',
+ krb4 => 'krb4',
+ krb5 => 'krb5',
+ localauth => 'loc',
+ );
+ $value = $authnames{$shortauth{$value}};
+ }
+ $resulttext .= ''.&mt('[_1] set to "[_2]"',$title->{$item},$value).' ';
+ $mailmsgtext .= "$title->{$item} set to $value\n";
+ }
+ $resulttext .= ' ';
+ $mailmsgtext .= "\n";
+ my $cachetime = 24*60*60;
+ &Apache::lonnet::do_cache_new('domdefaults',$dom,
+ $defaults_hash{'defaults'},$cachetime);
+ if ($changes{'auth_def'} || $changes{'auth_arg_def'} || $changes{'lang_def'} || $changes{'datelocale_def'}) {
+ my $sysmail = $r->dir_config('lonSysEMail');
+ &Apache::lonmsg::sendemail($sysmail,"LON-CAPA Domain Settings Change - $dom",$mailmsgtext);
+ }
+ } else {
+ $resulttext = &mt('No changes made to default authentication/language/timezone settings');
+ }
+ } else {
+ $resulttext = ''.
+ &mt('An error occurred: [_1]',$putresult).' ';
+ }
+ if (@errors > 0) {
+ $resulttext .= ' '.&mt('The following were left unchanged because the values entered were invalid:');
+ foreach my $item (@errors) {
+ $resulttext .= ' "'.$title->{$item}.'",';
+ }
+ $resulttext =~ s/,$//;
+ }
+ return $resulttext;
+}
+
+sub modify_scantron {
+ my ($r,$dom,$confname,%domconfig) = @_;
+ my ($resulttext,%confhash,%changes,$errors);
+ my $custom = 'custom.tab';
+ my $default = 'default.tab';
+ my $servadm = $r->dir_config('lonAdmEMail');
+ my ($configuserok,$author_ok,$switchserver) =
+ &config_check($dom,$confname,$servadm);
+ if ($env{'form.scantronformat.filename'} ne '') {
+ my $error;
+ if ($configuserok eq 'ok') {
+ if ($switchserver) {
+ $error = &mt("Upload of scantron format file is not permitted to this server: [_1]",$switchserver);
+ } else {
+ if ($author_ok eq 'ok') {
+ my ($result,$scantronurl) =
+ &publishlogo($r,'upload','scantronformat',$dom,
+ $confname,'scantron','','',$custom);
+ if ($result eq 'ok') {
+ $confhash{'scantron'}{'scantronformat'} = $scantronurl;
+ $changes{'scantronformat'} = 1;
+ } else {
+ $error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$custom,$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].",$custom,$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].",$custom,$confname,$dom,$configuserok);
+ }
+ if ($error) {
+ &Apache::lonnet::logthis($error);
+ $errors .= ''.$error.' ';
+ }
+ }
+ if (ref($domconfig{'scantron'}) eq 'HASH') {
+ if ($domconfig{'scantron'}{'scantronformat'} ne '') {
+ if ($env{'form.scantronformat_del'}) {
+ $confhash{'scantron'}{'scantronformat'} = '';
+ $changes{'scantronformat'} = 1;
+ }
+ }
+ }
+ if (keys(%confhash) > 0) {
+ my $putresult = &Apache::lonnet::put_dom('configuration',\%confhash,
+ $dom);
+ if ($putresult eq 'ok') {
+ if (keys(%changes) > 0) {
+ if (ref($confhash{'scantron'}) eq 'HASH') {
+ $resulttext = &mt('Changes made:').'';
+ if ($confhash{'scantron'}{'scantronformat'} eq '') {
+ $resulttext .= ''.&mt('[_1] scantron format file removed; [_2] file will be used for courses in this domain.',$custom,$default).' ';
+ } else {
+ $resulttext .= ''.&mt('Custom scantron format file ([_1]) uploaded for use with courses in this domain.',$custom).' ';
+ }
+ $resulttext .= ' ';
+ } else {
+ $resulttext = &mt('Changes made to scantron format file.');
+ }
+ $resulttext .= '';
+ &Apache::loncommon::devalidate_domconfig_cache($dom);
+ } else {
+ $resulttext = &mt('No changes made to scantron format file');
+ }
+ } else {
+ $resulttext = ''.
+ &mt('An error occurred: [_1]',$putresult).' ';
+ }
+ } else {
+ $resulttext = &mt('No changes made to scantron format file');
+ }
+ if ($errors) {
+ $resulttext .= &mt('The following errors occurred: ').'';
+ }
+ return $resulttext;
+}
+
+sub modify_coursecategories {
+ my ($dom,%domconfig) = @_;
+ my ($resulttext,%deletions,%reorderings,%needreordering,%adds,%changes,$errors,
+ $cathash);
+ my @deletecategory = &Apache::loncommon::get_env_multiple('form.deletecategory');
+ if (ref($domconfig{'coursecategories'}) eq 'HASH') {
+ $cathash = $domconfig{'coursecategories'}{'cats'};
+ if ($domconfig{'coursecategories'}{'togglecats'} ne $env{'form.togglecats'}) {
+ $changes{'togglecats'} = 1;
+ $domconfig{'coursecategories'}{'togglecats'} = $env{'form.togglecats'};
+ }
+ if ($domconfig{'coursecategories'}{'categorize'} ne $env{'form.categorize'}) {
+ $changes{'categorize'} = 1;
+ $domconfig{'coursecategories'}{'categorize'} = $env{'form.categorize'};
+ }
+ } else {
+ $changes{'togglecats'} = 1;
+ $changes{'categorize'} = 1;
+ $domconfig{'coursecategories'}{'togglecats'} = $env{'form.togglecats'};
+ $domconfig{'coursecategories'}{'categorize'} = $env{'form.categorize'};
+ }
+ if (ref($cathash) eq 'HASH') {
+ if (($domconfig{'coursecategories'}{'cats'}{'instcode::0'} ne '') && ($env{'form.instcode'} == 0)) {
+ push (@deletecategory,'instcode::0');
+ }
+ }
+ my (@predelcats,@predeltrails,%predelallitems,%sort_by_deltrail);
+ if (ref($cathash) eq 'HASH') {
+ if (@deletecategory > 0) {
+ #FIXME Need to remove category from all courses using a deleted category
+ &Apache::loncommon::extract_categories($cathash,\@predelcats,\@predeltrails,\%predelallitems);
+ foreach my $item (@deletecategory) {
+ if ($domconfig{'coursecategories'}{'cats'}{$item} ne '') {
+ delete($domconfig{'coursecategories'}{'cats'}{$item});
+ $deletions{$item} = 1;
+ &recurse_cat_deletes($item,$cathash,\%deletions);
+ }
+ }
+ }
+ foreach my $item (keys(%{$cathash})) {
+ my ($cat,$container,$depth) = map { &unescape($_); } split(/:/,$item);
+ if ($cathash->{$item} ne $env{'form.'.$item}) {
+ $reorderings{$item} = 1;
+ $domconfig{'coursecategories'}{'cats'}{$item} = $env{'form.'.$item};
+ }
+ if ($env{'form.addcategory_name_'.$item} ne '') {
+ my $newcat = $env{'form.addcategory_name_'.$item};
+ my $newdepth = $depth+1;
+ my $newitem = &escape($newcat).':'.&escape($cat).':'.$newdepth;
+ $domconfig{'coursecategories'}{'cats'}{$newitem} = $env{'form.addcategory_pos_'.$item};
+ $adds{$newitem} = 1;
+ }
+ if ($env{'form.subcat_'.$item} ne '') {
+ my $newcat = $env{'form.subcat_'.$item};
+ my $newdepth = $depth+1;
+ my $newitem = &escape($newcat).':'.&escape($cat).':'.$newdepth;
+ $domconfig{'coursecategories'}{'cats'}{$newitem} = 0;
+ $adds{$newitem} = 1;
+ }
+ }
+ }
+ if ($env{'form.instcode'} eq '1') {
+ if (ref($cathash) eq 'HASH') {
+ my $newitem = 'instcode::0';
+ if ($cathash->{$newitem} eq '') {
+ $domconfig{'coursecategories'}{'cats'}{$newitem} = $env{'form.instcode_pos'};
+ $adds{$newitem} = 1;
+ }
+ } else {
+ my $newitem = 'instcode::0';
+ $domconfig{'coursecategories'}{'cats'}{$newitem} = $env{'form.instcode_pos'};
+ $adds{$newitem} = 1;
+ }
+ }
+ if ($env{'form.addcategory_name'} ne '') {
+ my $newitem = &escape($env{'form.addcategory_name'}).'::0';
+ $domconfig{'coursecategories'}{'cats'}{$newitem} = $env{'form.addcategory_pos'};
+ $adds{$newitem} = 1;
+ }
+ my $putresult;
+ if ((keys(%deletions) > 0) || (keys(%reorderings) > 0) || (keys(%adds) > 0)) {
+ if (keys(%deletions) > 0) {
+ foreach my $key (keys(%deletions)) {
+ if ($predelallitems{$key} ne '') {
+ $sort_by_deltrail{$predelallitems{$key}} = $predeltrails[$predelallitems{$key}];
+ }
+ }
+ }
+ my (@chkcats,@chktrails,%chkallitems);
+ &Apache::loncommon::extract_categories($domconfig{'coursecategories'}{'cats'},\@chkcats,\@chktrails,\%chkallitems);
+ if (ref($chkcats[0]) eq 'ARRAY') {
+ my $depth = 0;
+ my $chg = 0;
+ for (my $i=0; $i<@{$chkcats[0]}; $i++) {
+ my $name = $chkcats[0][$i];
+ my $item;
+ if ($name eq '') {
+ $chg ++;
+ } else {
+ $item = &escape($name).'::0';
+ if ($chg) {
+ $domconfig{'coursecategories'}{'cats'}{$item} -= $chg;
+ }
+ $depth ++;
+ &recurse_check(\@chkcats,$domconfig{'coursecategories'}{'cats'},$depth,$name);
+ $depth --;
+ }
+ }
+ }
+ }
+ if ((keys(%changes) > 0) || (keys(%deletions) > 0) || (keys(%reorderings) > 0) || (keys(%adds) > 0)) {
+ $putresult = &Apache::lonnet::put_dom('configuration',\%domconfig,$dom);
+ if ($putresult eq 'ok') {
+ my %title = (
+ togglecats => 'Show/Hide a course in the catalog',
+ categorize => 'Category assigned to course',
+ );
+ my %level = (
+ dom => 'set from "Modify Course" (Domain)',
+ crs => 'set from "Parameters" (Course)',
+ );
+ $resulttext = &mt('Changes made:').'';
+ if ($changes{'togglecats'}) {
+ $resulttext .= ''.&mt("$title{'togglecats'} $level{$env{'form.togglecats'}}").' ';
+ }
+ if ($changes{'categorize'}) {
+ $resulttext .= ''.&mt("$title{'categorize'} $level{$env{'form.categorize'}}").' ';
+ }
+ if ((keys(%deletions) > 0) || (keys(%reorderings) > 0) || (keys(%adds) > 0)) {
+ my $cathash;
+ if (ref($domconfig{'coursecategories'}) eq 'HASH') {
+ $cathash = $domconfig{'coursecategories'}{'cats'};
+ } else {
+ $cathash = {};
+ }
+ my (@cats,@trails,%allitems);
+ &Apache::loncommon::extract_categories($cathash,\@cats,\@trails,\%allitems);
+ if (keys(%deletions) > 0) {
+ $resulttext .= ''.&mt('Deleted categories:').'';
+ foreach my $predeltrail (sort {$a <=> $b } (keys(%sort_by_deltrail))) {
+ $resulttext .= ''.$predeltrails[$predeltrail].' ';
+ }
+ $resulttext .= ' ';
+ }
+ if (keys(%reorderings) > 0) {
+ my %sort_by_trail;
+ $resulttext .= ''.&mt('Reordered categories:').'';
+ foreach my $key (keys(%reorderings)) {
+ if ($allitems{$key} ne '') {
+ $sort_by_trail{$allitems{$key}} = $trails[$allitems{$key}];
+ }
+ }
+ foreach my $trail (sort {$a <=> $b } (keys(%sort_by_trail))) {
+ $resulttext .= ''.$trails[$trail].' ';
+ }
+ $resulttext .= ' ';
+ }
+ if (keys(%adds) > 0) {
+ my %sort_by_trail;
+ $resulttext .= ''.&mt('Added categories:').'';
+ foreach my $key (keys(%adds)) {
+ if ($allitems{$key} ne '') {
+ $sort_by_trail{$allitems{$key}} = $trails[$allitems{$key}];
+ }
+ }
+ foreach my $trail (sort {$a <=> $b } (keys(%sort_by_trail))) {
+ $resulttext .= ''.$trails[$trail].' ';
+ }
+ $resulttext .= ' ';
+ }
+ }
+ $resulttext .= ' ';
+ } else {
+ $resulttext = ''.
+ &mt('An error occurred: [_1]',$putresult).' ';
+ }
+ } else {
+ $resulttext = &mt('No changes made to course categories');
+ }
+ return $resulttext;
+}
+
+sub modify_serverstatuses {
+ my ($dom,%domconfig) = @_;
+ my ($resulttext,%changes,%currserverstatus,%newserverstatus);
+ if (ref($domconfig{'serverstatuses'}) eq 'HASH') {
+ %currserverstatus = %{$domconfig{'serverstatuses'}};
+ }
+ my @pages = &serverstatus_pages();
+ foreach my $type (@pages) {
+ $newserverstatus{$type}{'namedusers'} = '';
+ $newserverstatus{$type}{'machines'} = '';
+ if (defined($env{'form.'.$type.'_namedusers'})) {
+ my @users = split(/,/,$env{'form.'.$type.'_namedusers'});
+ my @okusers;
+ foreach my $user (@users) {
+ my ($uname,$udom) = split(/:/,$user);
+ if (($udom =~ /^$match_domain$/) &&
+ (&Apache::lonnet::domain($udom)) &&
+ ($uname =~ /^$match_username$/)) {
+ if (!grep(/^\Q$user\E/,@okusers)) {
+ push(@okusers,$user);
+ }
+ }
+ }
+ if (@okusers > 0) {
+ @okusers = sort(@okusers);
+ $newserverstatus{$type}{'namedusers'} = join(',',@okusers);
+ }
+ }
+ if (defined($env{'form.'.$type.'_machines'})) {
+ my @machines = split(/,/,$env{'form.'.$type.'_machines'});
+ my @okmachines;
+ foreach my $ip (@machines) {
+ my @parts = split(/\./,$ip);
+ next if (@parts < 4);
+ my $badip = 0;
+ for (my $i=0; $i<4; $i++) {
+ if (!(($parts[$i] >= 0) && ($parts[$i] <= 255))) {
+ $badip = 1;
+ last;
+ }
+ }
+ if (!$badip) {
+ push(@okmachines,$ip);
+ }
+ }
+ @okmachines = sort(@okmachines);
+ $newserverstatus{$type}{'machines'} = join(',',@okmachines);
+ }
+ }
+ my %serverstatushash = (
+ serverstatuses => \%newserverstatus,
+ );
+ my $putresult = &Apache::lonnet::put_dom('configuration',\%serverstatushash,
+ $dom);
+ my %changes;
+ foreach my $type (@pages) {
+ if (ref($currserverstatus{$type}) eq 'HASH') {
+ my @currnamed = split(/,/,$currserverstatus{$type}{'namedusers'});
+ my @newusers = split(/,/,$newserverstatus{$type}{'namedusers'});
+ foreach my $item (@currnamed) {
+ if (!grep(/^\Q$item\E$/,@newusers)) {
+ $changes{$type}{'namedusers'} = 1;
+ last;
+ }
+ }
+ foreach my $item (@newusers) {
+ if (!grep(/^\Q$item\E$/,@currnamed)) {
+ $changes{$type}{'namedusers'} = 1;
+ last;
+ }
+ }
+ my @currmachines = split(/,/,$currserverstatus{$type}{'machines'});
+ my @newmachines = split(/,/,$newserverstatus{$type}{'machines'});
+ foreach my $item (@currmachines) {
+ if (!grep(/^\Q$item\E$/,@newmachines)) {
+ $changes{$type}{'machines'} = 1;
+ last;
+ }
+ }
+ foreach my $item (@newmachines) {
+ if (!grep(/^\Q$item\E$/,@currmachines)) {
+ $changes{$type}{'machines'} = 1;
+ last;
+ }
+ }
+
+ }
+ }
+ if (keys(%changes) > 0) {
+ my $titles= &LONCAPA::loncgi::serverstatus_titles();
+ my $putresult = &Apache::lonnet::put_dom('configuration',
+ \%serverstatushash,$dom);
+ if ($putresult eq 'ok') {
+ $resulttext .= &mt('Changes made:').'';
+ foreach my $type (@pages) {
+ if (defined($changes{$type})) {
+ $resulttext .= ''.$titles->{$type}.'';
+ if (defined($changes{$type}{'namedusers'})) {
+ if ($newserverstatus{$type}{'namedusers'} eq '') {
+ $resulttext .= ''.&mt("Access terminated for all specific (named) users").' '."\n";
+ } else {
+ $resulttext .= ''.&mt("Access available for the following specified users: ").$newserverstatus{$type}{'namedusers'}.' '."\n";
+ }
+ } elsif (defined($changes{$type}{'machines'})) {
+ if ($newserverstatus{$type}{'machines'} eq '') {
+ $resulttext .= ''.&mt("Access terminated for all specific IP addresses").' '."\n";
+ } else {
+ $resulttext .= ''.&mt("Access available for the following specified IP addresses: ").$newserverstatus{$type}{'machines'}.' '."\n";
+ }
+
+ }
+ $resulttext .= ' ';
+ }
+ }
+ $resulttext .= ' ';
+ } else {
+ $resulttext = ''.
+ &mt('An error occurred saving access settings for server status pages: [_1].',$putresult).' ';
+
+ }
+ } else {
+ $resulttext = &mt('No changes made to access to server status pages');
+ }
+ return $resulttext;
+}
+
+sub recurse_check {
+ my ($chkcats,$categories,$depth,$name) = @_;
+ if (ref($chkcats->[$depth]{$name}) eq 'ARRAY') {
+ my $chg = 0;
+ for (my $j=0; $j<@{$chkcats->[$depth]{$name}}; $j++) {
+ my $category = $chkcats->[$depth]{$name}[$j];
+ my $item;
+ if ($category eq '') {
+ $chg ++;
+ } else {
+ my $deeper = $depth + 1;
+ $item = &escape($category).':'.&escape($name).':'.$depth;
+ if ($chg) {
+ $categories->{$item} -= $chg;
+ }
+ &recurse_check($chkcats,$categories,$deeper,$category);
+ $deeper --;
+ }
+ }
+ }
+ return;
+}
+
+sub recurse_cat_deletes {
+ my ($item,$coursecategories,$deletions) = @_;
+ my ($deleted,$container,$depth) = map { &unescape($_); } split(/:/,$item);
+ my $subdepth = $depth + 1;
+ if (ref($coursecategories) eq 'HASH') {
+ foreach my $subitem (keys(%{$coursecategories})) {
+ my ($child,$parent,$itemdepth) = map { &unescape($_); } split(/:/,$subitem);
+ if (($parent eq $deleted) && ($itemdepth == $subdepth)) {
+ delete($coursecategories->{$subitem});
+ $deletions->{$subitem} = 1;
+ &recurse_cat_deletes($subitem,$coursecategories,$deletions);
+ }
+ }
+ }
+ return;
+}
+
1;