--- loncom/interface/domainprefs.pm 2016/09/12 20:20:45 1.279 +++ loncom/interface/domainprefs.pm 2017/07/26 19:45:45 1.303 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: domainprefs.pm,v 1.279 2016/09/12 20:20:45 raeburn Exp $ +# $Id: domainprefs.pm,v 1.303 2017/07/26 19:45:45 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -19,14 +19,15 @@ # # 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/ # # ############################################################### -############################################################## +############################################################### =pod @@ -219,6 +220,19 @@ sub handler { 'coursedefaults','usersessions','loadbalancing', 'requestauthor','selfenrollment','inststatus', 'ltitools','ssl','trust'],$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','quotas','autoenroll', 'autoupdate','autocreate','directorysrch','contacts', 'usercreation','selfcreation','usermodification','scantron', @@ -264,8 +278,10 @@ sub handler { help => 'Domain_Configuration_LangTZAuth', header => [{col1 => 'Setting', col2 => 'Value'}, + {col1 => 'Internal Authentication', + col2 => 'Value'}, {col1 => 'Institutional user types', - col2 => 'Assignable to e-mail usernames'}], + col2 => 'Assignable to non-institutional users'}], print => \&print_defaults, modify => \&modify_defaults, }, @@ -317,10 +333,14 @@ sub handler { modify => \&modify_directorysrch, }, 'contacts' => - { text => 'Contact Information', + { text => 'E-mail addresses and helpform', help => 'Domain_Configuration_Contact_Info', - header => [{col1 => 'Setting', - col2 => 'Value',}], + header => [{col1 => 'Default e-mail addresses', + col2 => 'Value',}, + {col1 => 'Recipient(s) for notifications', + col2 => 'Value',}, + {col1 => 'Ask helpdesk form settings', + col2 => 'Value',},], print => \&print_contacts, modify => \&modify_contacts, }, @@ -343,7 +363,7 @@ sub handler { col2 => 'Enabled?'}, {col1 => 'Institutional user type (login/SSO self-creation)', col2 => 'Information user can enter'}, - {col1 => 'Self-creation with e-mail as username', + {col1 => 'Self-creation with e-mail verification', col2 => 'Settings'}], print => \&print_selfcreation, modify => \&modify_selfcreation, @@ -417,10 +437,12 @@ sub handler { modify => \&modify_serverstatuses, }, 'helpsettings' => - {text => 'Help page settings', + {text => 'Support settings', help => 'Domain_Configuration_Help_Settings', - header => [{col1 => 'Help Settings (logged-in users)', - col2 => 'Value'}], + header => [{col1 => 'Help Page Settings (logged-in users)', + col2 => 'Value'}, + {col1 => 'Helpdesk Roles', + col2 => 'Settings'},], print => \&print_helpsettings, modify => \&modify_helpsettings, }, @@ -479,7 +501,7 @@ sub handler { }, 'ltitools' => {text => 'External Tools (LTI)', - help => 'Domain_configuration_LTI_Tools', + help => 'Domain_Configuration_LTI_Tools', header => [{col1 => 'Setting', col2 => 'Value',}], print => \&print_ltitools, @@ -492,6 +514,8 @@ sub handler { col2 => 'Certificate Status'}, {col1 => 'Connections to other servers', col2 => 'Rules'}, + {col1 => 'Connections from other servers', + col2 => 'Rules'}, {col1 => "Replicating domain's published content", col2 => 'Rules'}], print => \&print_ssl, @@ -574,6 +598,9 @@ $javascript_validations $coursebrowserjs END } + if (grep(/^contacts$/,@actions)) { + $js .= &contacts_javascript(); + } &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js); } else { # check if domconfig user exists for the domain. @@ -663,7 +690,7 @@ sub process_changes { } elsif ($action eq 'autocreate') { $output = &modify_autocreate($dom,%domconfig); } elsif ($action eq 'directorysrch') { - $output = &modify_directorysrch($dom,%domconfig); + $output = &modify_directorysrch($dom,$lastactref,%domconfig); } elsif ($action eq 'usercreation') { $output = &modify_usercreation($dom,%domconfig); } elsif ($action eq 'selfcreation') { @@ -685,7 +712,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,%domconfig); + $output = &modify_helpsettings($r,$dom,$confname,$lastactref,%domconfig); } elsif ($action eq 'coursedefaults') { $output = &modify_coursedefaults($dom,$lastactref,%domconfig); } elsif ($action eq 'selfenrollment') { @@ -712,6 +739,22 @@ sub print_config_box { $output = &coursecategories_javascript($settings); } elsif ($action eq 'defaults') { $output = &defaults_javascript($settings); + } 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 .= ' @@ -748,7 +791,8 @@ sub print_config_box { 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 'ssl') || - ($action eq 'directorysrch') || ($action eq 'trust')) { + ($action eq 'directorysrch') || ($action eq 'trust') || ($action eq 'helpsettings') || + ($action eq 'contacts')) { $output .= $item->{'print'}->('top',$dom,$settings,\$rowtotal); } elsif ($action eq 'coursecategories') { $output .= $item->{'print'}->('top',$dom,$item,$settings,\$rowtotal); @@ -779,7 +823,7 @@ sub print_config_box { if (($action eq 'autoupdate') || ($action eq 'usercreation') || ($action eq 'selfcreation') || ($action eq 'selfenrollment') || ($action eq 'usersessions') || ($action eq 'coursecategories') || - ($action eq 'ssl') || ($action eq 'trust')) { + ($action eq 'trust') || ($action eq 'contacts') || ($action eq 'defaults')) { if ($action eq 'coursecategories') { $output .= &print_coursecategories('middle',$dom,$item,$settings,\$rowtotal); $colspan = ' colspan="2"'; @@ -836,8 +880,31 @@ sub print_config_box { } $rowtotal ++; } elsif (($action eq 'usermodification') || ($action eq 'coursedefaults') || - ($action eq 'defaults') || ($action eq 'directorysrch')) { + ($action eq 'defaults') || ($action eq 'directorysrch') || + ($action eq 'helpsettings')) { $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); + } elsif ($action eq 'ssl') { + $output .= $item->{'print'}->('connto',$dom,$settings,\$rowtotal).' +
+ + + + + + + + '. + $item->{'print'}->('connfrom',$dom,$settings,\$rowtotal).' +
'.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
+ + + + + + + + '. + $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); } elsif ($action eq 'login') { if ($numheaders == 4) { $output .= &print_login('page',$dom,$confname,$phase,$settings,\$rowtotal).' @@ -994,13 +1061,11 @@ sub print_config_box { if ($action eq 'quotas') { $output .= &print_quotas($dom,$settings,\$rowtotal,$action); } elsif (($action eq 'autoenroll') || ($action eq 'autocreate') || - ($action eq 'contacts') || ($action eq 'serverstatuses') || - ($action eq 'loadbalancing') || ($action eq 'ltitools')) { + ($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 .= ' @@ -2927,120 +2992,638 @@ sub print_directorysrch { } sub print_contacts { - my ($dom,$settings,$rowtotal) = @_; + my ($position,$dom,$settings,$rowtotal) = @_; my $datatable; my @contacts = ('adminemail','supportemail'); - 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') { - foreach my $item (@contacts) { - if (exists($settings->{$item})) { - $to{$item} = $settings->{$item}; + 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'); 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} = ''; + } + } else { + @mailings = ('helpdeskmail','otherdomsmail'); + foreach my $type (@mailings) { + $otheremails{$type} = ''; + } + $bccemails{'helpdeskmail'} = ''; + $bccemails{'otherdomsmail'} = ''; + $includestr{'helpdeskmail'} = ''; + $includestr{'otherdomsmail'} = ''; + ($fields,$fieldtitles,$fieldoptions,$possoptions) = &helpform_fields(); + } + 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}); + } } } - $otheremails{$type} = $settings->{$type}{'others'}; - if ($type eq 'helpdeskmail') { - $bccemails{$type} = $settings->{$type}{'bcc'}; + } elsif ($type eq 'lonstatusmail') { + $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; + } + } + } + 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}; + } + } + 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'; } } - } elsif ($type eq 'lonstatusmail') { - $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; + $maxsize = '1.0'; } } } else { - $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" '; + 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" '; + } 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'; + } } my ($titles,$short_titles) = &contact_titles(); my $rownum = 0; my $css_class; - foreach my $item (@contacts) { - $css_class = $rownum%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''; - $rownum ++; + if ($position eq 'top') { + foreach my $item (@contacts) { + $css_class = $rownum%2?' class="LC_odd_row"':''; + $datatable .= ''. + ''; + $rownum ++; + } + } else { + foreach my $type (@mailings) { + $css_class = $rownum%2?' class="LC_odd_row"':''; + $datatable .= ''. + ''. + ''."\n"; + $rownum ++; + } } - foreach my $type (@mailings) { + 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') { $css_class = $rownum%2?' class="LC_odd_row"':''; $datatable .= ''. - ''. - ''."\n"; $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 contacts_javascript { + return <<"ENDSCRIPT"; + + + +ENDSCRIPT +} + sub print_helpsettings { - my ($dom,$confname,$settings,$rowtotal) = @_; + my ($position,$dom,$settings,$rowtotal) = @_; + my $confname = $dom.'-domainconfig'; + my $formname = 'display'; my ($datatable,$itemcount); - $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); + 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 .= ''. + ''; + $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 .= ''. + ''; + $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; +} + sub radiobutton_prefs { my ($settings,$toggles,$defaultchecked,$choices,$itemcount,$onclick, $additional,$align) = @_; @@ -3083,7 +3666,7 @@ sub radiobutton_prefs { } else { $datatable .= '
'.&mt($item->{'header'}->[3]->{'col1'}).''.&mt($item->{'header'}->[3]->{'col2'}).'
'.$titles->{$item}. - ''. - '
'.$titles->{$item}. + ''. + '
'. + $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 .= '
'. - $titles->{$type}.': '. - ''; - foreach my $item (@contacts) { - $datatable .= ' '; - } - $datatable .= '
'.&mt('Others').':  '. - ''; - if ($type eq 'helpdeskmail') { - $datatable .= '
'.&mt('Bcc:').(' 'x6). - ''; + '
'.&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 .= '
'; } $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'). + '
'.&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). + '
'; } - $datatable .= + $datatable .= ''. ''. (' 'x2); } + $datatable .= '
'. + '
'.$lt{'linktext'}.'
'. + '
'. + '
'.$lt{'explanation'}.'
'. + '

'; $datatable .= '
'; foreach my $extra ('passback','roster') { my $checkedon = ''; @@ -3280,7 +3873,7 @@ sub print_ltitools { } } $datatable .= '
'.&mt('Configurable in course').''; - foreach my $item ('label','title','target') { + foreach my $item ('label','title','target','linktext','explanation') { my $checked; if ($courseconfig{$item}) { $checked = ' checked="checked"'; @@ -3348,7 +3941,7 @@ sub print_ltitools { ''.&mt('Display target:'); my %defaultdisp; $defaultdisp{'iframe'} = ' checked="checked"'; - foreach my $disp ('iframe','window') { + foreach my $disp ('iframe','tab','window') { $datatable .= ''.(' 'x2); } @@ -3358,7 +3951,12 @@ sub print_ltitools { ''. (' 'x2); } - $datatable .= '
'; + $datatable .= '
'. + '
'.$lt{'linktext'}.'
'. + '
'. + '
'.$lt{'explanation'}.'
'. + ''. + '

'; foreach my $extra ('passback','roster') { $datatable .= $lt{$extra}.' '. '
'. '
'.&mt('Configurable in course').''; - foreach my $item ('label','title','target') { - $datatable .= ''.(' ' x2)."\n"; + foreach my $item ('label','title','target','linktext','explanation') { + $datatable .= ''.(' ' x2)."\n"; } $datatable .= '
'. '
'.&mt('Custom items sent on launch').''. @@ -3417,28 +4015,33 @@ 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', - 'iframe' => 'iFrame', - 'height' => 'Height', - 'width' => 'Width', - 'passback' => 'Tool can return grades:', - 'roster' => 'Tool can retrieve roster:', - 'crstarget' => 'Display target', - 'crslabel' => 'Course label', - 'crstitle' => 'Course title', + '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', ); return %lt; } @@ -3469,7 +4072,7 @@ sub print_coursedefaults { 'canuse_pdfforms' => 'off', 'uselcmath' => 'on', 'usejsme' => 'on', - 'canclone' => 'none', + 'canclone' => 'none', ); @toggles = ('canuse_pdfforms','uselcmath','usejsme'); ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, @@ -3508,7 +4111,7 @@ sub print_coursedefaults { $currcanclone = $settings->{'canclone'}; } } - } + } foreach my $option (@cloneoptions) { my ($checked,$additional); if ($currcanclone eq $option) { @@ -3577,7 +4180,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'}; } @@ -3677,9 +4280,9 @@ sub print_coursedefaults { $additional .= ''."\n"; %defaultchecked = ('postsubmit' => 'on'); @toggles = ('postsubmit'); - my $current = { - 'postsubmit' => $postsubmitclient, - }; + $current = { + 'postsubmit' => $postsubmitclient, + }; ($table,$itemcount) = &radiobutton_prefs($current,\@toggles,\%defaultchecked, \%choices,$itemcount,$onclick,$additional,'left'); @@ -3693,7 +4296,7 @@ sub print_coursedefaults { foreach my $type (@types) { $datatable .= ''.&mt($type).'
'. ''; + ' value="'.$currmysql{$type}.'" size="8" />'; } $datatable .= ''."\n"; $itemcount ++; @@ -4083,14 +4686,28 @@ sub rules_by_location { sub print_ssl { my ($position,$dom,$settings,$rowtotal) = @_; my ($css_class,$datatable); - my $lonhost = ''; my $itemcount = 1; if ($position eq 'top') { - my %domservers = &Apache::lonnet::get_servers($dom); + my $primary_id = &Apache::lonnet::domain($dom,'primary'); + my $intdom = &Apache::lonnet::internet_dom($primary_id); + my $same_institution; + if ($intdom ne '') { + my $internet_names = &Apache::lonnet::get_internet_names($Apache::lonnet::perlvar{'lonHostID'}); + if (ref($internet_names) eq 'ARRAY') { + if (grep(/^\Q$intdom\E$/,@{$internet_names})) { + $same_institution = 1; + } + } + } $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable = ''. - &LONCAPA::SSL::print_certstatus(\%domservers,'web','domprefs'). - ''; + $datatable = ''; + if ($same_institution) { + my %domservers = &Apache::lonnet::get_servers($dom); + $datatable .= &LONCAPA::SSL::print_certstatus(\%domservers,'web','domprefs'); + } else { + $datatable .= &mt("You need to be logged into one of your own domain's servers to display information about the status of LON-CAPA SSL certificates."); + } + $datatable .= ''; $itemcount ++; } else { my %titles = &ssl_titles(); @@ -4101,7 +4718,32 @@ sub print_ssl { my @domservers = &Apache::lonnet::get_servers($dom); my %servers = &Apache::lonnet::internet_dom_servers($dom); my %altids = &id_for_thisdom(%servers); - if ($position eq 'middle') { + if (($position eq 'connto') || ($position eq 'connfrom')) { + my $legacy; + unless (ref($settings) eq 'HASH') { + my $name; + if ($position eq 'connto') { + $name = 'loncAllowInsecure'; + } else { + $name = 'londAllowInsecure'; + } + my $primarylibserv = &Apache::lonnet::domain($dom,'primary'); + my @ids=&Apache::lonnet::current_machine_ids(); + if (($primarylibserv ne '') && (!grep(/^\Q$primarylibserv\E$/,@ids))) { + my %what = ( + $name => 1, + ); + my ($result,$returnhash) = + &Apache::lonnet::get_remote_globals($primarylibserv,\%what); + if ($result eq 'ok') { + if (ref($returnhash) eq 'HASH') { + $legacy = $returnhash->{$name}; + } + } + } else { + $legacy = $Apache::lonnet::perlvar{$name}; + } + } foreach my $type ('dom','intdom','other') { my %checked; $css_class = $itemcount%2?' class="LC_odd_row"':''; @@ -4128,16 +4770,21 @@ sub print_ssl { unless ($skip) { $checked{'yes'} = ' checked="checked"'; if (ref($settings) eq 'HASH') { - if (ref($settings->{'connect'}) eq 'HASH') { - if ($settings->{'connect'}->{$type} =~ /^(no|req)$/) { + if (ref($settings->{$position}) eq 'HASH') { + if ($settings->{$position}->{$type} =~ /^(no|req)$/) { $checked{$1} = $checked{'yes'}; delete($checked{'yes'}); } } + } else { + if ($legacy == 0) { + $checked{'req'} = $checked{'yes'}; + delete($checked{'yes'}); + } } foreach my $option ('no','yes','req') { $datatable .= ''.(' 'x2); } @@ -4168,7 +4815,8 @@ sub ssl_titles { dom => 'LON-CAPA servers/VMs from same domain', intdom => 'LON-CAPA servers/VMs from same "internet" domain', other => 'External LON-CAPA servers/VMs', - connect => 'Connections to other servers', + connto => 'Connections to other servers', + connfrom => 'Connections from other servers', replication => 'Replicating content to other institutions', certreq => 'Client certificate required, but specific domains exempt', nocertreq => 'No client certificate required, except for specific domains', @@ -4378,7 +5026,7 @@ sub spares_row { '. &mt('[_1] when busy, offloads to:' ,''.$server.'').'
'. - ''."\n". + ''."\n". ''. "\n"; @@ -4585,6 +5233,9 @@ sub print_loadbalancing { my ($numspares,@spares) = &count_servers($lonhost,%servers); my @sparestypes = ('primary','default'); my %typetitles = &sparestype_titles(); + my %hostherechecked = ( + no => ' checked="checked"', + ); foreach my $sparetype (@sparestypes) { my $targettable; for (my $i=0; $i<$numspares; $i++) { @@ -4630,6 +5281,23 @@ 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'} = ''; + } + } + } + } + $datatable .= &mt('Hosting on balancer itself').'
'. + '
'; + foreach my $sparetype (@sparestypes) { + $datatable .= '
'; } $datatable .= ''. &loadbalancing_rules($dom,$intdom,$currrules{$lonhost}, @@ -4722,9 +5390,14 @@ 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') { - unshift(@alltypes,@{$types},'default'); + @available = @{$types}; + } + unless (grep(/^default$/,@available)) { + push(@available,'default'); } + unshift(@alltypes,@available); my %titles; foreach my $type (@alltypes) { if ($type =~ /^_LC_/) { @@ -4847,14 +5520,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 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', + '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 for this domain's users", + 'otherdomsmail' => 'Helpdesk requests for 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', 'idconflictsmail' => 'E-mail from bi-nightly check for multiple users sharing same student/employee ID', ); my %short_titles = &Apache::lonlocal::texthash ( @@ -4864,6 +5538,34 @@ 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', @@ -5050,7 +5752,7 @@ sub print_usercreation { sub print_selfcreation { my ($position,$dom,$settings,$rowtotal) = @_; - my (@selfcreate,$createsettings,$processing,$datatable); + my (@selfcreate,$createsettings,$processing,$emailverified,$emaildomain,$datatable); if (ref($settings) eq 'HASH') { if (ref($settings->{'cancreate'}) eq 'HASH') { $createsettings = $settings->{'cancreate'}; @@ -5067,12 +5769,19 @@ sub print_selfcreation { if (ref($createsettings->{'selfcreateprocessing'}) eq 'HASH') { $processing = $createsettings->{'selfcreateprocessing'}; } + 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', @@ -5088,8 +5797,6 @@ sub print_selfcreation { \%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, @@ -5139,20 +5846,26 @@ sub print_selfcreation { $$rowtotal ++; } elsif ($position eq 'middle') { my %domconf = &Apache::lonnet::get_dom('configuration',['usermodification'],$dom); - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - $usertypes->{'default'} = $othertitle; + my @posstypes; if (ref($types) eq 'ARRAY') { - push(@{$types},'default'); - $usertypes->{'default'} = $othertitle; - foreach my $status (@{$types}) { - $datatable .= &modifiable_userdata_row('selfcreate',$status,$domconf{'usermodification'}, - $numinrow,$$rowtotal,$usertypes); - $$rowtotal ++; - } + @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 ++; } } else { my %choices = &Apache::lonlocal::texthash ( - cancreate_email => 'E-mail address as username', + cancreate_email => 'Non-institutional username (e-mail verification)', ); my @toggles = sort(keys(%choices)); my %defaultchecked = ( @@ -5166,29 +5879,45 @@ sub print_selfcreation { my $onclick = "toggleDisplay(this.form,'emailoptions');"; my $additional = '
'; my %domdefaults = &Apache::lonnet::get_domain_defaults($dom); - my $usertypes = {}; - my $order = []; - if ((ref($domdefaults{'inststatustypes'}) eq 'HASH') && (ref($domdefaults{'inststatusguest'}) eq 'ARRAY')) { - $usertypes = $domdefaults{'inststatustypes'}; + my $order; + if (ref($domdefaults{'inststatusguest'}) eq 'ARRAY') { $order = $domdefaults{'inststatusguest'}; } + my (@ordered,%usertypeshash); 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); + @ordered = @{$order}; + } + if (@ordered) { + unless (grep(/^default$/,@ordered)) { + push(@ordered,'default'); } + if (ref($usertypes) eq 'HASH') { + %usertypeshash = %{$usertypes}; + } + $usertypeshash{'default'} = $othertitle; + $additional .= ''; + foreach my $status (@ordered) { + $additional .= ''; + } + $additional .= ''; + foreach my $status (@ordered) { + $additional .= ''; + } + $additional .= '
'.$usertypeshash{$status}.'
'.&validate_by_email($rowtotal,$processing,$status).'

'. + ''; + foreach my $status (@ordered) { + $additional .= ''; + } + $additional .= ''; + foreach my $status (@ordered) { + $additional .= ''; + } + $additional .= '
'.$usertypeshash{$status}.'
'.&email_as_username($rowtotal,$emailverified,$emaildomain,$status).'
'; + + } else { + $usertypeshash{'default'} = $othertitle; + $additional .= &mt('Approval:').' '.&validate_by_email($rowtotal,$processing).'
'. + &mt('Username:').' '.&email_as_username($rowtotal,$emailverified,$emaildomain); } $additional .= '
'."\n"; @@ -5199,12 +5928,10 @@ sub print_selfcreation { $$rowtotal ++; my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info(); $numinrow = 1; - if (ref($order) eq 'ARRAY') { - foreach my $status (@{$order}) { - $datatable .= &modifiable_userdata_row('cancreate','emailusername_'.$status,$settings, - $numinrow,$$rowtotal,$usertypes,$infofields,$infotitles); - $$rowtotal ++; - } + foreach my $status (@ordered) { + $datatable .= &modifiable_userdata_row('cancreate','emailusername_'.$status,$settings, + $numinrow,$$rowtotal,\%usertypeshash,$infofields,$infotitles); + $$rowtotal ++; } my ($emailrules,$emailruleorder) = &Apache::lonnet::inst_userrules($dom,'email'); @@ -5220,15 +5947,20 @@ sub print_selfcreation { return $datatable; } -sub email_as_username { +sub validate_by_email { my ($rowtotal,$processing,$type) = @_; my %choices = &Apache::lonlocal::texthash ( automatic => 'Automatic approval', approval => 'Queued for approval', + notinuse => 'Unavailable', ); my $output; - foreach my $option ('automatic','approval') { + my @options = ('automatic','approval'); + unless ($type eq '') { + push(@options,'notinuse'); + } + foreach my $option (@options) { my $checked; if (ref($processing) eq 'HASH') { if ($type eq '') { @@ -5273,6 +6005,83 @@ sub email_as_username { return $output; } +sub email_as_username { + my ($rowtotal,$emailverified,$emaildomain,$type) = @_; + my %choices = + &Apache::lonlocal::texthash ( + email => 'Username is e-mail', + other => 'Username is chosen', + ); + my $name = 'cancreate_emailverified'; + my $condition = 'cancreate_emaildomain'; + if (($type ne '') && ($type ne 'default')) { + $name .= '_'.$type; + $condition .= '_'.$type; + } + my $display = 'none'; + my $onclick = "toggleDisplay(this.form,'$name');"; + + my $output; + foreach my $option ('email','other') { + my ($checked,$domain); + if (ref($emailverified) eq 'HASH') { + if ($type eq '') { + if (!exists($emailverified->{'default'})) { + if ($option eq 'email') { + $checked = ' checked="checked"'; + } + } else { + if ($emailverified->{'default'} eq $option) { + $checked = ' checked="checked"'; + } + } + } else { + if (!exists($emailverified->{$type})) { + if ($option eq 'email') { + $checked = ' checked="checked"'; + } + } else { + if ($emailverified->{$type} eq $option) { + $checked = ' checked="checked"'; + if ($option eq 'other') { + $display = 'inline'; + } + } + } + } + } elsif ($option eq 'email') { + $checked = ' checked="checked"'; + } + $output .= ''; + if ($type eq '') { + $output .= ' '; + } else { + $output .= '
'; + } + } + my $domain; + if (ref($emaildomain) eq 'HASH') { + if ($type eq '') { + if (exists($emaildomain->{'default'})) { + $domain = $emaildomain->{'default'}; + } + } else { + if (exists($emaildomain->{$type})) { + $domain = $emaildomain->{$type}; + } + } + } + $output .= '
'. + ''.&mt('E-mail domain').' '. + ''. + '
'; + $$rowtotal ++; + return $output; +} + sub captcha_choice { my ($context,$settings,$itemcount) = @_; my ($keyentry,$currpub,$currpriv,%checked,$rowname,$pubtext,$privtext, @@ -5471,7 +6280,10 @@ sub print_usermodification { sub print_defaults { my ($position,$dom,$settings,$rowtotal) = @_; my $rownum = 0; - my ($datatable,$css_class); + my ($datatable,$css_class,$titles); + unless ($position eq 'bottom') { + $titles = &defaults_titles($dom); + } if ($position eq 'top') { my @items = ('auth_def','auth_arg_def','lang_def','timezone_def', 'datelocale_def','portal_def'); @@ -5484,7 +6296,6 @@ sub print_defaults { $defaults{$item} = $domdefaults{$item}; } } - my $titles = &defaults_titles($dom); foreach my $item (@items) { if ($rownum%2) { $css_class = ''; @@ -5532,8 +6343,87 @@ sub print_defaults { $datatable .= ''; $rownum ++; } + } elsif ($position eq 'middle') { + my @items = ('intauth_cost','intauth_check','intauth_switch'); + my %defaults; + if (ref($settings) eq 'HASH') { + %defaults = %{$settings}; + 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 ($rownum%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 .= ''; + $rownum ++; + } } else { - my (%defaults); + my %defaults; if (ref($settings) eq 'HASH') { if ((ref($settings->{'inststatusorder'}) eq 'ARRAY') && (ref($settings->{'inststatustypes'}) eq 'HASH') && (ref($settings->{'inststatusguest'}) eq 'ARRAY')) { @@ -5628,6 +6518,9 @@ 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'); @@ -6163,7 +7056,35 @@ sub serverstatus_pages { sub defaults_javascript { my ($settings) = @_; - return unless (ref($settings) eq 'HASH'); + my $intauthcheck = &mt('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.'); + my $intauthcost = &mt('Warning: bcrypt encryption cost for internal authentication must be an integer.'); + &js_escape(\$intauthcheck); + &js_escape(\$intauthcost); + my $intauthjs = <<"ENDSCRIPT"; + +function warnIntAuth(field) { + if (field.name == 'intauth_check') { + if (field.value == '2') { + alert('$intauthcheck'); + } + } + if (field.name == 'intauth_cost') { + field.value.replace(/\s/g,''); + if (field.value != '') { + var regexdigit=/^\\d+\$/; + if (!regexdigit.test(field.value)) { + alert('$intauthcost'); + } + } + } + return; +} + +ENDSCRIPT + + if (ref($settings) ne 'HASH') { + return &Apache::lonhtmlcommon::scripttag($intauthjs); + } if ((ref($settings->{'inststatusorder'}) eq 'ARRAY') && (ref($settings->{'inststatustypes'}) eq 'HASH')) { my $maxnum = scalar(@{$settings->{'inststatusorder'}}); if ($maxnum eq '') { @@ -6217,10 +7138,14 @@ $jstext return; } +$intauthjs + // ]]> ENDSCRIPT + } else { + return &Apache::lonhtmlcommon::scripttag($intauthjs); } } @@ -6954,7 +7879,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}) { @@ -7186,7 +8111,6 @@ sub modify_login { return $resulttext; } - sub check_exempt_addresses { my ($iplist) = @_; $iplist =~ s/^\s+//; @@ -8097,7 +9021,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}) { @@ -8242,7 +9166,7 @@ sub modify_quotas { } if ($env{'form.validationdc'}) { my $newval = $env{'form.validationdc'}; - my %domcoords = &get_active_dcs($dom); + my %domcoords = &Apache::lonnet::get_active_domroles($dom,['dc']); if (exists($domcoords{$newval})) { $confhash{'validation'}{'dc'} = $newval; } @@ -8266,7 +9190,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') { @@ -8672,7 +9596,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,$errors,$resulttext); + my ($newid,@allpos,%changes,%confhash,%encconfig,$errors,$resulttext); my $confname = $dom.'-domainconfig'; my $servadm = $r->dir_config('lonAdmEMail'); my ($configuserok,$author_ok,$switchserver) = &config_check($dom,$confname,$servadm); @@ -8697,7 +9621,11 @@ sub modify_ltitools { foreach my $item ('title','url','key','secret') { $env{'form.ltitools_add_'.$item} =~ s/(`)/'/g; if ($env{'form.ltitools_add_'.$item}) { - $confhash{$newid}{$item} = $env{'form.ltitools_add_'.$item}; + if (($item eq 'key') || ($item eq 'secret')) { + $encconfig{$newid}{$item} = $env{'form.ltitools_add_'.$item}; + } else { + $confhash{$newid}{$item} = $env{'form.ltitools_add_'.$item}; + } } } if ($env{'form.ltitools_add_version'} eq 'LTI-1p0') { @@ -8706,15 +9634,23 @@ 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') { + foreach my $item ('width','height','linktext','explanation') { $env{'form.ltitools_add_'.$item} =~ s/^\s+//; $env{'form.ltitools_add_'.$item} =~ s/\s+$//; - if ($env{'form.ltitools_add_'.$item} =~ /^\d+$/) { - $confhash{$newid}{'display'}{$item} = $env{'form.ltitools_add_'.$item}; + if (($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_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'; } @@ -8798,12 +9734,18 @@ sub modify_ltitools { } else { my $newpos = $env{'form.ltitools_'.$itemid}; $newpos =~ s/\D+//g; - foreach my $item ('title','url','key','secret') { + foreach my $item ('title','url') { $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}; } @@ -8822,10 +9764,34 @@ 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'; } @@ -8845,7 +9811,7 @@ sub modify_ltitools { } } my @courseconfig = &Apache::loncommon::get_env_multiple('form.ltitools_courseconfig_'.$i); - foreach my $item ('label','title','target') { + 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') { @@ -8984,9 +9950,21 @@ 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; - &Apache::lonnet::do_cache_new('ltitools',$dom,\%confhash,$cachetime); + 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); if (ref($lastactref) eq 'HASH') { $lastactref->{'ltitools'} = 1; } @@ -9010,24 +9988,27 @@ sub modify_ltitools { $resulttext .= '
    '; my $position = $pos + 1; $resulttext .= '
  • '.&mt('Order: [_1]',$position).'
  • '; - foreach my $item ('version','msgtype','url','key') { + foreach my $item ('version','msgtype','url') { if ($confhash{$itemid}{$item} ne '') { $resulttext .= '
  • '.$lt{$item}.': '.$confhash{$itemid}{$item}.'
  • '; } } - if ($confhash{$itemid}{'secret'} ne '') { + if ($encconfig{$itemid}{'key'} ne '') { + $resulttext .= '
  • '.$lt{'key'}.': '.$encconfig{$itemid}{'key'}.'
  • '; + } + if ($encconfig{$itemid}{'secret'} ne '') { $resulttext .= '
  • '.$lt{'secret'}.': '; - my $num = length($confhash{$itemid}{'secret'}); + my $num = length($encconfig{$itemid}{'secret'}); $resulttext .= ('*'x$num).'
  • '; } $resulttext .= '
  • '.&mt('Configurable in course:'); - my @possconfig = ('label','title','target'); + 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}; + $resulttext .= ' "'.$lt{'crs'.$item}.'"'; } } } @@ -9060,7 +10041,12 @@ 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) { @@ -9275,9 +10261,9 @@ sub modify_autoenroll { } if ($changes{'autofailsafe'}) { if ($failsafe ne '') { - $resulttext .= '
  • '.&mt("$title{'failsafe'} set to [_1]",$failsafe).'
  • '; + $resulttext .= '
  • '.&mt('Failsafe for no drops if institutional data missing for a section set to: [_1]',$failsafe).'
  • '; } else { - $resulttext .= '
  • '.&mt("$title{'failsafe'} deleted"); + $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') { @@ -9499,7 +10485,7 @@ sub modify_autocreate { $newvals{$item} = 0 if ($newvals{$item} eq ''); } $newvals{'xmldc'} = $env{'form.autocreate_xmldc'}; - my %domcoords = &get_active_dcs($dom); + my %domcoords = &Apache::lonnet::get_active_domroles($dom,['dc']); unless (exists($domcoords{$newvals{'xmldc'}})) { $newvals{'xmldc'} = ''; } @@ -9556,7 +10542,7 @@ sub modify_autocreate { } sub modify_directorysrch { - my ($dom,%domconfig) = @_; + my ($dom,$lastactref,%domconfig) = @_; my ($resulttext,%changes); my %currdirsrch; if (ref($domconfig{'directorysrch'}) eq 'HASH') { @@ -9567,7 +10553,7 @@ sub modify_directorysrch { 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', + lclocalonly => 'Other domains can search LON-CAPA domain', searchby => 'Search types', searchtypes => 'Search latitude'); my @offon = ('off','on'); @@ -9661,27 +10647,27 @@ sub modify_directorysrch { } } if (exists($currdirsrch{'lcavailable'})) { - if ($currdirsrch{'lcavailable'} ne $env{'form.dirsrch_domavailable'}) { - $changes{'lcavailable'} = 1; - } + 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_instlocalonly'}) { + $changes{'localonly'} = 1; + } } else { if ($env{'form.dirsrch_instlocalonly'} eq '1') { $changes{'localonly'} = 1; } } if (exists($currdirsrch{'lclocalonly'})) { - if ($currdirsrch{'lclocalonly'} ne $env{'form.dirsrch_domlocalonly'}) { - $changes{'lclocalonly'} = 1; - } + if ($currdirsrch{'lclocalonly'} ne $env{'form.dirsrch_domlocalonly'}) { + $changes{'lclocalonly'} = 1; + } } else { if ($env{'form.dirsrch_domlocalonly'} eq '1') { $changes{'lclocalonly'} = 1; @@ -9700,7 +10686,7 @@ sub modify_directorysrch { } if ($changes{'lclocalonly'}) { $resulttext .= '
  • '.&mt("$title{'lclocalonly'} set to: $otherdoms[$env{'form.dirsrch_domlocalonly'}]").'
  • '; - } + } if (ref($changes{'cansearch'}) eq 'ARRAY') { my $chgtext; if (ref($usertypes) eq 'HASH') { @@ -9750,6 +10736,10 @@ 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'); } @@ -9768,11 +10758,12 @@ sub modify_contacts { $currsetting{$key} = $domconfig{'contacts'}{$key}; } } - my (%others,%to,%bcc); + my (%others,%to,%bcc,%includestr,%includeloc); my @contacts = ('supportemail','adminemail'); - my @mailings = ('errormail','packagesmail','helpdeskmail','lonstatusmail', - 'requestsmail','updatesmail','idconflictsmail'); + my @mailings = ('errormail','packagesmail','helpdeskmail','otherdomsmail', + '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); @@ -9782,12 +10773,17 @@ 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') { + if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { $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) { @@ -9799,6 +10795,23 @@ 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'}; + } + } + } + } + } + } if (keys(%currsetting) > 0) { foreach my $item (@contacts) { if ($to{$item} ne $currsetting{$item}) { @@ -9818,10 +10831,39 @@ sub modify_contacts { if ($others{$type} ne $currsetting{$type}{'others'}) { push(@{$changes{$type}},'others'); } - if ($type eq 'helpdeskmail') { + if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { 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'); + } + } + } } } } else { @@ -9831,26 +10873,41 @@ sub modify_contacts { $default{'errormail'} = 'adminemail'; $default{'packagesmail'} = 'adminemail'; $default{'helpdeskmail'} = 'supportemail'; + $default{'otherdomsmail'} = 'supportemail'; $default{'lonstatusmail'} = 'adminemail'; $default{'requestsmail'} = 'adminemail'; $default{'updatesmail'} = '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') { + if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { 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'); + } + } } } } @@ -9882,7 +10939,11 @@ sub modify_contacts { } foreach my $type (@mailings) { if (ref($changes{$type}) eq 'ARRAY') { - $resulttext .= '
  • '.$titles->{$type}.': '; + if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { + $resulttext .= '
  • '.$titles->{$type}.' -- '.&mt('sent to').': '; + } else { + $resulttext .= '
  • '.$titles->{$type}.': '; + } my @text; foreach my $item (@{$newsetting{$type}}) { push(@text,$short_titles->{$item}); @@ -9890,12 +10951,31 @@ sub modify_contacts { if ($others{$type} ne '') { push(@text,$others{$type}); } - $resulttext .= ''. - join(', ',@text).''; - if ($type eq 'helpdeskmail') { + if (@text) { + $resulttext .= ''. + join(', ',@text).''; + } + if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { if ($bcc{$type} ne '') { - $resulttext .= ' '.&mt('with Bcc to').': '.$bcc{$type}.''; + my $bcctext; + if (@text) { + $bcctext = ' '.&mt('with Bcc to'); + } else { + $bcctext = '(Bcc)'; + } + $resulttext .= $bcctext.': '.$bcc{$type}.''; + } elsif (!@text) { + $resulttext .= &mt('No one'); + } + if ($includestr{$type} ne '') { + if ($includeloc{$type} eq 'b') { + $resulttext .= '
    '.&mt('Text automatically added to e-mail body:').' '.$includestr{$type}; + } elsif ($includeloc{$type} eq 's') { + $resulttext .= '
    '.&mt('Text automatically added to e-mail subject:').' '.$includestr{$type}; + } } + } elsif (!@text) { + $resulttext .= &mt('No recipients'); } $resulttext .= '
  • '; } @@ -9917,9 +10997,50 @@ 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 contact information'); + $resulttext = &mt('No changes made to contacts and form settings'); } } else { $resulttext = ''. @@ -9937,12 +11058,10 @@ sub modify_usercreation { if ($key eq 'cancreate') { 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')) { - $save_usercreate{$key}{$item} = $domconfig{'usercreation'}{$key}{$item}; - } else { + if (($item eq 'requestcrs') || ($item eq 'course') || ($item eq 'author')) { $curr_usercreation{$key}{$item} = $domconfig{'usercreation'}{$key}{$item}; + } else { + $save_usercreate{$key}{$item} = $domconfig{'usercreation'}{$key}{$item}; } } } @@ -10147,12 +11266,18 @@ sub modify_usercreation { sub modify_selfcreation { 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'); + my (%save_usercreate,%save_usermodify,@types,%usertypes); + my ($othertitle,$usertypesref,$typesref) = &Apache::loncommon::sorted_inst_types($dom); + if (ref($typesref) eq 'ARRAY') { + @types = @{$typesref}; } + unless (grep(/^default$/,@types)) { + push(@types,'default'); + } + if (ref($usertypesref) eq 'HASH') { + %usertypes = %{$usertypesref}; + } + $usertypes{'default'} = $othertitle; # # Retrieve current domain configuration for self-creation of usernames from $domconfig{'usercreation'}. # @@ -10162,10 +11287,11 @@ 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 'emailusername') || ($item eq 'notify') || - ($item eq 'selfcreateprocessing') || ($item eq 'shibenv')) { + ($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 'emaildomain')) { $curr_usercreation{$key}{$item} = $domconfig{'usercreation'}{$key}{$item}; } else { $save_usercreate{$key}{$item} = $domconfig{'usercreation'}{$key}{$item}; @@ -10198,10 +11324,12 @@ sub modify_selfcreation { @{$cancreate{'statustocreate'}} = (); %{$cancreate{'selfcreateprocessing'}} = (); %{$cancreate{'shibenv'}} = (); + %{$cancreate{'emailverified'}} = (); + %{$cancreate{'emaildomain'}} = (); my %selfcreatetypes = ( sso => 'users authenticated by institutional single sign on', login => 'users authenticated by institutional log-in', - email => 'users who provide a valid e-mail address for use as username', + email => 'users verified by e-mail', ); # # Populate $cancreate{'selfcreate'} array reference with types of user, for which self-creation of user accounts @@ -10220,12 +11348,22 @@ sub modify_selfcreation { if ($item eq 'email') { if ($env{'form.cancreate_email'}) { push(@{$cancreate{'selfcreate'}},'email'); - push(@contexts,'selfcreateprocessing'); + push(@contexts,('selfcreateprocessing','emailverified','emaildomain')); foreach my $type (@statuses) { if ($type eq 'default') { $cancreate{'selfcreateprocessing'}{$type} = $env{'form.cancreate_emailprocess'}; + unless ($cancreate{'selfcreateprocessing'}{$type} eq 'notinuse') { + $cancreate{'emailverified'}{$type} = $env{'form.cancreate_emailverified'}; + if ($cancreate{'emailverified'}{$type} eq 'other') { + $cancreate{'emaildomain'}{$type} =$env{'form.cancreate_emaildomain'}; + } + } } else { $cancreate{'selfcreateprocessing'}{$type} = $env{'form.cancreate_emailprocess_'.$type}; + $cancreate{'emailverified'}{$type} = $env{'form.cancreate_emailverified_'.$type}; + if ($cancreate{'emailverified'}{$type} eq 'other') { + $cancreate{'emaildomain'}{$type} =$env{'form.cancreate_emaildomain_'.$type}; + } } } } @@ -10244,8 +11382,8 @@ sub modify_selfcreation { if ($env{'form.cancreate_email'}) { push(@contexts,'emailusername'); - if (ref($types) eq 'ARRAY') { - foreach my $type (@{$types}) { + if (@types) { + foreach my $type (@types) { if (ref($infofields) eq 'ARRAY') { foreach my $field (@{$infofields}) { if ($env{'form.canmodify_emailusername_'.$type.'_'.$field} =~ /^(required|optional)$/) { @@ -10257,7 +11395,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 using e-mail address as username +# queued requests for self-creation of account verified by e-mail. # my @approvalnotify = &Apache::loncommon::get_env_multiple('form.selfcreationnotifyapproval'); @@ -10278,7 +11416,7 @@ sub modify_selfcreation { } # -# Retrieve rules (if any) governing types of e-mail address which may be used as a username +# Retrieve rules (if any) governing types of e-mail address which may be used to verify a username. # @email_rule = &Apache::loncommon::get_env_multiple('form.email_rule'); &process_captcha('cancreate',\%changes,\%savecaptcha,$curr_usercreation{'cancreate'}); @@ -10325,14 +11463,14 @@ sub modify_selfcreation { # which the user may supply, if institutional data is unavailable. # if (($env{'form.cancreate_login'}) || ($env{'form.cancreate_sso'})) { - if (ref($types) eq 'ARRAY') { - if (@{$types} > 1) { + if (@types) { + if (@types > 1) { @{$cancreate{'statustocreate'}} = &Apache::loncommon::get_env_multiple('form.statustocreate'); push(@contexts,'statustocreate'); } else { undef($cancreate{'statustocreate'}); } - foreach my $type (@{$types}) { + foreach my $type (@types) { my @modifiable = &Apache::loncommon::get_env_multiple('form.canmodify_'.$type); foreach my $field (@fields) { if (grep(/^\Q$field\E$/,@modifiable)) { @@ -10343,7 +11481,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 @@ -10355,7 +11493,7 @@ sub modify_selfcreation { } } } else { - foreach my $type (@{$types}) { + foreach my $type (@types) { push(@{$changes{'selfcreate'}},$type); } } @@ -10413,7 +11551,7 @@ sub modify_selfcreation { } } } - } elsif ($item eq 'selfcreateprocessing') { + } elsif (($item eq 'selfcreateprocessing') || ($item eq 'emailverified') || ($item eq 'emaildomain')) { if ($cancreate{$item}{$curr} ne $curr_usercreation{'cancreate'}{$item}{$curr}) { if (!grep(/^$item$/,@{$changes{'cancreate'}})) { push(@{$changes{'cancreate'}},$item); @@ -10501,6 +11639,12 @@ 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{'emaildomain'}) eq 'HASH') { + $save_usercreate{'cancreate'}{'emaildomain'} = $cancreate{'emaildomain'}; + } if (ref($cancreate{'statustocreate'}) eq 'ARRAY') { $save_usercreate{'cancreate'}{'statustocreate'} = $cancreate{'statustocreate'}; } @@ -10525,7 +11669,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.'); @@ -10540,10 +11684,25 @@ 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."). - ''; + $chgtext .= ''. + &mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts via log-in or single sign-on."). + '
    '; + } + } + } + if (grep(/^email$/,@{$cancreate{$type}})) { + if (@statuses > 1) { + my $numtypes = 0; + foreach my $type (@statuses) { + unless ($cancreate{'selfcreateprocessing'}{$type} eq 'notinuse') { + $numtypes ++; + } + } + if (!$numtypes) { + $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."). + '
    '; + } } } @@ -10551,7 +11710,7 @@ sub modify_selfcreation { } } 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:'). '
      '; @@ -10564,7 +11723,7 @@ sub modify_selfcreation { } } $chgtext .= '
    '; - } + } } elsif ($type eq 'statustocreate') { if ((ref($cancreate{'selfcreate'}) eq 'ARRAY') && (ref($cancreate{'statustocreate'}) eq 'ARRAY')) { @@ -10577,7 +11736,7 @@ sub modify_selfcreation { &mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts."). '
    '; } - } elsif (ref($usertypes) eq 'HASH') { + } elsif (keys(%usertypes) > 0) { 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 { @@ -10588,12 +11747,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.'). ''; } @@ -10605,26 +11764,109 @@ 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', + notinuse => 'Unavailable', ); 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 .= '
    '; + my $numtypes = 0; + foreach my $type (@statuses) { + unless ($cancreate{'selfcreateprocessing'}{$type} eq 'notinuse') { + $numtypes ++; + } + } + if ($numtypes) { + $chgtext .= &mt('Processing of requests to create account with e-mail verification 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 { + $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 ( + email => 'Username is e-mail', + other => 'Username is chosen', + ); + if (@statuses > 1) { + my $numtypes = 0; + foreach my $type (@statuses) { + unless ($cancreate{'selfcreateprocessing'}{$type} eq 'notinuse') { + $numtypes ++; + } + } + if ($numtypes) { + $chgtext .= &mt('For self-created accounts verified by e-mail address, username is set as follows:'). + '
      '; + foreach my $type (@statuses) { + next if ($cancreate{'selfcreateprocessing'}{$type} eq 'notinuse'); + if ($type eq 'default') { + $chgtext .= '
    • '.$othertitle.' -- '.$options{$cancreate{'emailverified'}{$type}}.'
    • '; + } else { + $chgtext .= '
    • '.$usertypes{$type}.' -- '.$options{$cancreate{'emailverified'}{$type}}.'
    • '; + } + } + $chgtext .= '
    '; + } + } else { + $chgtext .= &mt('For self-created accounts verified by e-mail address: "[_1]"', + $choices{$cancreate{'emailverified'}{'default'}}); + } + } elsif ($type eq 'emaildomain') { + if (@statuses > 1) { + my $numtypes = 0; + foreach my $type (@statuses) { + unless ($cancreate{'selfcreateprocessing'}{$type} eq 'notinuse') { + if ($cancreate{'emailverified'}{$type} eq 'other') { + $numtypes ++; + } + } + } + if ($numtypes) { + $chgtext .= &mt('For self-created accounts verified by e-mail address, with username chosen by user ...'). + '
      '; + foreach my $type (@statuses) { + next if (($cancreate{'selfcreateprocessing'}{$type} eq 'notinuse') || + ($cancreate{'emailverified'}{$type} eq 'email')); + if ($type eq 'default') { + if ($cancreate{'emaildomain'}{$type} eq '') { + $chgtext .= '
    • '.$othertitle.' -- '.&mt('No restriction on e-mail domain').'
    • '; + } else { + $chgtext .= '
    • '.$othertitle.' -- '.&mt("User's e-mail domain needs to be: [_1]", + $cancreate{'emaildomain'}{$type}).'
    • '; + } + } else { + if ($cancreate{'emaildomain'}{$type} eq '') { + $chgtext .= '
    • '.$usertypes{$type}.' -- '.&mt('No restriction on e-mail domain').'
    • '; + } else { + $chgtext .= '
    • '.$usertypes{$type}.' -- '.&mt("User's e-mail domain needs to be: [_1]", + $cancreate{'emaildomain'}{$type}).'
    • '; + } + } + } + $chgtext .= '
    '; + } } else { - $chgtext .= &mt('Processing of requests to create account with e-mail address as username set to: "[_1]"', - $choices{$cancreate{'selfcreateprocessing'}{'default'}}); + if ($cancreate{'emailverified'}{'default'} eq 'other') { + if ($cancreate{'emaildomain'}{'default'} eq '') { + $chgtext .= &mt('No restriction on e-mail domain for self-created accounts verified by e-mail address, where username is chosen by user.'); + } else { + $chgtext .= &mt('For self-created accounts verified by e-mail address, where username is chosen by user, e-mail domain needs to be: [_1], + $cancreate{'selfcreateprocessing'}{'default'}); + } + } } } elsif ($type eq 'captcha') { if ($savecaptcha{$type} eq 'notused') { @@ -10661,11 +11903,11 @@ sub modify_selfcreation { } } elsif ($type eq 'emailusername') { if (ref($cancreate{'emailusername'}) eq 'HASH') { - if (ref($types) eq 'ARRAY') { - foreach my $type (@{$types}) { + if (@types) { + 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 as username, the following information will be provided by [_1]:',"'$usertypes->{$type}'"). + $chgtext .= &mt('When self-creating account with e-mail verification, the following information will be provided by [_1]:',"'$usertypes{$type}'"). '
      '; foreach my $field (@{$infofields}) { if ($cancreate{'emailusername'}{$type}{$field}) { @@ -10674,23 +11916,27 @@ sub modify_selfcreation { } $chgtext .= '
    '; } else { - $chgtext .= &mt('When self creating account with e-mail as username, no information besides e-mail address will be provided by [_1].',"'$usertypes->{$type}'").'
    '; + $chgtext .= &mt('When self creating account with e-mail verification, no information besides e-mail address will be provided by [_1].',"'$usertypes{$type}'").'
    '; } } else { - $chgtext .= &mt('When self creating account with e-mail as username, no information besides e-mail address will be provided by [_1].',"'$usertypes->{$type}'").'
    '; + $chgtext .= &mt('When self creating account with e-mail verification, no information besides e-mail address will be provided by [_1].',"'$usertypes{$type}'").'
    '; } } } } } elsif ($type eq 'notify') { - $chgtext = &mt('No Domain Coordinators will receive notification of username requests requiring approval.'); + my $numapprove = 0; 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'}; + $chgtext .= &mt('Notification of username requests requiring approval will be sent to: ').$cancreate{'notify'}{'approval'}; + $numapprove ++; } } } + unless ($numapprove) { + $chgtext .= &mt('No Domain Coordinators will receive notification of username requests requiring approval.'); + } } if ($chgtext) { $resulttext .= '
  • '.$chgtext.'
  • '; @@ -10709,12 +11955,12 @@ sub modify_selfcreation { $chgtext .= ''; if (@email_rule > 0) { $resulttext .= '
  • '. - &mt('Accounts may not be created by users self-enrolling with e-mail addresses of the following types: '). + &mt('Accounts may not be created by users verified by e-mail, for 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.'). + &mt('There are now no restrictions on e-mail addresses which may be used for verification when self-enrolling.'). '
  • '; } } @@ -10723,9 +11969,9 @@ sub modify_selfcreation { my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles(); foreach my $type (@{$changes{'selfcreate'}}) { my $typename = $type; - if (ref($usertypes) eq 'HASH') { - if ($usertypes->{$type} ne '') { - $typename = $usertypes->{$type}; + if (keys(%usertypes) > 0) { + if ($usertypes{$type} ne '') { + $typename = $usertypes{$type}; } } my @modifiable; @@ -10944,7 +12190,8 @@ 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','intauth_cost','intauth_check','intauth_switch'); my @authtypes = ('internal','krb4','krb5','localauth'); foreach my $item (@items) { $newvalues{$item} = $env{'form.'.$item}; @@ -10986,6 +12233,24 @@ sub modify_defaults { push(@errors,$item); } } + } elsif ($item eq 'intauth_cost') { + if ($newvalues{$item} ne '') { + if ($newvalues{$item} =~ /\D/) { + push(@errors,$item); + } + } + } elsif ($item eq 'intauth_check') { + if ($newvalues{$item} ne '') { + unless ($newvalues{$item} =~ /^(0|1|2)$/) { + push(@errors,$item); + } + } + } elsif ($item eq 'intauth_switch') { + if ($newvalues{$item} ne '') { + unless ($newvalues{$item} =~ /^(0|1|2)$/) { + push(@errors,$item); + } + } } if (grep(/^\Q$item\E$/,@errors)) { $newvalues{$item} = $domdefaults{$item}; @@ -11140,6 +12405,28 @@ sub modify_defaults { localauth => 'loc', ); $value = $authnames{$shortauth{$value}}; + } elsif ($item eq 'intauth_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 'intauth_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]"',$title->{$item},$value).'
  • '; $mailmsgtext .= "$title->{$item} set to $value\n"; @@ -11685,32 +12972,210 @@ sub modify_serverstatuses { } sub modify_helpsettings { - my ($r,$dom,$confname,%domconfig) = @_; + my ($r,$dom,$confname,$lastactref,%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') { - 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}) { + %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 ($defaultchecked{$item} eq 'off') { - if ($domconfig{'helpsettings'}{$item} eq '') { - if ($env{'form.'.$item} eq '1') { - $changes{$item} = 1; - } - } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) { + } 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); + } + } + 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 (@{$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)); + } + $newsettings{$rolename}{$access} = join(', ',sort(@newspecstaff)); } - if (($env{'form.'.$item} eq '0') || ($env{'form.'.$item} eq '1')) { - $helphash{'helpsettings'}{$item} = $env{'form.'.$item}; + } 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 ++; } } } @@ -11718,25 +13183,115 @@ sub modify_helpsettings { if (keys(%changes) > 0) { $putresult = &Apache::lonnet::put_dom('configuration',\%helphash,$dom); if ($putresult eq 'ok') { - $resulttext = &mt('Changes made:').'
      '; + 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')) { 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; } @@ -11814,7 +13369,7 @@ sub modify_coursedefaults { $changes{$item} = 1; } } elsif ($item =~ /^(uploadquota|mysqltables)_/) { - my $setting = $1; + my $setting = $1; unless (($currdef eq '') && ($newdef == $staticdefaults{$setting})) { $changes{$setting} = 1; } @@ -11829,7 +13384,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') { @@ -11852,8 +13407,8 @@ sub modify_coursedefaults { $newclone eq ''; } } elsif ($newclone ne '') { - $defaultshash{'coursedefaults'}{'canclone'} = $newclone; - } + $defaultshash{'coursedefaults'}{'canclone'} = $newclone; + } if ($newclone ne $currclone) { $changes{'canclone'} = 1; } @@ -11871,10 +13426,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}; @@ -11917,7 +13472,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; @@ -11946,7 +13501,7 @@ sub modify_coursedefaults { 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'}})) { @@ -12009,7 +13564,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.').'
  • '; + $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'}).'
  • '; @@ -12044,7 +13599,7 @@ sub modify_coursedefaults { $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 .= '
    • '; @@ -12075,7 +13630,7 @@ sub modify_coursedefaults { } $resulttext .= '
    '; } - $resulttext .= '
  • '; + $resulttext .= ''; } } elsif ($item eq 'coursecredits') { if (ref($defaultshash{'coursedefaults'}{'coursecredits'}) eq 'HASH') { @@ -12103,7 +13658,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.').'
  • '; } } } @@ -12558,7 +14113,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; @@ -12589,8 +14144,10 @@ 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(); @@ -12691,7 +14248,7 @@ sub modify_ssl { my %servers = &Apache::lonnet::internet_dom_servers($dom); my (%defaultshash,%changes); my $action = 'ssl'; - my @prefixes = ('connect','replication'); + my @prefixes = ('connto','connfrom','replication'); foreach my $prefix (@prefixes) { $defaultshash{$action}{$prefix} = {}; } @@ -12701,12 +14258,13 @@ sub modify_ssl { my @reptypes = ('certreq','nocertreq'); my @connecttypes = ('dom','intdom','other'); my %types = ( - connect => \@connecttypes, - replication => \@reptypes, + connto => \@connecttypes, + connfrom => \@connecttypes, + replication => \@reptypes, ); foreach my $prefix (sort(keys(%types))) { foreach my $type (@{$types{$prefix}}) { - if ($prefix eq 'connect') { + if (($prefix eq 'connto') || ($prefix eq 'connfrom')) { my $value = 'yes'; if ($env{'form.'.$prefix.'_'.$type} =~ /^(no|req)$/) { $value = $env{'form.'.$prefix.'_'.$type}; @@ -12795,8 +14353,11 @@ sub modify_ssl { if (ref($defaultshash{$action}{'replication'}) eq 'HASH') { $domdefaults{'replication'} = $defaultshash{$action}{'replication'}; } - if (ref($defaultshash{$action}{'connect'}) eq 'HASH') { - $domdefaults{'connect'} = $domconfig{$action}{'connect'}; + if (ref($defaultshash{$action}{'connto'}) eq 'HASH') { + $domdefaults{'connto'} = $domconfig{$action}{'connto'}; + } + if (ref($defaultshash{$action}{'connfrom'}) eq 'HASH') { + $domdefaults{'connfrom'} = $domconfig{$action}{'connfrom'}; } } my $cachetime = 24*60*60; @@ -12815,7 +14376,7 @@ sub modify_ssl { my $newvalue; if (ref($defaultshash{$action}) eq 'HASH') { if (ref($defaultshash{$action}{$prefix})) { - if ($prefix eq 'connect') { + if (($prefix eq 'connto') || ($prefix eq 'connfrom')) { $newvalue = $titles{$defaultshash{$action}{$prefix}{$type}}; } elsif (ref($defaultshash{$action}{$prefix}{$type}) eq 'ARRAY') { if (@{$defaultshash{$action}{$prefix}{$type}} > 0) { @@ -13031,8 +14592,13 @@ sub modify_loadbalancing { push(@offloadto,$target); } } - $defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype} = \@offloadto; } + 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 (ref($currtargets{$balancer}) eq 'HASH') { foreach my $sparetype (@sparestypes) { @@ -13071,7 +14637,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; } } @@ -13147,7 +14713,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') { @@ -13266,24 +14832,9 @@ 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 = &get_active_dcs($dom); + my %domcoords = &Apache::lonnet::get_active_domroles($dom,['dc']); my @domcoord = keys(%domcoords); if (keys(%currhash)) { foreach my $dc (keys(%currhash)) { @@ -13889,7 +15440,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'; @@ -13921,6 +15472,7 @@ 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; } @@ -13931,6 +15483,11 @@ 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)', ); } @@ -13972,7 +15529,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','ltitools'); + my @posscached = ('domainconfig','domdefaults','ltitools','usersessions','directorysrch'); 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.