--- loncom/interface/lonpreferences.pm 2012/08/16 17:02:55 1.198 +++ loncom/interface/lonpreferences.pm 2019/04/24 21:15:48 1.231 @@ -1,7 +1,7 @@ # The LearningOnline Network # Preferences # -# $Id: lonpreferences.pm,v 1.198 2012/08/16 17:02:55 raeburn Exp $ +# $Id: lonpreferences.pm,v 1.231 2019/04/24 21:15:48 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,8 +27,6 @@ # # This package uses the "londes.js" javascript code. # -# TODOs that have to be completed: -# interface with lonnet to change the password package Apache::lonpreferences; @@ -36,8 +34,6 @@ use strict; use LONCAPA; use Apache::Constants qw(:common); use Apache::File; -use Crypt::DES; -use DynaLoader; # for Crypt::DES version use Apache::loncommon(); use Apache::lonhtmlcommon(); use Apache::lonlocal; @@ -45,50 +41,6 @@ use Apache::lonnet; use LONCAPA::lonauthcgi(); use LONCAPA(); -# -# Write lonnet::passwd to do the call below. -# Use: -# my $answer=reply("encrypt:passwd:$udom:$uname:$upass",$tryserver); -# -################################################## -# password associated functions # -################################################## -sub des_keys { - # Make a new key for DES encryption. - # Each key has two parts which are returned separately. - # Please note: Each key must be passed through the &hex function - # before it is output to the web browser. The hex versions cannot - # be used to decrypt. - my @hexstr=('0','1','2','3','4','5','6','7', - '8','9','a','b','c','d','e','f'); - my $lkey=''; - for (0..7) { - $lkey.=$hexstr[rand(15)]; - } - my $ukey=''; - for (0..7) { - $ukey.=$hexstr[rand(15)]; - } - return ($lkey,$ukey); -} - -sub des_decrypt { - my ($key,$cyphertext) = @_; - my $keybin=pack("H16",$key); - my $cypher; - if ($Crypt::DES::VERSION>=2.03) { - $cypher=new Crypt::DES $keybin; - } else { - $cypher=new DES $keybin; - } - my $plaintext= - $cypher->decrypt(unpack("a8",pack("H16",substr($cyphertext,0,16)))); - $plaintext.= - $cypher->decrypt(unpack("a8",pack("H16",substr($cyphertext,16,16)))); - $plaintext=substr($plaintext,1,ord(substr($plaintext,0,1)) ); - return $plaintext; -} - ################################################################ # Handler subroutines # ################################################################ @@ -152,32 +104,16 @@ sub languagechanger { text => 'Change Language'}); $r->print(Apache::loncommon::start_page('Content Display Settings')); $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Language')); - my $user = $env{'user.name'}; - my $domain = $env{'user.domain'}; - my %userenv = &Apache::lonnet::get - ('environment',['languages']); + my %userenv = &Apache::lonnet::get('environment',['languages']); my $language=$userenv{'languages'}; - my $pref=&mt('Preferred language'); - my %langchoices=('' => 'No language preference'); - foreach (&Apache::loncommon::languageids()) { - if (&Apache::loncommon::supportedlanguagecode($_)) { - $langchoices{&Apache::loncommon::supportedlanguagecode($_)} - = &Apache::loncommon::plainlanguagedescription($_); - } - } - %langchoices = &Apache::lonlocal::texthash(%langchoices); - my $selectionbox= - &Apache::loncommon::select_form( - $language, - 'language', - \%langchoices); - $r->print(< - -
$pref: $selectionbox -ENDLSCREEN - $r->print('
'); + $r->print( + '
'."\n". + ''. + '
'.&mt('Preferred language').': '. + &Apache::loncommon::select_language('language',$language,1).''."\n". + '
' + ); } @@ -222,11 +158,13 @@ sub texenginechanger { my $domain = $env{'user.domain'}; my %userenv = &Apache::lonnet::get('environment',['texengine']); my $texengine=$userenv{'texengine'}; + if (lc($texengine) eq 'jsmath') { + $texengine = 'MathJax'; + } my %mathchoices=('' => 'Default', 'tth' => 'tth (TeX to HTML)', #'ttm' => 'TeX to MathML', - 'jsMath' => 'jsMath', 'MathJax' => 'MathJax', 'mimetex' => 'mimetex (Convert to Images)', 'raw' => 'Raw (Screen Reader)' @@ -238,33 +176,17 @@ sub texenginechanger { 'texengine', \%mathchoices); my $MathJax_start=&Apache::lontexconvert::MathJax_header(); - my $jsMath_start=&Apache::lontexconvert::jsMath_header(); my %lt=&Apache::lonlocal::texthash( 'headline' => 'Change how math is displayed', 'preftxt' => 'Preferred method to display math', 'change' => 'Save', 'exmpl' => 'Examples', 'mathjax' => 'MathJax:', - 'jsmath' => 'jsMath:', + 'mathjaxinfo' => 'MathJax provides rendered equations whose source code can be extracted in TeX and MathML formats by right clicking the equation.', 'tth' => 'tth (TeX to HTML):', 'mimetex' => 'mimetex (Convert to Images):', ); - my $jsMathWarning='

' - .'

' - .&mt("It looks like you don't have the TeX math fonts installed.") - .'
' - .'
' - .&mt('The jsMath example on this page may not look right without them. ' - .'The [_1]jsMath Home Page[_2] has information on how to download the ' - .'needed fonts. In the meantime, jsMath will do the best it can ' - .'with the fonts you have, but it may not be pretty and some equations ' - .'may not be rendered correctly.' - ,'' - ,'') - .'
' - .'

'; - $r->print(<$lt{'headline'}
@@ -281,37 +203,22 @@ $lt{'exmpl'}

$lt{'mathjax'}

- -

-

-MathJax provides rendered equations whose source code can be extracted in TeX and MathML formats by right clicking the equation. +

- -

$lt{'jsmath'}

-$jsMath_start - - +$lt{'mathjaxinfo'}

$lt{'mimetex'}

- +

$lt{'tth'}

- +

ENDLSCREEN - if ($env{'environment.texengine'} ne 'jsMath') { - $r->print(''); - } } @@ -322,6 +229,9 @@ sub verify_and_change_texengine { # Screenname my $newtexengine = $env{'form.texengine'}; $newtexengine=~s/[^\-\w]//g; + if (lc($newtexengine) eq 'jsmath') { + $newtexengine = 'MathJax'; + } if ($newtexengine eq 'ttm') { &Apache::lonnet::appenv({'browser.mathml' => 1}); } else { @@ -457,13 +367,13 @@ $options.' $r->print('

'.&mt('Freeze Roles').'

'.&mt('The table below can be used to [_1]freeze[_2] '.$lc_role.'s in the Hotlist.','','').'
'. -&mt('Those marked frozen will not be removed from the list, even if not recently used.').' +&mt('Those '.$lc_role.'s marked frozen will not be removed from the list, even if not recently used.').'

'.$roles_check_list.'
'); } else { $r->print('
'. - &mt('Once the Hotlist contains recently visited '.$lc_role.'s, you can return to this page to also set frozen roles.')); + &mt('Once the Hotlist contains recently visited '.$lc_role.'s you can return to this page to also set frozen roles.')); } $r->print('
@@ -565,7 +475,6 @@ sub verify_and_change_rolespref { } - ################################################################ # Anonymous Discussion Name Change Subroutines # ################################################################ @@ -774,16 +683,51 @@ sub verify_and_change_clicker { my $r = shift; my $user = $env{'user.name'}; my $domain = $env{'user.domain'}; + my $uhome = $env{'user.home'}; my $newclickers = $env{'form.clickers'}; + my $message; $newclickers=~s/[^\w\:\-]+/\,/gs; $newclickers=~tr/a-z/A-Z/; $newclickers=~s/[\:\-]+/\-/g; $newclickers=~s/\,+/\,/g; $newclickers=~s/^\,//; $newclickers=~s/\,$//; - &Apache::lonnet::put('environment',{'clickers' => $newclickers}); - &Apache::lonnet::appenv({'environment.clickers' => $newclickers}); - my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Registering clickers: [_1]',$newclickers)); + my @oldclickers = split(/,/,$env{'environment.clickers'}); + my @newclickers = split(/,/,$newclickers); + my %newuniq; + map { $newuniq{$_} = 1; } @newclickers; + @newclickers = sort(keys(%newuniq)); + my @differences = &Apache::loncommon::compare_arrays(\@oldclickers,\@newclickers); + if (@differences) { + my $putres = &Apache::lonnet::put('environment',{'clickers' => $newclickers}); + if ($putres eq 'ok') { + my @adds = (); + my @dels = (); + foreach my $item (@differences) { + if (grep(/^\Q$item\E$/,@newclickers)) { + push(@adds,$item); + } else { + push(@dels,$item); + } + } + if (@dels) { + my %delclicker; + map { $delclicker{$_} = $user; } @dels; + my $putresult = &Apache::lonnet::iddel($domain,\%delclicker,$uhome,'clickers'); + } + if (@adds) { + my %addclicker; + map { $addclicker{$_} = $user; } @adds; + my $putresult = &Apache::lonnet::updateclickers($domain,'add',\%addclicker,$uhome,1); + } + &Apache::lonnet::appenv({'environment.clickers' => $newclickers}); + $message=&Apache::lonhtmlcommon::confirm_success(&mt('Registering clickers: [_1]',$newclickers)); + } else { + $message=&Apache::lonhtmlcommon::confirm_success(&mt('Error saving clicker ID').1); + } + } else { + $message=''.&mt('Clicker information unchanged').''; + } $message=&Apache::loncommon::confirmwrapper($message); &print_main_menu($r, $message); } @@ -807,11 +751,13 @@ sub domcoordchanger { if ($userenv{'domcoord.author'} eq 'blocked') { $constchecked=' checked="checked"'; } - my $text=&mt('By default, the Domain Coordinator can enter your construction space.'); - my $construction=&mt('Block access to construction space'); + my $text=&mt('By default, the Domain Coordinator can enter your Authoring Space.'); + my $construction=&mt('Block access to Authoring Space'); my $change=&mt('Save'); + my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\''); $r->print(< + $text

@@ -834,9 +780,13 @@ sub verify_and_change_domcoord { } else { $status=&mt('off'); } - my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Block access to construction space').'',''.$status.'')); + my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Block access to Authoring Space').'',''.$status.'')); $message=&Apache::loncommon::confirmwrapper($message); - &print_main_menu($r,$message); + if ($env{'form.returnurl'}) { + &do_redirect($r,$env{'form.returnurl'},$message); + } else { + &print_main_menu($r,$message); + } } ################################################################# @@ -850,7 +800,7 @@ sub lockwarning { my $textbottom=&mt('Changing roles or logging out may result in data corruption.'); my ($num,%which)=&Apache::lonnet::get_locks(); my $which=''; - foreach my $id (keys %which) { + foreach my $id (keys(%which)) { $which.='
  • '.$which{$id}.'
  • '; } my $change=&mt('Override'); @@ -892,15 +842,15 @@ sub msgforwardchanger { foad => 'Forward to account(s)', fwdm => 'Forward messages to other account(s) in LON-CAPA', noti => 'E-mail notification of LON-CAPA messages', - foad_exmpl => 'e.g. userA:domain1,userB:domain2,...', mnot => 'E-mail address(es) which should be notified about new LON-CAPA messages', - mnot_exmpl => 'e.g. joe@doe.com', chg => 'Save', email => 'The e-mail address entered in row ', notv => 'is not a valid e-mail address', toen => "To enter multiple addresses, enter one address at a time, click 'Change' and then add the next one", prme => 'Back', ); + $lt{'foad_exmpl'} = &mt('e.g. [_1]userA:domain1,userB:domain2,...[_2]','',''); + $lt{'mnot_exmpl'} = &mt('e.g. [_1]joe@doe.com[_2]','',''); Apache::lonhtmlcommon::add_breadcrumb( { href => '/adm/preferences?action=changemsgforward', text => 'Messages & Notifications'}); @@ -1004,7 +954,7 @@ ENDMSG '" onclick="javscript:delete_address('."'$num'".')" />'. &mt('Delete').''. ''; my %chk; if (defined($allnot{$item}{'crit'})) { @@ -1053,7 +1003,7 @@ ENDMSG ''.&mt('Add new address').''. ''; + '" onfocus="javascript:new_address('."'$num'".')" />'; foreach my $type ('all','crit','reg') { $output .= '',$caller,$mailtoken); return 1; } - } + } if ($newpass1 ne $newpass2) { &passwordchanger($r, - ''. + ''. &mt('The new passwords you entered do not match.').' '. &mt('Please try again.').'',$caller,$mailtoken); return 1; } - if (length($newpass1) < 7) { - &passwordchanger($r, - ''. - &mt('Passwords must be a minimum of 7 characters long.').' '. - &mt('Please try again.').'',$caller,$mailtoken); - return 1; + if ($currentauth eq 'unix:') { + if (length($newpass1) < 7) { + &passwordchanger($r, + ''. + &mt('Passwords must be a minimum of 7 characters long.').' '. + &mt('Please try again.').'',$caller,$mailtoken); + return 1; + } + } else { + my %passwdconf = &Apache::lonnet::get_passwdconf($domain); + my ($min,$max,@chars,@brokerule); + if (ref($passwdconf{'chars'}) eq 'ARRAY') { + if ($passwdconf{'min'} =~ /^\d+$/) { + $min = $passwdconf{'min'}; + } + if ($passwdconf{'max'} =~ /^\d+$/) { + $max = $passwdconf{'max'}; + } + @chars = @{$passwdconf{'chars'}}; + } else { + $min = 7; + } + if (($min) && (length($newpass1) < $min)) { + push(@brokerule,'min'); + } + if (($max) && (length($newpass1) > $max)) { + push(@brokerule,'max'); + } + if (@chars) { + my %rules; + map { $rules{$_} = 1; } @chars; + if ($rules{'uc'}) { + unless ($newpass1 =~ /[A-Z]/) { + push(@brokerule,'uc'); + } + } + if ($rules{'lc'}) { + unless ($newpass1 =~ /a-z/) { + push(@brokerule,'lc'); + } + } + if ($rules{'num'}) { + unless ($newpass1 =~ /\d/) { + push(@brokerule,'num'); + } + } + if ($rules{'spec'}) { + unless ($newpass1 =~ /[!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/) { + push(@brokerule,'spec'); + } + } + } + if (@brokerule) { + 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', + ); + $rulenames{'uc'} .= ': ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $rulenames{'lc'} .= ': abcdefghijklmnopqrstuvwxyz'; + $rulenames{'num'} .= ': 0123456789'; + $rulenames{'spec'} .= ': !"\#$%&\'()*+,-./:;<=>?@[\]^_\`{|}~'; + $rulenames{'min'} = &mt('Minimum password length: [_1]',$min); + $rulenames{'max'} = &mt('Maximum password length: [_1]',$max); + my $warning = &mt('Password did not satisfy the following:').'
      '; + foreach my $rule ('min','max','uc','ls','num','spec') { + if (grep(/^$rule$/,@brokerule)) { + $warning .= '
    • '.$rulenames{$rule}.'
    • '; + } + } + $warning .= '
    '; + &passwordchanger($r,''. + $warning. + &mt('Please try again.').'', + $caller,$mailtoken); + return 1; + } } # # Check for bad characters @@ -1660,7 +1714,7 @@ ENDERROR } if ($badpassword) { # I can't figure out how to enter bad characters on my browser. - my $errormessage =''. + my $errormessage =''. &mt('The password you entered contained illegal characters.').'
    '. &mt('Valid characters are').(<<"ENDERROR"); : space and
    @@ -1685,6 +1739,9 @@ ENDERROR $r->print($message.'
    '); } else { &print_main_menu($r, $message); + if (ref($ended)) { + $$ended = 1; + } } } else { # error error: run in circles, scream and shout @@ -1699,6 +1756,9 @@ ENDERROR &mt("The password for user [_1] was not changed.",''.$user.'').' '.&mt('Please make sure your old password was entered correctly.'),1); $message=&Apache::loncommon::confirmwrapper($message); &print_main_menu($r, $message); + if (ref($ended)) { + $$ended = 1; + } } } return; @@ -1832,7 +1892,7 @@ sub verify_and_change_discussion { if (defined($env{'form.discmark'}) ) { my $newmark = $env{'form.newmark'}; if ($newmark eq 'ondisp') { - $message.=&Apache::lonhtmlcommon::confirm_success(&mt('In discussions: new posts will be cease to be identified as "NEW" after display.')).'
    '; + $message.=&Apache::lonhtmlcommon::confirm_success(&mt('In discussions: new posts will cease to be identified as "NEW" after display.')).'
    '; &Apache::lonnet::put('environment',{'discmarkread' => $newmark}); &Apache::lonnet::appenv({'environment.discmarkread' => $newmark}); } else { @@ -1934,6 +1994,64 @@ sub verify_and_change_coursepage { &print_main_menu($r,$message); } +sub author_space_settings { + my $r = shift; + &Apache::lonhtmlcommon::add_breadcrumb( + { href => '/adm/preferences?action=authorsettings', + text => 'Authoring Space Settings'}); + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']); + if (keys(%author_roles) > 0) { + $r->print(Apache::loncommon::start_page('Authoring Space Settings')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Authoring Space Settings')); + my %userenv = &Apache::lonnet::get('environment',['nocodemirror']); + my $constchecked=''; + if ($env{'environment.nocodemirror'}) { + $constchecked=' checked="checked"'; + } + my $text=&mt('By default, CodeMirror an editor with advanced functionality for editing code is activated for authors.'); + my $cmoff=&mt('Deactivate CodeMirror. This can improve performance on slow computers and accessibility.'); + my $change=&mt('Save'); + my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\''); + $r->print(< + + + $text
    +
    + + +ENDSCREEN + } +} + +sub change_authoring_settings { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']); + if (keys(%author_roles) > 0) { + my %ausettings=('environment.nocodemirror' => ''); + if ($env{'form.cmoff'}) { $ausettings{'environment.nocodemirror'}='yes'; } + &Apache::lonnet::put('environment',\%ausettings); + &Apache::lonnet::appenv({'environment.nocodemirror' => $ausettings{'environment.nocodemirror'}}); + my $status=''; + if ($ausettings{'environment.nocodemirror'} eq 'yes') { + $status=&mt('on'); + } else { + $status=&mt('off'); + } + my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Deactivate CodeMirror in Authoring Space').'',''.$status.'')); + $message=&Apache::loncommon::confirmwrapper($message); + if ($env{'form.returnurl'}) { + &do_redirect($r,$env{'form.returnurl'},$message); + } else { + &print_main_menu($r,$message); + } + } +} + sub lockednameschanger { my $r = shift; &Apache::lonhtmlcommon::add_breadcrumb( @@ -2175,6 +2293,18 @@ push(@{ $menu[4]->{items} }, { }); } + + my %author_coauthor_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']); + if (keys(%author_coauthor_roles) > 0) { + push(@{ $menu[4]->{items} }, { + linktext => 'Authoring Space Configuration', + url => '/adm/preferences?action=authorsettings', + permission => 'F', + icon => 'codemirror.png', + linktitle => 'Settings for your authoring space.', + }); + } + if (&can_toggle_debug()) { push(@{ $menu[4]->{items} }, { linktext => 'Toggle Debug Messages (Currently '.($env{'user.debug'} ? 'on)' : 'off)'), @@ -2212,10 +2342,22 @@ sub handler { ['action','wysiwyg','returnurl','refpage']); # Apache::lonhtmlcommon::clear_breadcrumbs(); - my ($brlink,$brtxt,$brhelp); + my ($brlink,$brtxt,$brhelp,$ended); if (($env{'form.action'} eq 'changerolespref') && ($env{'form.returnurl'} eq '/adm/roles')) { $brlink ='/adm/roles'; $brtxt = 'User Roles'; + } elsif ((($env{'form.action'} eq 'changedomcoord') || + ($env{'form.action'} eq 'authorsettings')) && + (($env{'form.returnurl'} =~ m{^/(priv/|res($|/))}) || + ($env{'form.returnurl'} eq '/adm/createuser'))) { + $brlink = $env{'form.returnurl'}; + if ($env{'form.returnurl'} eq '/adm/createuser') { + $brtxt = 'User Management'; + } elsif ($env{'form.returnurl'} =~ m{^/res($\/)}) { + $brtxt = 'Browse published resources'; + } else { + $brtxt = 'Authoring Space'; + } } else { $brlink ='/adm/preferences'; $brtxt = 'Set User Preferences'; @@ -2226,15 +2368,17 @@ sub handler { text => $brtxt, help => $brhelp,}); if(!exists $env{'form.action'}) { - &print_main_menu($r); + &print_main_menu($r); + $ended = 1; }elsif($env{'form.action'} eq 'changepass'){ &passwordchanger($r); }elsif($env{'form.action'} eq 'verify_and_change_pass'){ - &verify_and_change_password($r); + &verify_and_change_password($r,'preferences','',\$ended); }elsif($env{'form.action'} eq 'changescreenname'){ &screennamechanger($r); }elsif($env{'form.action'} eq 'verify_and_change_screenname'){ &verify_and_change_screenname($r); + $ended = 1; }elsif($env{'form.action'} eq 'changemsgforward'){ &msgforwardchanger($r); }elsif($env{'form.action'} eq 'verify_and_change_msgforward'){ @@ -2243,38 +2387,47 @@ sub handler { &colorschanger($r); }elsif($env{'form.action'} eq 'verify_and_change_colors'){ &verify_and_change_colors($r); + $ended = 1; }elsif($env{'form.action'} eq 'changelanguages'){ &languagechanger($r); }elsif($env{'form.action'} eq 'verify_and_change_languages'){ &verify_and_change_languages($r); + $ended = 1; }elsif($env{'form.action'} eq 'changewysiwyg'){ &wysiwygchanger($r); }elsif($env{'form.action'} eq 'set_wysiwyg'){ &verify_and_change_wysiwyg($r); + $ended = 1; }elsif($env{'form.action'} eq 'changediscussions'){ &discussionchanger($r); }elsif($env{'form.action'} eq 'verify_and_change_discussion'){ &verify_and_change_discussion($r); + $ended = 1; }elsif($env{'form.action'} eq 'changerolespref'){ &rolesprefchanger($r); }elsif($env{'form.action'} eq 'verify_and_change_rolespref'){ &verify_and_change_rolespref($r); + $ended = 1; }elsif($env{'form.action'} eq 'changetexenginepref'){ &texenginechanger($r); }elsif($env{'form.action'} eq 'verify_and_change_texengine'){ &verify_and_change_texengine($r); + $ended = 1; }elsif($env{'form.action'} eq 'changeicons'){ &iconchanger($r); }elsif($env{'form.action'} eq 'verify_and_change_icons'){ &verify_and_change_icons($r); + $ended = 1; }elsif($env{'form.action'} eq 'changeclicker'){ &clickerchanger($r); }elsif($env{'form.action'} eq 'verify_and_change_clicker'){ &verify_and_change_clicker($r); + $ended = 1; }elsif($env{'form.action'} eq 'changedomcoord'){ &domcoordchanger($r); }elsif($env{'form.action'} eq 'verify_and_change_domcoord'){ &verify_and_change_domcoord($r); + $ended = 1; }elsif($env{'form.action'} eq 'lockwarning'){ &lockwarning($r); }elsif($env{'form.action'} eq 'verify_and_change_locks'){ @@ -2283,22 +2436,29 @@ sub handler { &coursedisplaychanger($r); }elsif($env{'form.action'} eq 'verify_and_change_coursepage'){ &verify_and_change_coursepage($r); + $ended = 1; + }elsif($env{'form.action'} eq 'authorsettings'){ + &author_space_settings($r); + }elsif($env{'form.action'} eq 'change_authoring_settings'){ + &change_authoring_settings($r); + $ended = 1; }elsif($env{'form.action'} eq 'debugtoggle'){ if (&can_toggle_debug()) { &toggle_debug(); } &print_main_menu($r); + $ended = 1; } elsif ($env{'form.action'} eq 'changelockednames') { &lockednameschanger($r); } elsif ($env{'form.action'} eq 'verify_and_change_lockednames') { &verify_and_change_lockednames($r); + $ended = 1; } # Properly end the HTML page of all preference pages # started in each sub routine # Exception: print_main_menu has its own end_page call - unless (!exists $env{'form.action'} || - $env{'form.action'} eq 'debugtoggle') { + unless ($ended) { $r->print(&Apache::loncommon::end_page()); } @@ -2371,5 +2531,16 @@ sub updateable_userinfo { return %updateable; } +sub do_redirect { + my ($r,$url,$msg) = @_; + $r->print( + &Apache::loncommon::start_page('Switching Server ...',undef, + {'redirect' => [0.5,$url]}). + '
    '."\n". + "$msg\n". + &Apache::loncommon::end_page()); + return; +} + 1; __END__