--- loncom/interface/domainprefs.pm 2020/01/15 16:55:18 1.160.6.102.2.1 +++ loncom/interface/domainprefs.pm 2016/02/19 20:28:46 1.270 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: domainprefs.pm,v 1.160.6.102.2.1 2020/01/15 16:55:18 raeburn Exp $ +# $Id: domainprefs.pm,v 1.270 2016/02/19 20:28:46 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -19,8 +19,7 @@ # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA# # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ @@ -174,6 +173,7 @@ use File::Copy; use Locale::Language; use DateTime::TimeZone; use DateTime::Locale; +use Time::HiRes qw( sleep ); my $registered_cleanup; my $modified_urls; @@ -217,21 +217,8 @@ sub handler { 'serverstatuses','requestcourses','helpsettings', 'coursedefaults','usersessions','loadbalancing', 'requestauthor','selfenrollment','inststatus', - 'passwords','ltitools'],$dom); - if (ref($domconfig{'ltitools'}) eq 'HASH') { - my %encconfig = - &Apache::lonnet::get_dom('encconfig',['ltitools'],$dom); - if (ref($encconfig{'ltitools'}) eq 'HASH') { - foreach my $id (keys(%{$domconfig{'ltitools'}})) { - if (ref($domconfig{'ltitools'}{$id}) eq 'HASH') { - foreach my $item ('key','secret') { - $domconfig{'ltitools'}{$id}{$item} = $encconfig{'ltitools'}{$id}{$item}; - } - } - } - } - } - my @prefs_order = ('rolecolors','login','defaults','passwords','quotas','autoenroll', + 'ltitools'],$dom); + my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll', 'autoupdate','autocreate','directorysrch','contacts', 'usercreation','selfcreation','usermodification','scantron', 'requestcourses','requestauthor','coursecategories', @@ -277,24 +264,10 @@ sub handler { header => [{col1 => 'Setting', col2 => 'Value'}, {col1 => 'Institutional user types', - col2 => 'Name displayed'}], + col2 => 'Assignable to e-mail usernames'}], print => \&print_defaults, modify => \&modify_defaults, }, - 'passwords' => - { text => 'Passwords (Internal authentication)', - help => 'Domain_Configuration_Passwords', - header => [{col1 => 'Resetting Forgotten Password', - col2 => 'Settings'}, - {col1 => 'Encryption of Stored Passwords (Internal Auth)', - col2 => 'Settings'}, - {col1 => 'Rules for LON-CAPA Passwords', - col2 => 'Settings'}, - {col1 => 'Course Owner Changing Student Passwords', - col2 => 'Settings'}], - print => \&print_passwords, - modify => \&modify_passwords, - }, 'quotas' => { text => 'Blogs, personal web pages, webDAV/quotas, portfolios', help => 'Domain_Configuration_Quotas', @@ -333,24 +306,18 @@ sub handler { modify => \&modify_autocreate, }, 'directorysrch' => - { text => 'Directory searches', + { text => 'Institutional directory searches', help => 'Domain_Configuration_InstDirectory_Search', - header => [{col1 => 'Institutional Directory Setting', - col2 => 'Value',}, - {col1 => 'LON-CAPA Directory Setting', + header => [{col1 => 'Setting', col2 => 'Value',}], print => \&print_directorysrch, modify => \&modify_directorysrch, }, 'contacts' => - { text => 'E-mail addresses and helpform', + { text => 'Contact Information', help => 'Domain_Configuration_Contact_Info', - header => [{col1 => 'Default e-mail addresses', - col2 => 'Value',}, - {col1 => 'Recipient(s) for notifications', - col2 => 'Value',}, - {col1 => 'Ask helpdesk form settings', - col2 => 'Value',},], + header => [{col1 => 'Setting', + col2 => 'Value',}], print => \&print_contacts, modify => \&modify_contacts, }, @@ -373,7 +340,7 @@ sub handler { col2 => 'Enabled?'}, {col1 => 'Institutional user type (login/SSO self-creation)', col2 => 'Information user can enter'}, - {col1 => 'Self-creation with e-mail verification', + {col1 => 'Self-creation with e-mail as username', col2 => 'Settings'}], print => \&print_selfcreation, modify => \&modify_selfcreation, @@ -389,12 +356,11 @@ sub handler { modify => \&modify_usermodification, }, 'scantron' => - { text => 'Bubblesheet format', + { text => 'Bubblesheet format file', help => 'Domain_Configuration_Scantron_Format', - header => [ {col1 => 'Bubblesheet format file', - col2 => ''}, - {col1 => 'Bubblesheet data upload formats', - col2 => 'Settings'}], + header => [ {col1 => 'Item', + col2 => '', + }], print => \&print_scantron, modify => \&modify_scantron, }, @@ -448,12 +414,10 @@ sub handler { modify => \&modify_serverstatuses, }, 'helpsettings' => - {text => 'Support settings', + {text => 'Help page settings', help => 'Domain_Configuration_Help_Settings', - header => [{col1 => 'Help Page Settings (logged-in users)', - col2 => 'Value'}, - {col1 => 'Helpdesk Roles', - col2 => 'Settings'},], + header => [{col1 => 'Help Settings (logged-in users)', + col2 => 'Value'}], print => \&print_helpsettings, modify => \&modify_helpsettings, }, @@ -479,6 +443,14 @@ sub handler { print => \&print_selfenrollment, modify => \&modify_selfenrollment, }, + 'privacy' => + {text => 'User Privacy', + help => 'Domain_Configuration_User_Privacy', + header => [{col1 => 'Setting', + col2 => 'Value',}], + print => \&print_privacy, + modify => \&modify_privacy, + }, 'usersessions' => {text => 'User session hosting/offloading', help => 'Domain_Configuration_User_Sessions', @@ -491,7 +463,7 @@ sub handler { print => \&print_usersessions, modify => \&modify_usersessions, }, - 'loadbalancing' => + 'loadbalancing' => {text => 'Dedicated Load Balancer(s)', help => 'Domain_Configuration_Load_Balancing', header => [{col1 => 'Balancers', @@ -502,14 +474,15 @@ sub handler { print => \&print_loadbalancing, modify => \&modify_loadbalancing, }, - 'ltitools' => + 'ltitools' => {text => 'External Tools (LTI)', - help => 'Domain_Configuration_LTI_Tools', + help => 'Domain_configuration_LTI_Tools', header => [{col1 => 'Setting', col2 => 'Value',}], print => \&print_ltitools, modify => \&modify_ltitools, }, + ); if (keys(%servers) > 1) { $prefs{'login'} = { text => 'Log-in page options', @@ -563,15 +536,6 @@ $javascript_validations $coursebrowserjs END } - if (grep(/^selfcreation$/,@actions)) { - $js .= &selfcreate_javascript(); - } - if (grep(/^contacts$/,@actions)) { - $js .= &contacts_javascript(); - } - if (grep(/^scantron$/,@actions)) { - $js .= &scantron_javascript(); - } &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js); } else { # check if domconfig user exists for the domain. @@ -661,11 +625,11 @@ sub process_changes { } elsif ($action eq 'autocreate') { $output = &modify_autocreate($dom,%domconfig); } elsif ($action eq 'directorysrch') { - $output = &modify_directorysrch($dom,$lastactref,%domconfig); + $output = &modify_directorysrch($dom,%domconfig); } elsif ($action eq 'usercreation') { $output = &modify_usercreation($dom,%domconfig); } elsif ($action eq 'selfcreation') { - $output = &modify_selfcreation($dom,$lastactref,%domconfig); + $output = &modify_selfcreation($dom,%domconfig); } elsif ($action eq 'usermodification') { $output = &modify_usermodification($dom,%domconfig); } elsif ($action eq 'contacts') { @@ -683,7 +647,7 @@ sub process_changes { } elsif ($action eq 'requestauthor') { $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig); } elsif ($action eq 'helpsettings') { - $output = &modify_helpsettings($r,$dom,$confname,$lastactref,%domconfig); + $output = &modify_helpsettings($r,$dom,$confname,%domconfig); } elsif ($action eq 'coursedefaults') { $output = &modify_coursedefaults($dom,$lastactref,%domconfig); } elsif ($action eq 'selfenrollment') { @@ -692,8 +656,6 @@ sub process_changes { $output = &modify_usersessions($dom,$lastactref,%domconfig); } elsif ($action eq 'loadbalancing') { $output = &modify_loadbalancing($dom,%domconfig); - } elsif ($action eq 'passwords') { - $output = &modify_passwords($r,$dom,$confname,$lastactref,%domconfig); } elsif ($action eq 'ltitools') { $output = &modify_ltitools($r,$dom,$action,$lastactref,%domconfig); } @@ -708,24 +670,6 @@ sub print_config_box { $output = &coursecategories_javascript($settings); } elsif ($action eq 'defaults') { $output = &defaults_javascript($settings); - } elsif ($action eq 'passwords') { - $output = &passwords_javascript(); - } elsif ($action eq 'helpsettings') { - my (%privs,%levelscurrent); - my %full=(); - my %levels=( - course => {}, - domain => {}, - system => {}, - ); - my $context = 'domain'; - my $crstype = 'Course'; - my $formname = 'display'; - &Apache::lonuserutils::custom_role_privs(\%privs,\%full,\%levels,\%levelscurrent); - my @templateroles = &Apache::lonuserutils::custom_template_roles($context,$crstype); - $output = - &Apache::lonuserutils::custom_roledefs_js($context,$crstype,$formname,\%full, - \@templateroles); } $output .= ' @@ -743,7 +687,6 @@ sub print_config_box { my $colspan = ''; my $rightcolspan = ''; if (($action eq 'rolecolors') || ($action eq 'defaults') || - ($action eq 'directorysrch') || (($action eq 'login') && ($numheaders < 4))) { $colspan = ' colspan="2"'; } @@ -761,15 +704,10 @@ sub print_config_box { $rowtotal ++; if (($action eq 'autoupdate') || ($action eq 'usercreation') || ($action eq 'selfcreation') || ($action eq 'usermodification') || ($action eq 'defaults') || ($action eq 'coursedefaults') || - ($action eq 'selfenrollment') || ($action eq 'usersessions') || ($action eq 'directorysrch') || - ($action eq 'helpsettings') || ($action eq 'contacts')) { + ($action eq 'selfenrollment') || ($action eq 'usersessions')) { $output .= $item->{'print'}->('top',$dom,$settings,\$rowtotal); - } elsif ($action eq 'passwords') { - $output .= $item->{'print'}->('top',$dom,$confname,$settings,\$rowtotal); } elsif ($action eq 'coursecategories') { $output .= $item->{'print'}->('top',$dom,$item,$settings,\$rowtotal); - } elsif ($action eq 'scantron') { - $output .= $item->{'print'}->($r,'top',$dom,$confname,$settings,\$rowtotal); } elsif ($action eq 'login') { if ($numheaders == 4) { $colspan = ' colspan="2"'; @@ -796,13 +734,10 @@ sub print_config_box { $rowtotal ++; if (($action eq 'autoupdate') || ($action eq 'usercreation') || ($action eq 'selfcreation') || ($action eq 'selfenrollment') || - ($action eq 'usersessions') || ($action eq 'coursecategories') || - ($action eq 'contacts') || ($action eq 'passwords')) { + ($action eq 'usersessions') || ($action eq 'coursecategories')) { if ($action eq 'coursecategories') { $output .= &print_coursecategories('middle',$dom,$item,$settings,\$rowtotal); $colspan = ' colspan="2"'; - } elsif ($action eq 'passwords') { - $output .= $item->{'print'}->('middle',$dom,$confname,$settings,\$rowtotal); } else { $output .= $item->{'print'}->('middle',$dom,$settings,\$rowtotal); } @@ -819,33 +754,13 @@ sub print_config_box { '."\n"; if ($action eq 'coursecategories') { $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal); - } elsif ($action eq 'passwords') { - $output .= $item->{'print'}->('lower',$dom,$confname,$settings,\$rowtotal).' - -
- - - - - - - - '."\n". - $item->{'print'}->('bottom',$dom,$confname,$settings,\$rowtotal).' -
'.&mt($item->{'header'}->[3]->{'col1'}).''.&mt($item->{'header'}->[3]->{'col2'}).'
- - - '; } else { $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); } $rowtotal ++; } elsif (($action eq 'usermodification') || ($action eq 'coursedefaults') || - ($action eq 'defaults') || ($action eq 'directorysrch') || - ($action eq 'helpsettings')) { + ($action eq 'defaults')) { $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); - } elsif ($action eq 'scantron') { - $output .= $item->{'print'}->($r,'bottom',$dom,$confname,$settings,\$rowtotal); } elsif ($action eq 'login') { if ($numheaders == 4) { $output .= &print_login('page',$dom,$confname,$phase,$settings,\$rowtotal).' @@ -957,7 +872,7 @@ sub print_config_box { '; - if ($action eq 'login') { + if (($action eq 'login') || ($action eq 'directorysrch')) { $output .= ' '; } elsif ($action eq 'serverstatuses') { @@ -1001,10 +916,14 @@ sub print_config_box { $rowtotal ++; if ($action eq 'quotas') { $output .= &print_quotas($dom,$settings,\$rowtotal,$action); - } elsif (($action eq 'autoenroll') || ($action eq 'autocreate') || - ($action eq 'serverstatuses') || ($action eq 'loadbalancing') || + } elsif (($action eq 'autoenroll') || ($action eq 'autocreate') || ($action eq 'directorysrch') || + ($action eq 'contacts') || ($action eq 'serverstatuses') || ($action eq 'loadbalancing') || ($action eq 'ltitools')) { $output .= $item->{'print'}->($dom,$settings,\$rowtotal); + } elsif ($action eq 'scantron') { + $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal); + } elsif ($action eq 'helpsettings') { + $output .= &print_helpsettings($dom,$confname,$settings,\$rowtotal); } } $output .= ' @@ -1349,7 +1268,7 @@ sub print_login { } else { $datatable .= ''; } - $datatable .= ''; + $datatable .= ''; } $datatable .= '
'.&mt($item->{'header'}->[0]->{'col1'}).'
'; } @@ -1509,7 +1428,7 @@ sub display_color_options { my $datatable = ''. ''.$choices->{'font'}.''; if (!$is_custom->{'font'}) { - $datatable .= ''.&mt('Default in use:').' '.$defaults->{'font'}.''; + $datatable .= ''.&mt('Default in use:').' '.$defaults->{'font'}.''; } else { $datatable .= ' '; } @@ -1518,12 +1437,12 @@ sub display_color_options { $datatable .= ''. ' '. - ' '; + ' '; unless ($role eq 'login') { $datatable .= ''. ''.$choices->{'fontmenu'}.''; if (!$is_custom->{'fontmenu'}) { - $datatable .= ''.&mt('Default in use:').' '.$defaults->{'fontmenu'}.''; + $datatable .= ''.&mt('Default in use:').' '.$defaults->{'fontmenu'}.''; } else { $datatable .= ' '; } @@ -1533,7 +1452,7 @@ sub display_color_options { ' '. - ' '; + ' '; } my $switchserver = &check_switchserver($dom,$confname); foreach my $img (@{$images}) { @@ -1592,8 +1511,7 @@ sub display_color_options { if ($fullwidth ne '' && $fullheight ne '') { if ($fullwidth > $width && $fullheight > $height) { my $size = $width.'x'.$height; - my @args = ('convert','-sample',$size,$input,$output); - system({$args[0]} @args); + system("convert -sample $size $input $output"); $showfile = "/$imgdir/tn-".$filename; } } @@ -1651,7 +1569,7 @@ sub display_color_options { my $bgs_def; foreach my $item (@{$bgs}) { if (!$is_custom->{$item}) { - $bgs_def .= ''.$choices->{$item}.'    
'.$defaults->{'bgs'}{$item}.''; + $bgs_def .= ''.$choices->{$item}.'    
'.$defaults->{'bgs'}{$item}.''; } } if ($bgs_def) { @@ -1679,7 +1597,7 @@ sub display_color_options { my $links_def; foreach my $item (@{$links}) { if (!$is_custom->{$item}) { - $links_def .= ''.$choices->{$item}.'
'.$defaults->{'links'}{$item}.''; + $links_def .= ''.$choices->{$item}.'
'.$defaults->{'links'}{$item}.''; } } if ($links_def) { @@ -1765,15 +1683,17 @@ sub image_changes { my ($is_custom,$alt_text,$img_import,$showfile,$fullsize,$role,$img,$imgfile,$logincolors) = @_; my $output; if ($img eq 'login') { - $output = ''.$logincolors; # suppress image for Log-in header + # suppress image for Log-in header } elsif (!$is_custom) { if ($img ne 'domlogo') { - $output = &mt('Default image:').'
'; + $output .= &mt('Default image:').'
'; } else { - $output = &mt('Default in use:').'
'; + $output .= &mt('Default in use:').'
'; } } - if ($img ne 'login') { + if ($img eq 'login') { # suppress image for Log-in header + $output .= ''.$logincolors; + } else { if ($img_import) { $output .= ''; } @@ -2217,7 +2137,7 @@ sub print_quotas { } sub print_requestmail { - my ($dom,$action,$settings,$rowtotal,$customcss,$rowstyle) = @_; + my ($dom,$action,$settings,$rowtotal) = @_; my ($now,$datatable,%currapp); $now = time; if (ref($settings) eq 'HASH') { @@ -2229,19 +2149,7 @@ sub print_requestmail { } my $numinrow = 2; 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.'"'; - } + $css_class = ($$rowtotal%2? ' class="LC_odd_row"':''); my $text; if ($action eq 'requestcourses') { $text = &mt('Receive notification of course requests requiring approval'); @@ -2364,8 +2272,7 @@ sub print_textbookcourses { (' 'x2). ''.&mt('Thumbnail:'); if ($image) { - $datatable .= ''. - $imgsrc. + $datatable .= $imgsrc. ' '. ' '.&mt('Replace:').' '; @@ -2396,7 +2303,7 @@ sub print_textbookcourses { $datatable .= ''; } $datatable .= ' '."\n". - ''.&mt('Add').''."\n". + ''.&mt('Add').''."\n". ''. ''.&mt('Subject:').' '."\n". (' 'x2). @@ -2413,13 +2320,13 @@ sub print_textbookcourses { } else { $datatable .= ''; } - $datatable .= ''."\n"; } - $datatable .= ''.&mt('LON-CAPA course:').' '. + $datatable .= ''."\n". + ''.&mt('LON-CAPA course:').' '. &Apache::loncommon::select_dom_form($env{'request.role.domain'},$type.'_addbook_cdom'). ''. &Apache::loncommon::selectcourse_link - ('display',$type.'_addbook_cnum',$type.'_addbook_cdom',undef,undef,undef,'Course'). + ('display',$type.'_addbook_cnum',$type.'_addbook_cdom',undef,undef,undef,'Course'); ''."\n". ''."\n"; $itemcount ++; @@ -2590,7 +2497,7 @@ ENDSCRIPT sub print_autoenroll { my ($dom,$settings,$rowtotal) = @_; my $autorun = &Apache::lonnet::auto_run(undef,$dom), - my ($defdom,$runon,$runoff,$coownerson,$coownersoff,$failsafe); + my ($defdom,$runon,$runoff,$coownerson,$coownersoff); if (ref($settings) eq 'HASH') { if (exists($settings->{'run'})) { if ($settings->{'run'} eq '0') { @@ -2624,9 +2531,6 @@ sub print_autoenroll { if (exists($settings->{'sender_domain'})) { $defdom = $settings->{'sender_domain'}; } - if (exists($settings->{'autofailsafe'})) { - $failsafe = $settings->{'autofailsafe'}; - } } else { if ($autorun) { $runon = ' checked="checked" '; @@ -2662,12 +2566,8 @@ sub print_autoenroll { $coownerson.' value="1" />'.&mt('Yes').' '. ''. - ''. - ''.&mt('Failsafe for no drops when institutional data missing').''. - ''. - ''; - $$rowtotal += 4; + ''; + $$rowtotal += 3; return $datatable; } @@ -2715,7 +2615,7 @@ sub print_autoupdate { my $locknamesettings; $datatable .= &insttypes_row($settings,$types,$usertypes, $dom,$numinrow,$othertitle, - 'lockablenames',$rowtotal); + 'lockablenames'); $$rowtotal ++; } else { my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); @@ -2796,946 +2696,231 @@ sub print_autocreate { } sub print_directorysrch { - my ($position,$dom,$settings,$rowtotal) = @_; - my $datatable; - if ($position eq 'top') { - my $instsrchon = ' '; - my $instsrchoff = ' checked="checked" '; - my ($exacton,$containson,$beginson); - my $instlocalon = ' '; - my $instlocaloff = ' checked="checked" '; - if (ref($settings) eq 'HASH') { - if ($settings->{'available'} eq '1') { - $instsrchon = $instsrchoff; - $instsrchoff = ' '; - } - if ($settings->{'localonly'} eq '1') { - $instlocalon = $instlocaloff; - $instlocaloff = ' '; - } - if (ref($settings->{'searchtypes'}) eq 'ARRAY') { - foreach my $type (@{$settings->{'searchtypes'}}) { - if ($type eq 'exact') { - $exacton = ' checked="checked" '; - } elsif ($type eq 'contains') { - $containson = ' checked="checked" '; - } elsif ($type eq 'begins') { - $beginson = ' checked="checked" '; - } - } - } else { - if ($settings->{'searchtypes'} eq 'exact') { - $exacton = ' checked="checked" '; - } elsif ($settings->{'searchtypes'} eq 'contains') { - $containson = ' checked="checked" '; - } elsif ($settings->{'searchtypes'} eq 'specify') { + my ($dom,$settings,$rowtotal) = @_; + my $srchon = ' '; + my $srchoff = ' checked="checked" '; + my ($exacton,$containson,$beginson); + my $localon = ' '; + my $localoff = ' checked="checked" '; + if (ref($settings) eq 'HASH') { + if ($settings->{'available'} eq '1') { + $srchon = $srchoff; + $srchoff = ' '; + } + if ($settings->{'localonly'} eq '1') { + $localon = $localoff; + $localoff = ' '; + } + if (ref($settings->{'searchtypes'}) eq 'ARRAY') { + foreach my $type (@{$settings->{'searchtypes'}}) { + if ($type eq 'exact') { $exacton = ' checked="checked" '; + } elsif ($type eq 'contains') { $containson = ' checked="checked" '; + } elsif ($type eq 'begins') { + $beginson = ' checked="checked" '; } } - } - my ($searchtitles,$titleorder) = &sorted_searchtitles(); - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - - my $numinrow = 4; - my $cansrchrow = 0; - $datatable=''. - ''.&mt('Institutional directory search available?').''. - ' '. - ''. - ''. - ''.&mt('Other domains can search institution?').''. - ' '. - ''. - ''; - $$rowtotal += 2; - if (ref($usertypes) eq 'HASH') { - if (keys(%{$usertypes}) > 0) { - $datatable .= &insttypes_row($settings,$types,$usertypes,$dom, - $numinrow,$othertitle,'cansearch', - $rowtotal); - $cansrchrow = 1; + } else { + if ($settings->{'searchtypes'} eq 'exact') { + $exacton = ' checked="checked" '; + } elsif ($settings->{'searchtypes'} eq 'contains') { + $containson = ' checked="checked" '; + } elsif ($settings->{'searchtypes'} eq 'specify') { + $exacton = ' checked="checked" '; + $containson = ' checked="checked" '; } } - if ($cansrchrow) { - $$rowtotal ++; - $datatable .= ''; - } else { - $datatable .= ''; + } + my ($searchtitles,$titleorder) = &sorted_searchtitles(); + my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); + + my $numinrow = 4; + my $cansrchrow = 0; + my $datatable=''. + ''.&mt('Directory search available?').''. + ' '. + ''. + ''. + ''.&mt('Other domains can search?').''. + ' '. + ''. + ''; + $$rowtotal += 2; + if (ref($usertypes) eq 'HASH') { + if (keys(%{$usertypes}) > 0) { + $datatable .= &insttypes_row($settings,$types,$usertypes,$dom, + $numinrow,$othertitle,'cansearch'); + $cansrchrow = 1; } - $datatable .= ''.&mt('Supported search methods'). - ''; - foreach my $title (@{$titleorder}) { - if (defined($searchtitles->{$title})) { - my $check = ' '; - if (ref($settings) eq 'HASH') { - if (ref($settings->{'searchby'}) eq 'ARRAY') { - if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) { - $check = ' checked="checked" '; - } + } + if ($cansrchrow) { + $$rowtotal ++; + $datatable .= ''; + } else { + $datatable .= ''; + } + $datatable .= ''; - $$rowtotal ++; - if ($cansrchrow) { - $datatable .= ''; - } else { - $datatable .= ''; - } - $datatable .= ''. - ''; - $$rowtotal ++; + } + $datatable .= '
'.&mt('Supported search methods'). + ''; + foreach my $title (@{$titleorder}) { + if (defined($searchtitles->{$title})) { + my $check = ' '; + if (ref($settings) eq 'HASH') { + if (ref($settings->{'searchby'}) eq 'ARRAY') { + if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) { + $check = ' checked="checked" '; } } - $datatable .= ''; } + $datatable .= ''; } - $datatable .= '
'. - ''. + '
'.&mt('Search latitude').''. - ' '. - ' '. - '
'; + $$rowtotal ++; + if ($cansrchrow) { + $datatable .= ''; } else { - my $domsrchon = ' checked="checked" '; - my $domsrchoff = ' '; - my $domlocalon = ' '; - my $domlocaloff = ' checked="checked" '; - if (ref($settings) eq 'HASH') { - if ($settings->{'lclocalonly'} eq '1') { - $domlocalon = $domlocaloff; - $domlocaloff = ' '; - } - if ($settings->{'lcavailable'} eq '0') { - $domsrchoff = $domsrchon; - $domsrchon = ' '; - } - } - $datatable=''. - ''.&mt('LON-CAPA directory search available?').''. - ' '. - ''. - ''. - ''.&mt('Other domains can search LON-CAPA domain?').''. - ' '. - ''. - ''; - $$rowtotal += 2; + $datatable .= ''; } + $datatable .= ''.&mt('Search latitude').''. + ''. + ' '. + ' '. + ''; + $$rowtotal ++; return $datatable; } sub print_contacts { - my ($position,$dom,$settings,$rowtotal) = @_; + my ($dom,$settings,$rowtotal) = @_; my $datatable; my @contacts = ('adminemail','supportemail'); - my (%checked,%to,%otheremails,%bccemails,%includestr,%includeloc,%currfield, - $maxsize,$fields,$fieldtitles,$fieldoptions,$possoptions,@mailings); - if ($position eq 'top') { - if (ref($settings) eq 'HASH') { - foreach my $item (@contacts) { - if (exists($settings->{$item})) { - $to{$item} = $settings->{$item}; - } - } - } - } elsif ($position eq 'middle') { - @mailings = ('errormail','packagesmail','lonstatusmail','requestsmail', - 'updatesmail','idconflictsmail','hostipmail'); - foreach my $type (@mailings) { - $otheremails{$type} = ''; - } - } else { - @mailings = ('helpdeskmail','otherdomsmail'); - foreach my $type (@mailings) { - $otheremails{$type} = ''; - } - $bccemails{'helpdeskmail'} = ''; - $bccemails{'otherdomsmail'} = ''; - $includestr{'helpdeskmail'} = ''; - $includestr{'otherdomsmail'} = ''; - ($fields,$fieldtitles,$fieldoptions,$possoptions) = &helpform_fields(); + my (%checked,%to,%otheremails,%bccemails); + my @mailings = ('errormail','packagesmail','lonstatusmail','helpdeskmail', + 'requestsmail','updatesmail','idconflictsmail'); + foreach my $type (@mailings) { + $otheremails{$type} = ''; } + $bccemails{'helpdeskmail'} = ''; if (ref($settings) eq 'HASH') { - unless ($position eq 'top') { - foreach my $type (@mailings) { - if (exists($settings->{$type})) { - if (ref($settings->{$type}) eq 'HASH') { - foreach my $item (@contacts) { - if ($settings->{$type}{$item}) { - $checked{$type}{$item} = ' checked="checked" '; - } - } - $otheremails{$type} = $settings->{$type}{'others'}; - if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { - $bccemails{$type} = $settings->{$type}{'bcc'}; - if ($settings->{$type}{'include'} ne '') { - ($includeloc{$type},$includestr{$type}) = split(/:/,$settings->{$type}{'include'},2); - $includestr{$type} = &unescape($includestr{$type}); - } - } - } - } elsif ($type eq 'lonstatusmail') { - $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; - } + foreach my $item (@contacts) { + if (exists($settings->{$item})) { + $to{$item} = $settings->{$item}; } } - if ($position eq 'bottom') { - foreach my $type (@mailings) { - $bccemails{$type} = $settings->{$type}{'bcc'}; - if ($settings->{$type}{'include'} ne '') { - ($includeloc{$type},$includestr{$type}) = split(/:/,$settings->{$type}{'include'},2); - $includestr{$type} = &unescape($includestr{$type}); - } - } - if (ref($settings->{'helpform'}) eq 'HASH') { - if (ref($fields) eq 'ARRAY') { - foreach my $field (@{$fields}) { - $currfield{$field} = $settings->{'helpform'}{$field}; + foreach my $type (@mailings) { + if (exists($settings->{$type})) { + if (ref($settings->{$type}) eq 'HASH') { + foreach my $item (@contacts) { + if ($settings->{$type}{$item}) { + $checked{$type}{$item} = ' checked="checked" '; + } } - } - if (exists($settings->{'helpform'}{'maxsize'})) { - $maxsize = $settings->{'helpform'}{'maxsize'}; - } else { - $maxsize = '1.0'; - } - } else { - if (ref($fields) eq 'ARRAY') { - foreach my $field (@{$fields}) { - $currfield{$field} = 'yes'; + $otheremails{$type} = $settings->{$type}{'others'}; + if ($type eq 'helpdeskmail') { + $bccemails{$type} = $settings->{$type}{'bcc'}; } } - $maxsize = '1.0'; + } elsif ($type eq 'lonstatusmail') { + $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; } } } else { - if ($position eq 'top') { - $to{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'}; - $to{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'}; - $checked{'errormail'}{'adminemail'} = ' checked="checked" '; - $checked{'packagesmail'}{'adminemail'} = ' checked="checked" '; - $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; - $checked{'requestsmail'}{'adminemail'} = ' checked="checked" '; - $checked{'updatesmail'}{'adminemail'} = ' checked="checked" '; - $checked{'idconflictsmail'}{'adminemail'} = ' checked="checked" '; - $checked{'hostipmail'}{'adminemail'} = ' checked="checked" '; - } elsif ($position eq 'bottom') { - $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" '; - $checked{'otherdomsmail'}{'supportemail'} = ' checked="checked" '; - if (ref($fields) eq 'ARRAY') { - foreach my $field (@{$fields}) { - $currfield{$field} = 'yes'; - } - } - $maxsize = '1.0'; - } + $to{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'}; + $to{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'}; + $checked{'errormail'}{'adminemail'} = ' checked="checked" '; + $checked{'packagesmail'}{'adminemail'} = ' checked="checked" '; + $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" '; + $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; + $checked{'requestsmail'}{'adminemail'} = ' checked="checked" '; + $checked{'updatesmail'}{'adminemail'} = ' checked="checked" '; + $checked{'idconflictsmail'}{'adminemail'} = ' checked="checked" '; } my ($titles,$short_titles) = &contact_titles(); my $rownum = 0; my $css_class; - if ($position eq 'top') { - foreach my $item (@contacts) { - $css_class = $rownum%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''.$titles->{$item}. - ''. - ''; - $rownum ++; - } - } elsif ($position eq 'bottom') { + foreach my $item (@contacts) { + $css_class = $rownum%2?' class="LC_odd_row"':''; + $datatable .= ''. + ''.$titles->{$item}. + ''. + ''; + $rownum ++; + } + foreach my $type (@mailings) { $css_class = $rownum%2?' class="LC_odd_row"':''; $datatable .= ''. - ''.&mt('Extra helpdesk form fields:').'
'. - &mt('(e-mail, subject, and description always shown)'). - ''; - if ((ref($fields) eq 'ARRAY') && (ref($fieldtitles) eq 'HASH') && - (ref($fieldoptions) eq 'HASH') && (ref($possoptions) eq 'HASH')) { - $datatable .= ''; - foreach my $field (@{$fields}) { - $datatable .= ''. - ''; - } - $datatable .= '
'.&mt('Field').''.&mt('Status').'
'.$fieldtitles->{$field}; - if (($field eq 'screenshot') || ($field eq 'cc')) { - $datatable .= ' '.&mt('(logged-in users)'); - } - $datatable .=''; - my $clickaction; - if ($field eq 'screenshot') { - $clickaction = ' onclick="screenshotSize(this);"'; - } - if (ref($possoptions->{$field}) eq 'ARRAY') { - foreach my $option (@{$possoptions->{$field}}) { - my $checked; - if ($currfield{$field} eq $option) { - $checked = ' checked="checked"'; - } - $datatable .= ''.(' 'x2); - } - } - if ($field eq 'screenshot') { - my $display; - if ($currfield{$field} eq 'no') { - $display = ' style="display:none"'; - } - $datatable .= '
'.&mt('Maximum size for upload (MB)').''. - ''; - } - $datatable .= '
'; + ''. + $titles->{$type}.': '. + ''. + ''; + foreach my $item (@contacts) { + $datatable .= ' '; + } + $datatable .= '
'.&mt('Others').':  '. + ''; + if ($type eq 'helpdeskmail') { + $datatable .= '
'.&mt('Bcc:').(' 'x6). + ''; } $datatable .= ''."\n"; $rownum ++; } - unless ($position eq 'top') { - foreach my $type (@mailings) { - $css_class = $rownum%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''. - $titles->{$type}.': '. - ''; - if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { - $datatable .= '
'.&mt('E-mail recipient(s)').''; - } - $datatable .= ''; - foreach my $item (@contacts) { - $datatable .= ' '; - } - $datatable .= '
'.&mt('Others').':  '. - ''; - my %locchecked; - if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { - foreach my $loc ('s','b') { - if ($includeloc{$type} eq $loc) { - $locchecked{$loc} = ' checked="checked"'; - last; - } - } - $datatable .= '
'.&mt('Bcc:').(' 'x6). - '
'. - '
'.&mt('Optional added text').''. - &mt('Text automatically added to e-mail:').' '. - '
'. - ''.&mt('Location:').' '. - ''. - (' 'x2). - ''. - '
'; - } - $datatable .= ''."\n"; - $rownum ++; - } - } - if ($position eq 'middle') { - my %choices; - $choices{'reporterrors'} = &mt('E-mail error reports to [_1]', - &Apache::loncommon::modal_link('http://loncapa.org/core.html', - &mt('LON-CAPA core group - MSU'),600,500)); - $choices{'reportupdates'} = &mt('E-mail record of completed LON-CAPA updates to [_1]', - &Apache::loncommon::modal_link('http://loncapa.org/core.html', - &mt('LON-CAPA core group - MSU'),600,500)); - my @toggles = ('reporterrors','reportupdates'); - my %defaultchecked = ('reporterrors' => 'on', - 'reportupdates' => 'on'); - (my $reports,$rownum) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, - \%choices,$rownum); - $datatable .= $reports; - } elsif ($position eq 'bottom') { - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my (@posstypes,%usertypeshash); - if (ref($types) eq 'ARRAY') { - @posstypes = @{$types}; - } - if (@posstypes) { - if (ref($usertypes) eq 'HASH') { - %usertypeshash = %{$usertypes}; - } - my @overridden; - my $numinrow = 4; - if (ref($settings) eq 'HASH') { - if (ref($settings->{'overrides'}) eq 'HASH') { - foreach my $key (sort(keys(%{$settings->{'overrides'}}))) { - if (ref($settings->{'overrides'}{$key}) eq 'HASH') { - push(@overridden,$key); - foreach my $item (@contacts) { - if ($settings->{'overrides'}{$key}{$item}) { - $checked{'override_'.$key}{$item} = ' checked="checked" '; - } - } - $otheremails{'override_'.$key} = $settings->{'overrides'}{$key}{'others'}; - $bccemails{'override_'.$key} = $settings->{'overrides'}{$key}{'bcc'}; - $includeloc{'override_'.$key} = ''; - $includestr{'override_'.$key} = ''; - if ($settings->{'overrides'}{$key}{'include'} ne '') { - ($includeloc{'override_'.$key},$includestr{'override_'.$key}) = - split(/:/,$settings->{'overrides'}{$key}{'include'},2); - $includestr{'override_'.$key} = &unescape($includestr{'override_'.$key}); - } - } - } - } - } - my $customclass = 'LC_helpdesk_override'; - my $optionsprefix = 'LC_options_helpdesk_'; - - my $onclicktypes = "toggleHelpdeskRow(this.form,'overrides','$customclass','$optionsprefix');"; - - $datatable .= &insttypes_row($settings,$types,$usertypes,$dom, - $numinrow,$othertitle,'overrides', - \$rownum,$onclicktypes,$customclass); - $rownum ++; - $usertypeshash{'default'} = $othertitle; - foreach my $status (@posstypes) { - my $css_class; - if ($rownum%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$/,@overridden)) { - $currstyle = 'display:table-row'; - $hidden = 0; - } - my $key = 'override_'.$status; - $datatable .= &overridden_helpdesk($checked{$key},$otheremails{$key},$bccemails{$key}, - $includeloc{$key},$includestr{$key},$status,$rowid, - $usertypeshash{$status},$css_class,$currstyle, - \@contacts,$short_titles); - unless ($hidden) { - $rownum ++; - } - } - } - } + my %choices; + $choices{'reporterrors'} = &mt('E-mail error reports to [_1]', + &Apache::loncommon::modal_link('http://loncapa.org/core.html', + &mt('LON-CAPA core group - MSU'),600,500)); + $choices{'reportupdates'} = &mt('E-mail record of completed LON-CAPA updates to [_1]', + &Apache::loncommon::modal_link('http://loncapa.org/core.html', + &mt('LON-CAPA core group - MSU'),600,500)); + my @toggles = ('reporterrors','reportupdates'); + my %defaultchecked = ('reporterrors' => 'on', + 'reportupdates' => 'on'); + (my $reports,$rownum) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, + \%choices,$rownum); + $datatable .= $reports; $$rowtotal += $rownum; return $datatable; } -sub overridden_helpdesk { - my ($checked,$otheremails,$bccemails,$includeloc,$includestr,$type,$rowid, - $typetitle,$css_class,$rowstyle,$contacts,$short_titles) = @_; - 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); - $description = &mt('Helpdesk requests from: [_1] in this domain (overrides default)',"$typetitle"); - $output = ''. - "$description\n". - ''. - '
'.&mt('E-mail recipient(s)').''. - ''; - if (ref($contacts) eq 'ARRAY') { - foreach my $item (@{$contacts}) { - my $check; - if (ref($checked) eq 'HASH') { - $check = $checked->{$item}; - } - my $title; - if (ref($short_titles) eq 'HASH') { - $title = $short_titles->{$item}; - } - $output .= ' '; - } - } - $output .= '
'.&mt('Others').':  '. - ''; - my %locchecked; - foreach my $loc ('s','b') { - if ($includeloc eq $loc) { - $locchecked{$loc} = ' checked="checked"'; - last; - } - } - $output .= '
'.&mt('Bcc:').(' 'x6). - '
'. - '
'.&mt('Optional added text').''. - &mt('Text automatically added to e-mail:').' '. - '
'. - ''.&mt('Location:').' '. - ''. - (' 'x2). - ''. - '
'. - ''."\n"; - return $output; -} - -sub contacts_javascript { - return <<"ENDSCRIPT"; - - - -ENDSCRIPT -} - sub print_helpsettings { - my ($position,$dom,$settings,$rowtotal) = @_; - my $confname = $dom.'-domainconfig'; - my $formname = 'display'; + my ($dom,$confname,$settings,$rowtotal) = @_; my ($datatable,$itemcount); - if ($position eq 'top') { - $itemcount = 1; - my (%choices,%defaultchecked,@toggles); - $choices{'submitbugs'} = &mt('Display link to: [_1]?', - &Apache::loncommon::modal_link('http://bugs.loncapa.org', - &mt('LON-CAPA bug tracker'),600,500)); - %defaultchecked = ('submitbugs' => 'on'); - @toggles = ('submitbugs'); - ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, - \%choices,$itemcount); - $$rowtotal ++; - } else { - my $css_class; - my %existing=&Apache::lonnet::dump('roles',$dom,$confname,'rolesdef_'); - my (%customroles,%ordered,%current); - if (ref($settings) eq 'HASH') { - if (ref($settings->{'adhoc'}) eq 'HASH') { - %current = %{$settings->{'adhoc'}}; - } - } - my $count = 0; - foreach my $key (sort(keys(%existing))) { - if ($key=~/^rolesdef\_(\w+)$/) { - my $rolename = $1; - my (%privs,$order); - ($privs{'system'},$privs{'domain'},$privs{'course'}) = split(/\_/,$existing{$key}); - $customroles{$rolename} = \%privs; - if (ref($current{$rolename}) eq 'HASH') { - $order = $current{$rolename}{'order'}; - } - if ($order eq '') { - $order = $count; - } - $ordered{$order} = $rolename; - $count++; - } - } - my $maxnum = scalar(keys(%ordered)); - my @roles_by_num = (); - foreach my $item (sort {$a <=> $b } (keys(%ordered))) { - push(@roles_by_num,$item); - } - my $context = 'domprefs'; - my $crstype = 'Course'; - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my @accesstypes = ('all','dh','da','none'); - my ($numstatustypes,@jsarray); - if (ref($types) eq 'ARRAY') { - if (@{$types} > 0) { - $numstatustypes = scalar(@{$types}); - push(@accesstypes,'status'); - @jsarray = ('bystatus'); - } - } - my %domhelpdesk = &Apache::lonnet::get_active_domroles($dom,['dh','da']); - if (keys(%domhelpdesk)) { - push(@accesstypes,('inc','exc')); - push(@jsarray,('notinc','notexc')); - } - my $hiddenstr = join("','",@jsarray); - $datatable .= &helpsettings_javascript(\@roles_by_num,$maxnum,$hiddenstr,$formname); - my $context = 'domprefs'; - my $crstype = 'Course'; - my $prefix = 'helproles_'; - my $add_class = 'LC_hidden'; - foreach my $num (@roles_by_num) { - my $role = $ordered{$num}; - my ($desc,$access,@statuses); - if (ref($current{$role}) eq 'HASH') { - $desc = $current{$role}{'desc'}; - $access = $current{$role}{'access'}; - if (ref($current{$role}{'insttypes'}) eq 'ARRAY') { - @statuses = @{$current{$role}{'insttypes'}}; - } - } - if ($desc eq '') { - $desc = $role; - } - my $identifier = 'custhelp'.$num; - my %full=(); - my %levels= ( - course => {}, - domain => {}, - system => {}, - ); - my %levelscurrent=( - course => {}, - domain => {}, - system => {}, - ); - &Apache::lonuserutils::custom_role_privs($customroles{$role},\%full,\%levels,\%levelscurrent); - my @templateroles = &Apache::lonuserutils::custom_template_roles($context,$crstype); - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $chgstr = ' onchange="javascript:reorderHelpRoles(this.form,'."'helproles_".$num."_pos'".');"'; - $datatable .= ''.$role.'
'. - ''.(' 'x2). - ''. - ''. - '
'.&mt('Role name').''. - &mt('Name shown to users:'). - ''. - '
'. - &helpdeskroles_access($dom,$prefix,$num,$add_class,$current{$role},\@accesstypes, - $othertitle,$usertypes,$types,\%domhelpdesk). - '
'. - ''.&mt('Role privileges').&adhocbutton($prefix,$num,'privs','show').''. - &Apache::lonuserutils::custom_role_table($crstype,\%full,\%levels, - \%levelscurrent,$identifier, - 'LC_hidden',$prefix.$num.'_privs'). - '
'; - $itemcount ++; - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $newcust = 'custhelp'.$count; - my (%privs,%levelscurrent); - my %full=(); - my %levels= ( - course => {}, - domain => {}, - system => {}, - ); - &Apache::lonuserutils::custom_role_privs(\%privs,\%full,\%levels,\%levelscurrent); - my @templateroles = &Apache::lonuserutils::custom_template_roles($context,$crstype); - my $chgstr = ' onchange="javascript:reorderHelpRoles(this.form,'."'helproles_".$count."_pos'".');"'; - $datatable .= ''. - '
'.&mt('Role name').''. - ''. - &mt('Internal name:'). - ''. - ''.(' 'x4). - ''. - &mt('Name shown to users:'). - ''. - '
'. - &helpdeskroles_access($dom,$prefix,$count,'',undef,\@accesstypes,$othertitle, - $usertypes,$types,\%domhelpdesk). - '
'.&mt('Role privileges').''. - &Apache::lonuserutils::custom_role_header($context,$crstype, - \@templateroles,$newcust). - &Apache::lonuserutils::custom_role_table('Course',\%full,\%levels, - \%levelscurrent,$newcust). - '
'. - &helpsettings_javascript(\@roles_by_num,$maxnum,$hiddenstr,$formname). - ''; - $count ++; - $$rowtotal += $count; - } - return $datatable; -} - -sub adhocbutton { - my ($prefix,$num,$field,$visibility) = @_; - my %lt = &Apache::lonlocal::texthash( - show => 'Show details', - hide => 'Hide details', - ); - return ''.(' 'x10). - ''.(' 'x2).''.(' 'x2); -} - -sub helpsettings_javascript { - my ($roles_by_num,$total,$hiddenstr,$formname) = @_; - return unless(ref($roles_by_num) eq 'ARRAY'); - my %html_js_lt = &Apache::lonlocal::texthash( - show => 'Show details', - hide => 'Hide details', - ); - &html_escape(\%html_js_lt); - my $jstext = ' var helproles = Array('."'".join("','",@{$roles_by_num})."'".');'."\n"; - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - -sub helpdeskroles_access { - my ($dom,$prefix,$num,$add_class,$current,$accesstypes,$othertitle, - $usertypes,$types,$domhelpdesk) = @_; - return unless ((ref($accesstypes) eq 'ARRAY') && (ref($domhelpdesk) eq 'HASH')); - my %lt = &Apache::lonlocal::texthash( - 'rou' => 'Role usage', - 'whi' => 'Which helpdesk personnel may use this role?', - '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', - ); - my %usecheck = ( - all => ' checked="checked"', - ); - my %displaydiv = ( - status => 'none', - inc => 'none', - exc => 'none', - priv => 'block', - ); - my $output; - if (ref($current) eq 'HASH') { - if (($current->{'access'} ne '') && ($current->{'access'} ne 'all')) { - if (grep(/^\Q$current->{access}\E$/,@{$accesstypes})) { - $usecheck{$current->{access}} = $usecheck{'all'}; - delete($usecheck{'all'}); - if ($current->{access} =~ /^(status|inc|exc)$/) { - my $access = $1; - $displaydiv{$access} = 'inline'; - } elsif ($current->{access} eq 'none') { - $displaydiv{'priv'} = 'none'; - } - } - } - } - $output = '
'.$lt{'rou'}.''. - '

'.$lt{'whi'}.'

'; - foreach my $access (@{$accesstypes}) { - $output .= '

'; - if ($access eq 'status') { - $output .= '

'. - &Apache::lonuserutils::adhoc_status_types($dom,$prefix,$num,$current->{$access}, - $othertitle,$usertypes,$types). - '
'; - } elsif (($access eq 'inc') && (keys(%{$domhelpdesk}) > 0)) { - $output .= '
'. - &Apache::lonuserutils::adhoc_staff($access,$prefix,$num,$current->{$access},$domhelpdesk). - '
'; - } elsif (($access eq 'exc') && (keys(%{$domhelpdesk}) > 0)) { - $output .= '
'. - &Apache::lonuserutils::adhoc_staff($access,$prefix,$num,$current->{$access},$domhelpdesk). - '
'; - } - $output .= '

'; - } - $output .= '
'; - return $output; + ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, + \%choices,$itemcount); + return $datatable; } sub radiobutton_prefs { @@ -3780,7 +2965,7 @@ sub radiobutton_prefs { } else { $datatable .= ''; } - $datatable .= + $datatable .= ''. ''. (' 'x2); } - $datatable .= '
'. - '
'.$lt{'linktext'}.'
'. - '
'. - '
'.$lt{'explanation'}.'
'. - '

'; $datatable .= '
'; foreach my $extra ('passback','roster') { my $checkedon = ''; @@ -3963,7 +3138,7 @@ sub print_ltitools { if (!$rolemaps{$role}) { $selectnone = ' selected="selected"'; } - $datatable .= ''. + $datatable .= ''. &Apache::lonnet::plaintext($role,'Course').'
'. ''; } - $datatable .= ''; - my %courseconfig; - if (ref($settings->{$item}) eq 'HASH') { - if (ref($settings->{$item}->{'crsconf'}) eq 'HASH') { - %courseconfig = %{$settings->{$item}->{'crsconf'}}; - } - } - $datatable .= '
'.&mt('Configurable in course').''; - foreach my $item ('label','title','target','linktext','explanation') { - my $checked; - if ($courseconfig{$item}) { - $checked = ' checked="checked"'; - } - $datatable .= ''.(' ' x2)."\n"; - } - $datatable .= '
'. + $datatable .= ''. '
'.&mt('Custom items sent on launch').''. ''; if (ref($settings->{$item}->{'custom'}) eq 'HASH') { @@ -4055,7 +3213,7 @@ sub print_ltitools { ''.&mt('Display target:'); my %defaultdisp; $defaultdisp{'iframe'} = ' checked="checked"'; - foreach my $disp ('iframe','tab','window') { + foreach my $disp ('iframe','window') { $datatable .= ''.(' 'x2); } @@ -4065,12 +3223,7 @@ sub print_ltitools { ''. (' 'x2); } - $datatable .= '
'. - '
'.$lt{'linktext'}.'
'. - '
'. - '
'.$lt{'explanation'}.'
'. - ''. - '

'; + $datatable .= '
'; foreach my $extra ('passback','roster') { $datatable .= $lt{$extra}.' '. '
'.&mt('Action').''.&mt('Name').''.&mt('Value').'
'. - '
'.&mt('Configurable in course').''; - foreach my $item ('label','title','target','linktext','explanation') { - $datatable .= ''.(' ' x2)."\n"; - } - $datatable .= '
'. '
'.&mt('Custom items sent on launch').''. ''. ''."\n"; - $itemcount ++; + @toggles = ('canuse_pdfforms','uselcmath','usejsme'); ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, \%choices,$itemcount); - $datatable = $mathdisp.$datatable; $css_class = $itemcount%2?' class="LC_odd_row"':''; $datatable .= '
'.&mt('Action').''.&mt('Name').''.&mt('Value').'
'. @@ -4129,35 +3275,26 @@ sub print_ltitools { sub ltitools_names { my %lt = &Apache::lonlocal::texthash( - 'title' => 'Title', - 'version' => 'Version', - 'msgtype' => 'Message Type', - 'url' => 'URL', - 'key' => 'Key', - 'secret' => 'Secret', - 'icon' => 'Icon', - 'user' => 'Username:domain', - 'fullname' => 'Full Name', - 'firstname' => 'First Name', - 'lastname' => 'Last Name', - 'email' => 'E-mail', - 'roles' => 'Role', - 'window' => 'Window', - 'tab' => 'Tab', - 'iframe' => 'iFrame', - 'height' => 'Height', - 'width' => 'Width', - 'linktext' => 'Default Link Text', - 'explanation' => 'Default Explanation', - 'passback' => 'Tool can return grades:', - 'roster' => 'Tool can retrieve roster:', - 'crstarget' => 'Display target', - 'crslabel' => 'Course label', - 'crstitle' => 'Course title', - 'crslinktext' => 'Link Text', - 'crsexplanation' => 'Explanation', + 'title' => 'Title', + 'version' => 'Version', + 'msgtype' => 'Message Type', + 'url' => 'URL', + 'key' => 'Key', + 'secret' => 'Secret', + 'icon' => 'Icon', + 'user' => 'Username:domain', + 'fullname' => 'Full Name', + 'firstname' => 'First Name', + 'lastname' => 'Last Name', + 'email' => 'E-mail', + 'roles' => 'Role', + 'window' => 'Window/Tab', + 'iframe' => 'iFrame', + 'height' => 'Height', + 'width' => 'Width', + 'passback' => 'Tool can return grades:', + 'roster' => 'Tool can retrieve roster:', ); - return %lt; } @@ -4166,59 +3303,30 @@ sub print_coursedefaults { my ($css_class,$datatable,%checkedon,%checkedoff,%defaultchecked,@toggles); my $itemcount = 1; my %choices = &Apache::lonlocal::texthash ( + canuse_pdfforms => 'Course/Community users can create/upload PDF forms', uploadquota => 'Default quota for files uploaded directly to course/community using Course Editor (MB)', anonsurvey_threshold => 'Responder count needed before showing submissions for anonymous surveys', coursecredits => 'Credits can be specified for courses', uselcmath => 'Math preview uses LON-CAPA previewer (javascript) in place of DragMath (Java)', usejsme => 'Molecule editor uses JSME (HTML5) in place of JME (Java)', - texengine => 'Default method to display mathematics', postsubmit => 'Disable submit button/keypress following student submission', - canclone => "People who may clone a course (besides course's owner and coordinators)", - mysqltables => 'Lifetime (s) of "Temporary" MySQL tables (student performance data) on homeserver', + canclone => "People who may clone a course (besides course's owner and coordinators)", ); my %staticdefaults = ( anonsurvey_threshold => 10, uploadquota => 500, postsubmit => 60, - mysqltables => 172800, ); if ($position eq 'top') { %defaultchecked = ( + 'canuse_pdfforms' => 'off', 'uselcmath' => 'on', 'usejsme' => 'on', - 'canclone' => 'none', + 'canclone' => 'none', ); - @toggles = ('uselcmath','usejsme'); - my $deftex = $Apache::lonnet::deftex; - if (ref($settings) eq 'HASH') { - if ($settings->{'texengine'}) { - if ($settings->{'texengine'} =~ /^(MathJax|mimetex|tth)$/) { - $deftex = $settings->{'texengine'}; - } - } - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $mathdisp = ''. - ''.$choices{'texengine'}. - ''. - '
'. @@ -4253,7 +3361,7 @@ sub print_coursedefaults { $currcanclone = $settings->{'canclone'}; } } - } + } foreach my $option (@cloneoptions) { my ($checked,$additional); if ($currcanclone eq $option) { @@ -4292,7 +3400,7 @@ sub print_coursedefaults { $itemcount ++; } else { $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - my ($currdefresponder,%defcredits,%curruploadquota,%deftimeout,%currmysql); + my ($currdefresponder,%defcredits,%curruploadquota,%deftimeout); my $currusecredits = 0; my $postsubmitclient = 1; my @types = ('official','unofficial','community','textbook'); @@ -4322,7 +3430,7 @@ sub print_coursedefaults { foreach my $type (@types) { if (ref($settings->{'postsubmit'}->{'timeout'}) eq 'HASH') { if ($settings->{'postsubmit'}->{'timeout'}->{$type} =~ /^\d+$/) { - $deftimeout{$type} = $settings->{'postsubmit'}->{'timeout'}->{$type}; + $deftimeout{$type} = $settings->{'postsubmit'}->{'timeout'}->{$type}; } else { $deftimeout{$type} = $staticdefaults{'postsubmit'}; } @@ -4336,15 +3444,6 @@ sub print_coursedefaults { $deftimeout{$type} = $staticdefaults{'postsubmit'}; } } - if (ref($settings->{'mysqltables'}) eq 'HASH') { - foreach my $type (keys(%{$settings->{'mysqltables'}})) { - $currmysql{$type} = $settings->{'mysqltables'}{$type}; - } - } else { - foreach my $type (@types) { - $currmysql{$type} = $staticdefaults{'mysqltables'}; - } - } } else { foreach my $type (@types) { $deftimeout{$type} = $staticdefaults{'postsubmit'}; @@ -4422,27 +3521,13 @@ sub print_coursedefaults { $additional .= '
'."\n"; %defaultchecked = ('postsubmit' => 'on'); @toggles = ('postsubmit'); - $current = { - 'postsubmit' => $postsubmitclient, - }; + my $current = { + 'postsubmit' => $postsubmitclient, + }; ($table,$itemcount) = &radiobutton_prefs($current,\@toggles,\%defaultchecked, \%choices,$itemcount,$onclick,$additional,'left'); $datatable .= $table; - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''. - $choices{'mysqltables'}. - ''. - ''. - ''; - foreach my $type (@types) { - $datatable .= ''; - } - $datatable .= '
'.&mt($type).'
'. - '
'."\n"; - $itemcount ++; - } $$rowtotal += $itemcount; return $datatable; @@ -4636,7 +3721,7 @@ sub print_validation_rows { ' '; } } elsif ($item eq 'markup') { - $datatable .= ''; } @@ -4658,7 +3743,7 @@ sub print_validation_rows { my ($numdc,$dctable,$rows) = &active_dc_picker($dom,$numinrow,'radio', 'validationdc',%currhash); my $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''; + $datatable .= ''; if ($numdc > 1) { $datatable .= &mt('Course creation processed as: (choose Dom. Coord.)'); } else { @@ -4673,428 +3758,6 @@ sub print_validation_rows { return $datatable; } -sub print_passwords { - my ($position,$dom,$confname,$settings,$rowtotal) = @_; - my ($datatable,$css_class); - my $itemcount = 0; - my %titles = &Apache::lonlocal::texthash ( - captcha => '"Forgot Password" CAPTCHA validation', - link => 'Reset link expiration (hours)', - case => 'Case-sensitive usernames/e-mail', - prelink => 'Information required (form 1)', - postlink => 'Information required (form 2)', - emailsrc => 'LON-CAPA e-mail address type(s)', - customtext => 'Domain specific text (HTML)', - 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 and disallow reuse', - ); - if ($position eq 'top') { - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my $shownlinklife = 2; - my $prelink = 'both'; - my (%casesens,%postlink,%emailsrc,$nostdtext,$customurl); - if (ref($settings) eq 'HASH') { - if ($settings->{resetlink} =~ /^\d+(|\.\d*)$/) { - $shownlinklife = $settings->{resetlink}; - } - if (ref($settings->{resetcase}) eq 'ARRAY') { - map { $casesens{$_} = 1; } (@{$settings->{resetcase}}); - } - if ($settings->{resetprelink} =~ /^(both|either)$/) { - $prelink = $settings->{resetprelink}; - } - if (ref($settings->{resetpostlink}) eq 'HASH') { - %postlink = %{$settings->{resetpostlink}}; - } - if (ref($settings->{resetemail}) eq 'ARRAY') { - map { $emailsrc{$_} = 1; } (@{$settings->{resetemail}}); - } - if ($settings->{resetremove}) { - $nostdtext = 1; - } - if ($settings->{resetcustom}) { - $customurl = $settings->{resetcustom}; - } - } else { - if (ref($types) eq 'ARRAY') { - foreach my $item (@{$types}) { - $casesens{$item} = 1; - $postlink{$item} = ['username','email']; - } - } - $casesens{'default'} = 1; - $postlink{'default'} = ['username','email']; - $prelink = 'both'; - %emailsrc = ( - permanent => 1, - critical => 1, - notify => 1, - ); - } - $datatable = &captcha_choice('passwords',$settings,$$rowtotal); - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'link'}.''. - ''. - ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'case'}.''. - ''; - if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) { - foreach my $item (@{$types}) { - my $checkedcase; - if ($casesens{$item}) { - $checkedcase = ' checked="checked"'; - } - $datatable .= ''. - '   '; - } - } - my $checkedcase; - if ($casesens{'default'}) { - $checkedcase = ' checked="checked"'; - } - $datatable .= ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my %checkedpre = ( - both => ' checked="checked"', - either => '', - ); - if ($prelink eq 'either') { - $checkedpre{either} = ' checked="checked"'; - $checkedpre{both} = ''; - } - $datatable .= ''.$titles{'prelink'}.''. - ''. - '   '. - ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'postlink'}.''. - ''; - my %postlinked; - if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) { - foreach my $item (@{$types}) { - undef(%postlinked); - $datatable .= '
'. - ''.$usertypes->{$item}.''; - if (ref($postlink{$item}) eq 'ARRAY') { - map { $postlinked{$_} = 1; } (@{$postlink{$item}}); - } - foreach my $field ('email','username') { - my $checked; - if ($postlinked{$field}) { - $checked = ' checked="checked"'; - } - $datatable .= ''. - '   '; - } - $datatable .= '
'; - } - } - if (ref($postlink{'default'}) eq 'ARRAY') { - map { $postlinked{$_} = 1; } (@{$postlink{'default'}}); - } - $datatable .= '
'. - ''.$othertitle.''; - foreach my $field ('email','username') { - my $checked; - if ($postlinked{$field}) { - $checked = ' checked="checked"'; - } - $datatable .= ''. - '   '; - } - $datatable .= '
'; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'emailsrc'}.''. - ''; - foreach my $type ('permanent','critical','notify') { - my $checkedemail; - if ($emailsrc{$type}) { - $checkedemail = ' checked="checked"'; - } - $datatable .= ''. - '   '; - } - $datatable .= ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $switchserver = &check_switchserver($dom,$confname); - my ($showstd,$noshowstd); - if ($nostdtext) { - $noshowstd = ' checked="checked"'; - } else { - $showstd = ' checked="checked"'; - } - $datatable .= ''.$titles{'customtext'}.''. - ''. - &mt('Retain standard text:'). - ''.' '. - '
'. - ''. - &mt('(If you use the same account ... reset a password from this page.)').'

'. - &mt('Include custom text:'); - if ($customurl) { - my $link = &Apache::loncommon::modal_link($customurl,&mt('Custom text file'),600,500, - undef,undef,undef,undef,'background-color:#ffffff'); - $datatable .= ' '.$link. - ''. - '  '.&mt('Replace:').''; - } - if ($switchserver) { - $datatable .= ' '.&mt('Upload to library server: [_1]',$switchserver).''; - } else { - $datatable .=' '. - ''; - } - $datatable .= ''; - } elsif ($position eq 'middle') { - my %domconf = &Apache::lonnet::get_dom('configuration',['defaults'],$dom); - my @items = ('intauth_cost','intauth_check','intauth_switch'); - my %defaults; - if (ref($domconf{'defaults'}) eq 'HASH') { - %defaults = %{$domconf{'defaults'}}; - if ($defaults{'intauth_cost'} !~ /^\d+$/) { - $defaults{'intauth_cost'} = 10; - } - if ($defaults{'intauth_check'} !~ /^(0|1|2)$/) { - $defaults{'intauth_check'} = 0; - } - if ($defaults{'intauth_switch'} !~ /^(0|1|2)$/) { - $defaults{'intauth_switch'} = 0; - } - } else { - %defaults = ( - 'intauth_cost' => 10, - 'intauth_check' => 0, - 'intauth_switch' => 0, - ); - } - foreach my $item (@items) { - if ($itemcount%2) { - $css_class = ''; - } else { - $css_class = ' class="LC_odd_row" '; - } - $datatable .= ''. - ''.$titles{$item}. - ''; - if ($item eq 'intauth_switch') { - my @options = (0,1,2); - my %optiondesc = &Apache::lonlocal::texthash ( - 0 => 'No', - 1 => 'Yes', - 2 => 'Yes, and copy existing passwd file to passwd.bak file', - ); - $datatable .= ''; - foreach my $option (@options) { - my $checked = ' '; - if ($defaults{$item} eq $option) { - $checked = ' checked="checked"'; - } - $datatable .= ''; - } - $datatable .= '
'. - '
'; - } elsif ($item eq 'intauth_check') { - my @options = (0,1,2); - 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', - ); - $datatable .= ''; - foreach my $option (@options) { - my $checked = ' '; - my $onclick; - if ($defaults{$item} eq $option) { - $checked = ' checked="checked"'; - } - if ($option == 2) { - $onclick = ' onclick="javascript:warnIntAuth(this);"'; - } - $datatable .= ''; - } - $datatable .= '
'. - '
'; - } else { - $datatable .= ''; - } - $datatable .= ''; - $itemcount ++; - } - } elsif ($position eq 'lower') { - my ($min,$max,%chars,$numsaved); - $min = $Apache::lonnet::passwdmin; - if (ref($settings) eq 'HASH') { - if ($settings->{min}) { - $min = $settings->{min}; - } - if ($settings->{max}) { - $max = $settings->{max}; - } - if (ref($settings->{chars}) eq 'ARRAY') { - map { $chars{$_} = 1; } (@{$settings->{chars}}); - } - if ($settings->{numsaved}) { - $numsaved = $settings->{numsaved}; - } - } - my %rulenames = &Apache::lonlocal::texthash( - uc => 'At least one upper case letter', - lc => 'At least one lower case letter', - num => 'At least one number', - spec => 'At least one non-alphanumeric', - ); - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'min'}.''. - ''. - ''. - ' '.&mt('(Enter an integer: 7 or larger)').''. - ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'max'}.''. - ''. - ''. - ' '.&mt('(Leave blank for no maximum)').''. - ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'chars'}.'
'. - ''.&mt('(Leave unchecked if not required)'). - ''; - my $numinrow = 2; - my @possrules = ('uc','lc','num','spec'); - $datatable .= ''; - for (my $i=0; $i<@possrules; $i++) { - my ($rem,$checked); - if ($chars{$possrules[$i]}) { - $checked = ' checked="checked"'; - } - $rem = $i%($numinrow); - if ($rem == 0) { - if ($i > 0) { - $datatable .= ''; - } - $datatable .= ''; - } - $datatable .= ''; - } - my $rem = @possrules%($numinrow); - my $colsleft = $numinrow - $rem; - if ($colsleft > 1 ) { - $datatable .= ''; - } elsif ($colsleft == 1) { - $datatable .= ''; - } - $datatable .='
'. - '  
'; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'numsaved'}.''. - ''. - ''. - ' '.&mt('(Leave blank to not save previous passwords)').''. - ''; - } else { - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my %ownerchg = ( - by => {}, - for => {}, - ); - my %ownertitles = &Apache::lonlocal::texthash ( - by => 'Course owner status(es) allowed', - for => 'Student status(es) allowed', - ); - if (ref($settings) eq 'HASH') { - if (ref($settings->{crsownerchg}) eq 'HASH') { - if (ref($settings->{crsownerchg}{'by'}) eq 'ARRAY') { - map { $ownerchg{by}{$_} = 1; } (@{$settings->{crsownerchg}{'by'}}); - } - if (ref($settings->{crsownerchg}{'for'}) eq 'ARRAY') { - map { $ownerchg{for}{$_} = 1; } (@{$settings->{crsownerchg}{'for'}}); - } - } - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''. - &mt('Requirements').'
    '. - '
  • '.&mt("Course 'type' is not a Community").'
  • '. - '
  • '.&mt('User is Course Coordinator and also course owner').'
  • '. - '
  • '.&mt("Student's only active roles are student role(s) in course(s) owned by this user").'
  • '. - '
  • '.&mt('User, course, and student share same domain').'
  • '. - '
'. - ''. - ''; - foreach my $item ('by','for') { - $datatable .= '
'. - ''.$ownertitles{$item}.''; - if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) { - foreach my $type (@{$types}) { - my $checked; - if ($ownerchg{$item}{$type}) { - $checked = ' checked="checked"'; - } - $datatable .= ''. - '   '; - } - } - my $checked; - if ($ownerchg{$item}{'default'}) { - $checked = ' checked="checked"'; - } - $datatable .= '
'; - } - $datatable .= ''; - } - return $datatable; -} - sub print_usersessions { my ($position,$dom,$settings,$rowtotal) = @_; my ($css_class,$datatable,%checked,%choices); @@ -5397,7 +4060,7 @@ sub spares_row { '. &mt('[_1] when busy, offloads to:' ,''.$server.'').'
'. - ''."\n". + ''."\n". ''. "\n"; @@ -5524,13 +4187,13 @@ sub print_loadbalancing { my $numinrow = 1; my $datatable; my %servers = &Apache::lonnet::internet_dom_servers($dom); - my (%currbalancer,%currtargets,%currrules,%existing,%currcookies); + my (%currbalancer,%currtargets,%currrules,%existing); if (ref($settings) eq 'HASH') { %existing = %{$settings}; } if ((keys(%servers) > 1) || (keys(%existing) > 0)) { &get_loadbalancers_config(\%servers,\%existing,\%currbalancer, - \%currtargets,\%currrules,\%currcookies); + \%currtargets,\%currrules); } else { return; } @@ -5604,12 +4267,6 @@ sub print_loadbalancing { my ($numspares,@spares) = &count_servers($lonhost,%servers); my @sparestypes = ('primary','default'); my %typetitles = &sparestype_titles(); - my %hostherechecked = ( - no => ' checked="checked"', - ); - my %balcookiechecked = ( - no => ' checked="checked"', - ); foreach my $sparetype (@sparestypes) { my $targettable; for (my $i=0; $i<$numspares; $i++) { @@ -5655,35 +4312,8 @@ sub print_loadbalancing { $datatable .= ''.$typetitles{$sparetype}.'
'. ''.$targettable.'

'; } - $hostherechecked{$sparetype} = ''; - if (ref($currtargets{$lonhost}) eq 'HASH') { - if (ref($currtargets{$lonhost}{$sparetype}) eq 'ARRAY') { - if (grep(/^\Q$lonhost\E$/,@{$currtargets{$lonhost}{$sparetype}})) { - $hostherechecked{$sparetype} = ' checked="checked"'; - $hostherechecked{'no'} = ''; - } - } - } } - if ($currcookies{$lonhost}) { - %balcookiechecked = ( - yes => ' checked="checked"', - ); - } - $datatable .= &mt('Hosting on balancer itself').'
'. - '
'; - foreach my $sparetype (@sparestypes) { - $datatable .= '
'; - } - $datatable .= &mt('Use balancer cookie').'
'. - '
'. - '
'. - ''. + $datatable .= ''. &loadbalancing_rules($dom,$intdom,$currrules{$lonhost}, $othertitle,$usertypes,$types,\%servers, \%currbalancer,$lonhost, @@ -5697,11 +4327,10 @@ sub print_loadbalancing { } sub get_loadbalancers_config { - my ($servers,$existing,$currbalancer,$currtargets,$currrules,$currcookies) = @_; + my ($servers,$existing,$currbalancer,$currtargets,$currrules) = @_; return unless ((ref($servers) eq 'HASH') && (ref($existing) eq 'HASH') && (ref($currbalancer) eq 'HASH') && - (ref($currtargets) eq 'HASH') && (ref($currrules) eq 'HASH') && - (ref($currcookies) eq 'HASH')); + (ref($currtargets) eq 'HASH') && (ref($currrules) eq 'HASH')); if (keys(%{$existing}) > 0) { my $oldlonhost; foreach my $key (sort(keys(%{$existing}))) { @@ -5720,9 +4349,6 @@ sub get_loadbalancers_config { $currbalancer->{$key} = 1; $currtargets->{$key} = $existing->{$key}{'targets'}; $currrules->{$key} = $existing->{$key}{'rules'}; - if ($existing->{$key}{'cookie'}) { - $currcookies->{$key} = 1; - } } } } else { @@ -5778,14 +4404,9 @@ sub loadbalancing_titles { '_LC_ipchange' => &mt('Non-SSO users with IP mismatch'), ); my @alltypes = ('_LC_adv','_LC_author','_LC_internetdom','_LC_external','_LC_ipchangesso','_LC_ipchange'); - my @available; if (ref($types) eq 'ARRAY') { - @available = @{$types}; + unshift(@alltypes,@{$types},'default'); } - unless (grep(/^default$/,@available)) { - push(@available,'default'); - } - unshift(@alltypes,@available); my %titles; foreach my $type (@alltypes) { if ($type =~ /^_LC_/) { @@ -5908,17 +4529,15 @@ sub sparestype_titles { sub contact_titles { my %titles = &Apache::lonlocal::texthash ( - 'supportemail' => 'Support E-mail address', - 'adminemail' => 'Default Server Admin E-mail address', - 'errormail' => 'Error reports to be e-mailed to', - 'packagesmail' => 'Package update alerts to be e-mailed to', - 'helpdeskmail' => "Helpdesk requests from all users in this domain", - 'otherdomsmail' => 'Helpdesk requests from users in other (unconfigured) domains', - 'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)', - 'requestsmail' => 'E-mail from course requests requiring approval', - 'updatesmail' => 'E-mail from nightly check of LON-CAPA module integrity/updates', + 'supportemail' => 'Support E-mail address', + 'adminemail' => 'Default Server Admin E-mail address', + 'errormail' => 'Error reports to be e-mailed to', + 'packagesmail' => 'Package update alerts to be e-mailed to', + 'helpdeskmail' => 'Helpdesk requests to be e-mailed to', + 'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)', + 'requestsmail' => 'E-mail from course requests requiring approval', + 'updatesmail' => 'E-mail from nightly check of LON-CAPA module integrity/updates', 'idconflictsmail' => 'E-mail from bi-nightly check for multiple users sharing same student/employee ID', - 'hostipmail' => 'E-mail from nightly check of hostname/IP network changes', ); my %short_titles = &Apache::lonlocal::texthash ( adminemail => 'Admin E-mail address', @@ -5927,34 +4546,6 @@ sub contact_titles { return (\%titles,\%short_titles); } -sub helpform_fields { - my %titles = &Apache::lonlocal::texthash ( - 'username' => 'Name', - 'user' => 'Username/domain', - 'phone' => 'Phone', - 'cc' => 'Cc e-mail', - 'course' => 'Course Details', - 'section' => 'Sections', - 'screenshot' => 'File upload', - ); - my @fields = ('username','phone','user','course','section','cc','screenshot'); - my %possoptions = ( - username => ['yes','no','req'], - phone => ['yes','no','req'], - user => ['yes','no'], - cc => ['yes','no'], - course => ['yes','no'], - section => ['yes','no'], - screenshot => ['yes','no'], - ); - my %fieldoptions = &Apache::lonlocal::texthash ( - 'yes' => 'Optional', - 'req' => 'Required', - 'no' => "Not shown", - ); - return (\@fields,\%titles,\%fieldoptions,\%possoptions); -} - sub tool_titles { my %titles = &Apache::lonlocal::texthash ( aboutme => 'Personal web page', @@ -6139,8 +4730,7 @@ sub print_usercreation { sub print_selfcreation { my ($position,$dom,$settings,$rowtotal) = @_; - my (@selfcreate,$createsettings,$processing,$emailoptions,$emailverified, - $emaildomain,$datatable); + my (@selfcreate,$createsettings,$processing,$datatable); if (ref($settings) eq 'HASH') { if (ref($settings->{'cancreate'}) eq 'HASH') { $createsettings = $settings->{'cancreate'}; @@ -6157,22 +4747,12 @@ sub print_selfcreation { if (ref($createsettings->{'selfcreateprocessing'}) eq 'HASH') { $processing = $createsettings->{'selfcreateprocessing'}; } - if (ref($createsettings->{'emailoptions'}) eq 'HASH') { - $emailoptions = $createsettings->{'emailoptions'}; - } - if (ref($createsettings->{'emailverified'}) eq 'HASH') { - $emailverified = $createsettings->{'emailverified'}; - } - if (ref($createsettings->{'emaildomain'}) eq 'HASH') { - $emaildomain = $createsettings->{'emaildomain'}; - } } } } my %radiohash; my $numinrow = 4; map { $radiohash{'cancreate_'.$_} = 1; } @selfcreate; - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); if ($position eq 'top') { my %choices = &Apache::lonlocal::texthash ( cancreate_login => 'Institutional Login', @@ -6187,12 +4767,14 @@ sub print_selfcreation { ($datatable,$itemcount) = &radiobutton_prefs(\%radiohash,\@toggles,\%defaultchecked, \%choices,$itemcount,$onclick); $$rowtotal += $itemcount; + + my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); if (ref($usertypes) eq 'HASH') { if (keys(%{$usertypes}) > 0) { $datatable .= &insttypes_row($createsettings,$types,$usertypes, $dom,$numinrow,$othertitle, - 'statustocreate',$rowtotal); + 'statustocreate',$$rowtotal); $$rowtotal ++; } } @@ -6205,7 +4787,7 @@ sub print_selfcreation { $datatable .= ''. ''.&mt('Mapping of Shibboleth environment variable names to user data fields (SSO auth)').''. ''."\n". - ''."\n"; + '
\n". - '\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'}) { @@ -6685,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 = ''. - ''; return $output; } @@ -8617,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}) { @@ -8849,6 +6827,7 @@ sub modify_login { return $resulttext; } + sub check_exempt_addresses { my ($iplist) = @_; $iplist =~ s/^\s+//; @@ -9292,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); @@ -9321,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}); @@ -9366,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')); } @@ -9434,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; @@ -9450,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"; @@ -9462,7 +7441,7 @@ $env{'user.name'}.':'.$env{'user.domain' $output = $versionresult; } } - return ($output,$logourl); + return ($output,$logourl,$madethumb); } sub logo_versioning { @@ -9514,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=$_; @@ -9548,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) { @@ -9574,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; @@ -9759,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}) { @@ -9773,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'} = @@ -9820,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.'
  • '; } } } @@ -9912,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; } @@ -9936,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') { @@ -10324,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 { @@ -10342,7 +8313,7 @@ sub process_textbook_image { sub modify_ltitools { my ($r,$dom,$action,$lastactref,%domconfig) = @_; my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1); - my ($newid,@allpos,%changes,%confhash,%encconfig,$errors,$resulttext); + 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); @@ -10352,7 +8323,7 @@ sub modify_ltitools { map { $posslti{$_} = 1; } @ltiroles; my @allfields = ('fullname','firstname','lastname','email','user','roles'); map { $possfield{$_} = 1; } @allfields; - my %lt = <itools_names(); + my %lt = <itools_names(); if ($env{'form.ltitools_add'}) { my $title = $env{'form.ltitools_add_title'}; $title =~ s/(`)/'/g; @@ -10367,11 +8338,7 @@ sub modify_ltitools { foreach my $item ('title','url','key','secret') { $env{'form.ltitools_add_'.$item} =~ s/(`)/'/g; if ($env{'form.ltitools_add_'.$item}) { - if (($item eq 'key') || ($item eq 'secret')) { - $encconfig{$newid}{$item} = $env{'form.ltitools_add_'.$item}; - } else { - $confhash{$newid}{$item} = $env{'form.ltitools_add_'.$item}; - } + $confhash{$newid}{$item} = $env{'form.ltitools_add_'.$item}; } } if ($env{'form.ltitools_add_version'} eq 'LTI-1p0') { @@ -10380,23 +8347,15 @@ sub modify_ltitools { if ($env{'form.ltitools_add_msgtype'} eq 'basic-lti-launch-request') { $confhash{$newid}{'msgtype'} = $env{'form.ltitools_add_msgtype'}; } - foreach my $item ('width','height','linktext','explanation') { + foreach my $item ('width','height') { $env{'form.ltitools_add_'.$item} =~ s/^\s+//; $env{'form.ltitools_add_'.$item} =~ s/\s+$//; - if (($item eq 'width') || ($item eq 'height')) { - if ($env{'form.ltitools_add_'.$item} =~ /^\d+$/) { - $confhash{$newid}{'display'}{$item} = $env{'form.ltitools_add_'.$item}; - } - } else { - if ($env{'form.ltitools_add_'.$item} ne '') { - $confhash{$newid}{'display'}{$item} = $env{'form.ltitools_add_'.$item}; - } + 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'}; - } elsif ($env{'form.ltitools_add_target'} eq 'tab') { - $confhash{$newid}{'display'}{'target'} = $env{'form.ltitools_add_target'}; } else { $confhash{$newid}{'display'}{'target'} = 'iframe'; } @@ -10407,7 +8366,7 @@ sub modify_ltitools { } if ($env{'form.ltitools_add_image.filename'} ne '') { my ($imageurl,$error) = - &process_ltitools_image($r,$dom,$confname,'ltitools_add_image',$newid, + &process_ltitools_image($r,$dom,$confname,'ltitools_add_image',$dom, $configuserok,$switchserver,$author_ok); if ($imageurl) { $confhash{$newid}{'image'} = $imageurl; @@ -10426,7 +8385,7 @@ sub modify_ltitools { if (($choice ne '') && ($posslti{$choice})) { $confhash{$newid}{'roles'}{$role} = $choice; if ($role eq 'cc') { - $confhash{$newid}{'roles'}{'co'} = $choice; + $confhash{$newid}{'roles'}{'co'} = $choice; } } } @@ -10435,10 +8394,6 @@ sub modify_ltitools { } } } - my @courseconfig = &Apache::loncommon::get_env_multiple('form.ltitools_courseconfig'); - foreach my $item (@courseconfig) { - $confhash{$newid}{'crsconf'}{$item} = 1; - } if ($env{'form.ltitools_add_custom'}) { my $name = $env{'form.ltitools_add_custom_name'}; my $value = $env{'form.ltitools_add_custom_value'}; @@ -10447,7 +8402,7 @@ sub modify_ltitools { $confhash{$newid}{'custom'}{$name} = $value; } } else { - my $error = &mt('Failed to acquire unique ID for new external tool'); + my $error = &mt('Failed to acquire unique ID for new external tool'); $errors .= '
  • '.$error.'
  • '; } } @@ -10461,7 +8416,7 @@ sub modify_ltitools { 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) { @@ -10470,7 +8425,6 @@ sub modify_ltitools { my $maxnum = $env{'form.ltitools_maxnum'}; for (my $i=0; $i<=$maxnum; $i++) { my $itemid = $env{'form.ltitools_id_'.$i}; - $itemid =~ s/\D+//g; if (ref($domconfig{$action}{$itemid}) eq 'HASH') { if ($deletions{$itemid}) { if ($domconfig{$action}{$itemid}{'image'}) { @@ -10481,18 +8435,12 @@ sub modify_ltitools { } else { my $newpos = $env{'form.ltitools_'.$itemid}; $newpos =~ s/\D+//g; - foreach my $item ('title','url') { + 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; } } - foreach my $item ('key','secret') { - $encconfig{$itemid}{$item} = $env{'form.ltitools_'.$item.'_'.$i}; - if ($domconfig{$action}{$itemid}{$item} ne $encconfig{$itemid}{$item}) { - $changes{$itemid} = 1; - } - } if ($env{'form.ltitools_version_'.$i} eq 'LTI-1p0') { $confhash{$itemid}{'version'} = $env{'form.ltitools_version_'.$i}; } @@ -10511,34 +8459,10 @@ sub modify_ltitools { } else { $changes{$itemid} = 1; } - } elsif (ref($domconfig{$action}{$itemid}{'display'}) eq 'HASH') { - if ($domconfig{$action}{$itemid}{'display'}{$size} ne '') { - $changes{$itemid} = 1; - } - } - } - foreach my $item ('linktext','explanation') { - $env{'form.ltitools_'.$item.'_'.$i} =~ s/^\s+//; - $env{'form.ltitools_'.$item.'_'.$i} =~ s/\s+$//; - if ($env{'form.ltitools_'.$item.'_'.$i} ne '') { - $confhash{$itemid}{'display'}{$item} = $env{'form.ltitools_'.$item.'_'.$i}; - if (ref($domconfig{$action}{$itemid}{'display'}) eq 'HASH') { - if ($domconfig{$action}{$itemid}{'display'}{$item} ne $confhash{$itemid}{'display'}{$item}) { - $changes{$itemid} = 1; - } - } else { - $changes{$itemid} = 1; - } - } elsif (ref($domconfig{$action}{$itemid}{'display'}) eq 'HASH') { - if ($domconfig{$action}{$itemid}{'display'}{$item} ne '') { - $changes{$itemid} = 1; - } } } if ($env{'form.ltitools_target_'.$i} eq 'window') { $confhash{$itemid}{'display'}{'target'} = $env{'form.ltitools_target_'.$i}; - } elsif ($env{'form.ltitools_target_'.$i} eq 'tab') { - $confhash{$itemid}{'display'}{'target'} = $env{'form.ltitools_target_'.$i}; } else { $confhash{$itemid}{'display'}{'target'} = 'iframe'; } @@ -10557,19 +8481,6 @@ sub modify_ltitools { $changes{$itemid} = 1; } } - my @courseconfig = &Apache::loncommon::get_env_multiple('form.ltitools_courseconfig_'.$i); - foreach my $item ('label','title','target','linktext','explanation') { - if (grep(/^\Q$item\E$/,@courseconfig)) { - $confhash{$itemid}{'crsconf'}{$item} = 1; - if (ref($domconfig{$action}{$itemid}{'crsconf'}) eq 'HASH') { - if ($domconfig{$action}{$itemid}{'crsconf'}{$item} ne $confhash{$itemid}{'crsconf'}{$item}) { - $changes{$itemid} = 1; - } - } else { - $changes{$itemid} = 1; - } - } - } my @fields = &Apache::loncommon::get_env_multiple('form.ltitools_fields_'.$i); foreach my $field (@fields) { if ($possfield{$field}) { @@ -10638,7 +8549,7 @@ sub modify_ltitools { } } my %customdels; - my @customdeletions = &Apache::loncommon::get_env_multiple('form.ltitools_customdel_'.$i); + my @customdeletions = &Apache::loncommon::get_env_multiple('form.ltitools_customdel_'.$i); if (@customdeletions) { $changes{$itemid} = 1; } @@ -10647,7 +8558,7 @@ sub modify_ltitools { 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}; + $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; @@ -10697,21 +8608,9 @@ sub modify_ltitools { my $putresult = &Apache::lonnet::put_dom('configuration',\%ltitoolshash, $dom); if ($putresult eq 'ok') { - my %ltienchash = ( - $action => { %encconfig } - ); - &Apache::lonnet::put_dom('encconfig',\%ltienchash,$dom); if (keys(%changes) > 0) { my $cachetime = 24*60*60; - my %ltiall = %confhash; - foreach my $id (keys(%ltiall)) { - if (ref($encconfig{$id}) eq 'HASH') { - foreach my $item ('key','secret') { - $ltiall{$id}{$item} = $encconfig{$id}{$item}; - } - } - } - &Apache::lonnet::do_cache_new('ltitools',$dom,\%ltiall,$cachetime); + &Apache::lonnet::do_cache_new('ltitools',$dom,\%confhash,$cachetime); if (ref($lastactref) eq 'HASH') { $lastactref->{'ltitools'} = 1; } @@ -10722,7 +8621,7 @@ sub modify_ltitools { $bynum{$position} = $itemid; } foreach my $pos (sort { $a <=> $b } keys(%bynum)) { - my $itemid = $bynum{$pos}; + my $itemid = $bynum{$pos}; if (ref($confhash{$itemid}) ne 'HASH') { $resulttext .= '
  • '.&mt('Deleted: [_1]',$changes{$itemid}).'
  • '; } else { @@ -10735,34 +8634,16 @@ sub modify_ltitools { $resulttext .= '
      '; my $position = $pos + 1; $resulttext .= '
    • '.&mt('Order: [_1]',$position).'
    • '; - foreach my $item ('version','msgtype','url') { + foreach my $item ('version','msgtype','url','key') { if ($confhash{$itemid}{$item} ne '') { $resulttext .= '
    • '.$lt{$item}.': '.$confhash{$itemid}{$item}.'
    • '; } } - if ($encconfig{$itemid}{'key'} ne '') { - $resulttext .= '
    • '.$lt{'key'}.': '.$encconfig{$itemid}{'key'}.'
    • '; - } - if ($encconfig{$itemid}{'secret'} ne '') { + if ($confhash{$itemid}{'secret'} ne '') { $resulttext .= '
    • '.$lt{'secret'}.': '; - my $num = length($encconfig{$itemid}{'secret'}); + my $num = length($confhash{$itemid}{'secret'}); $resulttext .= ('*'x$num).'
    • '; } - $resulttext .= '
    • '.&mt('Configurable in course:'); - my @possconfig = ('label','title','target','linktext','explanation'); - my $numconfig = 0; - if (ref($confhash{$itemid}{'crsconf'}) eq 'HASH') { - foreach my $item (@possconfig) { - if ($confhash{$itemid}{'crsconf'}{$item}) { - $numconfig ++; - $resulttext .= ' "'.$lt{'crs'.$item}.'"'; - } - } - } - if (!$numconfig) { - $resulttext .= &mt('None'); - } - $resulttext .= '
    • '; foreach my $item ('passback','roster') { $resulttext .= '
    • '.$lt{$item}.' '; if ($confhash{$itemid}{$item}) { @@ -10778,7 +8659,7 @@ sub modify_ltitools { $displaylist = &mt('Display target').': '. $confhash{$itemid}{'display'}{'target'}.','; } - foreach my $size ('width','height') { + foreach my $size ('width','height') { if ($confhash{$itemid}{'display'}{$size}) { $displaylist .= (' 'x2).$lt{$size}.': '. $confhash{$itemid}{'display'}{$size}.','; @@ -10788,12 +8669,7 @@ sub modify_ltitools { $displaylist =~ s/,$//; $resulttext .= '
    • '.$displaylist.'
    • '; } - foreach my $item ('linktext','explanation') { - if ($confhash{$itemid}{'display'}{$item}) { - $resulttext .= '
    • '.$lt{$item}.': '.$confhash{$itemid}{'display'}{$item}.'
    • '; - } - } - } + } if (ref($confhash{$itemid}{'fields'}) eq 'HASH') { my $fieldlist; foreach my $field (@allfields) { @@ -10815,7 +8691,7 @@ sub modify_ltitools { } } if ($rolemaps) { - $rolemaps =~ s/,$//; + $rolemaps =~ s/,$//; $resulttext .= '
    • '.&mt('Role mapping:').$rolemaps.'
    • '; } } @@ -10824,12 +8700,12 @@ sub modify_ltitools { 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 .= '
    '; } } @@ -10890,7 +8766,7 @@ sub get_ltitools_id { 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); @@ -10935,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'}; @@ -10946,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, @@ -10983,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'}) { @@ -11006,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'); @@ -11232,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'} = ''; } @@ -11289,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') { @@ -11297,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'); @@ -11374,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, } @@ -11393,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') { @@ -11483,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 = ''. @@ -11505,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); @@ -11520,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) { @@ -11542,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}) { @@ -11618,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 { @@ -11687,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'); - } - } } } } @@ -11754,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}); @@ -11766,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'); + $resulttext .= ' '.&mt('with Bcc to').': '.$bcc{$type}.''; } - 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}; - } - } - } 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 .= '
  • '. @@ -11866,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 = ''. @@ -11917,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 (!ref($domconfig{passwords}) eq 'HASH') { - 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 (!ref($domconfig{passwords}) eq 'HASH') { - 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 (!ref($domconfig{passwords}) eq 'HASH') { - 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 (!ref($domconfig{passwords}) eq 'HASH') { - 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 (!ref($domconfig{passwords}) eq 'HASH') { - 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 (!(ref($domconfig{passwords}) eq 'HASH')) { - 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: ').'

      '. - $errors.'

    '; - } - return $resulttext; -} - sub modify_usercreation { my ($dom,%domconfig) = @_; my ($resulttext,%curr_usercreation,%changes,%authallowed,%cancreate,%save_usercreate); @@ -12446,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}; } } } @@ -12652,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'}. # @@ -12673,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}; @@ -12703,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}; } } } @@ -12867,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 @@ -12876,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)$/) { @@ -12889,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'); @@ -12909,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.').' '. @@ -12934,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)) { @@ -12948,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 @@ -12960,7 +9916,7 @@ sub modify_selfcreation { } } } else { - foreach my $type (@types) { + foreach my $type (@{$types}) { push(@{$changes{'selfcreate'}},$type); } } @@ -13009,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); } @@ -13041,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); } @@ -13057,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') { @@ -13094,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'}; } @@ -13110,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) { @@ -13129,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.'); @@ -13144,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:'). '
      '; @@ -13175,7 +10125,7 @@ sub modify_selfcreation { } } $chgtext .= '
    '; - } + } } elsif ($type eq 'statustocreate') { if ((ref($cancreate{'selfcreate'}) eq 'ARRAY') && (ref($cancreate{'statustocreate'}) eq 'ARRAY')) { @@ -13188,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 { @@ -13199,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.'). ''; } @@ -13216,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:'). - '
      '.$output.'
    '; + $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') { @@ -13375,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}) { @@ -13388,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') { @@ -13475,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; @@ -13500,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'); } @@ -13533,8 +10336,6 @@ sub process_captcha { } elsif (!defined($changes->{'cancreate'})) { $changes->{'cancreate'} = ['captcha']; } - } elsif ($container eq 'passwords') { - $changes->{'reset'} = 1; } else { $changes->{'captcha'} = 1; } @@ -13579,8 +10380,6 @@ sub process_captcha { } elsif (!defined($changes->{'cancreate'})) { $changes->{'cancreate'} = ['recaptchaversion']; } - } elsif ($container eq 'passwords') { - $changes->{'reset'} = 1; } else { $changes->{'recaptchaversion'} = 1; } @@ -13592,8 +10391,6 @@ sub process_captcha { } elsif (!defined($changes->{'cancreate'})) { $changes->{'cancreate'} = ['recaptchakeys']; } - } elsif ($container eq 'passwords') { - $changes->{'reset'} = 1; } else { $changes->{'recaptchakeys'} = 1; } @@ -13708,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}; @@ -13759,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, ); @@ -13789,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'}}) { @@ -13815,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/,$//; } @@ -13825,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'}; @@ -13834,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)) { @@ -13848,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') { @@ -13858,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}.','; @@ -13876,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 { @@ -13948,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; @@ -13983,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; } } } @@ -14054,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: ').'
      '. @@ -14360,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'}) { @@ -14515,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}; } } } @@ -14726,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.'
      '; + $errors.'
    '; } return $resulttext; } @@ -14843,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') { @@ -14900,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') { @@ -14943,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') { @@ -14966,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; } @@ -14985,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}; @@ -15031,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; @@ -15053,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'}})) { @@ -15107,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 { @@ -15117,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'}).'
    • '; @@ -15139,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 .= '
      • '; @@ -15185,7 +11587,7 @@ sub modify_coursedefaults { } $resulttext .= '
      '; } - $resulttext .= '
    • '; + $resulttext .= ''; } } elsif ($item eq 'coursecredits') { if (ref($defaultshash{'coursedefaults'}{'coursecredits'}) eq 'HASH') { @@ -15213,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.').'
    • '; } } } @@ -15448,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 .= ''; @@ -15668,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; @@ -15699,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(); @@ -15806,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); @@ -15855,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') { @@ -15912,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; } } @@ -15988,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') { @@ -16028,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; @@ -16111,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)) { @@ -16261,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"; @@ -16719,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'; @@ -16751,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; } @@ -16762,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)', ); } @@ -16808,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', - 'ltitools','directorysrch','passwdconf','cats'); + my @posscached = ('domainconfig','domdefaults','ltitools'); if (keys(%servers)) { foreach my $server (keys(%servers)) { next if ($thismachine{$server}); 500 Internal Server Error

    Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

    More information about this error may be available in the server error log.

    '."\n"; for (my $i=0; $i<@fields; $i++) { $rem = $i%($numperrow); if ($rem == 0) { @@ -6237,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 .= ''; + } + $additional .= ''; + foreach my $status (@{$order}) { + $additional .= ''; } + $additional .= '
    '.$usertypes->{$status}.'
    '.&email_as_username($rowtotal,$processing,$status).'
    '; + } 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'. - ''; - my %headers = &Apache::lonlocal::texthash( - approve => 'Processing', - email => 'E-mail', - username => 'Username', - ); - foreach my $item ('approve','email','username') { - $output .= ''; - } - $output .= ''; - foreach my $item ('approve','email','username') { - $output .= ''."\n"; } - $output .= "
    '.$headers{$item}.'
    '; - 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 .= '
    '. - ''.&mt('Disallow').''. - &user_formats_row('email',$settings,$emailrules, - $emailruleorder,$numinrow,'',$type); - '
    '; - } 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 .= '
    '.$rowname.''."\n". + ''.$rowname.''."\n". ''. - ''; return $output; } @@ -6874,10 +5151,7 @@ sub print_usermodification { sub print_defaults { my ($position,$dom,$settings,$rowtotal) = @_; my $rownum = 0; - my ($datatable,$css_class,$titles); - unless ($position eq 'bottom') { - $titles = &defaults_titles($dom); - } + my ($datatable,$css_class); if ($position eq 'top') { my @items = ('auth_def','auth_arg_def','lang_def','timezone_def', 'datelocale_def','portal_def'); @@ -6890,6 +5164,7 @@ sub print_defaults { $defaults{$item} = $domdefaults{$item}; } } + my $titles = &defaults_titles($dom); foreach my $item (@items) { if ($rownum%2) { $css_class = ''; @@ -6938,14 +5213,19 @@ sub print_defaults { $rownum ++; } } else { - my %defaults; + my (%defaults); if (ref($settings) eq 'HASH') { - if ((ref($settings->{'inststatusorder'}) eq 'ARRAY') && (ref($settings->{'inststatustypes'}) eq 'HASH')) { + if ((ref($settings->{'inststatusorder'}) eq 'ARRAY') && (ref($settings->{'inststatustypes'}) eq 'HASH') && + (ref($settings->{'inststatusguest'}) eq 'ARRAY')) { my $maxnum = @{$settings->{'inststatusorder'}}; for (my $i=0; $i<$maxnum; $i++) { $css_class = $rownum%2?' class="LC_odd_row"':''; my $item = $settings->{'inststatusorder'}->[$i]; my $title = $settings->{'inststatustypes'}->{$item}; + my $guestok; + if (grep(/^\Q$item\E$/,@{$settings->{'inststatusguest'}})) { + $guestok = 1; + } my $chgstr = ' onchange="javascript:reorderTypes(this.form,'."'$item'".');"'; $datatable .= ''. ''. ''; + ''. + ''; } $css_class = $rownum%2?' class="LC_odd_row"':''; my $chgstr = ' onchange="javascript:reorderTypes(this.form,'."'addinststatus_pos'".');"'; @@ -6983,6 +5274,11 @@ sub print_defaults { ''. + ''; ''."\n"; $rownum ++; } @@ -7012,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'); @@ -7029,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; @@ -7107,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)) { @@ -7117,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}, @@ -7128,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).''; } @@ -7254,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 = ''. - ''; - $$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; @@ -7419,7 +5537,7 @@ sub print_coursecategories { ''.$lt{$type}.' '; } - $datatable .= ''; + $datatable .= ''; $itemcount ++; } $$rowtotal += $itemcount; @@ -7630,7 +5748,7 @@ sub print_coursecategories { $datatable .= &initialize_categories($itemcount); } } else { - $datatable .= '' + $datatable .= '' .&initialize_categories($itemcount); } $$rowtotal += $itemcount; @@ -7678,7 +5796,7 @@ sub print_serverstatuses { ''. ''. - ''."\n"; + ''."\n"; } $$rowtotal += $rownum; return $datatable; @@ -7693,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 '') { @@ -7754,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); @@ -7959,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 = ''; @@ -7984,9 +6014,8 @@ sub initialize_categories { .'' .'' .' ' - .&mt('Add category').'>'.&mt('Name:') - .' ' - .''; + .&mt('Add category').''; return $datatable; } @@ -8041,7 +6070,7 @@ sub build_category_rows { pop(@{$path}); } } else { - $text .= &mt('Add subcategory:').' '.&mt('Add subcategory:').''; + $text .= ''; } } } @@ -8073,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}); @@ -8115,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 = ''. ''. ''; + $output .= ''. + '
    '."\n"; foreach my $option ('original','recaptcha','notused') { $output .= ''."\n". + '
    '."\n". ''.$pubtext.' '."\n". '
    '."\n". @@ -6733,19 +5022,23 @@ sub captcha_choice { } sub user_formats_row { - my ($type,$settings,$rules,$ruleorder,$numinrow,$rowcount,$status) = @_; + my ($type,$settings,$rules,$ruleorder,$numinrow,$rowcount) = @_; my $output; my %text = ( 'username' => 'new usernames', 'id' => 'IDs', + 'email' => 'self-created accounts (e-mail)', ); - unless ($type eq 'email') { - my $css_class = $rowcount%2?' class="LC_odd_row"':''; - $output = '
    '. - &mt("Format rules to check for $text{$type}: "). - ''; + my $css_class = $rowcount%2?' class="LC_odd_row"':''; + $output = ''. + ''. + ''; - } + $output .= '
    '; + 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++) { @@ -6763,41 +5056,25 @@ sub user_formats_row { if (grep(/^\Q$ruleorder->[$i]\E$/,@{$settings->{$type.'_rule'}})) { $check = ' checked="checked" '; } - } elsif ((ref($settings->{$type.'_rule'}) eq 'HASH') && ($status ne '')) { - if (ref($settings->{$type.'_rule'}->{$status}) eq 'ARRAY') { - if (grep(/^\Q$ruleorder->[$i]\E$/,@{$settings->{$type.'_rule'}->{$status}})) { - $check = ' checked="checked" '; - } - } } } - my $name = $type.'_rule'; - if ($type eq 'email') { - $name .= '_'.$status; - } $output .= ''; } } $rem = @{$ruleorder}%($numinrow); } - my $colsleft; - if ($rem) { - $colsleft = $numinrow - $rem; - } + my $colsleft = $numinrow - $rem; if ($colsleft > 1 ) { $output .= ''; } elsif ($colsleft == 1) { $output .= ''; } - $output .= '
    '. ''. '  
    '; - unless ($type eq 'email') { - $output .= '
    '. @@ -6958,12 +5238,23 @@ sub print_defaults { } $datatable .= ''; } + my ($checkedon,$checkedoff); + $checkedoff = ' checked="checked"'; + if ($guestok) { + $checkedon = $checkedoff; + $checkedoff = ''; + } $datatable .= ' '.&mt('Internal ID:').' '.$item.' '. ''. &mt('delete').''.&mt('Name displayed:'). ''. - '
    '. + ''.(' 'x2). + '
    '. &mt('Name displayed:'). ''. + ''.(' 'x2). + '
    '.&mt('Supported formats').''; - foreach my $item ('dat','csv') { - my $id; - if ($item eq 'csv') { - $id = 'id="scantronconfcsv" '; - } - $datatable .= ''.(' 'x3); - if ($item eq 'csv') { - $datatable .= '
    '. - ''.&mt('CSV Column Mapping').''. - ''."\n"; - foreach my $col (@fields) { - my $selnone; - if ($csvfields{$col} eq '') { - $selnone = ' selected="selected"'; - } - $datatable .= ''. - ''; - } - $datatable .= '
    '.&mt('Field').''.&mt('Location').'
    '.$titles{$col}.'
    '. - '
    '. - ''.&mt('CSV Options').''; - foreach my $option ('hdr','pad','rem') { - $datatable .= ''.$titles{$option}.':'. - ''.(' 'x2)."\n". - '
    '; - } - $datatable .= '
    '; - $itemcount ++; - } - } - $datatable .= '
    '.$hdritem->{'header'}->[1]->{'col2'}.'
    '.$hdritem->{'header'}->[1]->{'col2'}.'
    '.&mt('Name:') + .' 
    '.&mt('Add subcategory:').'
    '.$rolename.''; my $rem; @@ -8167,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 .= ''; @@ -8180,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') { @@ -8212,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) { @@ -8229,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') { @@ -8246,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 = ''. ''; } } $rem = @{$types}%($numinrow); } my $colsleft = $numinrow - $rem; - if ($context eq 'overrides') { - if ($colsleft > 1) { - $output .= ''; + } + if ($colsleft > 1) { + $output .= ''; - } - if ($colsleft > 1) { - $output .= '
    '. ' '.$lt{$context}.$showdom. @@ -8283,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" '; } @@ -8294,45 +6281,36 @@ sub insttypes_row { $output .= ''. ''; - } else { - $output .= ''; - } - $output .= ' '; + if (($rem == 0) && (@{$types} > 0)) { + $output .= '
    '; } else { - if ($rem == 0) { - $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 .= '