--- loncom/interface/lonpreferences.pm 2024/03/01 14:23:23 1.196.4.28.2.3 +++ loncom/interface/lonpreferences.pm 2012/10/04 13:41:10 1.199 @@ -1,7 +1,7 @@ # The LearningOnline Network # Preferences # -# $Id: lonpreferences.pm,v 1.196.4.28.2.3 2024/03/01 14:23:23 raeburn Exp $ +# $Id: lonpreferences.pm,v 1.199 2012/10/04 13:41:10 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,19 +27,67 @@ # # This package uses the "londes.js" javascript code. # +# TODOs that have to be completed: +# interface with lonnet to change the password package Apache::lonpreferences; 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; use Apache::lonnet; use LONCAPA::lonauthcgi(); use LONCAPA(); -use DateTime::TimeZone(); + +# +# 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 # @@ -104,16 +152,32 @@ sub languagechanger { text => 'Change Language'}); $r->print(Apache::loncommon::start_page('Content Display Settings')); $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Language')); - my %userenv = &Apache::lonnet::get('environment',['languages']); + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my %userenv = &Apache::lonnet::get + ('environment',['languages']); my $language=$userenv{'languages'}; - $r->print( - '
'."\n". - ''. - '
'.&mt('Preferred language').': '. - &Apache::loncommon::select_language('language',$language,1).''."\n". - '
' - ); + 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('
'); } @@ -158,14 +222,12 @@ 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', - 'MathJax' => 'MathJax', + 'jsMath' => 'jsMath', + 'MathJax' => 'MathJax', 'mimetex' => 'mimetex (Convert to Images)', 'raw' => 'Raw (Screen Reader)' ); @@ -176,17 +238,33 @@ 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:', - 'mathjaxinfo' => 'MathJax provides rendered equations whose source code can be extracted in TeX and MathML formats by right clicking the equation.', + 'jsmath' => 'jsMath:', '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'}
@@ -203,22 +281,37 @@ $lt{'exmpl'}

$lt{'mathjax'}

- +

-$lt{'mathjaxinfo'} +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{'mimetex'}

- +

$lt{'tth'}

- +

ENDLSCREEN + if ($env{'environment.texengine'} ne 'jsMath') { + $r->print(''); + } } @@ -229,9 +322,6 @@ 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 { @@ -280,7 +370,7 @@ sub rolesprefchanger { my $hotlist_n=$userenv{'recentrolesn'}; my ($checkedon,$checkedoff); if ($hotlist_flag) { - $checkedon = 'checked="checked"'; + $checkedon = 'checked="checked"'; } else { $checkedoff = 'checked="checked"'; } @@ -363,17 +453,17 @@ $options.' &Apache::lonhtmlcommon::row_closure(1). &Apache::lonhtmlcommon::end_pick_box().' '); - if ($roles_check_list) { + if ($roles_check_list) { $r->print('

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

'.&mt('The table below can be used to [_1]freeze[_2] '.$lc_role.'s in the Hotlist.','','').'
'. -&mt('Those '.$lc_role.'s marked frozen will not be removed from the list, even if not recently used.').' +&mt('Those 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('
@@ -475,6 +565,7 @@ sub verify_and_change_rolespref { } + ################################################################ # Anonymous Discussion Name Change Subroutines # ################################################################ @@ -627,7 +718,7 @@ sub icon_options { } sub icon_previews { - my %icon_text = &Apache::lonlocal::texthash ( + my %icon_text = ( annotate => 'Notes', wishlist => 'Stored Links', catalog => 'Info', @@ -636,12 +727,12 @@ sub icon_previews { printout => 'Print', ); my %inlinetools = ( - printout => "s&8&3&prt.png&$icon_text{'printout'}&printout[_1]&gopost('/adm/printout',currentURL)&".&mt('Prepare a printable document'), - wishlist => "s&9&1&wishlist-link.png&$icon_text{'wishlist'}&wishlistlink[_2]&set_wishlistlink()&".&mt('Save a link for this resource in your personal Stored Links repository'), - evaluate => "s&8&1&eval.png&$icon_text{'evaluate'}&this[_1]&gopost('/adm/evaluate',currentURL,1)&".&mt('Provide my evaluation of this resource'), - feedback => "s&8&2&fdbk.png&$icon_text{'feedback'}&discuss[_1]&gopost('/adm/feedback',currentURL,1)&".&mt('Provide feedback messages or contribute to the course discussion about this resource'), - annotate => "s&9&3&anot.png&$icon_text{'annotate'}&tations[_1]&annotate()&".&mt('Make notes and annotations about this resource'), - catalog => "s&6&3&catalog.png&$icon_text{'catalog'}&info[_1]&catalog_info()&".&mt('Show Metadata'), + printout => "s&8&3&prt.png&$icon_text{'printout'}&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document", + wishlist => "s&9&1&wishlist-link.png&$icon_text{'wishlist'}&wishlistlink[_2]&set_wishlistlink()&Save a link for this resource in your personal Stored Links repository", + evaluate => "s&8&1&eval.png&$icon_text{'evaluate'}&this[_1]&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource", + feedback => "s&8&2&fdbk.png&$icon_text{'feedback'}&discuss[_1]&gopost('/adm/feedback',currentURL,1)&Provide feedback messages or contribute to the course discussion about this resource", + annotate => "s&9&3&anot.png&$icon_text{'annotate'}&tations[_1]&annotate()&Make notes and annotations about this resource", + catalog => "s&6&3&catalog.png&$icon_text{'catalog'}&info[_1]&catalog_info()&Show Metadata", ); my @toolsorder = qw(annotate wishlist evaluate feedback printout catalog); return (\%inlinetools,\@toolsorder); @@ -716,13 +807,11 @@ sub domcoordchanger { if ($userenv{'domcoord.author'} eq 'blocked') { $constchecked=' checked="checked"'; } - my $text=&mt('By default, the Domain Coordinator can enter your Authoring Space.'); - my $construction=&mt('Block access to Authoring Space'); + my $text=&mt('By default, the Domain Coordinator can enter your construction space.'); + my $construction=&mt('Block access to construction space'); my $change=&mt('Save'); - my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\''); $r->print(< - $text

@@ -745,13 +834,9 @@ sub verify_and_change_domcoord { } else { $status=&mt('off'); } - my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Block access to Authoring Space').'',''.$status.'')); + my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Block access to construction space').'',''.$status.'')); $message=&Apache::loncommon::confirmwrapper($message); - if ($env{'form.returnurl'}) { - &do_redirect($r,$env{'form.returnurl'},$message); - } else { - &print_main_menu($r,$message); - } + &print_main_menu($r,$message); } ################################################################# @@ -765,7 +850,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'); @@ -807,15 +892,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'}); @@ -919,7 +1004,7 @@ ENDMSG '" onclick="javscript:delete_address('."'$num'".')" />'. &mt('Delete').''. ''; my %chk; if (defined($allnot{$item}{'crit'})) { @@ -968,7 +1053,7 @@ ENDMSG ''.&mt('Add new address').''. ''; + '" onFocus="javascript:new_address('."'$num'".')" />'; foreach my $type ('all','crit','reg') { $output .= '\n

    ",$caller,$mailtoken); + return; } # Get the keys my $lonhost = $r->dir_config('lonHostID'); @@ -1670,17 +1630,13 @@ sub verify_and_change_password {

    ENDERROR # Probably should log an error here - if ($caller eq 'reset_by_email') { - return 'internalerror'; - } else { - return; - } + return 1; } my ($ckey,$n1key,$n2key)=split(/&/,$tmpinfo); - # - $currentpass = &Apache::loncommon::des_decrypt($ckey ,$currentpass); - $newpass1 = &Apache::loncommon::des_decrypt($n1key,$newpass1); - $newpass2 = &Apache::loncommon::des_decrypt($n2key,$newpass2); + # + $currentpass = &des_decrypt($ckey ,$currentpass); + $newpass1 = &des_decrypt($n1key,$newpass1); + $newpass2 = &des_decrypt($n2key,$newpass2); # if ($caller eq 'reset_by_email') { my %data = &Apache::lonnet::tmpget($mailtoken); @@ -1688,53 +1644,30 @@ ENDERROR &passwordchanger($r, ''. &mt('Could not verify current authentication.').' '. - &mt('Please try again.').'',$caller,$mailtoken,$timelimit,$extrafields); - return 'emptydata'; + &mt('Please try again.').'',$caller,$mailtoken); + return 1; } if ($currentpass ne $data{'temppasswd'}) { &passwordchanger($r, ''. &mt('Could not verify current authentication.').' '. - &mt('Please try again.').'',$caller,$mailtoken,$timelimit,$extrafields); - return 'missingtemp'; + &mt('Please try again.').'',$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,$timelimit,$extrafields); - if ($caller eq 'reset_by_email') { - return 'mismatch'; - } else { - return; - } + &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,$timelimit,$extrafields); - if ($caller eq 'reset_by_email') { - return 'length'; - } else { - return; - } - } - } else { - my $warning = &Apache::loncommon::check_passwd_rules($domain,$newpass1); - if ($warning) { - &passwordchanger($r,''. - $warning. - &mt('Please try again.').'', - $caller,$mailtoken,$timelimit,$extrafields); - if ($caller eq 'reset_by_email') { - return 'rules'; - } else { - return; - } - } + if (length($newpass1) < 7) { + &passwordchanger($r, + ''. + &mt('Passwords must be a minimum of 7 characters long.').' '. + &mt('Please try again.').'',$caller,$mailtoken); + return 1; } # # Check for bad characters @@ -1753,12 +1686,8 @@ ENDERROR ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_\`abcdefghijklmnopqrstuvwxyz{|}~ ENDERROR - &passwordchanger($r,$errormessage,$caller,$mailtoken,$timelimit,$extrafields); - if ($caller eq 'reset_by_email') { - return 'badchars'; - } else { - return; - } + &passwordchanger($r,$errormessage,$caller,$mailtoken); + return 1; } # # Change the password (finally) @@ -1773,32 +1702,20 @@ ENDERROR $r->print($message.'
    '); } else { &print_main_menu($r, $message); - if (ref($ended)) { - $$ended = 1; - } } } else { # error error: run in circles, scream and shout if ($caller eq 'reset_by_email') { if (!$result) { - return 'error'; + return 1; } else { return $result; } } else { - my $feedback; - if ($result eq 'prioruse') { - $feedback = &mt('Please enter a password that you have not used recently.'); - } else { - $feedback = &mt('Please make sure your old password was entered correctly.'); - } $message = &Apache::lonhtmlcommon::confirm_success( - &mt("The password for user [_1] was not changed.",''.$user.'').' '.$feedback,1); + &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; @@ -1932,7 +1849,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 cease to be identified as "NEW" after display.')).'
    '; + $message.=&Apache::lonhtmlcommon::confirm_success(&mt('In discussions: new posts will be cease to be identified as "NEW" after display.')).'
    '; &Apache::lonnet::put('environment',{'discmarkread' => $newmark}); &Apache::lonnet::appenv({'environment.discmarkread' => $newmark}); } else { @@ -2034,282 +1951,15 @@ 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) { - my ($showdomdefs,$js,$args,@items); - my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\''); - my $reqdmajor = 2; - my $reqdminor = 12; - my $loncaparev = &Apache::lonnet::get_server_loncaparev($env{'user.domain'},$env{'user.home'}); - my ($major,$minor) = ($loncaparev =~ /^\'?(\d+)\.(\d+)\.[\w.\-]+\'?$/); - unless (($major eq '' && $minor eq '') || - ($reqdmajor > $major) || (($reqdmajor == $major) && ($reqdminor > $minor))) { - @items = ('nocodemirror','copyright','sourceavail'); - $showdomdefs = 1; - $js = &toggle_options_js(); - my $onload; - foreach my $item (@items) { - $onload .= "javascript:toggleOptions(document.prefs,'$item','user_$item');" - } - $args = { 'add_entries' => { 'onload' => $onload } }; - } - $r->print(Apache::loncommon::start_page('Authoring Space Settings',$js,$args)); - $r->print(Apache::lonhtmlcommon::breadcrumbs('Authoring Space Settings')); - if ($showdomdefs) { - my %userenv = &Apache::lonnet::get('environment',\@items); - my %domdefs = &Apache::lonnet::get_domain_defaults($domain); - my %staticdefaults = ( - 'nocodemirror' => '0', - 'copyright' => 'default', - 'sourceavail' => 'closed', - ); - my %lt = &authoring_settings_text(); - my %titles = &authoring_settings_titles(); - $r->print("

    $lt{'auss'}



    \n". - ''."\n". - ''."\n". - ''."\n"); - foreach my $item (@items) { - my ($domdef,$checkeddom,$checkeduser,$domdefdisplay,$divsty,$userelem); - $checkeddom = ' checked="checked"'; - $divsty = 'display:none'; - if (exists($domdefs{$item})) { - $domdef = $domdefs{$item}; - } else { - $domdef = $staticdefaults{$item}; - } - if ($item eq 'copyright') { - $domdefdisplay = &Apache::loncommon::copyrightdescription($domdef); - $userelem = &selectbox('userchoice_'.$item,$userenv{$item},'', - \&Apache::loncommon::copyrightdescription, - (grep !/^priv|custom$/,(&Apache::loncommon::copyrightids))); - } elsif ($item eq 'sourceavail') { - $domdefdisplay = &Apache::loncommon::source_copyrightdescription($domdef); - $userelem = &selectbox('userchoice_'.$item,$userenv{$item},'', - \&Apache::loncommon::source_copyrightdescription, - (&Apache::loncommon::source_copyrightids)); - } elsif ($item eq 'nocodemirror') { - if ($domdef) { - $domdefdisplay = $lt{'yes'}; - } else { - $domdefdisplay = $lt{'no'}; - } - my %checked; - $checked{'no'} = ' checked="checked"'; - if ($userenv{$item} eq 'yes') { - $checked{'yes'} = $checked{'no'}; - $checked{'no'} = ''; - } - $userelem = ''; - foreach my $choice ('yes','no') { - $userelem .= '   '; - } - $userelem .= ''; - } - if ($userenv{$item} ne '') { - $checkeduser = $checkeddom; - $checkeddom = ''; - $divsty = 'display:inline-block'; - } - $r->print(<<"END"); -

    $titles{$item}

    -

    $lt{'curd'}: $domdefdisplay

    -

    -    -

    -
    -$lt{'ousv'} -$userelem -


    -END - } - $r->print('
    '. - ''. - ''."\n"); - } else { - 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'); - $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 $message; - if (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'); - } - $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]',''.&mt('Deactivate CodeMirror in Authoring Space').'',''.$status.'')); - $message=&Apache::loncommon::confirmwrapper($message); - } else { - my @items = ('nocodemirror','copyright','sourceavail'); - my %oldsettings = &Apache::lonnet::get('environment',\@items); - my %domdefs = &Apache::lonnet::get_domain_defaults($domain); - my %lt = &authoring_settings_text(); - my %titles = &authoring_settings_titles(); - my ($result,%newsettings,%changes,@delete,@unchanged,@delerrors,@adderrors); - foreach my $item (@items) { - if ($env{'form.'.$item} eq 'dom') { - if ($oldsettings{$item} eq '') { - push(@unchanged,$item); - } else { - push(@delete,$item); - } - } elsif ($env{'form.'.$item} eq 'user') { - my $newval = $env{'form.userchoice_'.$item}; - my @possibles; - if ($item eq 'nocodemirror') { - if ($newval =~ /^yes|no$/) { - $newsettings{$item} = $newval; - } - } elsif ($item eq 'copyright') { - @possibles = (grep !/^priv|custom$/,(&Apache::loncommon::copyrightids)); - if (grep(/^\Q$newval\E$/,@possibles)) { - $newsettings{$item} = $newval; - } - } elsif ($item eq 'sourceavail') { - @possibles = (&Apache::loncommon::source_copyrightids); - if (grep(/^\Q$newval\E$/,@possibles)) { - $newsettings{$item} = $newval; - } - } - if ($oldsettings{$item} eq $newsettings{$item}) { - push(@unchanged,$item); - } else { - $changes{$item} = $newsettings{$item}; - } - } - } - if (@delete) { - if (&Apache::lonnet::del('environment',\@delete) eq 'ok') { - foreach my $key (@delete) { - &Apache::lonnet::delenv('environment.'.$key); - } - } else { - @delerrors = @delete; - } - } - if (keys(%changes)) { - if (&Apache::lonnet::put('environment',\%changes) eq 'ok') { - my %newenvhash; - map {$newenvhash{'environment.'.$_} = $changes{$_}; } (keys(%changes)); - &Apache::lonnet::appenv(\%newenvhash); - } else { - foreach my $item (@items) { - if (exists($changes{$item})) { - push(@adderrors,$item); - } - } - } - } - if (@adderrors) { - $result = &mt('An error occurred when saving user-specific settings for').': '. - join(', ', map { $titles{$_} } @adderrors); - $message = &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result,1)); - } elsif (keys(%changes)) { - $result = &mt('User-specific settings saved:').'
      '; - foreach my $item (@items) { - next unless (exists($changes{$item})); - my $value = $changes{$item}; - if ($item eq 'nocodemirror') { - $value = $lt{$changes{$item}}; - } elsif ($item eq 'copyright') { - $value = &Apache::loncommon::copyrightdescription($changes{$item}); - } elsif ($item eq 'sourceavail') { - $value = &Apache::loncommon::source_copyrightdescription($changes{$item}); - } - $result .= '
    • '. - &mt('[_1] set to [_2]', - $titles{$item}, - ''.$value.''). - '
    • '; - } - $result .= '
    '; - $message = &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result)); - } - if (@delerrors) { - $result = &mt('An error occurred when deleting user-specific settings for').':
    • '. - join('
    • ', map { $titles{$_} } @delerrors).'
    '; - $message .= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result,1)); - } elsif (@delete) { - $result = &mt('Set use of domain default for').':
    • '. - join('
    • ', map { $titles{$_} } @delete).'
    '; - $message .= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result)); - } - if (@unchanged) { - $result = &mt('No changes made for').':
    • '. - join('
    • ', map { $titles{$_} } @unchanged).'
    '; - $message .= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($result)); - } - } - if ($env{'form.returnurl'}) { - &do_redirect($r,$env{'form.returnurl'},$message); - } else { - &print_main_menu($r,$message); - } - } -} - -sub authoring_settings_text { - return &Apache::lonlocal::texthash( - 'auss' => 'Authoring Space Settings', - 'used' => 'Use domain default', - 'usyo' => 'Use your own user-specific setting', - 'curd' => 'Current domain default is', - 'ousv' => 'Own user-specific value', - 'save' => 'Save', - 'yes' => 'Deactivated', - 'no' => 'Activated', - ); -} - -sub authoring_settings_titles { - return &Apache::lonlocal::texthash( - 'nocodemirror' => 'CodeMirror for EditXML editor', - 'copyright' => 'Default Copyright/Distribution in new metadata file', - 'sourceavail' => 'Default Source Available in new metadata file', - ); -} - sub lockednameschanger { my $r = shift; + &Apache::lonhtmlcommon::add_breadcrumb( + { href => '/adm/preferences?action=changelockednames', + text => 'Automatic name changes'}); + $r->print(Apache::loncommon::start_page('Automatic name changes')); + $r->print(Apache::lonhtmlcommon::breadcrumbs('Allow/disallow name updates')); my %userenv = &Apache::lonnet::get('environment',['lockedname']); my $lockedname=''; - my $ended; if (&can_toggle_namelocking()) { if ($userenv{'lockedname'}) { $lockedname = ' checked="checked"'; @@ -2327,11 +1977,6 @@ sub lockednameschanger { } } if (keys(%updateable)) { - &Apache::lonhtmlcommon::add_breadcrumb( - { href => '/adm/preferences?action=changelockednames', - text => 'Automatic name changes'}); - $r->print(Apache::loncommon::start_page('Automatic name changes')); - $r->print(Apache::lonhtmlcommon::breadcrumbs('Allow/disallow name updates')); my %longnames = &Apache::lonlocal::texthash ( firstname => 'First Name', middlename => 'Middle Name', @@ -2358,14 +2003,11 @@ ENDSCREEN } else { my $message = &mt('Based on your institutional affiliation no name information is automatically updated for your LON-CAPA account.'); &print_main_menu($r,$message); - $ended = 1; } } else { my $message = &mt('You are not permitted to set a user preference for automatic name updates for your LON-CAPA account.'); &print_main_menu($r,$message); - $ended = 1; } - return $ended; } sub verify_and_change_lockednames { @@ -2396,90 +2038,6 @@ sub verify_and_change_lockednames { &print_main_menu($r,$message); } -sub timezonechanger { - my $r = shift; - my $uname = $env{'user.name'}; - my $udom = $env{'user.domain'}; - if (&Apache::lonnet::usertools_access($uname,$udom,'timezone')) { - my $js = &toggle_options_js(); - my %loaditems = ( - onload => "javascript:toggleOptions(document.prefs,'settimezone','LC_timezone_selector');", - ); - my $args = { 'add_entries' => \%loaditems }; - &Apache::lonhtmlcommon::add_breadcrumb( - { href => '/adm/preferences?action=', - text => 'Set Your Time Zone'}); - $r->print(Apache::loncommon::start_page('Set Your Time Zone',$js,$args)); - $r->print(Apache::lonhtmlcommon::breadcrumbs('Set Your Time Zone')); - my %userenv = &Apache::lonnet::get('environment',['timezone']); - my $timezone = $userenv{'timezone'}; - my %lt = &Apache::lonlocal::texthash( - lctz => 'Use Time Zone set by LON-CAPA', - owntz => 'Use Time Zone set by you', - save => 'Save', - ); - my (%checked,$tzsty); - if ($userenv{'timezone'} ne '') { - $checked{'owntz'} = ' checked="checked"'; - $tzsty = 'inline-block'; - } else { - $checked{'lctz'} = ' checked="checked"'; - $tzsty = 'none'; - } - my $onclick = ' onclick="javascript:toggleOptions(this.form,'."'settimezone','LC_timezone_selector'".');"'; - my $selector = &Apache::loncommon::select_timezone('timezone',$timezone,undef,1); - $r->print(<<"END"); -
    - - -     -
      -$selector -


    - -
    -END - } - return; -} - -sub verify_and_change_timezone { - my $r = shift; - my $currtimezone = $env{'environment.timezone'}; - my $newtimezone; - if ($env{'form.settimezone'}) { - $newtimezone = $env{'form.timezone'}; - if (DateTime::TimeZone->is_valid_name($env{'form.timezone'})) { - $newtimezone = $env{'form.timezone'}; - } - } - my $message=''; - if ($newtimezone) { - if ($newtimezone eq $currtimezone) { - $message = &mt('Time Zone settings unchanged'); - } else { - &Apache::lonnet::put('environment',{'timezone' => $newtimezone}); - &Apache::lonnet::appenv({'environment.timezone' => $newtimezone}); - $message=&Apache::lonhtmlcommon::confirm_success( - &mt('Set [_1] to [_2]', - ''.&mt('Your Time Zone').'', - '"'.$newtimezone.'".')). - '
    '; - } - } elsif ($currtimezone) { - &Apache::lonnet::del('environment',['timezone']); - &Apache::lonnet::delenv('environment.timezone'); - $message=&Apache::lonhtmlcommon::confirm_success(&mt('Time Zone now set by LON-CAPA')); - } else { - $message = &mt('Time Zone settings unchanged'); - } - $message=&Apache::loncommon::confirmwrapper($message); - &print_main_menu($r,$message); - return; -} - sub print_main_menu { my ($r, $message) = @_; # Determine current authentication method @@ -2494,11 +2052,6 @@ my %permissions; if (&Apache::lonnet::usertools_access($user,$domain,'aboutme')) { $permissions{'aboutme'} = 'F'; } -if (&Apache::lonnet::usertools_access($user,$domain,'timezone')) { - $permissions{'timezone'} = 'F'; -} -my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au']); -my %author_coauthor_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']); my @menu= ({ categorytitle=>'Personal Data', items =>[ @@ -2541,14 +2094,6 @@ my @menu= icon => 'dismath.png', linktitle => 'Change how math is displayed.' }, - { - linktext => 'Time Zone', - url => '/adm/preferences?action=changetimezone', - permission => $permissions{'timezone'}, - #help => '', - icon => 'timezone.png', - linktitle => 'Set your time zone.', - } ] }, { categorytitle=>'Page Display Settings', @@ -2587,33 +2132,6 @@ my @menu= }, ] }, - ); -if (keys(%author_coauthor_roles) > 0) { - push(@menu, - { categorytitle=>'Authoring Settings', - items => [ - { - linktext => 'Authoring Space Configuration', - url => '/adm/preferences?action=authorsettings', - permission => 'F', - icon => 'codemirror.png', - linktitle => 'Settings for your authoring space.', - }, - ] - }, - ); - if (keys(%author_roles) > 0) { - push(@{ $menu[4]->{items} }, { - linktext => 'Restrict Domain Coordinator Access', - url => '/adm/preferences?action=changedomcoord', - permission => 'F', - #help => '', - icon => 'system-lock-screen.png', - linktitle => 'Restrict domain coordinator access.', - }); - } -} -push(@menu, { categorytitle=>'Other', items =>[ { linktext => 'Register Response Devices ("Clickers")', @@ -2628,7 +2146,7 @@ push(@menu, ); if ($currentauth =~ /^(unix|internal):/) { - push(@{ $menu[0]->{items} }, { +push(@{ $menu[0]->{items} }, { linktext => 'Password', url => '/adm/preferences?action=changepass', permission => 'F', @@ -2637,25 +2155,6 @@ push(@menu, linktitle => 'Change your password.', }); } - if ($env{'environment.remote'} eq 'off') { - push(@{ $menu[1]->{items} }, { - linktext => 'Launch Remote Control', - url => '/adm/remote?url=/adm/preferences&action=launch', - permission => 'F', - #help => '', - icon => 'remotecontrol.png', - linktitle => 'Launch the remote control for LON-CAPA.', - }); - }else{ -push(@{ $menu[1]->{items} }, { - linktext => 'Collapse Remote Control', - url => '/adm/remote?url=/adm/preferences&action=collapse', - permission => 'F', - #help => '', - icon => 'remotecontrol.png', - linktitle => 'Collapse the remote control for LON-CAPA.', - }); - } if (&can_toggle_namelocking()) { push(@{ $menu[0]->{items} }, { @@ -2668,10 +2167,22 @@ push(@{ $menu[1]->{items} }, { }); } + my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au']); + if (keys(%author_roles) > 0) { +push(@{ $menu[4]->{items} }, { + linktext => 'Restrict Domain Coordinator Access', + url => '/adm/preferences?action=changedomcoord', + permission => 'F', + #help => '', + icon => 'system-lock-screen.png', + linktitle => 'Restrict domain coordinator access.', + }); + } + if (&Apache::lonnet::allowed('whn',$env{'request.course.id'}) || &Apache::lonnet::allowed('whn',$env{'request.course.id'}.'/' .$env{'request.course.sec'})) { -push(@{ $menu[-1]->{items} }, { +push(@{ $menu[4]->{items} }, { linktext => 'Course Initialization', url => '/adm/preferences?action=changecourseinit', permission => 'F', @@ -2681,9 +2192,8 @@ push(@{ $menu[-1]->{items} }, { }); } - if (&can_toggle_debug()) { -push(@{ $menu[-1]->{items} }, { +push(@{ $menu[4]->{items} }, { linktext => 'Toggle Debug Messages (Currently '.($env{'user.debug'} ? 'on)' : 'off)'), url => '/adm/preferences?action=debugtoggle', permission => 'F', @@ -2719,26 +2229,14 @@ sub handler { ['action','wysiwyg','returnurl','refpage']); # Apache::lonhtmlcommon::clear_breadcrumbs(); - my ($brlink,$brtxt,$brhelp,$ended); + my ($brlink,$brtxt,$brhelp); 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'; - $brhelp = 'Prefs_About_Me,Prefs_Language,Prefs_Screen_Name_Nickname,Change_Colors,Change_Password,Prefs_Messages,Change_Discussion_Display'; + $brhelp = 'Prefs_About_Me,Prefs_Language,Prefs_Screen_Name_Nickname,Change_Colors,Change_Password,Prefs_Messages,Change_Discussion_Display'; } Apache::lonhtmlcommon::add_breadcrumb ({href => $brlink, @@ -2746,16 +2244,14 @@ sub handler { help => $brhelp,}); if(!exists $env{'form.action'}) { &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,'preferences','','','',\$ended); + &verify_and_change_password($r); }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'){ @@ -2764,47 +2260,38 @@ 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'){ @@ -2813,33 +2300,22 @@ 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') { - $ended = &lockednameschanger($r); + &lockednameschanger($r); } elsif ($env{'form.action'} eq 'verify_and_change_lockednames') { &verify_and_change_lockednames($r); - $ended = 1; - } elsif ($env{'form.action'} eq 'changetimezone') { - &timezonechanger($r); - } elsif ($env{'form.action'} eq 'verify_and_change_timezone') { - &verify_and_change_timezone($r); } # 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 ($ended) { + unless (!exists $env{'form.action'} || + $env{'form.action'} eq 'debugtoggle') { $r->print(&Apache::loncommon::end_page()); } @@ -2912,69 +2388,5 @@ sub updateable_userinfo { return %updateable; } -sub do_redirect { - my ($r,$url,$msg) = @_; - $r->print( - &Apache::loncommon::start_page('Loading ...',undef, - {'redirect' => [2,$url]}). - '
    '."\n". - "$msg\n". - &Apache::loncommon::end_page()); - return; -} - -sub toggle_options_js { - return <<"ENDSCRIPT"; - -ENDSCRIPT -} - -sub selectbox { - my ($name,$value,$readonly,$functionref,@idlist)=@_; - my $selout = ''; - return $selout; -} - 1; __END__