--- loncom/interface/domainprefs.pm 2024/08/18 01:12:54 1.160.6.118.2.23 +++ loncom/interface/domainprefs.pm 2014/07/19 23:31:53 1.250 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: domainprefs.pm,v 1.160.6.118.2.23 2024/08/18 01:12:54 raeburn Exp $ +# $Id: domainprefs.pm,v 1.250 2014/07/19 23:31:53 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -19,15 +19,14 @@ # # 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 @@ -95,7 +94,8 @@ about default quota sizes for portfolio institutional affiliation in the domain (e.g., Faculty, Staff, Student etc.), but is now also used to manage availability of user tools: i.e., blogs, aboutme page, and portfolios, and the course request tool, -used by course owners to request creation of a course. +used by course owners to request creation of a course, and to display/store +default quota sizes for Authoring Spaces. Outputs: 1 @@ -103,8 +103,8 @@ $datatable - HTML containing form eleme In the case of course requests, radio buttons are displayed for each institutional affiliate type (and also default, and _LC_adv) for each of the course types -(official, unofficial, community, textbook, and lti). -In each case the radio buttons allow the selection of one of four values: +(official, unofficial, community, and textbook). In each case the radio buttons +allow the selection of one of four values: 0, approval, validate, autolimit=N (where N is blank, or a positive integer). which have the following effects: @@ -166,7 +166,6 @@ use Apache::lonmsg(); use Apache::lonconfigsettings; use Apache::lonuserutils(); use Apache::loncoursequeueadmin(); -use Apache::courseprefs(); use LONCAPA qw(:DEFAULT :match); use LONCAPA::Enrollment; use LONCAPA::lonauthcgi(); @@ -174,9 +173,6 @@ use File::Copy; use Locale::Language; use DateTime::TimeZone; use DateTime::Locale; -use Time::HiRes qw( sleep ); -use Net::CIDR; -use Crypt::CBC; my $registered_cleanup; my $modified_urls; @@ -219,79 +215,13 @@ sub handler { 'contacts','defaults','scantron','coursecategories', 'serverstatuses','requestcourses','helpsettings', 'coursedefaults','usersessions','loadbalancing', - 'requestauthor','selfenrollment','inststatus', - 'passwords','ltitools','toolsec','lti','ltisec', - 'wafproxy','ipaccess','authordefaults'],$dom); - my %encconfig = - &Apache::lonnet::get_dom('encconfig',['ltitools','lti','linkprot'],$dom,undef,1); - my ($checked_is_home,$is_home); - if (ref($domconfig{'ltitools'}) eq 'HASH') { - if (ref($encconfig{'ltitools'}) eq 'HASH') { - my $home = &Apache::lonnet::domain($dom,'primary'); - unless (($home eq 'no_host') || ($home eq '')) { - my @ids=&Apache::lonnet::current_machine_ids(); - if (grep(/^\Q$home\E$/,@ids)) { - $is_home = 1; - } - } - $checked_is_home = 1; - foreach my $id (keys(%{$domconfig{'ltitools'}})) { - if ((ref($domconfig{'ltitools'}{$id}) eq 'HASH') && - (ref($encconfig{'ltitools'}{$id}) eq 'HASH')) { - $domconfig{'ltitools'}{$id}{'key'} = $encconfig{'ltitools'}{$id}{'key'}; - if (($is_home) && ($phase eq 'process')) { - $domconfig{'ltitools'}{$id}{'secret'} = $encconfig{'ltitools'}{$id}{'secret'}; - } - } - } - } - } - if (ref($domconfig{'lti'}) eq 'HASH') { - if (ref($encconfig{'lti'}) eq 'HASH') { - unless ($checked_is_home) { - my $home = &Apache::lonnet::domain($dom,'primary'); - unless (($home eq 'no_host') || ($home eq '')) { - my @ids=&Apache::lonnet::current_machine_ids(); - if (grep(/^\Q$home\E$/,@ids)) { - $is_home = 1; - } - } - $checked_is_home = 1; - } - foreach my $id (keys(%{$domconfig{'lti'}})) { - if ((ref($domconfig{'lti'}{$id}) eq 'HASH') && - (ref($encconfig{'lti'}{$id}) eq 'HASH')) { - $domconfig{'lti'}{$id}{'key'} = $encconfig{'lti'}{$id}{'key'}; - if (($is_home) && ($phase eq 'process')) { - $domconfig{'lti'}{$id}{'secret'} = $encconfig{'lti'}{$id}{'secret'}; - } - } - } - } - } - if (ref($domconfig{'ltisec'}) eq 'HASH') { - if (ref($domconfig{'ltisec'}{'linkprot'}) eq 'HASH') { - if (ref($encconfig{'linkprot'}) eq 'HASH') { - foreach my $id (keys(%{$domconfig{'ltisec'}{'linkprot'}})) { - unless ($id =~ /^\d+$/) { - delete($domconfig{'ltisec'}{'linkprot'}{$id}); - } - if ((ref($domconfig{'ltisec'}{'linkprot'}{$id}) eq 'HASH') && - (ref($encconfig{'linkprot'}{$id}) eq 'HASH')) { - foreach my $item ('key','secret') { - $domconfig{'ltisec'}{'linkprot'}{$id}{$item} = $encconfig{'linkprot'}{$id}{$item}; - } - } - } - } - } - } - my @prefs_order = ('rolecolors','login','ipaccess','defaults','wafproxy','passwords', - 'quotas','autoenroll','autoupdate','autocreate','directorysrch', - 'contacts','usercreation','selfcreation','usermodification', - 'scantron','requestcourses','requestauthor','coursecategories', - 'serverstatuses','helpsettings','coursedefaults', - 'authordefaults','ltitools','selfenrollment','usersessions','lti'); + 'requestauthor','selfenrollment','inststatus'],$dom); + my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll', + 'autoupdate','autocreate','directorysrch','contacts', + 'usercreation','selfcreation','usermodification','scantron', + 'requestcourses','requestauthor','coursecategories', + 'serverstatuses','helpsettings', + 'coursedefaults','selfenrollment','usersessions'); my %existing; if (ref($domconfig{'loadbalancing'}) eq 'HASH') { %existing = %{$domconfig{'loadbalancing'}}; @@ -320,12 +250,7 @@ sub handler { header => [{col1 => 'Log-in Page Items', col2 => '',}, {col1 => 'Log-in Help', - col2 => 'Value'}, - {col1 => 'Custom HTML in document head', - col2 => 'Value'}, - {col1 => 'SSO', - col2 => 'Dual login: SSO and non-SSO options'}, - ], + col2 => 'Value'}], print => \&print_login, modify => \&modify_login, }, @@ -335,43 +260,16 @@ sub handler { header => [{col1 => 'Setting', col2 => 'Value'}, {col1 => 'Institutional user types', - col2 => 'Name displayed'}, - {col1 => 'Mapping for missing usernames via standard log-in', - col2 => 'Rules in use'}], + col2 => 'Assignable to e-mail usernames'}], print => \&print_defaults, modify => \&modify_defaults, }, - 'wafproxy' => - { text => 'Web Application Firewall/Reverse Proxy', - help => 'Domain_Configuration_WAF_Proxy', - header => [{col1 => 'Domain(s)', - col2 => 'Servers and WAF/Reverse Proxy alias(es)', - }, - {col1 => 'Domain(s)', - col2 => 'WAF Configuration',}], - print => \&print_wafproxy, - modify => \&modify_wafproxy, - }, - 'passwords' => - { text => 'Passwords (Internal authentication)', - help => 'Domain_Configuration_Passwords', - header => [{col1 => 'Resetting Forgotten Password', - col2 => 'Settings'}, - {col1 => 'Encryption of Stored Passwords (Internal Auth)', - col2 => 'Settings'}, - {col1 => 'Rules for LON-CAPA Passwords', - col2 => 'Settings'}, - {col1 => 'Course Owner Changing Student Passwords', - col2 => 'Settings'}], - print => \&print_passwords, - modify => \&modify_passwords, - }, 'quotas' => - { text => 'Blogs, personal pages/timezones, portfolio/quotas', + { text => 'Blogs, personal web pages, webDAV/quotas, portfolios', help => 'Domain_Configuration_Quotas', header => [{col1 => 'User affiliation', col2 => 'Available tools', - col3 => 'Portfolio quota (MB)',}], + col3 => 'Quotas, MB; (Authoring requires role)',}], print => \&print_quotas, modify => \&modify_quotas, }, @@ -404,26 +302,18 @@ sub handler { modify => \&modify_autocreate, }, 'directorysrch' => - { text => 'Directory searches', + { text => 'Institutional directory searches', help => 'Domain_Configuration_InstDirectory_Search', - header => [{col1 => 'Institutional Directory Setting', - col2 => 'Value',}, - {col1 => 'LON-CAPA Directory Setting', + header => [{col1 => 'Setting', col2 => 'Value',}], print => \&print_directorysrch, modify => \&modify_directorysrch, }, 'contacts' => - { text => 'E-mail addresses and helpform', + { text => 'Contact Information', help => 'Domain_Configuration_Contact_Info', - header => [{col1 => 'Default e-mail addresses', - col2 => 'Value',}, - {col1 => 'Recipient(s) for notifications', - col2 => 'Value',}, - {col1 => 'Nightly status check e-mail', - col2 => 'Settings',}, - {col1 => 'Ask helpdesk form settings', - col2 => 'Value',},], + header => [{col1 => 'Setting', + col2 => 'Value',}], print => \&print_contacts, modify => \&modify_contacts, }, @@ -446,7 +336,7 @@ sub handler { col2 => 'Enabled?'}, {col1 => 'Institutional user type (login/SSO self-creation)', col2 => 'Information user can enter'}, - {col1 => 'Self-creation with e-mail verification', + {col1 => 'Self-creation with e-mail as username', col2 => 'Settings'}], print => \&print_selfcreation, modify => \&modify_selfcreation, @@ -462,12 +352,11 @@ sub handler { modify => \&modify_usermodification, }, 'scantron' => - { text => 'Bubblesheet format', + { text => 'Bubblesheet format file', help => 'Domain_Configuration_Scantron_Format', - header => [ {col1 => 'Bubblesheet format file', - col2 => ''}, - {col1 => 'Bubblesheet data upload formats', - col2 => 'Settings'}], + header => [ {col1 => 'Item', + col2 => '', + }], print => \&print_scantron, modify => \&modify_scantron, }, @@ -521,12 +410,10 @@ sub handler { modify => \&modify_serverstatuses, }, 'helpsettings' => - {text => 'Support settings', + {text => 'Help page settings', help => 'Domain_Configuration_Help_Settings', - header => [{col1 => 'Help Page Settings (logged-in users)', - col2 => 'Value'}, - {col1 => 'Helpdesk Roles', - col2 => 'Settings'},], + header => [{col1 => 'Help Settings (logged-in users)', + col2 => 'Value'}], print => \&print_helpsettings, modify => \&modify_helpsettings, }, @@ -552,6 +439,14 @@ sub handler { print => \&print_selfenrollment, modify => \&modify_selfenrollment, }, + 'privacy' => + {text => 'User Privacy', + help => 'Domain_Configuration_User_Privacy', + header => [{col1 => 'Setting', + col2 => 'Value',}], + print => \&print_privacy, + modify => \&modify_privacy, + }, 'usersessions' => {text => 'User session hosting/offloading', help => 'Domain_Configuration_User_Sessions', @@ -564,7 +459,7 @@ sub handler { print => \&print_usersessions, modify => \&modify_usersessions, }, - 'loadbalancing' => + 'loadbalancing' => {text => 'Dedicated Load Balancer(s)', help => 'Domain_Configuration_Load_Balancing', header => [{col1 => 'Balancers', @@ -575,52 +470,6 @@ sub handler { print => \&print_loadbalancing, modify => \&modify_loadbalancing, }, - 'ltitools' => - {text => 'External Tools (LTI)', - help => 'Domain_Configuration_LTI_Tools', - header => [{col1 => 'Encryption of shared secrets', - col2 => 'Settings'}, - {col1 => 'Rules for shared secrets', - col2 => 'Settings'}, - {col1 => 'Providers', - col2 => 'Settings',}], - print => \&print_ltitools, - modify => \&modify_ltitools, - }, - 'lti' => - {text => 'LTI Link Protection and LTI Consumers', - help => 'Domain_Configuration_LTI_Provider', - header => [{col1 => 'Encryption of shared secrets', - col2 => 'Settings'}, - {col1 => 'Rules for shared secrets', - col2 => 'Settings'}, - {col1 => 'Link Protectors in Courses', - col2 => 'Values'}, - {col1 => 'Link Protectors', - col2 => 'Settings'}, - {col1 => 'Consumers', - col2 => 'Settings'},], - print => \&print_lti, - modify => \&modify_lti, - }, - 'ipaccess' => - {text => 'IP-based access control', - help => 'Domain_Configuration_IP_Access', - header => [{col1 => 'Setting', - col2 => 'Value'},], - print => \&print_ipaccess, - modify => \&modify_ipaccess, - }, - 'authordefaults' => - {text => 'Authoring Space defaults', - help => 'Domain_Configuration_Author_Defaults', - header => [{col1 => 'Defaults which can be overridden by Author', - col2 => 'Settings',}, - {col1 => 'Defaults which can be overridden by a Dom. Coord.', - col2 => 'Settings',},], - print => \&print_authordefaults, - modify => \&modify_authordefaults, - }, ); if (keys(%servers) > 1) { $prefs{'login'} = { text => 'Log-in page options', @@ -628,14 +477,9 @@ sub handler { header => [{col1 => 'Log-in Service', col2 => 'Server Setting',}, {col1 => 'Log-in Page Items', - col2 => 'Settings'}, + col2 => ''}, {col1 => 'Log-in Help', - col2 => 'Value'}, - {col1 => 'Custom HTML in document head', - col2 => 'Value'}, - {col1 => 'SSO', - col2 => 'Dual login: SSO and non-SSO options'}, - ], + col2 => 'Value'}], print => \&print_login, modify => \&modify_login, }; @@ -676,17 +520,6 @@ $javascript_validations $coursebrowserjs END - } elsif (grep(/^ipaccess$/,@actions)) { - $js .= &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'}); - } - if (grep(/^selfcreation$/,@actions)) { - $js .= &selfcreate_javascript(); - } - if (grep(/^contacts$/,@actions)) { - $js .= &contacts_javascript(); - } - if (grep(/^scantron$/,@actions)) { - $js .= &scantron_javascript(); } &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js); } else { @@ -777,11 +610,11 @@ sub process_changes { } elsif ($action eq 'autocreate') { $output = &modify_autocreate($dom,%domconfig); } elsif ($action eq 'directorysrch') { - $output = &modify_directorysrch($dom,$lastactref,%domconfig); + $output = &modify_directorysrch($dom,%domconfig); } elsif ($action eq 'usercreation') { $output = &modify_usercreation($dom,%domconfig); } elsif ($action eq 'selfcreation') { - $output = &modify_selfcreation($dom,$lastactref,%domconfig); + $output = &modify_selfcreation($dom,%domconfig); } elsif ($action eq 'usermodification') { $output = &modify_usermodification($dom,%domconfig); } elsif ($action eq 'contacts') { @@ -799,7 +632,7 @@ sub process_changes { } elsif ($action eq 'requestauthor') { $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig); } elsif ($action eq 'helpsettings') { - $output = &modify_helpsettings($r,$dom,$confname,$lastactref,%domconfig); + $output = &modify_helpsettings($r,$dom,$confname,%domconfig); } elsif ($action eq 'coursedefaults') { $output = &modify_coursedefaults($dom,$lastactref,%domconfig); } elsif ($action eq 'selfenrollment') { @@ -808,18 +641,6 @@ sub process_changes { $output = &modify_usersessions($dom,$lastactref,%domconfig); } elsif ($action eq 'loadbalancing') { $output = &modify_loadbalancing($dom,%domconfig); - } elsif ($action eq 'ltitools') { - $output = &modify_ltitools($r,$dom,$action,$lastactref,%domconfig); - } elsif ($action eq 'lti') { - $output = &modify_lti($r,$dom,$action,$lastactref,%domconfig); - } elsif ($action eq 'passwords') { - $output = &modify_passwords($r,$dom,$confname,$lastactref,%domconfig); - } elsif ($action eq 'wafproxy') { - $output = &modify_wafproxy($dom,$action,$lastactref,%domconfig); - } elsif ($action eq 'ipaccess') { - $output = &modify_ipaccess($dom,$lastactref,%domconfig); - } elsif ($action eq 'authordefaults') { - $output = &modify_authordefaults($dom,$lastactref,%domconfig); } return $output; } @@ -832,46 +653,11 @@ sub print_config_box { $output = &coursecategories_javascript($settings); } elsif ($action eq 'defaults') { $output = &defaults_javascript($settings); - } elsif ($action eq 'passwords') { - $output = &passwords_javascript($action); - } 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); - } elsif ($action eq 'ltitools') { - $output .= &Apache::lonconfigsettings::ltitools_javascript($settings); - } elsif ($action eq 'lti') { - $output .= &passwords_javascript('ltisecrets')."\n". - <i_javascript($dom,$settings); - } elsif ($action eq 'wafproxy') { - $output .= &wafproxy_javascript($dom); - } elsif ($action eq 'autoupdate') { - $output .= &autoupdate_javascript(); - } elsif ($action eq 'autoenroll') { - $output .= &autoenroll_javascript(); - } elsif ($action eq 'login') { - $output .= &saml_javascript(); - } elsif ($action eq 'ipaccess') { - $output .= &ipaccess_javascript($settings); - } elsif ($action eq 'authordefaults') { - $output .= &authordefaults_javascript(); } $output .= ' - '."\n". ''; @@ -883,41 +669,30 @@ sub print_config_box { if ($numheaders > 1) { my $colspan = ''; my $rightcolspan = ''; - my $leftnobr = ''; if (($action eq 'rolecolors') || ($action eq 'defaults') || - ($action eq 'directorysrch') || - (($action eq 'login') && ($numheaders < 5))) { + (($action eq 'login') && ($numheaders < 3))) { $colspan = ' colspan="2"'; } if ($action eq 'usersessions') { $rightcolspan = ' colspan="3"'; } - if ($action eq 'passwords') { - $leftnobr = ' LC_nobreak'; - } $output .= ' - - - @@ -979,51 +732,20 @@ sub print_config_box { - - - - - '; } else { $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); } $rowtotal ++; } elsif (($action eq 'usermodification') || ($action eq 'coursedefaults') || - ($action eq 'directorysrch') || ($action eq 'helpsettings') || - ($action eq 'wafproxy') || ($action eq 'authordefaults')) { + ($action eq 'defaults')) { $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); - } elsif ($action eq 'scantron') { - $output .= $item->{'print'}->($r,'bottom',$dom,$confname,$settings,\$rowtotal); } elsif ($action eq 'login') { - if ($numheaders == 5) { + if ($numheaders == 3) { $output .= &print_login('page',$dom,$confname,$phase,$settings,\$rowtotal).'
'. + '. &mt($item->{text}).' '. &Apache::loncommon::help_open_topic($item->{'help'}).'
- + '; $rowtotal ++; if (($action eq 'autoupdate') || ($action eq 'usercreation') || ($action eq 'selfcreation') || ($action eq 'usermodification') || ($action eq 'defaults') || ($action eq 'coursedefaults') || - ($action eq 'selfenrollment') || ($action eq 'usersessions') || ($action eq 'directorysrch') || - ($action eq 'helpsettings') || ($action eq 'contacts') || ($action eq 'wafproxy') || - ($action eq 'lti') || ($action eq 'ltitools') || ($action eq 'authordefaults')) { + ($action eq 'selfenrollment') || ($action eq 'usersessions')) { $output .= $item->{'print'}->('top',$dom,$settings,\$rowtotal); - } elsif ($action eq 'passwords') { - $output .= $item->{'print'}->('top',$dom,$confname,$settings,\$rowtotal); } elsif ($action eq 'coursecategories') { $output .= $item->{'print'}->('top',$dom,$item,$settings,\$rowtotal); - } elsif ($action eq 'scantron') { - $output .= $item->{'print'}->($r,'top',$dom,$confname,$settings,\$rowtotal); } elsif ($action eq 'login') { - if ($numheaders == 5) { + if ($numheaders == 3) { $colspan = ' colspan="2"'; $output .= &print_login('service',$dom,$confname,$phase,$settings,\$rowtotal); } else { @@ -942,35 +717,13 @@ sub print_config_box { $rowtotal ++; if (($action eq 'autoupdate') || ($action eq 'usercreation') || ($action eq 'selfcreation') || ($action eq 'selfenrollment') || - ($action eq 'usersessions') || ($action eq 'coursecategories') || - ($action eq 'contacts') || ($action eq 'passwords') || - ($action eq 'defaults') || ($action eq 'lti') || - ($action eq 'ltitools')) { + ($action eq 'usersessions') || ($action eq 'coursecategories')) { if ($action eq 'coursecategories') { $output .= &print_coursecategories('middle',$dom,$item,$settings,\$rowtotal); $colspan = ' colspan="2"'; - } elsif ($action eq 'passwords') { - $output .= $item->{'print'}->('middle',$dom,$confname,$settings,\$rowtotal); - } elsif ($action eq 'lti') { - $output .= $item->{'print'}->('upper',$dom,$settings,\$rowtotal).' -
'.&mt($item->{'header'}->[0]->{'col1'}).''.&mt($item->{'header'}->[0]->{'col1'}).' '.&mt($item->{'header'}->[0]->{'col2'}).'
-
- - - - - '."\n". - $item->{'print'}->('middle',$dom,$settings,\$rowtotal); } else { $output .= $item->{'print'}->('middle',$dom,$settings,\$rowtotal); } - my $hdridx = 2; - if ($action eq 'lti') { - $hdridx = 3; - } $output .= '
'.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
- - + + '."\n"; if ($action eq 'coursecategories') { $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal); - } elsif (($action eq 'contacts') || ($action eq 'passwords')) { - if ($action eq 'passwords') { - $output .= $item->{'print'}->('lower',$dom,$confname,$settings,\$rowtotal); - } else { - $output .= $item->{'print'}->('lower',$dom,$settings,\$rowtotal); - } - $hdridx ++; - $output .= ' - -
'.&mt($item->{'header'}->[$hdridx]->{'col1'}).''.&mt($item->{'header'}->[$hdridx]->{'col2'}).''.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
-
- - - - '."\n"; - if ($action eq 'passwords') { - $output .= $item->{'print'}->('bottom',$dom,$confname,$settings,\$rowtotal); - } else { - $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); - } - $output .= ' -
'.&mt($item->{'header'}->[$hdridx]->{'col1'}).''.&mt($item->{'header'}->[$hdridx]->{'col2'}).'
-
@@ -1039,47 +761,6 @@ sub print_config_box { } else { $output .= &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal); } - $output .= ' - - - - - - - '; - if ($numheaders == 5) { - $output .= ' - - - '; - } else { - $output .= ' - - - '; - } - $rowtotal ++; - $output .= &print_login('headtag',$dom,$confname,$phase,$settings,\$rowtotal).' -
'.&mt($item->{'header'}->[3]->{'col1'}).''.&mt($item->{'header'}->[3]->{'col2'}).'
'.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
- - - - - - '; - if ($numheaders == 5) { - $output .= ' - - - '; - } else { - $output .= ' - - - '; - } - $rowtotal ++; - $output .= &print_login('saml',$dom,$confname,$phase,$settings,\$rowtotal); } elsif ($action eq 'requestcourses') { $output .= &print_requestmail($dom,$action,$settings,\$rowtotal); $rowtotal ++; @@ -1153,7 +834,7 @@ sub print_config_box { '; } elsif ($caller eq 'help') { - my ($defaulturl,$defaulttype,%url,%type,%langchoices); + my ($defaulturl,$defaulttype,%url,%type,%lt,%langchoices); + my $switchserver = &check_switchserver($dom,$confname); my $itemcount = 1; $defaulturl = '/adm/loginproblems.html'; $defaulttype = 'default'; + %lt = &Apache::lonlocal::texthash ( + del => 'Delete?', + rep => 'Replace:', + upl => 'Upload:', + default => 'Default', + custom => 'Custom', + ); %langchoices = &Apache::lonlocal::texthash(&get_languages_hash()); my @currlangs; if (ref($settings) eq 'HASH') { @@ -1500,144 +1181,6 @@ sub print_login { $itemcount ++; } $datatable .= &captcha_choice('login',$settings,$itemcount); - } elsif ($caller eq 'headtag') { - my %domservers = &Apache::lonnet::get_servers($dom); - my $choice = $choices{'headtag'}; - $css_class = ' class="LC_odd_row"'; - $datatable .= ''. - ''; - } elsif ($caller eq 'saml') { - my %domservers = &Apache::lonnet::get_servers($dom); - $datatable .= ''; } return $datatable; } @@ -1671,208 +1214,10 @@ sub login_choices { link => "Link", alink => "Active link", vlink => "Visited link", - headtag => "Custom markup", - action => "Action", - current => "Current", - samllanding => "Dual login?", - samloptions => "Options", - alttext => "Alt text", ); return %choices; } -sub login_file_options { - return &Apache::lonlocal::texthash( - del => 'Delete?', - rep => 'Replace:', - upl => 'Upload:', - curr => 'View contents', - default => 'Default', - custom => 'Custom', - none => 'None', - ); -} - -sub print_ipaccess { - my ($dom,$settings,$rowtotal) = @_; - my $css_class; - my $itemcount = 0; - my $datatable; - my %ordered; - if (ref($settings) eq 'HASH') { - foreach my $item (keys(%{$settings})) { - if (ref($settings->{$item}) eq 'HASH') { - my $num = $settings->{$item}{'order'}; - if ($num eq '') { - $num = scalar(keys(%{$settings})); - } - $ordered{$num} = $item; - } - } - } - my $maxnum = scalar(keys(%ordered)); - if (keys(%ordered)) { - my @items = sort { $a <=> $b } keys(%ordered); - for (my $i=0; $i<@items; $i++) { - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $item = $ordered{$items[$i]}; - my ($name,$ipranges,%commblocks,%courses); - if (ref($settings->{$item}) eq 'HASH') { - $name = $settings->{$item}->{'name'}; - $ipranges = $settings->{$item}->{'ip'}; - if (ref($settings->{$item}->{'commblocks'}) eq 'HASH') { - %commblocks = %{$settings->{$item}->{'commblocks'}}; - } - if (ref($settings->{$item}->{'courses'}) eq 'HASH') { - %courses = %{$settings->{$item}->{'courses'}}; - } - } - my $chgstr = ' onchange="javascript:reorderIPaccess(this.form,'."'ipaccess_pos_".$item."'".');"'; - $datatable .= ''. - ''; - $itemcount ++; - } - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $chgstr = ' onchange="javascript:reorderIPaccess(this.form,'."'ipaccess_pos_add'".');"'; - $datatable .= ''."\n". - ''."\n". - ''."\n"; - $$rowtotal ++; - return $datatable; -} - -sub ipaccess_options { - my ($num,$itemcount,$dom,$name,$ipranges,$blocksref,$coursesref) = @_; - my (%currblocks,%currcourses,$output); - if (ref($blocksref) eq 'HASH') { - %currblocks = %{$blocksref}; - } - if (ref($coursesref) eq 'HASH') { - %currcourses = %{$coursesref}; - } - $output = '
'.&mt('Location(s)').''. - ''.&mt('Name').': '. - ''. - '
'. - '
'.&mt('IP Range(s)').''. - &mt('Format for each IP range').': '.&mt('A.B.C.D/N or A.B.C.D-E.F.G.H').'
'. - &mt('Range(s) will be stored as IP netblock(s) in CIDR notation (comma separated)').'
'. - '
'. - '
'.&mt('Functionality Blocked?').''. - &blocker_checkboxes($num,$blocksref).'
'. - '
'.&mt('Courses/Communities allowed').''. - '
'.&mt($item->{'header'}->[4]->{'col1'}).''.&mt($item->{'header'}->[4]->{'col2'}).'
'.&mt($item->{'header'}->[3]->{'col1'}).''.&mt($item->{'header'}->[3]->{'col2'}).'
'; - if ($action eq 'login') { + if (($action eq 'login') || ($action eq 'directorysrch')) { $output .= ' '; } elsif ($action eq 'serverstatuses') { @@ -1197,10 +878,13 @@ sub print_config_box { $rowtotal ++; if ($action eq 'quotas') { $output .= &print_quotas($dom,$settings,\$rowtotal,$action); - } elsif (($action eq 'autoenroll') || ($action eq 'autocreate') || - ($action eq 'serverstatuses') || ($action eq 'loadbalancing') || - ($action eq 'ipaccess')) { + } elsif (($action eq 'autoenroll') || ($action eq 'autocreate') || ($action eq 'directorysrch') || + ($action eq 'contacts') || ($action eq 'serverstatuses') || ($action eq 'loadbalancing')) { $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 .= ' @@ -1213,12 +897,9 @@ sub print_config_box { sub print_login { my ($caller,$dom,$confname,$phase,$settings,$rowtotal) = @_; - my ($css_class,$datatable,$switchserver,%lt); + my ($css_class,$datatable); my %choices = &login_choices(); - if (($caller eq 'help') || ($caller eq 'headtag') || ($caller eq 'saml')) { - %lt = &login_file_options(); - $switchserver = &check_switchserver($dom,$confname); - } + if ($caller eq 'service') { my %servers = &Apache::lonnet::internet_dom_servers($dom); my $choice = $choices{'disallowlogin'}; @@ -1305,7 +986,6 @@ sub print_login { } } my @images = ('img','logo','domlogo','login'); - my @alttext = ('img','logo','domlogo'); my @logintext = ('textcol','bgcol'); my @bgs = ('pgbg','mainbg','sidebg'); my @links = ('link','alink','vlink'); @@ -1347,13 +1027,6 @@ sub print_login { $designs{'showlogo'}{$item} = $settings->{'showlogo'}{$item}; } } - foreach my $item (@alttext) { - if (ref($settings->{'alttext'}) eq 'HASH') { - if ($settings->{'alttext'}->{$item} ne '') { - $designs{'alttext'}{$item} = $settings->{'alttext'}{$item}; - } - } - } foreach my $item (@logintext) { if ($settings->{$item} ne '') { $designs{'logintext'}{$item} = $settings->{$item}; @@ -1420,10 +1093,18 @@ sub print_login { $datatable .= &display_color_options($dom,$confname,$phase,'login',$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text,$rowtotal,\@logintext); $datatable .= '
'.&mt($item->{'header'}->[0]->{'col1'}).'
'.$choice.''. - ''. - ''. - ''."\n"; - my (%currurls,%currexempt); - if (ref($settings) eq 'HASH') { - if (ref($settings->{'headtag'}) eq 'HASH') { - foreach my $lonhost (keys(%{$settings->{'headtag'}})) { - if (ref($settings->{'headtag'}{$lonhost}) eq 'HASH') { - $currurls{$lonhost} = $settings->{'headtag'}{$lonhost}{'url'}; - $currexempt{$lonhost} = $settings->{'headtag'}{$lonhost}{'exempt'}; - } - } - } - } - foreach my $lonhost (sort(keys(%domservers))) { - my $exempt = &check_exempt_addresses($currexempt{$lonhost}); - $datatable .= ''; - if ($currurls{$lonhost}) { - $datatable .= ''. - ''; - } - $datatable .= '
'.$choices{'hostid'}.''.$choices{'current'}.''.$choices{'action'}.''.$choices{'exempt'}.'
'.$domservers{$lonhost}.''.$lt{'curr'}.' '.$lt{'rep'}.''; - } else { - $datatable .= ''.$lt{'none'}.''.$lt{'upl'}; - } - $datatable .='
'; - if ($switchserver) { - $datatable .= &mt('Upload to library server: [_1]',$switchserver); - } else { - $datatable .= ''; - } - $datatable .= '
'. - ''. - ''. - ''."\n"; - my (%saml,%samltext,%samlimg,%samlalt,%samlurl,%samltitle,%samlwindow,%samlnotsso,%styleon,%styleoff); - foreach my $lonhost (keys(%domservers)) { - $samlurl{$lonhost} = '/adm/sso'; - $styleon{$lonhost} = 'display:none'; - $styleoff{$lonhost} = ''; - } - if ((ref($settings) eq 'HASH') && (ref($settings->{'saml'}) eq 'HASH')) { - foreach my $lonhost (keys(%{$settings->{'saml'}})) { - if (ref($settings->{'saml'}{$lonhost}) eq 'HASH') { - $saml{$lonhost} = 1; - $samltext{$lonhost} = $settings->{'saml'}{$lonhost}{'text'}; - $samlimg{$lonhost} = $settings->{'saml'}{$lonhost}{'img'}; - $samlalt{$lonhost} = $settings->{'saml'}{$lonhost}{'alt'}; - $samlurl{$lonhost} = $settings->{'saml'}{$lonhost}{'url'}; - $samltitle{$lonhost} = $settings->{'saml'}{$lonhost}{'title'}; - $samlwindow{$lonhost} = $settings->{'saml'}{$lonhost}{'window'}; - $samlnotsso{$lonhost} = $settings->{'saml'}{$lonhost}{'notsso'}; - $styleon{$lonhost} = ''; - $styleoff{$lonhost} = 'display:none'; - } else { - $styleon{$lonhost} = 'display:none'; - $styleoff{$lonhost} = ''; - } - } - } - my $itemcount = 1; - foreach my $lonhost (sort(keys(%domservers))) { - my $samlon = ' '; - my $samloff = ' checked="checked" '; - if ($saml{$lonhost}) { - $samlon = $samloff; - $samloff = ' '; - } - my $samlwinon = ''; - my $samlwinoff = ' checked="checked"'; - if ($samlwindow{$lonhost}) { - $samlwinon = $samlwinoff; - $samlwinoff = ''; - } - my $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''. - ''. - ''; - $itemcount ++; - } - $datatable .= '
'.$choices{'hostid'}.''.$choices{'samllanding'}.''.$choices{'samloptions'}.'
'.$domservers{$lonhost}.''.(' 'x2). - ''. - ''. - ''. - ''. - ''. - '
'.&mt('SSO').'
'.&mt('Text').''.&mt('Image').''.&mt('Alt Text').'
'; - if ($samlimg{$lonhost}) { - $datatable .= '
'. - ' '.$lt{'rep'}.''; - } else { - $datatable .= $lt{'upl'}; - } - $datatable .='
'; - if ($switchserver) { - $datatable .= &mt('Upload to library server: [_1]',$switchserver); - } else { - $datatable .= ''; - } - $datatable .= '

'. - ''. - ''. - ''. - ''. - ''. - ''. - ''. - ''. - '
'.&mt('SSO').''. - ''.&mt('Non-SSO').'
'.&mt('URL').''.&mt('Tool Tip').''.&mt('Pop-up if iframe').''.&mt('Text').'
'.(' 'x2).'
 
' - .''.(' 'x2). - ''. - &ipaccess_options($i,$itemcount,$dom,$name,$ipranges,\%commblocks,\%courses). - '
'."\n". - ''."\n". - ' '."\n". - ''.&mt('Add').''. - &ipaccess_options('add',$itemcount,$dom). - '
'; - foreach my $cid (sort(keys(%currcourses))) { - my %courseinfo = &Apache::lonnet::coursedescription($cid,{'one_time' => 1}); - $output .= ''; - } - $output .= '
'. - ''. - ' ('.$cid.')
'.&mt('Add').': '. - ''. - &Apache::loncommon::selectcourse_link('display','ipaccess_cnum_'.$num,'ipaccess_cdom_'.$num,'ipaccess_cdesc_'.$num,$dom,undef,'Course/Community'). - ''. - ''. - '
'."\n". - ''; - return $output; -} - -sub blocker_checkboxes { - my ($num,$blocks) = @_; - my ($typeorder,$types) = &commblocktype_text(); - my $numinrow = 6; - my $output = ''; - for (my $i=0; $i<@{$typeorder}; $i++) { - my $block = $typeorder->[$i]; - my $blockstatus; - if (ref($blocks) eq 'HASH') { - if ($blocks->{$block} eq 'on') { - $blockstatus = 'checked="checked"'; - } - } - my $rem = $i%($numinrow); - if ($rem == 0) { - if ($i > 0) { - $output .= ''; - } - $output .= ''; - } - if ($i == scalar(@{$typeorder})-1) { - my $colsleft = $numinrow-$rem; - if ($colsleft > 1) { - $output .= ''; - } - $output .= '
'; - } else { - $output .= ''; - } - } else { - $output .= ''; - } - my $item = 'ipaccess_block_'.$num; - if ($blockstatus) { - $blockstatus = ' '.$blockstatus; - } - $output .= ''."\n". - '
'; - return $output; -} - -sub commblocktype_text { - my %types = &Apache::lonlocal::texthash( - 'com' => 'Messaging', - 'chat' => 'Chat Room', - 'boards' => 'Discussion', - 'port' => 'Portfolio', - 'groups' => 'Groups', - 'blogs' => 'Blogs', - 'about' => 'User Information', - 'printout' => 'Printouts', - 'passwd' => 'Change Password', - 'grades' => 'Gradebook', - 'search' => 'Course search', - 'wishlist' => 'Stored links', - 'annotate' => 'Annotations', - ); - my $typeorder = ['com','chat','boards','port','groups','blogs','about','wishlist','printout','grades','search','annotate','passwd']; - return ($typeorder,\%types); -} - sub print_rolecolors { my ($phase,$role,$dom,$confname,$settings,$rowtotal) = @_; my %choices = &color_font_choices(); @@ -1990,7 +1335,7 @@ sub display_color_options { my $datatable = ''. ''.$choices->{'font'}.''; if (!$is_custom->{'font'}) { - $datatable .= ''.&mt('Default in use:').' '.$defaults->{'font'}.''; + $datatable .= ''.&mt('Default in use:').' '.$defaults->{'font'}.''; } else { $datatable .= ' '; } @@ -1999,12 +1344,12 @@ sub display_color_options { $datatable .= ''. ' '. - ' '; + ' '; unless ($role eq 'login') { $datatable .= ''. ''.$choices->{'fontmenu'}.''; if (!$is_custom->{'fontmenu'}) { - $datatable .= ''.&mt('Default in use:').' '.$defaults->{'fontmenu'}.''; + $datatable .= ''.&mt('Default in use:').' '.$defaults->{'fontmenu'}.''; } else { $datatable .= ' '; } @@ -2014,7 +1359,7 @@ sub display_color_options { ' '. - ' '; + ' '; } my $switchserver = &check_switchserver($dom,$confname); foreach my $img (@{$images}) { @@ -2022,7 +1367,7 @@ sub display_color_options { $css_class = $itemcount%2?' class="LC_odd_row"':''; $datatable .= ''. ''.$choices->{$img}; - my ($imgfile,$img_import,$login_hdr_pick,$logincolors,$alttext); + my ($imgfile,$img_import,$login_hdr_pick,$logincolors); if ($role eq 'login') { if ($img eq 'login') { $login_hdr_pick = @@ -2030,13 +1375,8 @@ sub display_color_options { $logincolors = &login_text_colors($img,$role,$logintext,$phase,$choices, $designs,$defaults); - } else { - if ($img ne 'domlogo') { - $datatable.= &logo_display_options($img,$defaults,$designs); - } - if (ref($designs->{'alttext'}) eq 'HASH') { - $alttext = $designs->{'alttext'}{$img}; - } + } elsif ($img ne 'domlogo') { + $datatable.= &logo_display_options($img,$defaults,$designs); } } $datatable .= ''; @@ -2078,8 +1418,7 @@ sub display_color_options { if ($fullwidth ne '' && $fullheight ne '') { if ($fullwidth > $width && $fullheight > $height) { my $size = $width.'x'.$height; - my @args = ('convert','-sample',$size,$input,$output); - system({$args[0]} @args); + system("convert -sample $size $input $output"); $showfile = "/$imgdir/tn-".$filename; } } @@ -2128,11 +1467,6 @@ sub display_color_options { $datatable .=' '; } } - if (($role eq 'login') && ($img ne 'login')) { - $datatable .= (' ' x2).' '; - } $datatable .= ''; } $itemcount ++; @@ -2142,7 +1476,7 @@ sub display_color_options { my $bgs_def; foreach my $item (@{$bgs}) { if (!$is_custom->{$item}) { - $bgs_def .= ''.$choices->{$item}.'    
'.$defaults->{'bgs'}{$item}.''; + $bgs_def .= ''.$choices->{$item}.'    
'.$defaults->{'bgs'}{$item}.''; } } if ($bgs_def) { @@ -2170,7 +1504,7 @@ sub display_color_options { my $links_def; foreach my $item (@{$links}) { if (!$is_custom->{$item}) { - $links_def .= ''.$choices->{$item}.'
'.$defaults->{'links'}{$item}.''; + $links_def .= ''.$choices->{$item}.'
'.$defaults->{'links'}{$item}.''; } } if ($links_def) { @@ -2256,15 +1590,17 @@ sub image_changes { my ($is_custom,$alt_text,$img_import,$showfile,$fullsize,$role,$img,$imgfile,$logincolors) = @_; my $output; if ($img eq 'login') { - $output = ''.$logincolors; # suppress image for Log-in header + # suppress image for Log-in header } elsif (!$is_custom) { if ($img ne 'domlogo') { - $output = &mt('Default image:').'
'; + $output .= &mt('Default image:').'
'; } else { - $output = &mt('Default in use:').'
'; + $output .= &mt('Default in use:').'
'; } } - if ($img ne 'login') { + if ($img eq 'login') { # suppress image for Log-in header + $output .= ''.$logincolors; + } else { if ($img_import) { $output .= ''; } @@ -2290,12 +1626,12 @@ sub print_quotas { } else { $context = $action; } - my ($datatable,$defaultquota,@usertools,@options,%validations); + my ($datatable,$defaultquota,$authorquota,@usertools,@options,%validations); my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); my $typecount = 0; my ($css_class,%titles); if ($context eq 'requestcourses') { - @usertools = ('official','unofficial','community','textbook','lti'); + @usertools = ('official','unofficial','community','textbook'); @options =('norequest','approval','validate','autolimit'); %validations = &Apache::lonnet::auto_courserequest_checks($dom); %titles = &courserequest_titles(); @@ -2304,12 +1640,12 @@ sub print_quotas { @options = ('norequest','approval','automatic'); %titles = &authorrequest_titles(); } else { - @usertools = ('aboutme','blog','portfolio','portaccess','timezone'); + @usertools = ('aboutme','blog','webdav','portfolio'); %titles = &tool_titles(); } if (ref($types) eq 'ARRAY') { foreach my $type (@{$types}) { - my $currdefquota; + my ($currdefquota,$currauthorquota); unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) { if (ref($settings) eq 'HASH') { @@ -2318,6 +1654,9 @@ sub print_quotas { } else { $currdefquota = $settings->{$type}; } + if (ref($settings->{authorquota}) eq 'HASH') { + $currauthorquota = $settings->{authorquota}->{$type}; + } } } if (defined($usertypes->{$type})) { @@ -2405,12 +1744,9 @@ sub print_quotas { } } else { my $checked = 'checked="checked" '; - if ($item eq 'timezone') { - $checked = ''; - } if (ref($settings) eq 'HASH') { if (ref($settings->{$item}) eq 'HASH') { - if (!$settings->{$item}->{$type}) { + if ($settings->{$item}->{$type} == 0) { $checked = ''; } elsif ($settings->{$item}->{$type} == 1) { $checked = 'checked="checked" '; @@ -2435,9 +1771,13 @@ sub print_quotas { ($context eq 'requestauthor')) { $datatable .= ''. - ''. + ''.&mt('Portfolio').': '. ''.(' ' x 2). + ''.&mt('Authoring').': '. + ''; } $datatable .= ''; @@ -2446,12 +1786,16 @@ sub print_quotas { } unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) { $defaultquota = '20'; + $authorquota = '500'; if (ref($settings) eq 'HASH') { if (ref($settings->{'defaultquota'}) eq 'HASH') { $defaultquota = $settings->{'defaultquota'}->{'default'}; } elsif (defined($settings->{'default'})) { $defaultquota = $settings->{'default'}; } + if (ref($settings->{'authorquota'}) eq 'HASH') { + $authorquota = $settings->{'authorquota'}->{'default'}; + } } } $typecount ++; @@ -2563,9 +1907,12 @@ sub print_quotas { $datatable .= ''; unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) { $datatable .= ''. - ''. + ''.&mt('Portfolio').': '. ''; + $defaultquota.'" size="5" />'.(' ' x2). + ''.&mt('Authoring').': '. + ''; } $datatable .= ''; $typecount ++; @@ -2697,7 +2044,7 @@ sub print_quotas { } sub print_requestmail { - my ($dom,$action,$settings,$rowtotal,$customcss,$rowstyle) = @_; + my ($dom,$action,$settings,$rowtotal) = @_; my ($now,$datatable,%currapp); $now = time; if (ref($settings) eq 'HASH') { @@ -2709,19 +2056,7 @@ sub print_requestmail { } my $numinrow = 2; my $css_class; - if ($$rowtotal%2) { - $css_class = 'LC_odd_row'; - } - if ($customcss) { - $css_class .= " $customcss"; - } - $css_class =~ s/^\s+//; - if ($css_class) { - $css_class = ' class="'.$css_class.'"'; - } - if ($rowstyle) { - $css_class .= ' style="'.$rowstyle.'"'; - } + $css_class = ($$rowtotal%2? ' class="LC_odd_row"':''); my $text; if ($action eq 'requestcourses') { $text = &mt('Receive notification of course requests requiring approval'); @@ -2748,7 +2083,7 @@ sub print_studentcode { my ($settings,$rowtotal) = @_; my $rownum = 0; my ($output,%current); - my @crstypes = ('official','unofficial','community','textbook','lti'); + my @crstypes = ('official','unofficial','community','textbook'); if (ref($settings) eq 'HASH') { if (ref($settings->{'uniquecode'}) eq 'HASH') { foreach my $type (@crstypes) { @@ -2844,7 +2179,8 @@ sub print_textbookcourses { (' 'x2). ''.&mt('Thumbnail:'); if ($image) { - $datatable .= $imgsrc. + $datatable .= ''. + $imgsrc. ' '. ' '.&mt('Replace:').' '; @@ -2875,7 +2211,7 @@ sub print_textbookcourses { $datatable .= ''; } $datatable .= ' '."\n". - ''.&mt('Add').''."\n". + ''.&mt('Add').''."\n". ''. ''.&mt('Subject:').' '."\n". (' 'x2). @@ -2892,13 +2228,13 @@ sub print_textbookcourses { } else { $datatable .= ''; } - $datatable .= ''."\n"; } - $datatable .= ''.&mt('LON-CAPA course:').' '. + $datatable .= ''."\n". + ''.&mt('LON-CAPA course:').' '. &Apache::loncommon::select_dom_form($env{'request.role.domain'},$type.'_addbook_cdom'). ''. &Apache::loncommon::selectcourse_link - ('display',$type.'_addbook_cnum',$type.'_addbook_cdom',undef,undef,undef,'Course'). + ('display',$type.'_addbook_cnum',$type.'_addbook_cdom',undef,undef,undef,'Course'); ''."\n". ''."\n"; $itemcount ++; @@ -2998,775 +2334,10 @@ $jstext{'templates'}; ENDSCRIPT } -sub ltitools_javascript { - my ($settings) = @_; - my $togglejs = <itools_toggle_js(); - unless (ref($settings) eq 'HASH') { - return $togglejs; - } - my (%ordered,$total,%jstext); - $total = 0; - foreach my $item (keys(%{$settings})) { - if (ref($settings->{$item}) eq 'HASH') { - my $num = $settings->{$item}{'order'}; - $ordered{$num} = $item; - } - } - $total = scalar(keys(%{$settings})); - my @jsarray = (); - foreach my $item (sort {$a <=> $b } (keys(%ordered))) { - push(@jsarray,$ordered{$item}); - } - my $jstext = ' var ltitools = Array('."'".join("','",@jsarray)."'".');'."\n"; - return <<"ENDSCRIPT"; - - -$togglejs - -ENDSCRIPT -} - -sub ltitools_toggle_js { - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - -sub wafproxy_javascript { - my ($dom) = @_; - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - -sub lti_javascript { - my ($dom,$settings) = @_; - my $togglejs = <i_toggle_js($dom); - my $linkprot_js = &Apache::courseprefs::linkprot_javascript(); - unless (ref($settings) eq 'HASH') { - return $togglejs.' - -'; - } - my (%ordered,$total,%jstext); - $total = scalar(keys(%{$settings})); - foreach my $item (keys(%{$settings})) { - if (ref($settings->{$item}) eq 'HASH') { - my $num = $settings->{$item}{'order'}; - if ($num eq '') { - $num = $total - 1; - } - $ordered{$num} = $item; - } - } - my @jsarray = (); - foreach my $item (sort {$a <=> $b } (keys(%ordered))) { - push(@jsarray,$ordered{$item}); - } - my $jstext = ' var lti = Array('."'".join("','",@jsarray)."'".');'."\n"; - return <<"ENDSCRIPT"; - - -$togglejs - -ENDSCRIPT -} - -sub lti_toggle_js { - my ($dom) = @_; - my %lcauthparmtext = &Apache::lonlocal::texthash ( - localauth => 'Local auth argument', - krb => 'Kerberos domain', - ); - my $crsincalert = &mt('"User\'s identity sent" needs to be set to "Yes" first,[_1] before setting "Course\'s identity sent" to "Yes"',"\n"); - &js_escape(\$crsincalert); - my %servers = &Apache::lonnet::get_servers($dom,'library'); - my $primary = &Apache::lonnet::domain($dom,'primary'); - my $course_servers = "'".join("','",keys(%servers))."'"; - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - -sub autoupdate_javascript { - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - -sub autoenroll_javascript { - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - -sub saml_javascript { - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - -sub ipaccess_javascript { - my ($settings) = @_; - my (%ordered,$total,%jstext); - $total = 0; - if (ref($settings) eq 'HASH') { - foreach my $item (keys(%{$settings})) { - if (ref($settings->{$item}) eq 'HASH') { - my $num = $settings->{$item}{'order'}; - $ordered{$num} = $item; - } - } - $total = scalar(keys(%{$settings})); - } - my @jsarray = (); - foreach my $item (sort {$a <=> $b } (keys(%ordered))) { - push(@jsarray,$ordered{$item}); - } - my $jstext = ' var ipaccess = Array('."'".join("','",@jsarray)."'".');'."\n"; - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - -sub authordefaults_javascript { - my %alert = &Apache::lonlocal::texthash ( - reqd => 'Warning: at least one editor needs to be available.', - rest => 'Unchecking this editor disallowed while others unchecked.', - ); - &js_escape(\%alert); - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - sub print_autoenroll { my ($dom,$settings,$rowtotal) = @_; my $autorun = &Apache::lonnet::auto_run(undef,$dom), - my ($defdom,$runon,$runoff,$coownerson,$coownersoff, - $failsafe,$autofailsafe,$failsafesty,%failsafechecked); - $failsafesty = 'none'; - %failsafechecked = ( - off => ' checked="checked"', - ); + my ($defdom,$runon,$runoff,$coownerson,$coownersoff); if (ref($settings) eq 'HASH') { if (exists($settings->{'run'})) { if ($settings->{'run'} eq '0') { @@ -3800,25 +2371,6 @@ sub print_autoenroll { if (exists($settings->{'sender_domain'})) { $defdom = $settings->{'sender_domain'}; } - if (exists($settings->{'failsafe'})) { - $failsafe = $settings->{'failsafe'}; - if ($failsafe eq 'zero') { - $failsafechecked{'zero'} = ' checked="checked"'; - $failsafechecked{'off'} = ''; - $failsafesty = 'inline-block'; - } elsif ($failsafe eq 'any') { - $failsafechecked{'any'} = ' checked="checked"'; - $failsafechecked{'off'} = ''; - } - $autofailsafe = $settings->{'autofailsafe'}; - } elsif (exists($settings->{'autofailsafe'})) { - $autofailsafe = $settings->{'autofailsafe'}; - if ($autofailsafe ne '') { - $failsafechecked{'zero'} = ' checked="checked"'; - $failsafe = 'zero'; - $failsafechecked{'off'} = ''; - } - } } else { if ($autorun) { $runon = ' checked="checked" '; @@ -3854,93 +2406,56 @@ sub print_autoenroll { $coownerson.' value="1" />'.&mt('Yes').' '. ''. - ''. - ''.&mt('Failsafe for no drops when institutional data missing').''. - ''. - '    '. - '
'. - ''. - '
'. - ''. - &mt('Threshold for number of students in section to drop: [_1]', - ''). - '
'; - $$rowtotal += 4; + ''; + $$rowtotal += 3; return $datatable; } sub print_autoupdate { my ($position,$dom,$settings,$rowtotal) = @_; - my ($enable,$datatable); + my $datatable; if ($position eq 'top') { - my %choices = &Apache::lonlocal::texthash ( - run => 'Auto-update active?', - classlists => 'Update information in classlists?', - unexpired => 'Skip updates for users without active or future roles?', - lastactive => 'Skip updates for inactive users?', - ); - my $itemcount = 0; my $updateon = ' '; my $updateoff = ' checked="checked" '; + my $classlistson = ' '; + my $classlistsoff = ' checked="checked" '; if (ref($settings) eq 'HASH') { if ($settings->{'run'} eq '1') { $updateon = $updateoff; $updateoff = ' '; } + if ($settings->{'classlists'} eq '1') { + $classlistson = $classlistsoff; + $classlistsoff = ' '; + } } - $enable = ''. - ''.$choices{'run'}.''. - ' '. ''. + $updateoff.'value="0" />'.&mt('No').'
'. + ''. + ''.&mt($title{'classlists'}).''. + ''. + ' '. + ''. ''; - my @toggles = ('classlists','unexpired'); - my %defaultchecked = ('classlists' => 'off', - 'unexpired' => 'off' - ); - $$rowtotal ++; - ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, - \%choices,$itemcount,'','','left','no'); - $datatable = $enable.$datatable; - $$rowtotal += $itemcount; - my $lastactiveon = ' '; - my $lastactiveoff = ' checked="checked" '; - my $lastactivestyle = 'none'; - my $lastactivedays; - my $onclick = ' onclick="javascript:toggleLastActiveDays(this.form);"'; - if (ref($settings) eq 'HASH') { - if ($settings->{'lastactive'} =~ /^\d+$/) { - $lastactiveon = $lastactiveoff; - $lastactiveoff = ' '; - $lastactivestyle = 'inline-block'; - $lastactivedays = $settings->{'lastactive'}; - } - } - my $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''.$choices{'lastactive'}.''. - ''. - ' '. - '
'. - ': '.&mt('inactive = no activity in last [_1] days', - ''). - ''. - ''; - $$rowtotal ++; + $$rowtotal += 2; } elsif ($position eq 'middle') { my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); my $numinrow = 3; my $locknamesettings; $datatable .= &insttypes_row($settings,$types,$usertypes, $dom,$numinrow,$othertitle, - 'lockablenames',$rowtotal); + 'lockablenames'); $$rowtotal ++; } else { my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); @@ -4021,1046 +2536,236 @@ sub print_autocreate { } sub print_directorysrch { - my ($position,$dom,$settings,$rowtotal) = @_; - my $datatable; - if ($position eq 'top') { - my $instsrchon = ' '; - my $instsrchoff = ' checked="checked" '; - my ($exacton,$containson,$beginson); - my $instlocalon = ' '; - my $instlocaloff = ' checked="checked" '; - if (ref($settings) eq 'HASH') { - if ($settings->{'available'} eq '1') { - $instsrchon = $instsrchoff; - $instsrchoff = ' '; - } - if ($settings->{'localonly'} eq '1') { - $instlocalon = $instlocaloff; - $instlocaloff = ' '; - } - if (ref($settings->{'searchtypes'}) eq 'ARRAY') { - foreach my $type (@{$settings->{'searchtypes'}}) { - if ($type eq 'exact') { - $exacton = ' checked="checked" '; - } elsif ($type eq 'contains') { - $containson = ' checked="checked" '; - } elsif ($type eq 'begins') { - $beginson = ' checked="checked" '; - } - } - } else { - if ($settings->{'searchtypes'} eq 'exact') { - $exacton = ' checked="checked" '; - } elsif ($settings->{'searchtypes'} eq 'contains') { - $containson = ' checked="checked" '; - } elsif ($settings->{'searchtypes'} eq 'specify') { + my ($dom,$settings,$rowtotal) = @_; + my $srchon = ' '; + my $srchoff = ' checked="checked" '; + my ($exacton,$containson,$beginson); + my $localon = ' '; + my $localoff = ' checked="checked" '; + if (ref($settings) eq 'HASH') { + if ($settings->{'available'} eq '1') { + $srchon = $srchoff; + $srchoff = ' '; + } + if ($settings->{'localonly'} eq '1') { + $localon = $localoff; + $localoff = ' '; + } + if (ref($settings->{'searchtypes'}) eq 'ARRAY') { + foreach my $type (@{$settings->{'searchtypes'}}) { + if ($type eq 'exact') { $exacton = ' checked="checked" '; + } elsif ($type eq 'contains') { $containson = ' checked="checked" '; + } elsif ($type eq 'begins') { + $beginson = ' checked="checked" '; } } - } - my ($searchtitles,$titleorder) = &sorted_searchtitles(); - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - - my $numinrow = 4; - my $cansrchrow = 0; - $datatable=''. - ''.&mt('Institutional directory search available?').''. - ' '. - ''. - ''. - ''.&mt('Other domains can search institution?').''. - ' '. - ''. - ''; - $$rowtotal += 2; - if (ref($usertypes) eq 'HASH') { - if (keys(%{$usertypes}) > 0) { - $datatable .= &insttypes_row($settings,$types,$usertypes,$dom, - $numinrow,$othertitle,'cansearch', - $rowtotal); - $cansrchrow = 1; + } else { + if ($settings->{'searchtypes'} eq 'exact') { + $exacton = ' checked="checked" '; + } elsif ($settings->{'searchtypes'} eq 'contains') { + $containson = ' checked="checked" '; + } elsif ($settings->{'searchtypes'} eq 'specify') { + $exacton = ' checked="checked" '; + $containson = ' checked="checked" '; } } - if ($cansrchrow) { - $$rowtotal ++; - $datatable .= ''; - } else { - $datatable .= ''; + } + my ($searchtitles,$titleorder) = &sorted_searchtitles(); + my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); + + my $numinrow = 4; + my $cansrchrow = 0; + my $datatable=''. + ''.&mt('Directory search available?').''. + ' '. + ''. + ''. + ''.&mt('Other domains can search?').''. + ' '. + ''. + ''; + $$rowtotal += 2; + if (ref($usertypes) eq 'HASH') { + if (keys(%{$usertypes}) > 0) { + $datatable .= &insttypes_row($settings,$types,$usertypes,$dom, + $numinrow,$othertitle,'cansearch'); + $cansrchrow = 1; } - $datatable .= ''.&mt('Supported search methods'). - ''; - foreach my $title (@{$titleorder}) { - if (defined($searchtitles->{$title})) { - my $check = ' '; - if (ref($settings) eq 'HASH') { - if (ref($settings->{'searchby'}) eq 'ARRAY') { - if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) { - $check = ' checked="checked" '; - } + } + if ($cansrchrow) { + $$rowtotal ++; + $datatable .= ''; + } else { + $datatable .= ''; + } + $datatable .= ''; - $$rowtotal ++; - if ($cansrchrow) { - $datatable .= ''; - } else { - $datatable .= ''; - } - $datatable .= ''. - ''; - $$rowtotal ++; + } + $datatable .= '
'.&mt('Supported search methods'). + ''; + foreach my $title (@{$titleorder}) { + if (defined($searchtitles->{$title})) { + my $check = ' '; + if (ref($settings) eq 'HASH') { + if (ref($settings->{'searchby'}) eq 'ARRAY') { + if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) { + $check = ' checked="checked" '; } } - $datatable .= ''; } + $datatable .= ''; } - $datatable .= '
'. - ''. + '
'.&mt('Search latitude').''. - ' '. - ' '. - '
'; + $$rowtotal ++; + if ($cansrchrow) { + $datatable .= ''; } else { - my $domsrchon = ' checked="checked" '; - my $domsrchoff = ' '; - my $domlocalon = ' '; - my $domlocaloff = ' checked="checked" '; - if (ref($settings) eq 'HASH') { - if ($settings->{'lclocalonly'} eq '1') { - $domlocalon = $domlocaloff; - $domlocaloff = ' '; - } - if ($settings->{'lcavailable'} eq '0') { - $domsrchoff = $domsrchon; - $domsrchon = ' '; - } - } - $datatable=''. - ''.&mt('LON-CAPA directory search available?').''. - ' '. - ''. - ''. - ''.&mt('Other domains can search LON-CAPA domain?').''. - ' '. - ''. - ''; - $$rowtotal += 2; + $datatable .= ''; } + $datatable .= ''.&mt('Search latitude').''. + ''. + ' '. + ' '. + ''; + $$rowtotal ++; return $datatable; } sub print_contacts { - my ($position,$dom,$settings,$rowtotal) = @_; + my ($dom,$settings,$rowtotal) = @_; my $datatable; my @contacts = ('adminemail','supportemail'); - my (%checked,%to,%otheremails,%bccemails,%includestr,%includeloc,%currfield, - $maxsize,$fields,$fieldtitles,$fieldoptions,$possoptions,@mailings,%lonstatus); - if ($position eq 'top') { - if (ref($settings) eq 'HASH') { - foreach my $item (@contacts) { - if (exists($settings->{$item})) { - $to{$item} = $settings->{$item}; - } - } - } - } elsif ($position eq 'middle') { - @mailings = ('errormail','packagesmail','lonstatusmail','requestsmail', - 'updatesmail','idconflictsmail','hostipmail'); - foreach my $type (@mailings) { - $otheremails{$type} = ''; - } - } elsif ($position eq 'lower') { - if (ref($settings) eq 'HASH') { - if (ref($settings->{'lonstatus'}) eq 'HASH') { - %lonstatus = %{$settings->{'lonstatus'}}; - } - } - } else { - @mailings = ('helpdeskmail','otherdomsmail'); - foreach my $type (@mailings) { - $otheremails{$type} = ''; - } - $bccemails{'helpdeskmail'} = ''; - $bccemails{'otherdomsmail'} = ''; - $includestr{'helpdeskmail'} = ''; - $includestr{'otherdomsmail'} = ''; - ($fields,$fieldtitles,$fieldoptions,$possoptions) = &helpform_fields(); + my (%checked,%to,%otheremails,%bccemails); + my @mailings = ('errormail','packagesmail','lonstatusmail','helpdeskmail', + 'requestsmail','updatesmail','idconflictsmail'); + foreach my $type (@mailings) { + $otheremails{$type} = ''; } + $bccemails{'helpdeskmail'} = ''; if (ref($settings) eq 'HASH') { - unless (($position eq 'top') || ($position eq 'lower')) { - foreach my $type (@mailings) { - if (exists($settings->{$type})) { - if (ref($settings->{$type}) eq 'HASH') { - foreach my $item (@contacts) { - if ($settings->{$type}{$item}) { - $checked{$type}{$item} = ' checked="checked" '; - } - } - $otheremails{$type} = $settings->{$type}{'others'}; - if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { - $bccemails{$type} = $settings->{$type}{'bcc'}; - if ($settings->{$type}{'include'} ne '') { - ($includeloc{$type},$includestr{$type}) = split(/:/,$settings->{$type}{'include'},2); - $includestr{$type} = &unescape($includestr{$type}); - } - } - } - } elsif ($type eq 'lonstatusmail') { - $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; - } + foreach my $item (@contacts) { + if (exists($settings->{$item})) { + $to{$item} = $settings->{$item}; } } - if ($position eq 'bottom') { - foreach my $type (@mailings) { - $bccemails{$type} = $settings->{$type}{'bcc'}; - if ($settings->{$type}{'include'} ne '') { - ($includeloc{$type},$includestr{$type}) = split(/:/,$settings->{$type}{'include'},2); - $includestr{$type} = &unescape($includestr{$type}); - } - } - if (ref($settings->{'helpform'}) eq 'HASH') { - if (ref($fields) eq 'ARRAY') { - foreach my $field (@{$fields}) { - $currfield{$field} = $settings->{'helpform'}{$field}; + foreach my $type (@mailings) { + if (exists($settings->{$type})) { + if (ref($settings->{$type}) eq 'HASH') { + foreach my $item (@contacts) { + if ($settings->{$type}{$item}) { + $checked{$type}{$item} = ' checked="checked" '; + } } - } - if (exists($settings->{'helpform'}{'maxsize'})) { - $maxsize = $settings->{'helpform'}{'maxsize'}; - } else { - $maxsize = '1.0'; - } - } else { - if (ref($fields) eq 'ARRAY') { - foreach my $field (@{$fields}) { - $currfield{$field} = 'yes'; + $otheremails{$type} = $settings->{$type}{'others'}; + if ($type eq 'helpdeskmail') { + $bccemails{$type} = $settings->{$type}{'bcc'}; } } - $maxsize = '1.0'; + } elsif ($type eq 'lonstatusmail') { + $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; } } } else { - if ($position eq 'top') { - $to{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'}; - $to{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'}; - $checked{'errormail'}{'adminemail'} = ' checked="checked" '; - $checked{'packagesmail'}{'adminemail'} = ' checked="checked" '; - $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; - $checked{'requestsmail'}{'adminemail'} = ' checked="checked" '; - $checked{'updatesmail'}{'adminemail'} = ' checked="checked" '; - $checked{'idconflictsmail'}{'adminemail'} = ' checked="checked" '; - $checked{'hostipmail'}{'adminemail'} = ' checked="checked" '; - } elsif ($position eq 'bottom') { - $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" '; - $checked{'otherdomsmail'}{'supportemail'} = ' checked="checked" '; - if (ref($fields) eq 'ARRAY') { - foreach my $field (@{$fields}) { - $currfield{$field} = 'yes'; - } - } - $maxsize = '1.0'; - } + $to{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'}; + $to{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'}; + $checked{'errormail'}{'adminemail'} = ' checked="checked" '; + $checked{'packagesmail'}{'adminemail'} = ' checked="checked" '; + $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" '; + $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; + $checked{'requestsmail'}{'adminemail'} = ' checked="checked" '; + $checked{'updatesmail'}{'adminemail'} = ' checked="checked" '; + $checked{'idconflictsmail'}{'adminemail'} = ' checked="checked" '; } my ($titles,$short_titles) = &contact_titles(); my $rownum = 0; my $css_class; - if ($position eq 'top') { - foreach my $item (@contacts) { - $css_class = $rownum%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''.$titles->{$item}. - ''. - ''; - $rownum ++; - } - } elsif ($position eq 'bottom') { + foreach my $item (@contacts) { $css_class = $rownum%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''.&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 .= ''."\n"; + $datatable .= ''. + ''.$titles->{$item}. + ''. + ''; $rownum ++; } - unless (($position eq 'top') || ($position eq 'lower')) { - foreach my $type (@mailings) { - $css_class = $rownum%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''. - $titles->{$type}.': '. - ''; - if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { - $datatable .= '
'.&mt('E-mail recipient(s)').''; - } - $datatable .= ''; - foreach my $item (@contacts) { - $datatable .= ' '; - } - $datatable .= '
'.&mt('Others').':  '. - ''; - my %locchecked; - if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { - foreach my $loc ('s','b') { - if ($includeloc{$type} eq $loc) { - $locchecked{$loc} = ' checked="checked"'; - last; - } - } - $datatable .= '
'.&mt('Bcc:').(' 'x6). - '
'. - '
'.&mt('Optional added text').''. - &mt('Text automatically added to e-mail:').' '. - '
'. - ''.&mt('Location:').' '. - ''. - (' 'x2). - ''. - '
'; - } - $datatable .= ''."\n"; - $rownum ++; - } - } - if ($position eq 'middle') { - my %choices; - my $corelink = &core_link_msu(); - $choices{'reporterrors'} = &mt('E-mail error reports to [_1]',$corelink); - $choices{'reportupdates'} = &mt('E-mail record of completed LON-CAPA updates to [_1]', - $corelink); - $choices{'reportstatus'} = &mt('E-mail status if errors above threshold to [_1]',$corelink); - my @toggles = ('reporterrors','reportupdates','reportstatus'); - my %defaultchecked = ('reporterrors' => 'on', - 'reportupdates' => 'on', - 'reportstatus' => 'on'); - (my $reports,$rownum) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, - \%choices,$rownum); - $datatable .= $reports; - } elsif ($position eq 'lower') { - my (%current,%excluded,%weights); - my ($defaults,$names) = &Apache::loncommon::lon_status_items(); - if ($lonstatus{'threshold'} =~ /^\d+$/) { - $current{'errorthreshold'} = $lonstatus{'threshold'}; - } else { - $current{'errorthreshold'} = $defaults->{'threshold'}; - } - if ($lonstatus{'sysmail'} =~ /^\d+$/) { - $current{'errorsysmail'} = $lonstatus{'sysmail'}; - } else { - $current{'errorsysmail'} = $defaults->{'sysmail'}; - } - if (ref($lonstatus{'weights'}) eq 'HASH') { - foreach my $type ('E','W','N','U') { - if ($lonstatus{'weights'}{$type} =~ /^\d+$/) { - $weights{$type} = $lonstatus{'weights'}{$type}; - } else { - $weights{$type} = $defaults->{$type}; - } - } - } else { - foreach my $type ('E','W','N','U') { - $weights{$type} = $defaults->{$type}; - } - } - if (ref($lonstatus{'excluded'}) eq 'ARRAY') { - if (@{$lonstatus{'excluded'}} > 0) { - map {$excluded{$_} = 1; } @{$lonstatus{'excluded'}}; - } - } - foreach my $item ('errorthreshold','errorsysmail') { - $css_class = $rownum%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''. - $titles->{$item}. - ''. - ''; - $rownum ++; - } + foreach my $type (@mailings) { $css_class = $rownum%2?' class="LC_odd_row"':''; $datatable .= ''. + ''. + $titles->{$type}.': '. ''. - ''.$titles->{'errorweights'}. - ''; - foreach my $type ('E','W','N','U') { - $datatable .= ''; - } - $datatable .= '
'.$names->{$type}.'
'. - '
'; - $rownum ++; - $css_class = $rownum%2?' class="LC_odd_row"':''; - $datatable .= ''. - $titles->{'errorexcluded'}.''. - ''; - my $numinrow = 4; - my @ids = sort(values(%Apache::lonnet::serverhomeIDs)); - for (my $i=0; $i<@ids; $i++) { - my $rem = $i%($numinrow); - if ($rem == 0) { - if ($i > 0) { - $datatable .= ''; - } - $datatable .= ''; - } - my $check; - if ($excluded{$ids[$i]}) { - $check = ' checked="checked" '; - } - $datatable .= ''; - } - my $colsleft = $numinrow - @ids%($numinrow); - if ($colsleft > 1 ) { - $datatable .= ''; - } elsif ($colsleft == 1) { - $datatable .= ''; + ''; + foreach my $item (@contacts) { + $datatable .= ' '; + } + $datatable .= '
'.&mt('Others').':  '. + ''; + if ($type eq 'helpdeskmail') { + $datatable .= '
'.&mt('Bcc:').(' 'x6). + ''; } - $datatable .= '
'. - ''. - '  
'; + $datatable .= ''."\n"; $rownum ++; - } elsif ($position eq 'bottom') { - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my (@posstypes,%usertypeshash); - if (ref($types) eq 'ARRAY') { - @posstypes = @{$types}; - } - if (@posstypes) { - if (ref($usertypes) eq 'HASH') { - %usertypeshash = %{$usertypes}; - } - my @overridden; - my $numinrow = 4; - if (ref($settings) eq 'HASH') { - if (ref($settings->{'overrides'}) eq 'HASH') { - foreach my $key (sort(keys(%{$settings->{'overrides'}}))) { - if (ref($settings->{'overrides'}{$key}) eq 'HASH') { - push(@overridden,$key); - foreach my $item (@contacts) { - if ($settings->{'overrides'}{$key}{$item}) { - $checked{'override_'.$key}{$item} = ' checked="checked" '; - } - } - $otheremails{'override_'.$key} = $settings->{'overrides'}{$key}{'others'}; - $bccemails{'override_'.$key} = $settings->{'overrides'}{$key}{'bcc'}; - $includeloc{'override_'.$key} = ''; - $includestr{'override_'.$key} = ''; - if ($settings->{'overrides'}{$key}{'include'} ne '') { - ($includeloc{'override_'.$key},$includestr{'override_'.$key}) = - split(/:/,$settings->{'overrides'}{$key}{'include'},2); - $includestr{'override_'.$key} = &unescape($includestr{'override_'.$key}); - } - } - } - } - } - my $customclass = 'LC_helpdesk_override'; - my $optionsprefix = 'LC_options_helpdesk_'; - - my $onclicktypes = "toggleHelpdeskRow(this.form,'overrides','$customclass','$optionsprefix');"; - $datatable .= &insttypes_row($settings,$types,$usertypes,$dom, - $numinrow,$othertitle,'overrides', - \$rownum,$onclicktypes,$customclass); - $rownum ++; - $usertypeshash{'default'} = $othertitle; - foreach my $status (@posstypes) { - my $css_class; - if ($rownum%2) { - $css_class = 'LC_odd_row '; - } - $css_class .= $customclass; - my $rowid = $optionsprefix.$status; - my $hidden = 1; - my $currstyle = 'display:none'; - if (grep(/^\Q$status\E$/,@overridden)) { - $currstyle = 'display:table-row'; - $hidden = 0; - } - my $key = 'override_'.$status; - $datatable .= &overridden_helpdesk($checked{$key},$otheremails{$key},$bccemails{$key}, - $includeloc{$key},$includestr{$key},$status,$rowid, - $usertypeshash{$status},$css_class,$currstyle, - \@contacts,$short_titles); - unless ($hidden) { - $rownum ++; - } - } - } } + my %choices; + $choices{'reporterrors'} = &mt('E-mail error reports to [_1]', + &Apache::loncommon::modal_link('http://loncapa.org/core.html', + &mt('LON-CAPA core group - MSU'),600,500)); + $choices{'reportupdates'} = &mt('E-mail record of completed LON-CAPA updates to [_1]', + &Apache::loncommon::modal_link('http://loncapa.org/core.html', + &mt('LON-CAPA core group - MSU'),600,500)); + my @toggles = ('reporterrors','reportupdates'); + my %defaultchecked = ('reporterrors' => 'on', + 'reportupdates' => 'on'); + (my $reports,$rownum) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, + \%choices,$rownum); + $datatable .= $reports; $$rowtotal += $rownum; return $datatable; } -sub core_link_msu { - return &Apache::loncommon::modal_link('http://loncapa.org/core.html', - &mt('LON-CAPA core group - MSU'),600,500); -} - -sub overridden_helpdesk { - my ($checked,$otheremails,$bccemails,$includeloc,$includestr,$type,$rowid, - $typetitle,$css_class,$rowstyle,$contacts,$short_titles) = @_; - my $class = 'LC_left_item'; - if ($css_class) { - $css_class = ' class="'.$css_class.'"'; - } - if ($rowid) { - $rowid = ' id="'.$rowid.'"'; - } - if ($rowstyle) { - $rowstyle = ' style="'.$rowstyle.'"'; - } - my ($output,$description); - $description = &mt('Helpdesk requests from: [_1] in this domain (overrides default)',"$typetitle"); - $output = ''. - "$description\n". - ''. - '
'.&mt('E-mail recipient(s)').''. - ''; - if (ref($contacts) eq 'ARRAY') { - foreach my $item (@{$contacts}) { - my $check; - if (ref($checked) eq 'HASH') { - $check = $checked->{$item}; - } - my $title; - if (ref($short_titles) eq 'HASH') { - $title = $short_titles->{$item}; - } - $output .= ' '; - } - } - $output .= '
'.&mt('Others').':  '. - ''; - my %locchecked; - foreach my $loc ('s','b') { - if ($includeloc eq $loc) { - $locchecked{$loc} = ' checked="checked"'; - last; - } - } - $output .= '
'.&mt('Bcc:').(' 'x6). - '
'. - '
'.&mt('Optional added text').''. - &mt('Text automatically added to e-mail:').' '. - '
'. - ''.&mt('Location:').' '. - ''. - (' 'x2). - ''. - '
'. - ''."\n"; - return $output; -} - -sub contacts_javascript { - return <<"ENDSCRIPT"; - - - -ENDSCRIPT -} - sub print_helpsettings { - my ($position,$dom,$settings,$rowtotal) = @_; - my $confname = $dom.'-domainconfig'; - my $formname = 'display'; + my ($dom,$confname,$settings,$rowtotal) = @_; my ($datatable,$itemcount); - if ($position eq 'top') { - $itemcount = 1; - my (%choices,%defaultchecked,@toggles); - $choices{'submitbugs'} = &mt('Display link to: [_1]?', - &Apache::loncommon::modal_link('http://bugs.loncapa.org', - &mt('LON-CAPA bug tracker'),600,500)); - %defaultchecked = ('submitbugs' => 'on'); - @toggles = ('submitbugs'); - ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, - \%choices,$itemcount); - $$rowtotal ++; - } else { - my $css_class; - my %existing=&Apache::lonnet::dump('roles',$dom,$confname,'rolesdef_'); - my (%customroles,%ordered,%current); - if (ref($settings) eq 'HASH') { - if (ref($settings->{'adhoc'}) eq 'HASH') { - %current = %{$settings->{'adhoc'}}; - } - } - my $count = 0; - foreach my $key (sort(keys(%existing))) { - if ($key=~/^rolesdef\_(\w+)$/) { - my $rolename = $1; - my (%privs,$order); - ($privs{'system'},$privs{'domain'},$privs{'course'}) = split(/\_/,$existing{$key}); - $customroles{$rolename} = \%privs; - if (ref($current{$rolename}) eq 'HASH') { - $order = $current{$rolename}{'order'}; - } - if ($order eq '') { - $order = $count; - } - $ordered{$order} = $rolename; - $count++; - } - } - my $maxnum = scalar(keys(%ordered)); - my @roles_by_num = (); - foreach my $item (sort {$a <=> $b } (keys(%ordered))) { - push(@roles_by_num,$item); - } - my $context = 'domprefs'; - my $crstype = 'Course'; - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my @accesstypes = ('all','dh','da','none'); - my ($numstatustypes,@jsarray); - if (ref($types) eq 'ARRAY') { - if (@{$types} > 0) { - $numstatustypes = scalar(@{$types}); - push(@accesstypes,'status'); - @jsarray = ('bystatus'); - } - } - my %domhelpdesk = &Apache::lonnet::get_active_domroles($dom,['dh','da']); - if (keys(%domhelpdesk)) { - push(@accesstypes,('inc','exc')); - push(@jsarray,('notinc','notexc')); - } - my $hiddenstr = join("','",@jsarray); - my $context = 'domprefs'; - my $crstype = 'Course'; - my $prefix = 'helproles_'; - my $add_class = 'LC_hidden'; - foreach my $num (@roles_by_num) { - my $role = $ordered{$num}; - my ($desc,$access,@statuses); - if (ref($current{$role}) eq 'HASH') { - $desc = $current{$role}{'desc'}; - $access = $current{$role}{'access'}; - if (ref($current{$role}{'insttypes'}) eq 'ARRAY') { - @statuses = @{$current{$role}{'insttypes'}}; - } - } - if ($desc eq '') { - $desc = $role; - } - my $identifier = 'custhelp'.$num; - my %full=(); - my %levels= ( - course => {}, - domain => {}, - system => {}, - ); - my %levelscurrent=( - course => {}, - domain => {}, - system => {}, - ); - &Apache::lonuserutils::custom_role_privs($customroles{$role},\%full,\%levels,\%levelscurrent); - my @templateroles = &Apache::lonuserutils::custom_template_roles($context,$crstype); - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $chgstr = ' onchange="javascript:reorderHelpRoles(this.form,'."'helproles_".$num."_pos'".');"'; - $datatable .= ''.$role.'
'. - ''.(' 'x2). - ''. - ''. - '
'.&mt('Role name').''. - &mt('Name shown to users:'). - ''. - '
'. - &helpdeskroles_access($dom,$prefix,$num,$add_class,$current{$role},\@accesstypes, - $othertitle,$usertypes,$types,\%domhelpdesk). - '
'. - ''.&mt('Role privileges').&adhocbutton($prefix,$num,'privs','show').''. - &Apache::lonuserutils::custom_role_table($crstype,\%full,\%levels, - \%levelscurrent,$identifier, - 'LC_hidden',$prefix.$num.'_privs'). - '
'; - $itemcount ++; - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $newcust = 'custhelp'.$count; - my (%privs,%levelscurrent); - my %full=(); - my %levels= ( - course => {}, - domain => {}, - system => {}, - ); - &Apache::lonuserutils::custom_role_privs(\%privs,\%full,\%levels,\%levelscurrent); - my @templateroles = &Apache::lonuserutils::custom_template_roles($context,$crstype); - my $chgstr = ' onchange="javascript:reorderHelpRoles(this.form,'."'helproles_".$count."_pos'".');"'; - $datatable .= ''. - '
'.&mt('Role name').''. - ''. - &mt('Internal name:'). - ''. - ''.(' 'x4). - ''. - &mt('Name shown to users:'). - ''. - '
'. - &helpdeskroles_access($dom,$prefix,$count,'',undef,\@accesstypes,$othertitle, - $usertypes,$types,\%domhelpdesk). - '
'.&mt('Role privileges').''. - &Apache::lonuserutils::custom_role_header($context,$crstype, - \@templateroles,$newcust). - &Apache::lonuserutils::custom_role_table('Course',\%full,\%levels, - \%levelscurrent,$newcust). - '
'. - &helpsettings_javascript(\@roles_by_num,$maxnum,$hiddenstr,$formname). - ''; - $count ++; - $$rowtotal += $count; - } - return $datatable; -} + $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',); -sub adhocbutton { - my ($prefix,$num,$field,$visibility) = @_; - my %lt = &Apache::lonlocal::texthash( - show => 'Show details', - hide => 'Hide details', - ); - return ''.(' 'x10). - ''.(' 'x2).''.(' 'x2); -} - -sub helpsettings_javascript { - my ($roles_by_num,$total,$hiddenstr,$formname) = @_; - return unless(ref($roles_by_num) eq 'ARRAY'); - my %html_js_lt = &Apache::lonlocal::texthash( - show => 'Show details', - hide => 'Hide details', - ); - &html_escape(\%html_js_lt); - my $jstext = ' var helproles = Array('."'".join("','",@{$roles_by_num})."'".');'."\n"; - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - -sub helpdeskroles_access { - my ($dom,$prefix,$num,$add_class,$current,$accesstypes,$othertitle, - $usertypes,$types,$domhelpdesk) = @_; - return unless ((ref($accesstypes) eq 'ARRAY') && (ref($domhelpdesk) eq 'HASH')); - my %lt = &Apache::lonlocal::texthash( - 'rou' => 'Role usage', - 'whi' => 'Which helpdesk personnel may use this role?', - 'all' => 'All with domain helpdesk or helpdesk assistant role', - 'dh' => 'All with domain helpdesk role', - 'da' => 'All with domain helpdesk assistant role', - 'none' => 'None', - 'status' => 'Determined based on institutional status', - 'inc' => 'Include all, but exclude specific personnel', - 'exc' => 'Exclude all, but include specific personnel', - ); - my %usecheck = ( - all => ' checked="checked"', - ); - my %displaydiv = ( - status => 'none', - inc => 'none', - exc => 'none', - priv => 'block', - ); - my $output; - if (ref($current) eq 'HASH') { - if (($current->{'access'} ne '') && ($current->{'access'} ne 'all')) { - if (grep(/^\Q$current->{access}\E$/,@{$accesstypes})) { - $usecheck{$current->{access}} = $usecheck{'all'}; - delete($usecheck{'all'}); - if ($current->{access} =~ /^(status|inc|exc)$/) { - my $access = $1; - $displaydiv{$access} = 'inline'; - } elsif ($current->{access} eq 'none') { - $displaydiv{'priv'} = 'none'; - } - } - } - } - $output = '
'.$lt{'rou'}.''. - '

'.$lt{'whi'}.'

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

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

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

'; - } - $output .= '
'; - return $output; + ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, + \%choices,$itemcount); + return $datatable; } sub radiobutton_prefs { my ($settings,$toggles,$defaultchecked,$choices,$itemcount,$onclick, - $additional,$align,$firstval) = @_; + $additional) = @_; return unless ((ref($toggles) eq 'ARRAY') && (ref($defaultchecked) eq 'HASH') && (ref($choices) eq 'HASH')); @@ -5094,1183 +2799,61 @@ sub radiobutton_prefs { $datatable .= ''. ''.$choices->{$item}. - ''; - if ($align eq 'left') { - $datatable .= ''; - } else { - $datatable .= ''; - } - $datatable .= ''; - if ($firstval eq 'no') { - $datatable .= - ' '; - } else { - $datatable .= - ' '; - } - $datatable .= ''.$additional.''; + ''. + ''. + ' '. + ''.$additional. + ''. + ''; $itemcount ++; } return ($datatable,$itemcount); } -sub print_ltitools { - my ($position,$dom,$settings,$rowtotal) = @_; - my (%rules,%encrypt,%privkeys,%linkprot); - if (ref($settings) eq 'HASH') { - if ($position eq 'top') { - if (exists($settings->{'encrypt'})) { - if (ref($settings->{'encrypt'}) eq 'HASH') { - foreach my $key (keys(%{$settings->{'encrypt'}})) { - $encrypt{'toolsec_'.$key} = $settings->{'encrypt'}{$key}; - } - } - } - if (exists($settings->{'private'})) { - if (ref($settings->{'private'}) eq 'HASH') { - if (ref($settings->{'private'}) eq 'HASH') { - if (ref($settings->{'private'}{'keys'}) eq 'ARRAY') { - map { $privkeys{$_} = 1; } (@{$settings->{'private'}{'keys'}}); - } - } - } - } - } elsif ($position eq 'middle') { - if (exists($settings->{'rules'})) { - if (ref($settings->{'rules'}) eq 'HASH') { - %rules = %{$settings->{'rules'}}; - } - } - } else { - foreach my $key ('encrypt','private','rules') { - if (exists($settings->{$key})) { - delete($settings->{$key}); - } - } - } - } - my $datatable; - my $itemcount = 1; - if ($position eq 'top') { - $datatable = &secrets_form($dom,'toolsec',\%encrypt,\%privkeys,$rowtotal); - } elsif ($position eq 'middle') { - $datatable = &password_rules('toolsecrets',\$itemcount,\%rules); - $$rowtotal += $itemcount; - } else { - $datatable = &Apache::courseprefs::print_ltitools($dom,'',$settings,\$rowtotal,'','','domain'); - } - return $datatable; -} - -sub ltitools_names { - my %lt = &Apache::lonlocal::texthash( - 'title' => 'Title', - 'version' => 'Version', - 'msgtype' => 'Message Type', - 'sigmethod' => 'Signature Method', - 'url' => 'URL', - 'key' => 'Key', - 'lifetime' => 'Nonce lifetime (s)', - 'secret' => 'Secret', - 'icon' => 'Icon', - 'user' => 'User', - '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', - 'crsappend' => 'Provider URL', - ); - return %lt; -} - -sub secrets_form { - my ($dom,$context,$encrypt,$privkeys,$rowtotal) = @_; - my @ids=&Apache::lonnet::current_machine_ids(); - my %servers = &Apache::lonnet::get_servers($dom,'library'); - my $primary = &Apache::lonnet::domain($dom,'primary'); - my ($css_class,$extra,$numshown,$itemcount,$output); - $itemcount = 0; - foreach my $hostid (sort(keys(%servers))) { - my ($showextra,$divsty,$switch); - if ($hostid eq $primary) { - if ($context eq 'ltisec') { - if (($encrypt->{'ltisec_consumers'}) || ($encrypt->{'ltisec_domlinkprot'})) { - $showextra = 1; - } - if ($encrypt->{'ltisec_crslinkprot'}) { - $showextra = 1; - } - } else { - if (($encrypt->{'toolsec_crs'}) || ($encrypt->{'toolsec_dom'})) { - $showextra = 1; - } - } - unless (grep(/^\Q$hostid\E$/,@ids)) { - $switch = 1; - } - if ($showextra) { - $numshown ++; - $divsty = 'display:inline-block'; - } else { - $divsty = 'display:none'; - } - $extra .= '
'. - ''.$hostid.''; - if ($switch) { - my $switchserver = ''.&mt('Switch Server').''; - if (exists($privkeys->{$hostid})) { - $extra .= '
'. - ''. - &mt('Encryption Key').': ['.&mt('not shown').'] '.(' 'x2).'
'. - ''.&mt('Change?'). - ''. - (' 'x2). - '  '; - } else { - $extra .= ''. - &mt('Key required').' - '.&mt('submit from server ([_1]): [_2].',$hostid,$switchserver). - ''."\n"; - } - } elsif (exists($privkeys->{$hostid})) { - $extra .= '
'. - &mt('Encryption Key').': ['.&mt('not shown').'] '.(' 'x2).'
'. - ''.&mt('Change?'). - ''. - (' 'x2). - '  '; - } else { - $extra .= ''.&mt('Encryption Key').':'. - ''. - ''; - } - $extra .= '
'; - } - } - my (%choices,@toggles,%defaultchecked); - if ($context eq 'ltisec') { - %choices = &Apache::lonlocal::texthash ( - ltisec_crslinkprot => 'Encrypt stored link protection secrets defined in courses', - ltisec_domlinkprot => 'Encrypt stored link protection secrets defined in domain', - ltisec_consumers => 'Encrypt stored consumer secrets defined in domain', - ); - @toggles = qw(ltisec_crslinkprot ltisec_domlinkprot ltisec_consumers); - %defaultchecked = ( - 'ltisec_crslinkprot' => 'off', - 'ltisec_domlinkprot' => 'off', - 'ltisec_consumers' => 'off', - ); - } else { - %choices = &Apache::lonlocal::texthash ( - toolsec_crs => 'Encrypt stored external tool secrets defined in courses', - toolsec_dom => 'Encrypt stored external tool secrets defined in domain', - ); - @toggles = qw(toolsec_crs toolsec_dom); - %defaultchecked = ( - 'toolsec_crs' => 'off', - 'toolsec_dom' => 'off', - ); - } - my ($onclick,$itemcount); - $onclick = 'javascript:toggleLTIEncKey(this.form,'."'$context'".');'; - ($output,$itemcount) = &radiobutton_prefs($encrypt,\@toggles,\%defaultchecked, - \%choices,$itemcount,$onclick,'','left','no'); - - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $noprivkeysty = 'display:inline-block'; - if ($numshown) { - $noprivkeysty = 'display:none'; - } - $output .= ''.&mt('Encryption Key(s)').''. - '
'. - ''.&mt('Not in use').'
'. - $extra. - ''; - $itemcount ++; - $$rowtotal += $itemcount; - return $output; -} - -sub print_lti { - my ($position,$dom,$settings,$rowtotal) = @_; - my $itemcount = 1; - my ($datatable,$css_class); - my (%rules,%encrypt,%privkeys,%linkprot,%suggestions); - if (ref($settings) eq 'HASH') { - if ($position eq 'top') { - if (exists($settings->{'encrypt'})) { - if (ref($settings->{'encrypt'}) eq 'HASH') { - foreach my $key (keys(%{$settings->{'encrypt'}})) { - if ($key eq 'consumers') { - $encrypt{'ltisec_'.$key} = $settings->{'encrypt'}{$key}; - } else { - $encrypt{'ltisec_'.$key.'linkprot'} = $settings->{'encrypt'}{$key}; - } - } - } - } - if (exists($settings->{'private'})) { - if (ref($settings->{'private'}) eq 'HASH') { - if (ref($settings->{'private'}) eq 'HASH') { - if (ref($settings->{'private'}{'keys'}) eq 'ARRAY') { - map { $privkeys{$_} = 1; } (@{$settings->{'private'}{'keys'}}); - } - } - } - } - } elsif ($position eq 'upper') { - if (exists($settings->{'rules'})) { - if (ref($settings->{'rules'}) eq 'HASH') { - %rules = %{$settings->{'rules'}}; - } - } - } elsif ($position eq 'middle') { - if (exists($settings->{'suggested'})) { - if (ref($settings->{'suggested'}) eq 'HASH') { - %suggestions = %{$settings->{'suggested'}}; - } - } - } elsif ($position eq 'lower') { - if (exists($settings->{'linkprot'})) { - if (ref($settings->{'linkprot'}) eq 'HASH') { - %linkprot = %{$settings->{'linkprot'}}; - if ($linkprot{'lock'}) { - delete($linkprot{'lock'}); - } - } - } - } else { - foreach my $key ('encrypt','private','rules','linkprot','suggestions') { - if (exists($settings->{$key})) { - delete($settings->{$key}); - } - } - } - } - if ($position eq 'top') { - $datatable = &secrets_form($dom,'ltisec',\%encrypt,\%privkeys,$rowtotal); - } elsif ($position eq 'upper') { - $datatable = &password_rules('ltisecrets',\$itemcount,\%rules); - $$rowtotal += $itemcount; - } elsif ($position eq 'middle') { - $datatable = &linkprot_suggestions(\%suggestions,\$itemcount); - $$rowtotal += $itemcount; - } elsif ($position eq 'lower') { - $datatable .= &Apache::courseprefs::print_linkprotection($dom,'',$settings,$rowtotal,'','','domain'); - } else { - my ($switchserver,$switchmessage); - $switchserver = &check_switchserver($dom); - $switchmessage = &mt("submit from domain's primary library server: [_1].",$switchserver); - my $maxnum = 0; - my %ordered; - if (ref($settings) eq 'HASH') { - foreach my $item (keys(%{$settings})) { - if (ref($settings->{$item}) eq 'HASH') { - my $num = $settings->{$item}{'order'}; - if ($num eq '') { - $num = scalar(keys(%{$settings})); - } - $ordered{$num} = $item; - } - } - } - $maxnum = scalar(keys(%ordered)); - my %lt = <i_names(); - if (keys(%ordered)) { - my @items = sort { $a <=> $b } keys(%ordered); - for (my $i=0; $i<@items; $i++) { - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $item = $ordered{$items[$i]}; - my ($key,$secret,$usable,$lifetime,$consumer,$requser,$crsinc,$current); - if (ref($settings->{$item}) eq 'HASH') { - $key = $settings->{$item}->{'key'}; - $usable = $settings->{$item}->{'usable'}; - $lifetime = $settings->{$item}->{'lifetime'}; - $consumer = $settings->{$item}->{'consumer'}; - $requser = $settings->{$item}->{'requser'}; - $crsinc = $settings->{$item}->{'crsinc'}; - $current = $settings->{$item}; - } - my $onclickrequser = ' onclick="toggleLTI(this.form,'."'requser','$i'".');"'; - my %checkedrequser = ( - yes => ' checked="checked"', - no => '', - ); - if (!$requser) { - $checkedrequser{'no'} = $checkedrequser{'yes'}; - $checkedrequser{'yes'} = ''; - } - my $onclickcrsinc = ' onclick="toggleLTI(this.form,'."'crsinc','$i'".');"'; - my %checkedcrsinc = ( - yes => ' checked="checked"', - no => '', - ); - if (!$crsinc) { - $checkedcrsinc{'no'} = $checkedcrsinc{'yes'}; - $checkedcrsinc{'yes'} = ''; - } - my $chgstr = ' onchange="javascript:reorderLTI(this.form,'."'lti_pos_".$item."'".');"'; - $datatable .= '' - .''.(' 'x2). - ''. - ''. - '
'.&mt('Required settings').''. - ''.$lt{'consumer'}. - ': '. - (' 'x2). - ''.$lt{'version'}.': '. - (' 'x2). - ''.$lt{'lifetime'}.':

'; - if ($key ne '') { - $datatable .= ''.$lt{'key'}; - if ($switchserver) { - $datatable .= ': ['.&mt('[_1] to view/edit',$switchserver).']'; - } else { - $datatable .= ':'; - } - $datatable .= ' '.(' 'x2); - } elsif (!$switchserver) { - $datatable .= ''.$lt{'key'}.':'. - ''. - ' '.(' 'x2); - } - if ($switchserver) { - if ($usable ne '') { - $datatable .= '
'. - $lt{'secret'}.': ['.&mt('not shown').'] '.(' 'x2).'
'. - ''.&mt('Change secret?'). - ''. - (' 'x2). - ''.(' 'x2). - ''; - } elsif ($key eq '') { - $datatable .= ''.&mt('Key and Secret are required').' - '.$switchmessage.''."\n"; - } else { - $datatable .= ''.&mt('Secret required').' - '.$switchmessage.''."\n"; - } - } else { - if ($usable ne '') { - $datatable .= '
'. - $lt{'secret'}.': ['.&mt('not shown').'] '.(' 'x2).'
'. - ''.&mt('Change?'). - ''. - (' 'x2). - '  '; - } else { - $datatable .= - ''.$lt{'secret'}.':'. - ''. - ''; - } - } - $datatable .= '

'. - ''.$lt{'requser'}.':'. - ' '."\n". - ''."\n". - '

'. - ''.$lt{'crsinc'}.':'. - ' '."\n". - ''."\n". - (' 'x4). - '
'. - '
'.<i_options($i,$current,$itemcount,%lt).''; - $itemcount ++; - } - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $chgstr = ' onchange="javascript:reorderLTI(this.form,'."'lti_pos_add'".');"'; - $datatable .= ''."\n". - ''."\n". - ' '."\n". - ''.&mt('Add').''."\n". - ''. - '
'.&mt('Required settings').''. - ''.$lt{'consumer'}. - ': '."\n". - (' 'x2). - ''.$lt{'version'}.': '."\n". - (' 'x2). - ''.$lt{'lifetime'}.':

'."\n"; - if ($switchserver) { - $datatable .= ''.&mt('Key and Secret are required').' - '.$switchmessage.''."\n"; - } else { - $datatable .= ''.$lt{'key'}.': '."\n". - (' 'x2). - ''.$lt{'secret'}.':'. - ' '."\n"; - } - $datatable .= '

'. - ''.$lt{'requser'}.':'. - ' '."\n". - ''."\n". - '

'. - ''.$lt{'crsinc'}.':'. - ' '."\n". - ''."\n". - '
'.<i_options('add',undef,$itemcount,%lt). - ''."\n". - ''."\n"; - $itemcount ++; - } - $$rowtotal += $itemcount; - return $datatable; -} - -sub lti_names { - my %lt = &Apache::lonlocal::texthash( - 'version' => 'LTI Version', - 'url' => 'URL', - 'key' => 'Key', - 'lifetime' => 'Nonce lifetime (s)', - 'consumer' => 'Consumer', - 'secret' => 'Secret', - 'requser' => "User's identity sent", - 'crsinc' => "Course's identity sent", - 'email' => 'Email address', - 'sourcedid' => 'User ID', - 'other' => 'Other', - 'passback' => 'Can return grades to Consumer:', - 'roster' => 'Can retrieve roster from Consumer:', - 'topmenu' => 'Display LON-CAPA page header', - 'inlinemenu'=> 'Display LON-CAPA inline menu', - ); - return %lt; -} - -sub lti_options { - my ($num,$current,$itemcount,%lt) = @_; - my (%checked,%rolemaps,$crssecsrc,$userfield,$cidfield,$callback); - $checked{'mapuser'}{'sourcedid'} = ' checked="checked"'; - $checked{'mapcrs'}{'course_offering_sourcedid'} = ' checked="checked"'; - $checked{'storecrs'}{'Y'} = ' checked="checked"'; - $checked{'makecrs'}{'N'} = ' checked="checked"'; - $checked{'mapcrstype'} = {}; - $checked{'makeuser'} = {}; - $checked{'selfenroll'} = {}; - $checked{'crssec'} = {}; - $checked{'crssecsrc'} = {}; - $checked{'lcauth'} = {}; - $checked{'menuitem'} = {}; - if ($num eq 'add') { - $checked{'lcauth'}{'lti'} = ' checked="checked"'; - } - my $userfieldsty = 'none'; - my $crsfieldsty = 'none'; - my $crssecfieldsty = 'none'; - my $secsrcfieldsty = 'none'; - my $callbacksty = 'none'; - my $passbacksty = 'none'; - my $optionsty = 'block'; - my $crssty = 'block'; - my $lcauthparm; - my $lcauthparmstyle = 'display:none'; - my $lcauthparmtext; - my $menusty; - my $numinrow = 4; - my %menutitles = <imenu_titles(); - - if (ref($current) eq 'HASH') { - if (!$current->{'requser'}) { - $optionsty = 'none'; - $crssty = 'none'; - } elsif (!$current->{'crsinc'}) { - $crssty = 'none'; - } - if (($current->{'mapuser'} ne '') && ($current->{'mapuser'} ne 'lis_person_sourcedid')) { - $checked{'mapuser'}{'sourcedid'} = ''; - if ($current->{'mapuser'} eq 'lis_person_contact_email_primary') { - $checked{'mapuser'}{'email'} = ' checked="checked"'; - } else { - $checked{'mapuser'}{'other'} = ' checked="checked"'; - $userfield = $current->{'mapuser'}; - $userfieldsty = 'inline-block'; - } - } - if (($current->{'mapcrs'} ne '') && ($current->{'mapcrs'} ne 'course_offering_sourcedid')) { - $checked{'mapcrs'}{'course_offering_sourcedid'} = ''; - if ($current->{'mapcrs'} eq 'context_id') { - $checked{'mapcrs'}{'context_id'} = ' checked="checked"'; - } else { - $checked{'mapcrs'}{'other'} = ' checked="checked"'; - $cidfield = $current->{'mapcrs'}; - $crsfieldsty = 'inline-block'; - } - } - if (ref($current->{'mapcrstype'}) eq 'ARRAY') { - foreach my $type (@{$current->{'mapcrstype'}}) { - $checked{'mapcrstype'}{$type} = ' checked="checked"'; - } - } - if (!$current->{'storecrs'}) { - $checked{'storecrs'}{'N'} = $checked{'storecrs'}{'Y'}; - $checked{'storecrs'}{'Y'} = ''; - } - if ($current->{'makecrs'}) { - $checked{'makecrs'}{'Y'} = ' checked="checked"'; - } - if (ref($current->{'makeuser'}) eq 'ARRAY') { - foreach my $role (@{$current->{'makeuser'}}) { - $checked{'makeuser'}{$role} = ' checked="checked"'; - } - } - if ($current->{'lcauth'} =~ /^(internal|localauth|krb4|krb5|lti)$/) { - $checked{'lcauth'}{$1} = ' checked="checked"'; - unless (($current->{'lcauth'} eq 'lti') || ($current->{'lcauth'} eq 'internal')) { - $lcauthparm = $current->{'lcauthparm'}; - $lcauthparmstyle = 'display:table-row'; - if ($current->{'lcauth'} eq 'localauth') { - $lcauthparmtext = &mt('Local auth argument'); - } else { - $lcauthparmtext = &mt('Kerberos domain'); - } - } - } - if (ref($current->{'selfenroll'}) eq 'ARRAY') { - foreach my $role (@{$current->{'selfenroll'}}) { - $checked{'selfenroll'}{$role} = ' checked="checked"'; - } - } - if (ref($current->{'maproles'}) eq 'HASH') { - %rolemaps = %{$current->{'maproles'}}; - } - if ($current->{'section'} ne '') { - $checked{'crssec'}{'Y'} = ' checked="checked"'; - $crssecfieldsty = 'inline-block'; - if ($current->{'section'} eq 'course_section_sourcedid') { - $checked{'crssecsrc'}{'sourcedid'} = ' checked="checked"'; - } else { - $checked{'crssecsrc'}{'other'} = ' checked="checked"'; - $crssecsrc = $current->{'section'}; - $secsrcfieldsty = 'inline-block'; - } - } else { - $checked{'crssec'}{'N'} = ' checked="checked"'; - } - if ($current->{'callback'} ne '') { - $callback = $current->{'callback'}; - $checked{'callback'}{'Y'} = ' checked="checked"'; - $callbacksty = 'inline-block'; - } else { - $checked{'callback'}{'N'} = ' checked="checked"'; - } - if ($current->{'topmenu'}) { - $checked{'topmenu'}{'Y'} = ' checked="checked"'; - } else { - $checked{'topmenu'}{'N'} = ' checked="checked"'; - } - if ($current->{'inlinemenu'}) { - $checked{'inlinemenu'}{'Y'} = ' checked="checked"'; - } else { - $checked{'inlinemenu'}{'N'} = ' checked="checked"'; - } - if (($current->{'topmenu'}) || ($current->{'inlinemenu'})) { - $menusty = 'inline-block'; - if (ref($current->{'lcmenu'}) eq 'ARRAY') { - foreach my $item (@{$current->{'lcmenu'}}) { - if (exists($menutitles{$item})) { - $checked{'menuitem'}{$item} = ' checked="checked"'; - } - } - } - } else { - $menusty = 'none'; - } - } else { - $checked{'makecrs'}{'N'} = ' checked="checked"'; - $checked{'crssec'}{'N'} = ' checked="checked"'; - $checked{'callback'}{'N'} = ' checked="checked"'; - $checked{'topmenu'}{'N'} = ' checked="checked"'; - $checked{'inlinemenu'}{'Y'} = ' checked="checked"'; - $checked{'menuitem'}{'grades'} = ' checked="checked"'; - $menusty = 'inline-block'; - } - my @coursetypes = ('official','unofficial','community','textbook','lti'); - my %coursetypetitles = &Apache::lonlocal::texthash ( - official => 'Official', - unofficial => 'Unofficial', - community => 'Community', - textbook => 'Textbook', - lti => 'LTI Provider', - ); - my @authtypes = ('internal','krb4','krb5','localauth'); - my %shortauth = ( - internal => 'int', - krb4 => 'krb4', - krb5 => 'krb5', - localauth => 'loc' - ); - my %authnames = &authtype_names(); - my @ltiroles = qw(Learner Instructor ContentDeveloper TeachingAssistant Mentor Member Manager Administrator); - my @lticourseroles = qw(Learner Instructor TeachingAssistant Mentor); - my @courseroles = ('cc','in','ta','ep','st'); - my $onclickuser = ' onclick="toggleLTI(this.form,'."'user','$num'".');"'; - my $onclickcrs = ' onclick="toggleLTI(this.form,'."'crs','$num'".');"'; - my $onclicksec = ' onclick="toggleLTI(this.form,'."'sec','$num'".');"'; - my $onclickcallback = ' onclick="toggleLTI(this.form,'."'callback','$num'".');"'; - my $onclicksecsrc = ' onclick="toggleLTI(this.form,'."'secsrc','$num'".')"'; - my $onclicklcauth = ' onclick="toggleLTI(this.form,'."'lcauth','$num'".')"'; - my $onclickmenu = ' onclick="toggleLTI(this.form,'."'lcmenu','$num'".');"'; - my $output = '
'.&mt('Logout options').''. - '
'.&mt('Callback to logout LON-CAPA on log out from Consumer').': '. - ''.(' 'x2). - '
'. - '
'. - ''.&mt('Parameter').': '. - ''. - '
'. - '
'.&mt('Mapping users').''. - '
'.&mt('LON-CAPA username').': '; - foreach my $option ('sourcedid','email','other') { - $output .= ''. - ($option eq 'other' ? '' : (' 'x2) ); - } - $output .= '
'. - '
'. - '
'. - '
'.&mt('Roles which may create user accounts').''; - foreach my $ltirole (@ltiroles) { - $output .= '  '; - } - $output .= '
'. - '
'.&mt('New user accounts created for LTI users').''. - ''. - &modifiable_userdata_row('lti','instdata_'.$num,$current,$numinrow,$itemcount). - '
'. - ''. - ''. - ''. - ''. - '
LON-CAPA Authentication'; - foreach my $auth ('lti',@authtypes) { - my $authtext; - if ($auth eq 'lti') { - $authtext = &mt('None'); - } else { - $authtext = $authnames{$shortauth{$auth}}; - } - $output .= '  '; - } - $output .= '
'. - ''.$lcauthparmtext.''. - '
'. - '
'. - &mt('LON-CAPA menu items (Course Coordinator can override)').''. - '
'.$lt{'topmenu'}.': '. - ''.(' 'x2). - '
'. - '
'. - '
'.$lt{'inlinemenu'}.': '. - ''.(' 'x2). - '
'; - $output .='
'. - '
'. - ''.&mt('Menu items').': '; - foreach my $type ('fullname','coursetitle','role','logout','grades') { - $output .= ''. - (' 'x2); - } - $output .= '
'. - '
'.&mt('Mapping courses').''. - '
'. - &mt('Unique course identifier').': '; - foreach my $option ('course_offering_sourcedid','context_id','other') { - $output .= ''. - ($option eq 'other' ? '' : (' 'x2) ); - } - $output .= '
'. - ''. - '
'. - ''.&mt('LON-CAPA course type(s)').': '; - foreach my $type (@coursetypes) { - $output .= ''. - (' 'x2); - } - $output .= '

'. - ''.&mt('Store mapping of course identifier to LON-CAPA CourseID').': '. - ''.(' 'x2). - ''. - '
'. - '
'.&mt('Mapping course roles').''; - foreach my $ltirole (@lticourseroles) { - my ($selected,$selectnone); - if ($rolemaps{$ltirole} eq '') { - $selectnone = ' selected="selected"'; - } - $output .= ''; - } - $output .= '
'.$ltirole.'
'. - '
'. - '
'.&mt('Creating courses').''. - ''.&mt('Course created (if absent) on Instructor access').': '. - ''.(' 'x2). - ''. - '
'. - '
'.&mt('Roles which may self-enroll').''; - foreach my $lticrsrole (@lticourseroles) { - $output .= '  '; - } - $output .= '
'. - '
'.&mt('Course options').''. - '
'.&mt('Assign users to sections').': '. - ''.(' 'x2). - '
'. - '
'. - ''.&mt('From').':'.(' 'x2). - '
'. - ''. - '
'; - my ($pb1p1chk,$pb1p0chk,$onclickpb); - foreach my $extra ('roster','passback') { - my $checkedon = ''; - my $checkedoff = ' checked="checked"'; - if ($extra eq 'passback') { - $pb1p1chk = ' checked="checked"'; - $pb1p0chk = ''; - $onclickpb = ' onclick="toggleLTI(this.form,'."'passback','$num'".');"'; - } else { - $onclickpb = ''; - } - if (ref($current) eq 'HASH') { - if (($current->{$extra})) { - $checkedon = $checkedoff; - $checkedoff = ''; - if ($extra eq 'passback') { - $passbacksty = 'inline-block'; - } - if ($current->{'passbackformat'} eq '1.0') { - $pb1p0chk = ' checked="checked"'; - $pb1p1chk = ''; - } - } - } - $output .= $lt{$extra}.' '. - ''.(' 'x2). - '
'; - } - $output .= '
'. - ''.&mt('Grade format'). - ''.(' 'x2). - '
'. - '
'; - $output .= '
'; -# '
'.&mt('Assigning author roles').''; -# -# $output .= '
'. -# '
'.&mt('Assigning domain roles').''; - return $output; -} - -sub ltimenu_titles { - return &Apache::lonlocal::texthash( - fullname => 'Full name', - coursetitle => 'Course title', - role => 'Role', - logout => 'Logout', - grades => 'Grades', - ); -} - -sub linkprot_suggestions { - my ($suggested,$itemcount) = @_; - my $count = 0; - my $next = 1; - my %lt = &Apache::lonlocal::texthash( - 'name' => 'Suggested Launcher', - 'info' => 'Recommendations', - ); - my ($datatable,$css_class,$dest); - if (ref($suggested) eq 'HASH') { - my @current = sort { $a <=> $b } keys(%{$suggested}); - $next += $current[-1]; - for (my $i=0; $i<@current; $i++) { - my $num = $current[$i]; - my %values; - if (ref($suggested->{$num}) eq 'HASH') { - %values = %{$suggested->{$num}}; - } else { - next; - } - $css_class = $$itemcount%2?' class="LC_odd_row"':''; - $datatable .= - ''."\n". - ''."\n". - '
'.$lt{'name'}.''."\n". - ''."\n". - '
'. - '
'.$lt{'info'}.''."\n". - ''. - '
'. - '
'."\n". - ''."\n"; - $$itemcount ++; - } - } - $css_class = $$itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''."\n". - ''."\n". - ''.&mt('Add').''."\n". - ''."\n". - '
'.$lt{'name'}.''."\n". - ''."\n". - '
'. - '
'.$lt{'info'}.''."\n". - ''. - '
'. - '
'."\n". - ''."\n"; - return $datatable; -} - sub print_coursedefaults { my ($position,$dom,$settings,$rowtotal) = @_; my ($css_class,$datatable,%checkedon,%checkedoff,%defaultchecked,@toggles); my $itemcount = 1; my %choices = &Apache::lonlocal::texthash ( + canuse_pdfforms => 'Course/Community users can create/upload PDF forms', uploadquota => 'Default quota for files uploaded directly to course/community using Course Editor (MB)', - coursequota => 'Default cumulative quota for all group portfolio spaces in course (MB)', anonsurvey_threshold => 'Responder count needed before showing submissions for anonymous surveys', coursecredits => 'Credits can be specified for courses', - uselcmath => 'Math preview uses LON-CAPA previewer (javascript) in place of DragMath (Java)', - usejsme => 'Molecule editor uses JSME (HTML5) in place of JME (Java)', - inline_chem => 'Use inline previewer for chemical reaction response in place of pop-up', - texengine => 'Default method to display mathematics', - postsubmit => 'Disable submit button/keypress following student submission', - canclone => "People who may clone a course (besides course's owner and coordinators)", - mysqltables => 'Lifetime (s) of "Temporary" MySQL tables (student performance data) on homeserver', - ltiauth => 'Student username in LTI launch of deep-linked URL can be accepted without re-authentication', - domexttool => 'External Tools defined in the domain may be used in courses/communities (by type)', - exttool => 'External Tools can be defined and configured in courses/communities (by type)', - crseditors => 'Available editors for web pages and/or problems created in a course/community', ); my %staticdefaults = ( anonsurvey_threshold => 10, uploadquota => 500, - coursequota => 20, - postsubmit => 60, - mysqltables => 172800, - domexttool => 1, - exttool => 0, - crseditors => ['edit','xml'], ); if ($position eq 'top') { - %defaultchecked = ( - 'uselcmath' => 'on', - 'usejsme' => 'on', - 'inline_chem' => 'on', - 'canclone' => 'none', - ); - @toggles = ('uselcmath','usejsme','inline_chem'); - my $deftex = $Apache::lonnet::deftex; - if (ref($settings) eq 'HASH') { - if ($settings->{'texengine'}) { - if ($settings->{'texengine'} =~ /^(MathJax|mimetex|tth)$/) { - $deftex = $settings->{'texengine'}; - } - } - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $mathdisp = ''. - ''.$choices{'texengine'}. - ''. - ''."\n"; - $itemcount ++; + %defaultchecked = ('canuse_pdfforms' => 'off'); + @toggles = ('canuse_pdfforms'); ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, - \%choices,$itemcount); - $datatable = $mathdisp.$datatable; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= - ''. - ''.$choices{'canclone'}. - ''; - my $currcanclone = 'none'; - my $onclick; - my @cloneoptions = ('none','domain'); - my %clonetitles = &Apache::lonlocal::texthash ( - none => 'No additional course requesters', - domain => "Any course requester in course's domain", - instcode => 'Course requests for official courses ...', - ); - my (%codedefaults,@code_order,@posscodes); - if (&Apache::lonnet::auto_instcode_defaults($dom,\%codedefaults, - \@code_order) eq 'ok') { - if (@code_order > 0) { - push(@cloneoptions,'instcode'); - $onclick = ' onclick="toggleDisplay(this.form,'."'cloneinstcode'".');"'; - } - } - if (ref($settings) eq 'HASH') { - if ($settings->{'canclone'}) { - if (ref($settings->{'canclone'}) eq 'HASH') { - if (ref($settings->{'canclone'}{'instcode'}) eq 'ARRAY') { - if (@code_order > 0) { - $currcanclone = 'instcode'; - @posscodes = @{$settings->{'canclone'}{'instcode'}}; - } - } - } elsif ($settings->{'canclone'} eq 'domain') { - $currcanclone = $settings->{'canclone'}; - } - } - } - foreach my $option (@cloneoptions) { - my ($checked,$additional); - if ($currcanclone eq $option) { - $checked = ' checked="checked"'; - } - if ($option eq 'instcode') { - if (@code_order) { - my $show = 'none'; - if ($checked) { - $show = 'block'; - } - $additional = '
'. - &mt('Institutional codes for new and cloned course have identical:'). - '
'; - foreach my $item (@code_order) { - my $codechk; - if ($checked) { - if (grep(/^\Q$item\E$/,@posscodes)) { - $codechk = ' checked="checked"'; - } - } - $additional .= ''; - } - $additional .= (' 'x2).'('.&mt('check as many as needed').')
'; - } - } - $datatable .= - ' '.$additional.'
'; - } - $datatable .= ''. - ''; - $itemcount ++; + \%choices,$itemcount); } else { $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - my ($currdefresponder,%defcredits,%curruploadquota,%currcoursequota, - %deftimeout,%currmysql); + my ($currdefresponder,$def_official_credits,$def_unofficial_credits,$def_textbook_credits, + %curruploadquota); my $currusecredits = 0; - my $postsubmitclient = 1; - my $ltiauth = 0; - my %domexttool; - my %exttool; - my %crseditors; my @types = ('official','unofficial','community','textbook'); if (ref($settings) eq 'HASH') { - if ($settings->{'ltiauth'}) { - $ltiauth = 1; - } - if (ref($settings->{'domexttool'}) eq 'HASH') { - foreach my $type (@types) { - if ($settings->{'domexttool'}->{$type}) { - $domexttool{$type} = ' checked="checked"'; - } - } - } else { - foreach my $type (@types) { - if ($staticdefaults{'domexttool'}) { - $domexttool{$type} = ' checked="checked"'; - } - } - } - if (ref($settings->{'exttool'}) eq 'HASH') { - foreach my $type (@types) { - if ($settings->{'exttool'}->{$type}) { - $exttool{$type} = ' checked="checked"'; - } - } - } - if (ref($settings->{'crseditors'}) eq 'ARRAY') { - foreach my $editor (@{$settings->{'crseditors'}}) { - $crseditors{$editor} = ' checked="checked"'; - } - } else { - foreach my $editor (@{$staticdefaults{'crseditors'}}) { - $crseditors{$editor} = ' checked="checked"'; - } - } $currdefresponder = $settings->{'anonsurvey_threshold'}; if (ref($settings->{'uploadquota'}) eq 'HASH') { foreach my $type (keys(%{$settings->{'uploadquota'}})) { $curruploadquota{$type} = $settings->{'uploadquota'}{$type}; } } - if (ref($settings->{'coursequota'}) eq 'HASH') { - foreach my $type (keys(%{$settings->{'coursequota'}})) { - $currcoursequota{$type} = $settings->{'coursequota'}{$type}; - } - } if (ref($settings->{'coursecredits'}) eq 'HASH') { - foreach my $type (@types) { - next if ($type eq 'community'); - $defcredits{$type} = $settings->{'coursecredits'}->{$type}; - if ($defcredits{$type} ne '') { - $currusecredits = 1; - } - } - } - if (ref($settings->{'postsubmit'}) eq 'HASH') { - if ($settings->{'postsubmit'}->{'client'} eq 'off') { - $postsubmitclient = 0; - foreach my $type (@types) { - $deftimeout{$type} = $staticdefaults{'postsubmit'}; - } - } else { - foreach my $type (@types) { - if (ref($settings->{'postsubmit'}->{'timeout'}) eq 'HASH') { - if ($settings->{'postsubmit'}->{'timeout'}->{$type} =~ /^\d+$/) { - $deftimeout{$type} = $settings->{'postsubmit'}->{'timeout'}->{$type}; - } else { - $deftimeout{$type} = $staticdefaults{'postsubmit'}; - } - } else { - $deftimeout{$type} = $staticdefaults{'postsubmit'}; - } - } - } - } else { - foreach my $type (@types) { - $deftimeout{$type} = $staticdefaults{'postsubmit'}; - } - } - if (ref($settings->{'mysqltables'}) eq 'HASH') { - foreach my $type (keys(%{$settings->{'mysqltables'}})) { - $currmysql{$type} = $settings->{'mysqltables'}{$type}; - } - } else { - foreach my $type (@types) { - $currmysql{$type} = $staticdefaults{'mysqltables'}; - } - } - } else { - foreach my $type (@types) { - $deftimeout{$type} = $staticdefaults{'postsubmit'}; - if ($staticdefaults{'domexttool'}) { - $domexttool{$type} = ' checked="checked"'; + $def_official_credits = $settings->{'coursecredits'}->{'official'}; + $def_unofficial_credits = $settings->{'coursecredits'}->{'unofficial'}; + $def_textbook_credits = $settings->{'coursecredits'}->{'textbook'}; + if (($def_official_credits ne '') || ($def_unofficial_credits ne '') || + ($def_textbook_credits ne '')) { + $currusecredits = 1; } } - foreach my $editor (@{$staticdefaults{'crseditors'}}) { - $crseditors{$editor} = ' checked="checked"'; - } } if (!$currdefresponder) { $currdefresponder = $staticdefaults{'anonsurvey_threshold'}; @@ -6281,9 +2864,6 @@ sub print_coursedefaults { if ($curruploadquota{$type} eq '') { $curruploadquota{$type} = $staticdefaults{'uploadquota'}; } - if ($currcoursequota{$type} eq '') { - $currcoursequota{$type} = $staticdefaults{'coursequota'}; - } } $datatable .= ''. @@ -6307,33 +2887,27 @@ sub print_coursedefaults { } $datatable .= ''."\n"; $itemcount ++; - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''. - $choices{'coursequota'}. - ''. - ''. - ''; - foreach my $type (@types) { - $datatable .= ''; - } - $datatable .= '
'.&mt($type).'
'. - '
'."\n"; - $itemcount ++; my $onclick = "toggleDisplay(this.form,'credits');"; my $display = 'none'; if ($currusecredits) { $display = 'block'; } my $additional = '
'. - ''.&mt('Default credits').'
'; - foreach my $type (@types) { - next if ($type eq 'community'); - $additional .= ''; - } - $additional .= '
'.&mt($type).'
'. - '
'."\n"; + ''. + &mt('Default credits for official courses [_1]', + ''). + '
'. + ''. + &mt('Default credits for unofficial courses [_1]', + ''). + '
'. + ''. + &mt('Default credits for textbook courses [_1]', + ''). + ''."\n"; %defaultchecked = ('coursecredits' => 'off'); @toggles = ('coursecredits'); my $current = { @@ -6341,333 +2915,14 @@ sub print_coursedefaults { }; (my $table,$itemcount) = &radiobutton_prefs($current,\@toggles,\%defaultchecked, - \%choices,$itemcount,$onclick,$additional,'left'); + \%choices,$itemcount,$onclick,$additional); $datatable .= $table; - $onclick = "toggleDisplay(this.form,'studentsubmission');"; - my $display = 'none'; - if ($postsubmitclient) { - $display = 'block'; - } - $additional = '
'. - &mt('Number of seconds submit is disabled').'
'. - ''.&mt('Enter 0 to remain disabled until page reload.').'
'. - ''; - foreach my $type (@types) { - $additional .= ''; - } - $additional .= '
'.&mt($type).'
'. - '
'."\n"; - %defaultchecked = ('postsubmit' => 'on'); - @toggles = ('postsubmit'); - $current = { - 'postsubmit' => $postsubmitclient, - }; - ($table,$itemcount) = - &radiobutton_prefs($current,\@toggles,\%defaultchecked, - \%choices,$itemcount,$onclick,$additional,'left'); - $datatable .= $table; - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''. - $choices{'mysqltables'}. - ''. - ''. - ''; - foreach my $type (@types) { - $datatable .= ''; - } - $datatable .= '
'.&mt($type).'
'. - '
'."\n"; - $itemcount ++; - %defaultchecked = ('ltiauth' => 'off'); - @toggles = ('ltiauth'); - $current = { - 'ltiauth' => $ltiauth, - }; - ($table,$itemcount) = - &radiobutton_prefs($current,\@toggles,\%defaultchecked, - \%choices,$itemcount,undef,undef,'left'); - $datatable .= $table; - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''. - $choices{'domexttool'}. - ''. - ''. - ''; - foreach my $type (@types) { - $datatable .= ''."\n"; - } - $datatable .= '
'. - ''. - '
'."\n"; - $itemcount ++; - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''. - $choices{'exttool'}. - ''. - ''. - ''; - foreach my $type (@types) { - $datatable .= ''."\n"; - } - $datatable .= '
'. - ''. - '
'."\n"; - $itemcount ++; - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''. - $choices{'crseditors'}. - ''. - ''. - ''; - my @editors = ('edit','xml','daxe'); - my %editornames = &crseditor_titles(); - foreach my $editor (@editors) { - $datatable .= ''."\n"; - } - $datatable .= '
'. - ''. - '
'."\n"; - } - $$rowtotal += $itemcount; - return $datatable; -} - -sub crseditor_titles { - return &Apache::lonlocal::texthash( - edit => 'Standard editor (Edit)', - xml => 'Text editor (EditXML)', - daxe => 'Daxe editor (Daxe)', - ); -} - -sub print_authordefaults { - my ($position,$dom,$settings,$rowtotal) = @_; - my ($css_class,$datatable,%checkedon,%checkedoff); - my $itemcount = 1; - my %titles = &authordefaults_titles(); - if ($position eq 'top') { - my %defaultchecked = ( - 'nocodemirror' => 'off', - 'daxecollapse' => 'off', - 'domcoordacc' => 'on', - ); - my @toggles = ('nocodemirror','daxecollapse','domcoordacc'); - ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, - \%titles,$itemcount); - my %staticdefaults = ( - 'copyright' => 'default', - 'sourceavail' => 'closed', - ); - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my %currrights; - foreach my $item ('copyright','sourceavail') { - $currrights{$item} = $staticdefaults{$item}; - if (ref($settings) eq 'HASH') { - if (exists($settings->{$item})) { - $currrights{$item} = $settings->{$item}; - } - } - } - $datatable .= ''. - ''.$titles{'copyright'}. - ''. - &selectbox('copyright',$currrights{'copyright'},'', - \&Apache::loncommon::copyrightdescription, - (grep !/^priv|custom$/,(&Apache::loncommon::copyrightids))). - ''."\n"; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''.$titles{'sourceavail'}. - ''. - &selectbox('sourceavail',$currrights{'sourceavail'},'', - \&Apache::loncommon::source_copyrightdescription, - (&Apache::loncommon::source_copyrightids)). - ''."\n"; - } else { - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - my $curreditors; - my %staticdefaults = ( - editors => ['edit','xml'], - authorquota => 500, - webdav => 0, - ); - my $curreditors = $staticdefaults{'editors'}; - if ((ref($settings) eq 'HASH') && - (ref($settings->{'editors'}) eq 'ARRAY')) { - $curreditors = $settings->{'editors'}; - } else { - $curreditors = $staticdefaults{'editors'}; - } - my @editors = ('edit','xml','daxe'); - $datatable = ''."\n". - ''.$titles{'editors'}.''."\n". - ''."\n". - ''; - foreach my $editor (@editors) { - my $checked; - if (grep(/^\Q$editor\E$/,@{$curreditors})) { - $checked = ' checked="checked"'; - } - $datatable .= ' '; - } - $datatable .= ''."\n".''."\n".''."\n"; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my @insttypes; - if (ref($types) eq 'ARRAY') { - @insttypes = @{$types}; - } - my $typecount = 0; - my %domconf = &Apache::lonnet::get_dom('configuration',['quotas'],$dom); - my @items = ('webdav','authorquota'); - my %quotas; - if (ref($domconf{'quotas'}) eq 'HASH') { - %quotas = %{$domconf{'quotas'}}; - foreach my $item (@items) { - if (ref($quotas{$item}) eq 'HASH') { - foreach my $type (@insttypes,'default') { - if ($item eq 'authorquota') { - if ($quotas{$item}{$type} !~ /^\d+$/) { - $quotas{$item}{$type} = $staticdefaults{$item}; - } - } elsif ($item eq 'webdav') { - if ($quotas{$item}{$type} !~ /^(0|1)$/) { - $quotas{$item}{$type} = $staticdefaults{$item}; - } - } - } - } else { - foreach my $type (@insttypes,'default') { - $quotas{$item}{$type} = $staticdefaults{$item}; - } - } - } - } else { - foreach my $item (@items) { - foreach my $type (@insttypes,'default') { - $quotas{$item}{$type} = $staticdefaults{$item}; - } - } - } - if (ref($usertypes) eq 'HASH') { - my $numinrow = 4; - my $onclick = ''; - $datatable .= &insttypes_row(\%quotas,$types,$usertypes,$dom, - $numinrow,$othertitle,'authorquota', - \$itemcount,$onclick); - $itemcount ++; - $datatable .= &insttypes_row(\%quotas,$types,$usertypes,$dom, - $numinrow,$othertitle,'webdav', - \$itemcount); - $itemcount ++; - } - my $checkedno = ' checked="checked"'; - my ($checkedon,$checkedoff); - if (ref($quotas{'webdav'}) eq 'HASH') { - if ($quotas{'webdav'}{'_LC_adv'} =~ /^0|1$/) { - if ($quotas{'webdav'}{'_LC_adv'}) { - $checkedon = $checkedno; - } else { - $checkedoff = $checkedno; - } - undef($checkedno); - } - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''.$titles{'webdav_LC_adv'}.'
'. - $titles{'webdav_LC_adv_over'}. - ''. - ''; - foreach my $option ('none','off','on') { - my ($text,$val,$checked); - if ($option eq 'none') { - $text = $titles{'none'}; - $val = ''; - $checked = $checkedno; - } elsif ($option eq 'off') { - $text = $titles{'overoff'}; - $val = 0; - $checked = $checkedoff; - } elsif ($option eq 'on') { - $text = $titles{'overon'}; - $val = 1; - $checked = $checkedon; - } - $datatable .= '  '; - } - $datatable .= ''; - $itemcount ++; - my %defchecked = ( - 'archive' => 'off', - ); - my @toggles = ('archive'); - (my $archive,$itemcount) = &radiobutton_prefs($settings,['archive'], - {'archive' => 'off'}, - \%titles,$itemcount); - $datatable .= $archive."\n"; $itemcount ++; } $$rowtotal += $itemcount; return $datatable; } -sub authordefaults_titles { - return &Apache::lonlocal::texthash( - copyright => 'Copyright/Distribution', - sourceavail => ' Source Available', - editors => 'Available Editors', - webdav => 'WebDAV', - authorquota => 'Authoring Space quotas (MB)', - nocodemirror => 'Deactivate CodeMirror for EditXML editor', - daxecollapse => 'Daxe editor: LON-CAPA standard menus start collapsed', - domcoordacc => 'Dom. Coords. can enter Authoring Spaces in domain', - edit => 'Standard editor (Edit)', - xml => 'Text editor (EditXML)', - daxe => 'Daxe editor (Daxe)', - webdav_LC_adv => 'WebDAV access for LON-CAPA "advanced" users', - webdav_LC_adv_over => '(overrides access based on affiliation, if set)', - none => 'No override set', - overon => 'Override -- webDAV on', - overoff => 'Override -- webDAV off', - archive => 'Authors can download tar.gz file of Authoring Space', - ); -} - -sub selectbox { - my ($name,$value,$readonly,$functionref,@idlist)=@_; - my $selout = ''; - return $selout; -} - sub print_selfenrollment { my ($position,$dom,$settings,$rowtotal) = @_; my ($css_class,$datatable); @@ -6856,7 +3111,7 @@ sub print_validation_rows { '
'; } } elsif ($item eq 'markup') { - $datatable .= ''; } @@ -6878,7 +3133,7 @@ sub print_validation_rows { my ($numdc,$dctable,$rows) = &active_dc_picker($dom,$numinrow,'radio', 'validationdc',%currhash); my $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''; + $datatable .= ''; if ($numdc > 1) { $datatable .= &mt('Course creation processed as: (choose Dom. Coord.)'); } else { @@ -6893,770 +3148,6 @@ sub print_validation_rows { return $datatable; } -sub print_passwords { - my ($position,$dom,$confname,$settings,$rowtotal) = @_; - my ($datatable,$css_class); - my $itemcount = 0; - my %titles = &Apache::lonlocal::texthash ( - captcha => '"Forgot Password" CAPTCHA validation', - link => 'Reset link expiration (hours)', - case => 'Case-sensitive usernames/e-mail', - prelink => 'Information required (form 1)', - postlink => 'Information required (form 2)', - emailsrc => 'LON-CAPA e-mail address type(s)', - customtext => 'Domain specific text (HTML)', - intauth_cost => 'Encryption cost for bcrypt (positive integer)', - intauth_check => 'Check bcrypt cost if authenticated', - intauth_switch => 'Existing crypt-based switched to bcrypt on authentication', - permanent => 'Permanent e-mail address', - critical => 'Critical notification address', - notify => 'Notification address', - min => 'Minimum password length', - max => 'Maximum password length', - chars => 'Required characters', - numsaved => 'Number of previous passwords to save and disallow reuse', - ); - if ($position eq 'top') { - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my $shownlinklife = 2; - my $prelink = 'both'; - my (%casesens,%postlink,%emailsrc,$nostdtext,$customurl); - if (ref($settings) eq 'HASH') { - if ($settings->{resetlink} =~ /^\d+(|\.\d*)$/) { - $shownlinklife = $settings->{resetlink}; - } - if (ref($settings->{resetcase}) eq 'ARRAY') { - map { $casesens{$_} = 1; } (@{$settings->{resetcase}}); - } - if ($settings->{resetprelink} =~ /^(both|either)$/) { - $prelink = $settings->{resetprelink}; - } - if (ref($settings->{resetpostlink}) eq 'HASH') { - %postlink = %{$settings->{resetpostlink}}; - } - if (ref($settings->{resetemail}) eq 'ARRAY') { - map { $emailsrc{$_} = 1; } (@{$settings->{resetemail}}); - } - if ($settings->{resetremove}) { - $nostdtext = 1; - } - if ($settings->{resetcustom}) { - $customurl = $settings->{resetcustom}; - } - } else { - if (ref($types) eq 'ARRAY') { - foreach my $item (@{$types}) { - $casesens{$item} = 1; - $postlink{$item} = ['username','email']; - } - } - $casesens{'default'} = 1; - $postlink{'default'} = ['username','email']; - $prelink = 'both'; - %emailsrc = ( - permanent => 1, - critical => 1, - notify => 1, - ); - } - $datatable = &captcha_choice('passwords',$settings,$$rowtotal); - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'link'}.''. - ''. - ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'case'}.''. - ''; - if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) { - foreach my $item (@{$types}) { - my $checkedcase; - if ($casesens{$item}) { - $checkedcase = ' checked="checked"'; - } - $datatable .= ''. - '   '; - } - } - my $checkedcase; - if ($casesens{'default'}) { - $checkedcase = ' checked="checked"'; - } - $datatable .= ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my %checkedpre = ( - both => ' checked="checked"', - either => '', - ); - if ($prelink eq 'either') { - $checkedpre{either} = ' checked="checked"'; - $checkedpre{both} = ''; - } - $datatable .= ''.$titles{'prelink'}.''. - ''. - '   '. - ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'postlink'}.''. - ''; - my %postlinked; - if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) { - foreach my $item (@{$types}) { - undef(%postlinked); - $datatable .= '
'. - ''.$usertypes->{$item}.''; - if (ref($postlink{$item}) eq 'ARRAY') { - map { $postlinked{$_} = 1; } (@{$postlink{$item}}); - } - foreach my $field ('email','username') { - my $checked; - if ($postlinked{$field}) { - $checked = ' checked="checked"'; - } - $datatable .= ''. - '   '; - } - $datatable .= '
'; - } - } - if (ref($postlink{'default'}) eq 'ARRAY') { - map { $postlinked{$_} = 1; } (@{$postlink{'default'}}); - } - $datatable .= '
'. - ''.$othertitle.''; - foreach my $field ('email','username') { - my $checked; - if ($postlinked{$field}) { - $checked = ' checked="checked"'; - } - $datatable .= ''. - '   '; - } - $datatable .= '
'; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'emailsrc'}.''. - ''; - foreach my $type ('permanent','critical','notify') { - my $checkedemail; - if ($emailsrc{$type}) { - $checkedemail = ' checked="checked"'; - } - $datatable .= ''. - '   '; - } - $datatable .= ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $switchserver = &check_switchserver($dom,$confname); - my ($showstd,$noshowstd); - if ($nostdtext) { - $noshowstd = ' checked="checked"'; - } else { - $showstd = ' checked="checked"'; - } - $datatable .= ''.$titles{'customtext'}.''. - ''. - &mt('Retain standard text:'). - ''.' '. - '
'. - ''. - &mt('(If you use the same account ... reset a password from this page.)').'

'. - &mt('Include custom text:'); - if ($customurl) { - my $link = &Apache::loncommon::modal_link($customurl,&mt('custom text'),600,500, - undef,undef,undef,undef,'background-color:#ffffff'); - $datatable .= ' '.$link. - ''. - '  '.&mt('Replace:').''; - } - if ($switchserver) { - $datatable .= ' '.&mt('Upload to library server: [_1]',$switchserver).''; - } else { - $datatable .=' '. - ''; - } - $datatable .= ''; - } elsif ($position eq 'middle') { - my %domconf = &Apache::lonnet::get_dom('configuration',['defaults'],$dom); - my @items = ('intauth_cost','intauth_check','intauth_switch'); - my %defaults; - if (ref($domconf{'defaults'}) eq 'HASH') { - %defaults = %{$domconf{'defaults'}}; - if ($defaults{'intauth_cost'} !~ /^\d+$/) { - $defaults{'intauth_cost'} = 10; - } - if ($defaults{'intauth_check'} !~ /^(0|1|2)$/) { - $defaults{'intauth_check'} = 0; - } - if ($defaults{'intauth_switch'} !~ /^(0|1|2)$/) { - $defaults{'intauth_switch'} = 0; - } - } else { - %defaults = ( - 'intauth_cost' => 10, - 'intauth_check' => 0, - 'intauth_switch' => 0, - ); - } - foreach my $item (@items) { - if ($itemcount%2) { - $css_class = ''; - } else { - $css_class = ' class="LC_odd_row" '; - } - $datatable .= ''. - ''.$titles{$item}. - ''; - if ($item eq 'intauth_switch') { - my @options = (0,1,2); - my %optiondesc = &Apache::lonlocal::texthash ( - 0 => 'No', - 1 => 'Yes', - 2 => 'Yes, and copy existing passwd file to passwd.bak file', - ); - $datatable .= ''; - foreach my $option (@options) { - my $checked = ' '; - if ($defaults{$item} eq $option) { - $checked = ' checked="checked"'; - } - $datatable .= ''; - } - $datatable .= '
'. - '
'; - } elsif ($item eq 'intauth_check') { - my @options = (0,1,2); - my %optiondesc = &Apache::lonlocal::texthash ( - 0 => 'No', - 1 => 'Yes, allow login then update passwd file using default cost (if higher)', - 2 => 'Yes, disallow login if stored cost is less than domain default', - ); - $datatable .= ''; - foreach my $option (@options) { - my $checked = ' '; - my $onclick; - if ($defaults{$item} eq $option) { - $checked = ' checked="checked"'; - } - if ($option == 2) { - $onclick = ' onclick="javascript:warnIntAuth(this);"'; - } - $datatable .= ''; - } - $datatable .= '
'. - '
'; - } else { - $datatable .= ''; - } - $datatable .= ''; - $itemcount ++; - } - } elsif ($position eq 'lower') { - $datatable .= &password_rules('passwords',\$itemcount,$settings); - } else { - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my %ownerchg = ( - by => {}, - for => {}, - ); - my %ownertitles = &Apache::lonlocal::texthash ( - by => 'Course owner status(es) allowed', - for => 'Student status(es) allowed', - ); - if (ref($settings) eq 'HASH') { - if (ref($settings->{crsownerchg}) eq 'HASH') { - if (ref($settings->{crsownerchg}{'by'}) eq 'ARRAY') { - map { $ownerchg{by}{$_} = 1; } (@{$settings->{crsownerchg}{'by'}}); - } - if (ref($settings->{crsownerchg}{'for'}) eq 'ARRAY') { - map { $ownerchg{for}{$_} = 1; } (@{$settings->{crsownerchg}{'for'}}); - } - } - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''. - &mt('Requirements').'
    '. - '
  • '.&mt("Course 'type' is not a Community").'
  • '. - '
  • '.&mt('User is Course Coordinator and also course owner').'
  • '. - '
  • '.&mt("Student's only active roles are student role(s) in course(s) owned by this user").'
  • '. - '
  • '.&mt('User, course, and student share same domain').'
  • '. - '
'. - ''. - ''; - foreach my $item ('by','for') { - $datatable .= '
'. - ''.$ownertitles{$item}.''; - if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) { - foreach my $type (@{$types}) { - my $checked; - if ($ownerchg{$item}{$type}) { - $checked = ' checked="checked"'; - } - $datatable .= ''. - '   '; - } - } - my $checked; - if ($ownerchg{$item}{'default'}) { - $checked = ' checked="checked"'; - } - $datatable .= '
'; - } - $datatable .= ''; - } - return $datatable; -} - -sub password_rules { - my ($prefix,$itemcountref,$settings) = @_; - my ($min,$max,%chars,$numsaved,$numinrow); - my %titles; - if ($prefix eq 'passwords') { - %titles = &Apache::lonlocal::texthash ( - min => 'Minimum password length', - max => 'Maximum password length', - chars => 'Required characters', - ); - } elsif (($prefix eq 'ltisecrets') || ($prefix eq 'toolsecrets')) { - %titles = &Apache::lonlocal::texthash ( - min => 'Minimum secret length', - max => 'Maximum secret length', - chars => 'Required characters', - ); - } - $min = $Apache::lonnet::passwdmin; - my $datatable; - my $itemcount; - if (ref($itemcountref)) { - $itemcount = $$itemcountref; - } - if (ref($settings) eq 'HASH') { - if ($settings->{min}) { - $min = $settings->{min}; - } - if ($settings->{max}) { - $max = $settings->{max}; - } - if (ref($settings->{chars}) eq 'ARRAY') { - map { $chars{$_} = 1; } (@{$settings->{chars}}); - } - if ($prefix eq 'passwords') { - if ($settings->{numsaved}) { - $numsaved = $settings->{numsaved}; - } - } - } - my %rulenames = &Apache::lonlocal::texthash( - uc => 'At least one upper case letter', - lc => 'At least one lower case letter', - num => 'At least one number', - spec => 'At least one non-alphanumeric', - ); - my $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'min'}.''. - ''. - ''. - ' '.&mt('(Enter an integer: 7 or larger)').''. - ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'max'}.''. - ''. - ''. - ' '.&mt('(Leave blank for no maximum)').''. - ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'chars'}.'
'. - ''.&mt('(Leave unchecked if not required)'). - ''; - my $numinrow = 2; - my @possrules = ('uc','lc','num','spec'); - $datatable .= ''; - for (my $i=0; $i<@possrules; $i++) { - my ($rem,$checked); - if ($chars{$possrules[$i]}) { - $checked = ' checked="checked"'; - } - $rem = $i%($numinrow); - if ($rem == 0) { - if ($i > 0) { - $datatable .= ''; - } - $datatable .= ''; - } - $datatable .= ''; - } - my $rem = @possrules%($numinrow); - my $colsleft = $numinrow - $rem; - if ($colsleft > 1 ) { - $datatable .= ''; - } elsif ($colsleft == 1) { - $datatable .= ''; - } - $datatable .='
'. - '  
'; - $itemcount ++; - if ($prefix eq 'passwords') { - $titles{'numsaved'} = &mt('Number of previous passwords to save and disallow reuse'); - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'numsaved'}.''. - ''. - ''. - ' '.&mt('(Leave blank to not save previous passwords)').''. - ''; - $itemcount ++; - } - if (ref($itemcountref)) { - $$itemcountref += $itemcount; - } - return $datatable; -} - -sub print_wafproxy { - my ($position,$dom,$settings,$rowtotal) = @_; - my $css_class; - my $itemcount = 0; - my $datatable; - my %servers = &Apache::lonnet::internet_dom_servers($dom); - my (%othercontrol,%otherdoms,%aliases,%saml,%values,$setdom,$showdom); - my %lt = &wafproxy_titles(); - foreach my $server (sort(keys(%servers))) { - my $serverhome = &Apache::lonnet::get_server_homeID($servers{$server}); - next if ($serverhome eq ''); - my $serverdom; - if ($serverhome ne $server) { - $serverdom = &Apache::lonnet::host_domain($serverhome); - if (($serverdom ne '') && (&Apache::lonnet::domain($serverdom) ne '')) { - $othercontrol{$server} = $serverdom; - } - } else { - $serverdom = &Apache::lonnet::host_domain($server); - next if (($serverdom eq '') || (&Apache::lonnet::domain($serverdom) eq '')); - if ($serverdom ne $dom) { - $othercontrol{$server} = $serverdom; - } else { - $setdom = 1; - if (ref($settings) eq 'HASH') { - if (ref($settings->{'alias'}) eq 'HASH') { - $aliases{$dom} = $settings->{'alias'}; - if ($aliases{$dom} ne '') { - $showdom = 1; - } - } - if (ref($settings->{'saml'}) eq 'HASH') { - $saml{$dom} = $settings->{'saml'}; - } - } - } - } - } - if ($setdom) { - %{$values{$dom}} = (); - if (ref($settings) eq 'HASH') { - foreach my $item ('remoteip','ipheader','trusted','vpnint','vpnext') { - $values{$dom}{$item} = $settings->{$item}; - } - } - } - if (keys(%othercontrol)) { - %otherdoms = reverse(%othercontrol); - foreach my $domain (keys(%otherdoms)) { - %{$values{$domain}} = (); - my %config = &Apache::lonnet::get_dom('configuration',['wafproxy'],$domain); - if (ref($config{'wafproxy'}) eq 'HASH') { - $aliases{$domain} = $config{'wafproxy'}{'alias'}; - if (exists($config{'wafproxy'}{'saml'})) { - $saml{$domain} = $config{'wafproxy'}{'saml'}; - } - foreach my $item ('remoteip','ipheader','trusted','vpnint','vpnext') { - $values{$domain}{$item} = $config{'wafproxy'}{$item}; - } - } - } - } - if ($position eq 'top') { - my %servers = &Apache::lonnet::internet_dom_servers($dom); - my %aliasinfo; - foreach my $server (sort(keys(%servers))) { - $itemcount ++; - my $dom_in_effect; - my $aliasrows = ''. - ''. - &mt('Hostname').': '. - ''. - &Apache::lonnet::hostname($server).' '; - if ($othercontrol{$server}) { - $dom_in_effect = $othercontrol{$server}; - my ($current,$forsaml); - if (ref($aliases{$dom_in_effect}) eq 'HASH') { - $current = $aliases{$dom_in_effect}{$server}; - } - if (ref($saml{$dom_in_effect}) eq 'HASH') { - if ($saml{$dom_in_effect}{$server}) { - $forsaml = 1; - } - } - $aliasrows .= ''. - &mt('Alias').': '; - if ($current) { - $aliasrows .= $current; - if ($forsaml) { - $aliasrows .= ' ('.&mt('also for SSO Auth').')'; - } - } else { - $aliasrows .= &mt('None'); - } - $aliasrows .= ' ('. - &mt('controlled by domain: [_1]', - ''.$dom_in_effect.'').')'; - } else { - $dom_in_effect = $dom; - my ($current,$samlon,$samloff); - $samloff = ' checked="checked"'; - if (ref($aliases{$dom}) eq 'HASH') { - if ($aliases{$dom}{$server}) { - $current = $aliases{$dom}{$server}; - } - } - if (ref($saml{$dom}) eq 'HASH') { - if ($saml{$dom}{$server}) { - $samlon = $samloff; - undef($samloff); - } - } - $aliasrows .= ''. - &mt('Alias').': '. - ''. - (' 'x2).''. - &mt('Alias used for SSO Auth').':  '. - ''; - } - $aliasrows .= ''; - $aliasinfo{$dom_in_effect} .= $aliasrows; - } - if ($aliasinfo{$dom}) { - my ($onclick,$wafon,$wafoff,$showtable); - $onclick = ' onclick="javascript:toggleWAF();"'; - $wafoff = ' checked="checked"'; - $showtable = ' style="display:none";'; - if ($showdom) { - $wafon = $wafoff; - $wafoff = ''; - $showtable = ' style="display:inline;"'; - } - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable = ''. - ''.&mt('Domain: [_1]',''.$dom.'').'
'. - ''.&mt('WAF in use?').' '.(' 'x2).''. - ''. - ''.$aliasinfo{$dom}. - '
'; - $itemcount++; - } - if (keys(%otherdoms)) { - foreach my $key (sort(keys(%otherdoms))) { - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''. - ''.&mt('Domain: [_1]',''.$key.'').''. - ''.$aliasinfo{$key}. - '
'; - $itemcount++; - } - } - } else { - my %ip_methods = &remoteip_methods(); - if ($setdom) { - $itemcount ++; - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - my ($nowafstyle,$wafstyle,$curr_remotip,$currwafdisplay,$vpndircheck,$vpnaliascheck, - $currwafvpn,$wafrangestyle,$alltossl,$ssltossl); - $wafstyle = ' style="display:none;"'; - $nowafstyle = ' style="display:table-row;"'; - $currwafdisplay = ' style="display: none"'; - $wafrangestyle = ' style="display: none"'; - $curr_remotip = 'n'; - $ssltossl = ' checked="checked"'; - if ($showdom) { - $wafstyle = ' style="display:table-row;"'; - $nowafstyle = ' style="display:none;"'; - if (keys(%{$values{$dom}})) { - if ($values{$dom}{remoteip} =~ /^[nmh]$/) { - $curr_remotip = $values{$dom}{remoteip}; - } - if ($curr_remotip eq 'h') { - $currwafdisplay = ' style="display:table-row"'; - $wafrangestyle = ' style="display:inline-block;"'; - } - if ($values{$dom}{'sslopt'}) { - $alltossl = ' checked="checked"'; - $ssltossl = ''; - } - } - if (($values{$dom}{'vpnint'} ne '') || ($values{$dom}{'vpnext'} ne '')) { - $vpndircheck = ' checked="checked"'; - $currwafvpn = ' style="display:table-row;"'; - $wafrangestyle = ' style="display:inline-block;"'; - } else { - $vpnaliascheck = ' checked="checked"'; - $currwafvpn = ' style="display:none;"'; - } - } - $datatable .= ''. - ''.&mt('Domain: [_1]',''.$dom.'').''. - ''.&mt('WAF not in use, nothing to set').''. - ''. - ''. - ''.&mt('Domain: [_1]',''.$dom.'').'

'. - '
'.&mt('Format for comma separated IP ranges').':
'. - &mt('A.B.C.D/N or A.B.C.D-E.F.G.H').'
'. - &mt('Range(s) stored in CIDR notation').'
'. - ''. - ''. - ''."\n". - ''."\n". - ''."\n". - ''."\n". - ''. - ''; - foreach my $item ('vpnint','vpnext') { - $datatable .= ''. - ''."\n"; - } - $datatable .= ''."\n". - ''. - ''."\n". - '
'.$lt{'remoteip'}.': '. - '
'. - $lt{'ipheader'}.': '. - ''. - '
'. - $lt{'trusted'}.':
'. - ''. - '

'.$lt{'vpnaccess'}.':
'. - ''.(' 'x2). - '
'.$lt{$item}.':
'. - ''. - '

'.$lt{'sslopt'}.':
'. - ''.(' 'x2). - '
'; - } - if (keys(%otherdoms)) { - foreach my $domain (sort(keys(%otherdoms))) { - $itemcount ++; - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''. - ''.&mt('Domain: [_1]',''.$domain.'').''. - ''; - foreach my $item ('remoteip','ipheader','trusted','vpnint','vpnext','sslopt') { - my $showval = &mt('None'); - if ($item eq 'ssl') { - $showval = $lt{'ssltossl'}; - } - if ($values{$domain}{$item}) { - $showval = $values{$domain}{$item}; - if ($item eq 'ssl') { - $showval = $lt{'alltossl'}; - } elsif ($item eq 'remoteip') { - $showval = $ip_methods{$values{$domain}{$item}}; - } - } - $datatable .= ''. - ''; - } - $datatable .= '
'.$lt{$item}.': '.$showval.'
'; - } - } - } - $$rowtotal += $itemcount; - return $datatable; -} - -sub wafproxy_titles { - return &Apache::lonlocal::texthash( - remoteip => "Method for determining user's IP", - ipheader => 'Request header containing remote IP', - trusted => 'Trusted IP range(s)', - vpnaccess => 'Access from institutional VPN', - vpndirect => 'via regular hostname (no WAF)', - vpnaliased => 'via aliased hostname (WAF)', - vpnint => 'Internal IP Range(s) for VPN sessions', - vpnext => 'IP Range(s) for backend WAF connections', - sslopt => 'Forwarding http/https', - alltossl => 'WAF forwards both http and https requests to https', - ssltossl => 'WAF forwards http requests to http and https to https', - ); -} - -sub remoteip_methods { - return &Apache::lonlocal::texthash( - m => 'Use Apache mod_remoteip', - h => 'Use headers parsed by LON-CAPA', - n => 'Not in use', - ); -} - sub print_usersessions { my ($position,$dom,$settings,$rowtotal) = @_; my ($css_class,$datatable,%checked,%choices); @@ -7671,28 +3162,15 @@ sub print_usersessions { if ($position eq 'top') { if (keys(%serverhomes) > 1) { my %spareid = ¤t_offloads_to($dom,$settings,\%servers); - my ($curroffloadnow,$curroffloadoth); - if (ref($settings) eq 'HASH') { - if (ref($settings->{'offloadnow'}) eq 'HASH') { - $curroffloadnow = $settings->{'offloadnow'}; - } - if (ref($settings->{'offloadoth'}) eq 'HASH') { - $curroffloadoth = $settings->{'offloadoth'}; - } - } - my $other_insts = scalar(keys(%by_location)); - $datatable .= &spares_row($dom,\%servers,\%spareid,\%serverhomes,\%altids, - $other_insts,$curroffloadnow,$curroffloadoth,$rowtotal); + $datatable .= &spares_row($dom,\%servers,\%spareid,\%serverhomes,\%altids,$rowtotal); } else { $datatable .= ''. - &mt('Nothing to set here, as the cluster to which this domain belongs only contains one server.'). - ''; + &mt('Nothing to set here, as the cluster to which this domain belongs only contains one server.'); } } else { if (keys(%by_location) == 0) { $datatable .= ''. - &mt('Nothing to set here, as the cluster to which this domain belongs only contains one institution.'). - ''; + &mt('Nothing to set here, as the cluster to which this domain belongs only contains one institution.'); } else { my %lt = &usersession_titles(); my $numinrow = 5; @@ -7934,8 +3412,7 @@ sub current_offloads_to { } sub spares_row { - my ($dom,$servers,$spareid,$serverhomes,$altids,$other_insts, - $curroffloadnow,$curroffloadoth,$rowtotal) = @_; + my ($dom,$servers,$spareid,$serverhomes,$altids,$rowtotal) = @_; my $css_class; my $numinrow = 4; my $itemcount = 1; @@ -7955,34 +3432,13 @@ sub spares_row { } } next unless (ref($spareid->{$server}) eq 'HASH'); - my ($checkednow,$checkedoth); - if (ref($curroffloadnow) eq 'HASH') { - if ($curroffloadnow->{$server}) { - $checkednow = ' checked="checked"'; - } - } - if (ref($curroffloadoth) eq 'HASH') { - if ($curroffloadoth->{$server}) { - $checkedoth = ' checked="checked"'; - } - } $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; $datatable .= ' '. &mt('[_1] when busy, offloads to:' - ,''.$server.'').'
'. - ''."\n". - ''. + ,''.$server.''). "\n"; - if ($other_insts) { - $datatable .= '
'. - ''."\n". - ''. - "\n"; - } my (%current,%canselect); my @choices = &possible_newspares($server,$spareid->{$server},$serverhomes,$altids); @@ -8106,13 +3562,13 @@ sub print_loadbalancing { my $numinrow = 1; my $datatable; my %servers = &Apache::lonnet::internet_dom_servers($dom); - my (%currbalancer,%currtargets,%currrules,%existing,%currcookies); + my (%currbalancer,%currtargets,%currrules,%existing); if (ref($settings) eq 'HASH') { %existing = %{$settings}; } if ((keys(%servers) > 1) || (keys(%existing) > 0)) { &get_loadbalancers_config(\%servers,\%existing,\%currbalancer, - \%currtargets,\%currrules,\%currcookies); + \%currtargets,\%currrules); } else { return; } @@ -8186,12 +3642,6 @@ sub print_loadbalancing { my ($numspares,@spares) = &count_servers($lonhost,%servers); my @sparestypes = ('primary','default'); my %typetitles = &sparestype_titles(); - my %hostherechecked = ( - no => ' checked="checked"', - ); - my %balcookiechecked = ( - no => ' checked="checked"', - ); foreach my $sparetype (@sparestypes) { my $targettable; for (my $i=0; $i<$numspares; $i++) { @@ -8211,10 +3661,9 @@ sub print_loadbalancing { $disabled = ' disabled="disabled"'; } $targettable .= - ''; + '
'; my $rem = $i%($numinrow); if ($rem == 0) { if (($i > 0) && ($i < $numspares-1)) { @@ -8237,35 +3686,8 @@ sub print_loadbalancing { $datatable .= ''.$typetitles{$sparetype}.'
'. ''.$targettable.'

'; } - $hostherechecked{$sparetype} = ''; - if (ref($currtargets{$lonhost}) eq 'HASH') { - if (ref($currtargets{$lonhost}{$sparetype}) eq 'ARRAY') { - if (grep(/^\Q$lonhost\E$/,@{$currtargets{$lonhost}{$sparetype}})) { - $hostherechecked{$sparetype} = ' checked="checked"'; - $hostherechecked{'no'} = ''; - } - } - } } - if ($currcookies{$lonhost}) { - %balcookiechecked = ( - yes => ' checked="checked"', - ); - } - $datatable .= &mt('Hosting on balancer itself').'
'. - '
'; - foreach my $sparetype (@sparestypes) { - $datatable .= '
'; - } - $datatable .= &mt('Use balancer cookie').'
'. - '
'. - '
'. - ''. + $datatable .= ''. &loadbalancing_rules($dom,$intdom,$currrules{$lonhost}, $othertitle,$usertypes,$types,\%servers, \%currbalancer,$lonhost, @@ -8279,11 +3701,10 @@ sub print_loadbalancing { } sub get_loadbalancers_config { - my ($servers,$existing,$currbalancer,$currtargets,$currrules,$currcookies) = @_; + my ($servers,$existing,$currbalancer,$currtargets,$currrules) = @_; return unless ((ref($servers) eq 'HASH') && (ref($existing) eq 'HASH') && (ref($currbalancer) eq 'HASH') && - (ref($currtargets) eq 'HASH') && (ref($currrules) eq 'HASH') && - (ref($currcookies) eq 'HASH')); + (ref($currtargets) eq 'HASH') && (ref($currrules) eq 'HASH')); if (keys(%{$existing}) > 0) { my $oldlonhost; foreach my $key (sort(keys(%{$existing}))) { @@ -8302,9 +3723,6 @@ sub get_loadbalancers_config { $currbalancer->{$key} = 1; $currtargets->{$key} = $existing->{$key}{'targets'}; $currrules->{$key} = $existing->{$key}{'rules'}; - if ($existing->{$key}{'cookie'}) { - $currcookies->{$key} = 1; - } } } } else { @@ -8335,7 +3753,7 @@ sub loadbalancing_rules { if (ref($currrules) eq 'HASH') { $current = $currrules->{$type}; } - if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) { + if (($type eq '_LC_external') || ($type eq '_LC_internetdom') || ($type eq '_LC_ipchange')) { if ($dom ne &Apache::lonnet::host_domain($lonhost)) { $current = ''; } @@ -8360,14 +3778,9 @@ sub loadbalancing_titles { '_LC_ipchange' => &mt('Non-SSO users with IP mismatch'), ); my @alltypes = ('_LC_adv','_LC_author','_LC_internetdom','_LC_external','_LC_ipchangesso','_LC_ipchange'); - my @available; if (ref($types) eq 'ARRAY') { - @available = @{$types}; + unshift(@alltypes,@{$types},'default'); } - unless (grep(/^default$/,@available)) { - push(@available,'default'); - } - unshift(@alltypes,@available); my %titles; foreach my $type (@alltypes) { if ($type =~ /^_LC_/) { @@ -8392,7 +3805,7 @@ sub loadbalance_rule_row { my @rulenames; my %ruletitles = &offloadtype_text(); if (($type eq '_LC_ipchangesso') || ($type eq '_LC_ipchange')) { - @rulenames = ('balancer','offloadedto','specific'); + @rulenames = ('balancer','offloadedto'); } else { @rulenames = ('default','homeserver'); if ($type eq '_LC_external') { @@ -8403,12 +3816,12 @@ sub loadbalance_rule_row { push(@rulenames,'none'); } my $style = $targets_div_style; - if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) { + if (($type eq '_LC_external') || ($type eq '_LC_internetdom') || ($type eq '_LC_ipchange')) { $style = $homedom_div_style; } my $space; if ($islast && $num == 1) { - $space = '
 
'; + $space = '
 
'; } my $output = ''.$space. @@ -8454,13 +3867,8 @@ sub loadbalance_rule_row { ' '; - if (($rulenames[$i] eq 'specific') && ($type =~ /^_LC_ipchange/)) { - $output .= $ruletitles{'particular'}; - } else { - $output .= $ruletitles{$rulenames[$i]}; - } - $output .= ''.$extra.'

'."\n"; + ')"'.$checked.' /> '.$ruletitles{$rulenames[$i]}. + ''.$extra.'
'."\n"; } $output .= ''."\n"; return $output; @@ -8475,7 +3883,6 @@ sub offloadtype_text { 'none' => 'No offload', 'balancer' => 'Session hosted on Load Balancer, after re-authentication', 'offloadedto' => 'Session hosted on offload server, after re-authentication', - 'particular' => 'Session hosted (after re-auth) on server:', ); return %ruletitles; } @@ -8490,21 +3897,15 @@ sub sparestype_titles { sub contact_titles { my %titles = &Apache::lonlocal::texthash ( - 'supportemail' => 'Support E-mail address', - 'adminemail' => 'Default Server Admin E-mail address', - 'errormail' => 'Error reports to be e-mailed to', - 'packagesmail' => 'Package update alerts to be e-mailed to', - 'helpdeskmail' => "Helpdesk requests from all users in this domain", - 'otherdomsmail' => 'Helpdesk requests from users in other (unconfigured) domains', - 'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)', - 'requestsmail' => 'E-mail from course requests requiring approval', - 'updatesmail' => 'E-mail from nightly check of LON-CAPA module integrity/updates', + 'supportemail' => 'Support E-mail address', + 'adminemail' => 'Default Server Admin E-mail address', + 'errormail' => 'Error reports to be e-mailed to', + 'packagesmail' => 'Package update alerts to be e-mailed to', + 'helpdeskmail' => 'Helpdesk requests to be e-mailed to', + 'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)', + 'requestsmail' => 'E-mail from course requests requiring approval', + 'updatesmail' => 'E-mail from nightly check of LON-CAPA module integrity/updates', 'idconflictsmail' => 'E-mail from bi-nightly check for multiple users sharing same student/employee ID', - 'hostipmail' => 'E-mail from nightly check of hostname/IP network changes', - 'errorthreshold' => 'Error count threshold for status e-mail to admin(s)', - 'errorsysmail' => 'Error count threshold for e-mail to developer group', - 'errorweights' => 'Weights used to compute error count', - 'errorexcluded' => 'Servers with unsent updates excluded from count', ); my %short_titles = &Apache::lonlocal::texthash ( adminemail => 'Admin E-mail address', @@ -8513,41 +3914,12 @@ 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', blog => 'Blog', + webdav => 'WebDAV', portfolio => 'Portfolio', - portaccess => 'Share portfolio files', - timezone => 'Can set time zone', official => 'Official courses (with institutional codes)', unofficial => 'Unofficial courses', community => 'Communities', @@ -8562,7 +3934,6 @@ sub courserequest_titles { unofficial => 'Unofficial', community => 'Communities', textbook => 'Textbook', - lti => 'LTI Provider', norequest => 'Not allowed', approval => 'Approval by Dom. Coord.', validate => 'With validation', @@ -8676,7 +4047,7 @@ sub print_usercreation { } } else { my @contexts = ('author','course','domain'); - my @authtypes = ('int','krb4','krb5','loc','lti'); + my @authtypes = ('int','krb4','krb5','loc'); my %checked; if (ref($settings) eq 'HASH') { if (ref($settings->{'authtypes'}) eq 'HASH') { @@ -8727,8 +4098,7 @@ sub print_usercreation { sub print_selfcreation { my ($position,$dom,$settings,$rowtotal) = @_; - my (@selfcreate,$createsettings,$processing,$emailoptions,$emailverified, - $emaildomain,$datatable); + my (@selfcreate,$createsettings,$processing,$datatable); if (ref($settings) eq 'HASH') { if (ref($settings->{'cancreate'}) eq 'HASH') { $createsettings = $settings->{'cancreate'}; @@ -8745,22 +4115,12 @@ sub print_selfcreation { if (ref($createsettings->{'selfcreateprocessing'}) eq 'HASH') { $processing = $createsettings->{'selfcreateprocessing'}; } - if (ref($createsettings->{'emailoptions'}) eq 'HASH') { - $emailoptions = $createsettings->{'emailoptions'}; - } - if (ref($createsettings->{'emailverified'}) eq 'HASH') { - $emailverified = $createsettings->{'emailverified'}; - } - if (ref($createsettings->{'emaildomain'}) eq 'HASH') { - $emaildomain = $createsettings->{'emaildomain'}; - } } } } my %radiohash; my $numinrow = 4; map { $radiohash{'cancreate_'.$_} = 1; } @selfcreate; - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); if ($position eq 'top') { my %choices = &Apache::lonlocal::texthash ( cancreate_login => 'Institutional Login', @@ -8775,12 +4135,14 @@ sub print_selfcreation { ($datatable,$itemcount) = &radiobutton_prefs(\%radiohash,\@toggles,\%defaultchecked, \%choices,$itemcount,$onclick); $$rowtotal += $itemcount; + + my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); if (ref($usertypes) eq 'HASH') { if (keys(%{$usertypes}) > 0) { $datatable .= &insttypes_row($createsettings,$types,$usertypes, $dom,$numinrow,$othertitle, - 'statustocreate',$rowtotal); + 'statustocreate',$$rowtotal); $$rowtotal ++; } } @@ -8793,7 +4155,7 @@ sub print_selfcreation { $datatable .= ''. ''.&mt('Mapping of Shibboleth environment variable names to user data fields (SSO auth)').''. ''."\n". - ''."\n"; + '
\n". - '\n"; + $$rowtotal ++; return $output; } sub captcha_choice { - my ($context,$settings,$itemcount,$customcss,$rowstyle) = @_; - my ($keyentry,$currpub,$currpriv,%checked,$rowname,$pubtext,$privtext, - $vertext,$currver); + my ($context,$settings,$itemcount) = @_; + my ($keyentry,$currpub,$currpriv,%checked,$rowname,$pubtext,$privtext); my %lt = &captcha_phrases(); $keyentry = 'hidden'; - my $colspan=2; if ($context eq 'cancreate') { $rowname = &mt('CAPTCHA validation'); } elsif ($context eq 'login') { $rowname = &mt('"Contact helpdesk" CAPTCHA validation'); - } elsif ($context eq 'passwords') { - $rowname = &mt('"Forgot Password" CAPTCHA validation'); - $colspan=1; } if (ref($settings) eq 'HASH') { if ($settings->{'captcha'}) { @@ -9260,11 +4341,6 @@ sub captcha_choice { $pubtext = $lt{'pub'}; $privtext = $lt{'priv'}; $keyentry = 'text'; - $vertext = $lt{'ver'}; - $currver = $settings->{'recaptchaversion'}; - if ($currver ne '2') { - $currver = 1; - } } if (ref($settings->{'recaptchakeys'}) eq 'HASH') { $currpub = $settings->{'recaptchakeys'}{'public'}; @@ -9273,22 +4349,9 @@ sub captcha_choice { } else { $checked{'original'} = ' checked="checked"'; } - my $css_class; - if ($itemcount%2) { - $css_class = 'LC_odd_row'; - } - if ($customcss) { - $css_class .= " $customcss"; - } - $css_class =~ s/^\s+//; - if ($css_class) { - $css_class = ' class="'.$css_class.'"'; - } - if ($rowstyle) { - $css_class .= ' style="'.$rowstyle.'"'; - } + my $css_class = $itemcount%2?' class="LC_odd_row"':''; my $output = ''. - '
'."\n"; for (my $i=0; $i<@fields; $i++) { $rem = $i%($numperrow); if ($rem == 0) { @@ -8825,430 +4187,149 @@ sub print_selfcreation { $$rowtotal ++; } elsif ($position eq 'middle') { my %domconf = &Apache::lonnet::get_dom('configuration',['usermodification'],$dom); - my @posstypes; + my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); + $usertypes->{'default'} = $othertitle; if (ref($types) eq 'ARRAY') { - @posstypes = @{$types}; - } - unless (grep(/^default$/,@posstypes)) { - push(@posstypes,'default'); - } - my %usertypeshash; - if (ref($usertypes) eq 'HASH') { - %usertypeshash = %{$usertypes}; - } - $usertypeshash{'default'} = $othertitle; - foreach my $status (@posstypes) { - $datatable .= &modifiable_userdata_row('selfcreate',$status,$domconf{'usermodification'}, - $numinrow,$$rowtotal,\%usertypeshash); - $$rowtotal ++; + push(@{$types},'default'); + $usertypes->{'default'} = $othertitle; + foreach my $status (@{$types}) { + $datatable .= &modifiable_userdata_row('selfcreate',$status,$domconf{'usermodification'}, + $numinrow,$$rowtotal,$usertypes); + $$rowtotal ++; + } } } else { my %choices = &Apache::lonlocal::texthash ( - 'cancreate_email' => 'Non-institutional username (via e-mail verification)', + cancreate_email => 'E-mail address as username', ); my @toggles = sort(keys(%choices)); my %defaultchecked = ( 'cancreate_email' => 'off', ); - my $customclass = 'LC_selfcreate_email'; - my $classprefix = 'LC_canmodify_emailusername_'; - my $optionsprefix = 'LC_options_emailusername_'; + my $itemcount = 0; my $display = 'none'; - my $rowstyle = 'display:none'; if (grep(/^\Qemail\E$/,@selfcreate)) { $display = 'block'; - $rowstyle = 'display:table-row'; } - my $onclick = "toggleRows(this.form,'cancreate_email','selfassign','$customclass','$classprefix','$optionsprefix');"; - ($datatable,$$rowtotal) = &radiobutton_prefs(\%radiohash,\@toggles,\%defaultchecked, - \%choices,$$rowtotal,$onclick); - $datatable .= &print_requestmail($dom,'selfcreation',$createsettings,$rowtotal,$customclass, - $rowstyle); - $$rowtotal ++; - $datatable .= &captcha_choice('cancreate',$createsettings,$$rowtotal,$customclass, - $rowstyle); - $$rowtotal ++; - my (@ordered,@posstypes,%usertypeshash); + my $onclick = "toggleDisplay(this.form,'emailoptions');"; + my $additional = '
'; my %domdefaults = &Apache::lonnet::get_domain_defaults($dom); - my ($emailrules,$emailruleorder) = - &Apache::lonnet::inst_userrules($dom,'email'); - my $primary_id = &Apache::lonnet::domain($dom,'primary'); - my $intdom = &Apache::lonnet::internet_dom($primary_id); - if (ref($types) eq 'ARRAY') { - @posstypes = @{$types}; - } - if (@posstypes) { - unless (grep(/^default$/,@posstypes)) { - push(@posstypes,'default'); - } - if (ref($usertypes) eq 'HASH') { - %usertypeshash = %{$usertypes}; - } - my $currassign; - if (ref($domdefaults{'inststatusguest'}) eq 'ARRAY') { - $currassign = { - selfassign => $domdefaults{'inststatusguest'}, - }; - @ordered = @{$domdefaults{'inststatusguest'}}; - } else { - $currassign = { selfassign => [] }; - } - my $onclicktypes = "toggleDataRow(this.form,'selfassign','$customclass','$optionsprefix',);". - "toggleDataRow(this.form,'selfassign','$customclass','$classprefix',1);"; - $datatable .= &insttypes_row($currassign,$types,$usertypes,$dom, - $numinrow,$othertitle,'selfassign', - $rowtotal,$onclicktypes,$customclass, - $rowstyle); - $$rowtotal ++; - $usertypeshash{'default'} = $othertitle; - foreach my $status (@posstypes) { - my $css_class; - if ($$rowtotal%2) { - $css_class = 'LC_odd_row '; - } - $css_class .= $customclass; - my $rowid = $optionsprefix.$status; - my $hidden = 1; - my $currstyle = 'display:none'; - if (grep(/^\Q$status\E$/,@ordered)) { - $currstyle = $rowstyle; - $hidden = 0; - } - $datatable .= &noninst_users($processing,$emailverified,$emailoptions,$emaildomain, - $emailrules,$emailruleorder,$settings,$status,$rowid, - $usertypeshash{$status},$css_class,$currstyle,$intdom); - unless ($hidden) { - $$rowtotal ++; + my $usertypes = {}; + my $order = []; + if ((ref($domdefaults{'inststatustypes'}) eq 'HASH') && (ref($domdefaults{'inststatusguest'}) eq 'ARRAY')) { + $usertypes = $domdefaults{'inststatustypes'}; + $order = $domdefaults{'inststatusguest'}; + } + if (ref($order) eq 'ARRAY') { + push(@{$order},'default'); + if (@{$order} > 1) { + $usertypes->{'default'} = &mt('Other users'); + $additional .= ''; + foreach my $status (@{$order}) { + $additional .= ''; + } + $additional .= ''; + foreach my $status (@{$order}) { + $additional .= ''; } + $additional .= '
'.$usertypes->{$status}.'
'.&email_as_username($rowtotal,$processing,$status).'
'; + } else { + $usertypes->{'default'} = &mt('All users'); + $additional .= &email_as_username($rowtotal,$processing); } - } else { - my $css_class; - if ($$rowtotal%2) { - $css_class = 'LC_odd_row '; - } - $css_class .= $customclass; - $usertypeshash{'default'} = $othertitle; - $datatable .= &noninst_users($processing,$emailverified,$emailoptions,$emaildomain, - $emailrules,$emailruleorder,$settings,'default','', - $othertitle,$css_class,$rowstyle,$intdom); - $$rowtotal ++; } + $additional .= '
'."\n"; + + ($datatable,$itemcount) = &radiobutton_prefs(\%radiohash,\@toggles,\%defaultchecked, + \%choices,$$rowtotal,$onclick,$additional); + $$rowtotal ++; + $datatable .= &print_requestmail($dom,'selfcreation',$createsettings,$rowtotal); + $$rowtotal ++; my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info(); $numinrow = 1; - if (@posstypes) { - foreach my $status (@posstypes) { - my $rowid = $classprefix.$status; - my $datarowstyle = 'display:none'; - if (grep(/^\Q$status\E$/,@ordered)) { - $datarowstyle = $rowstyle; - } + if (ref($order) eq 'ARRAY') { + foreach my $status (@{$order}) { $datatable .= &modifiable_userdata_row('cancreate','emailusername_'.$status,$settings, - $numinrow,$$rowtotal,\%usertypeshash,$infofields, - $infotitles,$rowid,$customclass,$datarowstyle); - unless ($datarowstyle eq 'display:none') { - $$rowtotal ++; - } + $numinrow,$$rowtotal,$usertypes,$infofields,$infotitles); + $$rowtotal ++; } - } else { - $datatable .= &modifiable_userdata_row('cancreate','emailusername_default',$settings, - $numinrow,$$rowtotal,\%usertypeshash,$infofields, - $infotitles,'',$customclass,$rowstyle); } - } - return $datatable; -} - -sub selfcreate_javascript { - return <<"ENDSCRIPT"; - - - -ENDSCRIPT -} - -sub noninst_users { - my ($processing,$emailverified,$emailoptions,$emaildomain,$emailrules, - $emailruleorder,$settings,$type,$rowid,$typetitle,$css_class,$rowstyle,$intdom) = @_; - my $class = 'LC_left_item'; - if ($css_class) { - $css_class = ' class="'.$css_class.'"'; - } - if ($rowid) { - $rowid = ' id="'.$rowid.'"'; - } - if ($rowstyle) { - $rowstyle = ' style="'.$rowstyle.'"'; - } - my ($output,$description); - if ($type eq 'default') { - $description = &mt('Requests for: [_1]',$typetitle); - } else { - $description = &mt('Requests for: [_1] (status self-reported)',$typetitle); - } - $output = ''. - "
$description'. - ''; - my %headers = &Apache::lonlocal::texthash( - approve => 'Processing', - email => 'E-mail', - username => 'Username', - ); - foreach my $item ('approve','email','username') { - $output .= ''; - } - $output .= ''; - foreach my $item ('approve','email','username') { - $output .= ''."\n"; } - $output .= "
'.$headers{$item}.'
'; - my (%choices,@options,$hashref,$defoption,$name,$onclick,$hascustom); - if ($item eq 'approve') { - %choices = &Apache::lonlocal::texthash ( - automatic => 'Automatically approved', - approval => 'Queued for approval', - ); - @options = ('automatic','approval'); - $hashref = $processing; - $defoption = 'automatic'; - $name = 'cancreate_emailprocess_'.$type; - } elsif ($item eq 'email') { - %choices = &Apache::lonlocal::texthash ( - any => 'Any e-mail', - inst => 'Institutional only', - noninst => 'Non-institutional only', - custom => 'Custom restrictions', - ); - @options = ('any','inst','noninst'); - my $showcustom; - if (ref($emailrules) eq 'HASH') { - if (keys(%{$emailrules}) > 0) { - push(@options,'custom'); - $showcustom = 'cancreate_emailrule'; - if (ref($settings) eq 'HASH') { - if (ref($settings->{'email_rule'}) eq 'ARRAY') { - foreach my $rule (@{$settings->{'email_rule'}}) { - if (exists($emailrules->{$rule})) { - $hascustom ++; - } - } - } elsif (ref($settings->{'email_rule'}) eq 'HASH') { - if (ref($settings->{'email_rule'}{$type}) eq 'ARRAY') { - foreach my $rule (@{$settings->{'email_rule'}{$type}}) { - if (exists($emailrules->{$rule})) { - $hascustom ++; - } - } - } - } + if ($processing->{'default'} eq $option) { + $checked = ' checked="checked"'; } } - } - $onclick = ' onclick="toggleEmailOptions(this.form,'."'cancreate_emailoptions','$showcustom',". - "'cancreate_emaildomain','$type'".');"'; - $hashref = $emailoptions; - $defoption = 'any'; - $name = 'cancreate_emailoptions_'.$type; - } elsif ($item eq 'username') { - %choices = &Apache::lonlocal::texthash ( - all => 'Same as e-mail', - first => 'Omit @domain', - free => 'Free to choose', - ); - @options = ('all','first','free'); - $hashref = $emailverified; - $defoption = 'all'; - $name = 'cancreate_usernameoptions_'.$type; - } - foreach my $option (@options) { - my $checked; - if (ref($hashref) eq 'HASH') { - if ($type eq '') { - if (!exists($hashref->{'default'})) { - if ($option eq $defoption) { - $checked = ' checked="checked"'; - } - } else { - if ($hashref->{'default'} eq $option) { - $checked = ' checked="checked"'; - } + } else { + if (!exists($processing->{$type})) { + if ($option eq 'automatic') { + $checked = ' checked="checked"'; } } else { - if (!exists($hashref->{$type})) { - if ($option eq $defoption) { - $checked = ' checked="checked"'; - } - } else { - if ($hashref->{$type} eq $option) { - $checked = ' checked="checked"'; - } - } - } - } elsif (($item eq 'email') && ($hascustom)) { - if ($option eq 'custom') { - $checked = ' checked="checked"'; - } - } elsif ($option eq $defoption) { - $checked = ' checked="checked"'; - } - $output .= '
'; - if ($item eq 'email') { - if ($option eq 'custom') { - my $id = 'cancreate_emailrule_'.$type; - my $display = 'none'; - if ($checked) { - $display = 'inline'; - } - my $numinrow = 2; - $output .= '
'. - ''.&mt('Disallow').''. - &user_formats_row('email',$settings,$emailrules, - $emailruleorder,$numinrow,'',$type); - '
'; - } elsif (($option eq 'inst') || ($option eq 'noninst')) { - my %text = &Apache::lonlocal::texthash ( - inst => 'must end:', - noninst => 'cannot end:', - ); - my $value; - if (ref($emaildomain) eq 'HASH') { - if (ref($emaildomain->{$type}) eq 'HASH') { - $value = $emaildomain->{$type}->{$option}; - } - } - if ($value eq '') { - $value = '@'.$intdom; - } - my $condition = 'cancreate_emaildomain_'.$option.'_'.$type; - my $display = 'none'; - if ($checked) { - $display = 'inline'; + if ($processing->{$type} eq $option) { + $checked = ' checked="checked"'; } - $output .= '
'. - ''.$text{$option}.' '. - ''. - '
'; } } + } elsif ($option eq 'automatic') { + $checked = ' checked="checked"'; + } + my $name = 'cancreate_emailprocess'; + if (($type ne '') && ($type ne 'default')) { + $name .= '_'.$type; + } + $output .= ''; + if ($type eq '') { + $output .= ' '; + } else { + $output .= '
'; } - $output .= '
'.$rowname.''."\n". + ''.$rowname.''."\n". '
'."\n"; foreach my $option ('original','recaptcha','notused') { $output .= ''."\n". + '
'."\n". ''.$pubtext.' '."\n". '
'."\n". ''.$privtext.' '."\n". '
'. - ''.$vertext.' '."\n". - '
'. - '
'."\n". + $currpriv.'" size="40" />
'."\n". ''; return $output; } sub user_formats_row { - my ($type,$settings,$rules,$ruleorder,$numinrow,$rowcount,$status) = @_; + my ($type,$settings,$rules,$ruleorder,$numinrow,$rowcount) = @_; my $output; my %text = ( 'username' => 'new usernames', 'id' => 'IDs', + 'email' => 'self-created accounts (e-mail)', ); - unless (($type eq 'email') || ($type eq 'unamemap')) { - my $css_class = $rowcount%2?' class="LC_odd_row"':''; - $output = ''. - ''. - &mt("Format rules to check for $text{$type}: "). - ''; + my $css_class = $rowcount%2?' class="LC_odd_row"':''; + $output = ''. + ''. + ''; - } + $output .= '
'; + if ($type eq 'email') { + $output .= &mt("Formats disallowed for $text{$type}: "); + } else { + $output .= &mt("Format rules to check for $text{$type}: "); } + $output .= ''; my $rem; if (ref($ruleorder) eq 'ARRAY') { for (my $i=0; $i<@{$ruleorder}; $i++) { @@ -9351,41 +4414,25 @@ sub user_formats_row { if (grep(/^\Q$ruleorder->[$i]\E$/,@{$settings->{$type.'_rule'}})) { $check = ' checked="checked" '; } - } elsif ((ref($settings->{$type.'_rule'}) eq 'HASH') && ($status ne '')) { - if (ref($settings->{$type.'_rule'}->{$status}) eq 'ARRAY') { - if (grep(/^\Q$ruleorder->[$i]\E$/,@{$settings->{$type.'_rule'}->{$status}})) { - $check = ' checked="checked" '; - } - } } } - my $name = $type.'_rule'; - if ($type eq 'email') { - $name .= '_'.$status; - } $output .= ''; } } $rem = @{$ruleorder}%($numinrow); } - my $colsleft; - if ($rem) { - $colsleft = $numinrow - $rem; - } + my $colsleft = $numinrow - $rem; if ($colsleft > 1 ) { $output .= ''; } elsif ($colsleft == 1) { $output .= ''; } - $output .= ''; - unless (($type eq 'email') || ($type eq 'unamemap')) { - $output .= '
'. ''. '  
'; return $output; } @@ -9420,7 +4467,6 @@ sub authtype_names { krb4 => 'Kerberos 4', krb5 => 'Kerberos 5', loc => 'Local', - lti => 'LTI', ); return %lt; } @@ -9463,10 +4509,7 @@ sub print_usermodification { sub print_defaults { my ($position,$dom,$settings,$rowtotal) = @_; my $rownum = 0; - my ($datatable,$css_class,$titles); - unless ($position eq 'bottom') { - $titles = &defaults_titles($dom); - } + my ($datatable,$css_class); if ($position eq 'top') { my @items = ('auth_def','auth_arg_def','lang_def','timezone_def', 'datelocale_def','portal_def'); @@ -9479,6 +4522,7 @@ sub print_defaults { $defaults{$item} = $domdefaults{$item}; } } + my $titles = &defaults_titles($dom); foreach my $item (@items) { if ($rownum%2) { $css_class = ''; @@ -9489,13 +4533,12 @@ sub print_defaults { ''.$titles->{$item}. ''; if ($item eq 'auth_def') { - my @authtypes = ('internal','krb4','krb5','localauth','lti'); + my @authtypes = ('internal','krb4','krb5','localauth'); my %shortauth = ( internal => 'int', krb4 => 'krb4', krb5 => 'krb5', - localauth => 'loc', - lti => 'lti', + localauth => 'loc' ); my %authnames = &authtype_names(); foreach my $auth (@authtypes) { @@ -9514,44 +4557,36 @@ sub print_defaults { my $includeempty = 1; $datatable .= &Apache::loncommon::select_datelocale($item,$defaults{$item},undef,$includeempty); } elsif ($item eq 'lang_def') { - my $includeempty = 1; - $datatable .= &Apache::loncommon::select_language($item,$defaults{$item},$includeempty); - } elsif ($item eq 'portal_def') { - $datatable .= ''; - my $portalsty = 'none'; - if ($defaults{$item}) { - $portalsty = 'block'; - } - foreach my $field ('email','web') { - my $checkedoff = ' checked="checked"'; - my $checkedon; - if ($defaults{$item.'_'.$field}) { - $checkedon = $checkedoff; - $checkedoff = ''; - } - $datatable .= '
'. - ''.$titles->{$field}.' '. - ''. - (' 'x2). - ''. - '
'; + my %langchoices = &get_languages_hash(); + $langchoices{''} = 'No language preference'; + %langchoices = &Apache::lonlocal::texthash(%langchoices); + $datatable .= &Apache::loncommon::select_form($defaults{$item},$item, + \%langchoices); + } else { + my $size; + if ($item eq 'portal_def') { + $size = ' size="25"'; } - } else { - $datatable .= ''; + $datatable .= ''; } $datatable .= ''; $rownum ++; } - } elsif ($position eq 'middle') { - my %defaults; + } else { + my (%defaults); if (ref($settings) eq 'HASH') { - if ((ref($settings->{'inststatusorder'}) eq 'ARRAY') && (ref($settings->{'inststatustypes'}) eq 'HASH')) { + if ((ref($settings->{'inststatusorder'}) eq 'ARRAY') && (ref($settings->{'inststatustypes'}) eq 'HASH') && + (ref($settings->{'inststatusguest'}) eq 'ARRAY')) { my $maxnum = @{$settings->{'inststatusorder'}}; for (my $i=0; $i<$maxnum; $i++) { $css_class = $rownum%2?' class="LC_odd_row"':''; my $item = $settings->{'inststatusorder'}->[$i]; my $title = $settings->{'inststatustypes'}->{$item}; + my $guestok; + if (grep(/^\Q$item\E$/,@{$settings->{'inststatusguest'}})) { + $guestok = 1; + } my $chgstr = ' onchange="javascript:reorderTypes(this.form,'."'$item'".');"'; $datatable .= ''. ''. @@ -9564,12 +4599,23 @@ sub print_defaults { } $datatable .= ''; } + my ($checkedon,$checkedoff); + $checkedoff = ' checked="checked"'; + if ($guestok) { + $checkedon = $checkedoff; + $checkedoff = ''; + } $datatable .= ' '.&mt('Internal ID:').' '.$item.' '. ''. &mt('delete').''. - ''.&mt('Name displayed').':'. + ''.&mt('Name displayed:'). ''. - ''; + ''. + ''. + ''.(' 'x2). + ''; } $css_class = $rownum%2?' class="LC_odd_row"':''; my $chgstr = ' onchange="javascript:reorderTypes(this.form,'."'addinststatus_pos'".');"'; @@ -9584,31 +4630,20 @@ sub print_defaults { $datatable .= ''; } $datatable .= ' '.&mt('Internal ID:'). - ''. + '
'. ' '.&mt('(new)'). ''. - &mt('Name displayed').':'. + &mt('Name displayed:'). ''. + ''. + ''.(' 'x2). + ''; ''."\n"; $rownum ++; } } - } else { - my ($unamemaprules,$ruleorder) = - &Apache::lonnet::inst_userrules($dom,'unamemap'); - $css_class = $rownum%2?' class="LC_odd_row"':''; - if ((ref($unamemaprules) eq 'HASH') && (ref($ruleorder) eq 'ARRAY')) { - my $numinrow = 2; - $datatable .= ''.&mt('Available conversions').''. - &user_formats_row('unamemap',$settings,$unamemaprules, - $ruleorder,$numinrow). - '
'; - } - if ($datatable eq '') { - $datatable .= ''. - &mt('No rules set for domain in customized localenroll.pm'). - ''; - } } $$rowtotal += $rownum; return $datatable; @@ -9634,11 +4669,6 @@ sub defaults_titles { 'timezone_def' => 'Default timezone', 'datelocale_def' => 'Default locale for dates', 'portal_def' => 'Portal/Default URL', - 'email' => 'Email links use portal URL', - 'web' => 'Public web links use portal 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'); @@ -9653,58 +4683,6 @@ sub defaults_titles { return (\%titles); } -sub print_scantron { - my ($r,$position,$dom,$confname,$settings,$rowtotal) = @_; - if ($position eq 'top') { - return &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal); - } else { - return &print_scantronconfig($dom,$settings,\$rowtotal); - } -} - -sub scantron_javascript { - return <<"ENDSCRIPT"; - - - -ENDSCRIPT - -} - sub print_scantronformat { my ($r,$dom,$confname,$settings,$rowtotal) = @_; my $itemcount = 1; @@ -9731,8 +4709,8 @@ sub print_scantronformat { if ($configuserok eq 'ok') { if ($author_ok eq 'ok') { my %legacyfile = ( - default => $Apache::lonnet::perlvar{'lonTabDir'}.'/default_scantronformat.tab', - custom => $Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab', + default => $Apache::lonnet::perlvar{'lonTabDir'}.'/default_scantronformat.tab', + custom => $Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab', ); my %md5chk; foreach my $type (keys(%legacyfile)) { @@ -9741,7 +4719,7 @@ sub print_scantronformat { } if ($md5chk{'default'} ne $md5chk{'custom'}) { foreach my $type (keys(%legacyfile)) { - ($scantronurls{$type},my $error) = + ($scantronurls{$type},my $error) = &legacy_scantronformat($r,$dom,$confname, $type,$legacyfile{$type}, $scantronurls{$type}, @@ -9752,13 +4730,13 @@ sub print_scantronformat { } if (keys(%error) == 0) { $is_custom = 1; - $confhash{'scantron'}{'scantronformat'} = + $confhash{'scantron'}{'scantronformat'} = $scantronurls{'custom'}; - my $putresult = + my $putresult = &Apache::lonnet::put_dom('configuration', \%confhash,$dom); if ($putresult ne 'ok') { - $error{'custom'} = + $error{'custom'} = ''. &mt('An error occurred updating the domain configuration: [_1]',$putresult).''; } @@ -9868,142 +4846,16 @@ sub legacy_scantronformat { my ($url,$error); my @statinfo = &Apache::lonnet::stat_file($newurl); if ((!@statinfo) || ($statinfo[0] eq 'no_such_dir')) { - my $modified = []; (my $result,$url) = - &Apache::lonconfigsettings::publishlogo($r,'copy',$legacyfile,$dom,$confname, - 'scantron','','',$newfile,$modified); - if ($result eq 'ok') { - &update_modify_urls($r,$modified); - } else { + &publishlogo($r,'copy',$legacyfile,$dom,$confname,'scantron', + '','',$newfile); + if ($result ne 'ok') { $error = &mt("An error occurred publishing the [_1] bubblesheet format file in RES space. Error was: [_2].",$newfile,$result); } } return ($url,$error); } -sub print_scantronconfig { - my ($dom,$settings,$rowtotal) = @_; - my $itemcount = 2; - my $is_checked = ' checked="checked"'; - my %optionson = ( - hdr => ' checked="checked"', - pad => ' checked="checked"', - rem => ' checked="checked"', - ); - my %optionsoff = ( - hdr => '', - pad => '', - rem => '', - ); - my $currcsvsty = 'none'; - my ($datatable,%csvfields,%checked,%onclick,%csvoptions); - my @fields = &scantroncsv_fields(); - my %titles = &scantronconfig_titles(); - if (ref($settings) eq 'HASH') { - if (ref($settings->{config}) eq 'HASH') { - if ($settings->{config}->{dat}) { - $checked{'dat'} = $is_checked; - } - if (ref($settings->{config}->{csv}) eq 'HASH') { - if (ref($settings->{config}->{csv}->{fields}) eq 'HASH') { - %csvfields = %{$settings->{config}->{csv}->{fields}}; - if (keys(%csvfields) > 0) { - $checked{'csv'} = $is_checked; - $currcsvsty = 'block'; - } - } - if (ref($settings->{config}->{csv}->{options}) eq 'HASH') { - %csvoptions = %{$settings->{config}->{csv}->{options}}; - foreach my $option (keys(%optionson)) { - unless ($csvoptions{$option}) { - $optionsoff{$option} = $optionson{$option}; - $optionson{$option} = ''; - } - } - } - } - } else { - $checked{'dat'} = $is_checked; - } - } else { - $checked{'dat'} = $is_checked; - } - $onclick{'csv'} = ' onclick="toggleScantron(this.form);"'; - my $css_class = $itemcount%2? ' class="LC_odd_row"':''; - $datatable = ''.&mt('Supported formats').''. - ''; - foreach my $item ('dat','csv') { - my $id; - if ($item eq 'csv') { - $id = 'id="scantronconfcsv" '; - } - $datatable .= ''.(' 'x3); - if ($item eq 'csv') { - $datatable .= '
'. - ''.&mt('CSV Column Mapping').''. - ''."\n"; - foreach my $col (@fields) { - my $selnone; - if ($csvfields{$col} eq '') { - $selnone = ' selected="selected"'; - } - $datatable .= ''. - ''; - } - $datatable .= '
'.&mt('Field').''.&mt('Location').'
'.$titles{$col}.'
'. - '
'. - ''.&mt('CSV Options').''; - foreach my $option ('hdr','pad','rem') { - $datatable .= ''.$titles{$option}.':'. - ''.(' 'x2)."\n". - '
'; - } - $datatable .= '
'; - $itemcount ++; - } - } - $datatable .= ''; - $$rowtotal ++; - return $datatable; -} - -sub scantronconfig_titles { - return &Apache::lonlocal::texthash( - dat => 'Standard format (.dat)', - csv => 'Comma separated values (.csv)', - hdr => 'Remove first line in file (contains column titles)', - pad => 'Prepend 0s to PaperID', - rem => 'Remove leading spaces (except Question Response columns)', - CODE => 'CODE', - ID => 'Student ID', - PaperID => 'Paper ID', - FirstName => 'First Name', - LastName => 'Last Name', - FirstQuestion => 'First Question Response', - Section => 'Section', - ); -} - -sub scantroncsv_fields { - return ('PaperID','LastName','FirstName','ID','Section','CODE','FirstQuestion'); -} - sub print_coursecategories { my ($position,$dom,$hdritem,$settings,$rowtotal) = @_; my $datatable; @@ -10046,7 +4898,7 @@ sub print_coursecategories { ''.$lt{$type}.' '; } - $datatable .= '
'; + $datatable .= ''; $itemcount ++; } $$rowtotal += $itemcount; @@ -10257,7 +5109,7 @@ sub print_coursecategories { $datatable .= &initialize_categories($itemcount); } } else { - $datatable .= ''.$hdritem->{'header'}->[1]->{'col2'}.'' + $datatable .= ''.$hdritem->{'header'}->[1]->{'col2'}.'' .&initialize_categories($itemcount); } $$rowtotal += $itemcount; @@ -10305,7 +5157,7 @@ sub print_serverstatuses { ''. ''. - ''."\n"; + ''."\n"; } $$rowtotal += $rownum; return $datatable; @@ -10315,29 +5167,12 @@ sub serverstatus_pages { return ('userstatus','lonstatus','loncron','server-status','codeversions', 'checksums','clusterstatus','metadata_keywords','metadata_harvest', 'takeoffline','takeonline','showenv','toggledebug','ping','domconf', - 'uniquecodes','diskusage','coursecatalog'); + 'uniquecodes','diskusage'); } sub defaults_javascript { my ($settings) = @_; - return unless (ref($settings) eq 'HASH'); - my $portal_js = <<"ENDPORTAL"; - -function portalExtras(caller) { - var x = caller.value; - var y = new Array('email','web'); - for (var i=0; i 0) { - z.style.display = 'block'; - } else { - z.style.display = 'none'; - } - } - } -} -ENDPORTAL + return unless (ref($settings) eq 'HASH'); if ((ref($settings->{'inststatusorder'}) eq 'ARRAY') && (ref($settings->{'inststatustypes'}) eq 'HASH')) { my $maxnum = scalar(@{$settings->{'inststatusorder'}}); if ($maxnum eq '') { @@ -10391,112 +5226,11 @@ $jstext return; } -$portal_js - -// ]]> - - -ENDSCRIPT - } else { -return <<"ENDSCRIPT"; - ENDSCRIPT } - return; -} - -sub passwords_javascript { - my ($prefix) = @_; - my %intalert; - if ($prefix eq 'passwords') { - %intalert = &Apache::lonlocal::texthash ( - authcheck => 'Warning: disallowing login for an authenticated user if the stored cost is less than the default will require a password reset by/for the user.', - authcost => 'Warning: bcrypt encryption cost for internal authentication must be an integer.', - passmin => 'Warning: minimum password length must be a positive integer greater than 6.', - passmax => 'Warning: maximum password length must be a positive integer (or blank).', - passnum => 'Warning: number of previous passwords to save must be a positive integer (or blank).', - ); - } elsif (($prefix eq 'ltisecrets') || ($prefix eq 'toolsecrets')) { - %intalert = &Apache::lonlocal::texthash ( - passmin => 'Warning: minimum secret length must be a positive integer greater than 6.', - passmax => 'Warning: maximum secret length must be a positive integer (or blank).', - ); - } - &js_escape(\%intalert); - my $defmin = $Apache::lonnet::passwdmin; - my $intauthjs; - if ($prefix eq 'passwords') { $intauthjs = <<"ENDSCRIPT"; - -function warnIntAuth(field) { - if (field.name == 'intauth_check') { - if (field.value == '2') { - alert('$intalert{authcheck}'); - } - } - if (field.name == 'intauth_cost') { - field.value.replace(/\s/g,''); - if (field.value != '') { - var regexdigit=/^\\d+\$/; - if (!regexdigit.test(field.value)) { - alert('$intalert{authcost}'); - } - } - } - return; -} - -ENDSCRIPT - - } - - $intauthjs .= <<"ENDSCRIPT"; - -function warnInt$prefix(field) { - field.value.replace(/^\s+/,''); - field.value.replace(/\s+\$/,''); - var regexdigit=/^\\d+\$/; - if (field.name == '${prefix}_min') { - if (field.value == '') { - alert('$intalert{passmin}'); - field.value = '$defmin'; - } else { - if (!regexdigit.test(field.value)) { - alert('$intalert{passmin}'); - field.value = '$defmin'; - } - var minval = parseInt(field.value,10); - if (minval < $defmin) { - alert('$intalert{passmin}'); - field.value = '$defmin'; - } - } - } else { - if (field.value == '0') { - field.value = ''; - } - if (field.value != '') { - if (!regexdigit.test(field.value)) { - if (field.name == '${prefix}_max') { - alert('$intalert{passmax}'); - } else { - if (field.name == '${prefix}_numsaved') { - alert('$intalert{passnum}'); - } - } - field.value = ''; - } - } - } - return; -} - -ENDSCRIPT - return &Apache::lonhtmlcommon::scripttag($intauthjs); } sub coursecategories_javascript { @@ -10523,10 +5257,7 @@ sub coursecategories_javascript { } my $instcode_reserved = &mt('The name: [_1] is a reserved category.','"instcode"'); my $communities_reserved = &mt('The name: [_1] is a reserved category.','"communities"'); - my $choose_again = "\n".&mt('Please use a different name for the new top level category.'); - &js_escape(\$instcode_reserved); - &js_escape(\$communities_reserved); - &js_escape(\$choose_again); + my $choose_again = '\\n'.&mt('Please use a different name for the new top level category.'); $output = <<"ENDSCRIPT";