--- loncom/interface/domainprefs.pm 2017/03/20 03:19:43 1.295 +++ 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.295 2017/03/20 03:19:43 raeburn Exp $ +# $Id: domainprefs.pm,v 1.303 2017/07/26 19:45:45 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,7 +27,7 @@ # # ############################################################### -############################################################## +############################################################### =pod @@ -220,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', @@ -268,7 +281,7 @@ sub handler { {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, }, @@ -350,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, @@ -488,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, @@ -3248,8 +3261,10 @@ sub print_helpsettings { my $css_class; my %existing=&Apache::lonnet::dump('roles',$dom,$confname,'rolesdef_'); my (%customroles,%ordered,%current); - if (ref($settings->{'adhoc'}) eq 'HASH') { - %current = %{$settings->{'adhoc'}}; + if (ref($settings) eq 'HASH') { + if (ref($settings->{'adhoc'}) eq 'HASH') { + %current = %{$settings->{'adhoc'}}; + } } my $count = 0; foreach my $key (sort(keys(%existing))) { @@ -3745,6 +3760,8 @@ sub print_ltitools { if (ref($settings->{$item}->{'display'}) eq 'HASH') { if ($settings->{$item}->{'display'}->{'target'} eq 'window') { $currdisp{'window'} = ' checked="checked"'; + } elsif ($settings->{$item}->{'display'}->{'target'} eq 'tab') { + $currdisp{'tab'} = ' checked="checked"'; } else { $currdisp{'iframe'} = ' checked="checked"'; } @@ -3754,10 +3771,12 @@ sub print_ltitools { if ($settings->{$item}->{'display'}->{'height'} =~ /^(\d+)$/) { $currdisp{'height'} = $1; } + $currdisp{'linktext'} = $settings->{$item}->{'display'}->{'linktext'}; + $currdisp{'explanation'} = $settings->{$item}->{'display'}->{'explanation'}; } else { $currdisp{'iframe'} = ' checked="checked"'; } - foreach my $disp ('iframe','window') { + foreach my $disp ('iframe','tab','window') { $datatable .= ''.(' 'x2); } @@ -3767,6 +3786,12 @@ sub print_ltitools { ''. (' 'x2); } + $datatable .= '
'. + '
'.$lt{'linktext'}.'
'. + '
'. + '
'.$lt{'explanation'}.'
'. + '

'; $datatable .= '
'; foreach my $extra ('passback','roster') { my $checkedon = ''; @@ -3848,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"'; @@ -3916,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); } @@ -3926,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').''. @@ -3985,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; } @@ -5355,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_/) { @@ -5712,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'}; @@ -5729,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', @@ -5750,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, @@ -5801,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 = ( @@ -5828,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"; @@ -5861,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'); @@ -5882,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 '') { @@ -5935,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, @@ -9449,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); @@ -9474,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') { @@ -9483,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'; } @@ -9575,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}; } @@ -9599,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'; } @@ -9622,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') { @@ -9761,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; } @@ -9787,24 +9988,27 @@ sub modify_ltitools { $resulttext .= ''; 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.'). ''; } @@ -11517,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:'). - ''; + 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:'). + ''; + } } else { - $chgtext .= &mt('Processing of requests to create account with e-mail address as username set to: "[_1]"', - $choices{$cancreate{'selfcreateprocessing'}{'default'}}); + $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:'). + ''; + } + } 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 ...'). + ''; + } + } else { + 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') { @@ -11573,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}'"). ''; } 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.'
  • '; @@ -11621,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.'). '
  • '; } } @@ -11635,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; @@ -12883,7 +13217,7 @@ sub modify_helpsettings { order => 'Order', desc => 'Role description', access => 'Role usage', - status => 'Allowed instituional types', + status => 'Allowed institutional types', exc => 'Allowed personnel', inc => 'Disallowed personnel', ); @@ -15138,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; } @@ -15148,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