--- loncom/interface/lonpreferences.pm 2001/01/03 16:20:59 1.1 +++ loncom/interface/lonpreferences.pm 2005/06/06 02:32:36 1.61 @@ -1,41 +1,1248 @@ # The LearningOnline Network # Preferences # -# (Internal Server Error Handler +# $Id: lonpreferences.pm,v 1.61 2005/06/06 02:32:36 albertel Exp $ # -# (Login Screen -# 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14, -# 1/14/00,5/29,5/30,6/1,6/29,7/1,11/9 Gerd Kortemeyer) +# Copyright Michigan State University Board of Trustees # -# 3/1/1 Gerd Kortemeyer) +# This file is part of the LearningOnline Network with CAPA (LON-CAPA). # -# 3/1 Gerd Kortemeyer +# LON-CAPA is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. # +# LON-CAPA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# 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 +# +# /home/httpd/html/adm/gpl.txt +# +# http://www.lon-capa.org/ +# +# 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 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; + +# +# 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 # +################################################################ + +################################################################ +# Language Change Subroutines # +################################################################ + +sub wysiwygchanger { + my $r = shift; + my %userenv = &Apache::lonnet::get + ('environment',['wysiwygeditor']); + my $offselect=''; + my $onselect='checked="1"'; + if ($userenv{'wysiwygeditor'}) { + $onselect=''; + $offselect='checked="1"'; + } + my $switchoff=&mt('Disable WYSIWYG editor'); + my $switchon=&mt('Enable WYSIWYG editor'); + $r->print(< + +
+ $switchoff
+ $switchon +ENDLSCREEN + $r->print('
'); +} + + +sub verify_and_change_wysiwyg { + my $r = shift; + my $newsetting=$env{'form.wysiwyg'}; + &Apache::lonnet::put('environment',{'wysiwygeditor' => $newsetting}); + &Apache::lonnet::appenv('environment.wysiwygeditor' => $newsetting); + $r->print('

'.&mt('Setting WYSIWYG editor to:').' '.&mt($newsetting).'

'); +} + +################################################################ +# Language Change Subroutines # +################################################################ +sub languagechanger { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + 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($_); + } + } + my $selectionbox=&Apache::loncommon::select_form($language,'language', + %langchoices); + $r->print(< + +
$pref: $selectionbox +ENDLSCREEN + $r->print('
'); +} + + +sub verify_and_change_languages { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; +# Screenname + my $newlanguage = $env{'form.language'}; + $newlanguage=~s/[^\-\w]//g; + my $message=''; + if ($newlanguage) { + &Apache::lonnet::put('environment',{'languages' => $newlanguage}); + &Apache::lonnet::appenv('environment.languages' => $newlanguage); + $message='Set new preferred languages to '.$newlanguage; + } else { + &Apache::lonnet::del('environment',['languages']); + &Apache::lonnet::delenv('environment\.languages'); + $message='Reset preferred language'; + } + $r->print(< 'No Preference', + 'tth' => 'TeX to HTML', + 'ttm' => 'TeX to MathML', + 'jsMath' => 'jsMath', + 'mimetex' => 'Convert to Images' + ); + my $selectionbox=&Apache::loncommon::select_form($texengine,'texengine', + %mathchoices); + my $mathexample='$$\int\left(\frac{a+b}{c^6*d}\right)$$'; + my $jsMath_example=&Apache::lontexconvert::jsMath_converted(\$mathexample); + $mathexample='$$\int\left(\frac{a+b}{c^6*d}\right)$$'; + my $tth_example=&Apache::lontexconvert::tth_converted(\$mathexample); + $mathexample='$$\int\left(\frac{a+b}{c^6*d}\right)$$'; + my $mimetex_example=&Apache::lontexconvert::mimetex_converted(\$mathexample); + my $change=&mt('Change'); + $r->print(< + +

$pref: $selectionbox

+

+ +Examples: +

TeX to HTML
$tth_example

+ + +

jsMath
+ + + +$jsMath_example

+

Convert to Images
$mimetex_example

+ENDLSCREEN + if ($env{'environment.texengine'} ne 'jsMath') { + $r->print(''); + } +} + + +sub verify_and_change_texengine { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; +# Screenname + my $newtexengine = $env{'form.texengine'}; + $newtexengine=~s/[^\-\w]//g; + if ($newtexengine eq 'ttm') { + &Apache::lonnet::appenv('browser.mathml' => 1); + } else { + if ($env{'environment.texengine'} eq 'ttm') { + &Apache::lonnet::appenv('browser.mathml' => 0); + } + } + my $message=''; + if ($newtexengine) { + &Apache::lonnet::put('environment',{'texengine' => $newtexengine}); + &Apache::lonnet::appenv('environment.texengine' => $newtexengine); + $message='Set new preferred math display to '.$newtexengine; + } else { + &Apache::lonnet::del('environment',['texengine']); + &Apache::lonnet::delenv('environment\.texengine'); + $message='Reset preferred math display.'; + } + + + $r->print(<print(<Some LON-CAPA users have a long list of roles. The Recent Roles Hotlist +feature keeps track of the last N roles which have been +visited and places a table of these at the top of the roles page. +People with very few roles should leave this feature disabled. +

+ +
+ +
Enable Recent Roles Hotlist: + +
Number of roles in Hotlist: + +
+ +
+ENDSCREEN +} + +sub verify_and_change_rolespref { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; +# Recent Roles Hotlist Flag + my $hotlist_flag = $env{'form.recentroles'}; + my $hotlist_n = $env{'form.recentrolesn'}; + my $message=''; + if ($hotlist_flag) { + &Apache::lonnet::put('environment',{'recentroles' => $hotlist_flag}); + &Apache::lonnet::appenv('environment.recentroles' => $hotlist_flag); + $message='Recent Roles Hotlist is Enabled'; + } else { + &Apache::lonnet::del('environment',['recentroles']); + &Apache::lonnet::delenv('environment\.recentroles'); + $message='Recent Roles Hotlist is Disabled'; + } + if ($hotlist_n) { + &Apache::lonnet::put('environment',{'recentrolesn' => $hotlist_n}); + &Apache::lonnet::appenv('environment.recentrolesn' => $hotlist_n); + if ($hotlist_flag) { + $message.="
Display $hotlist_n Most Recent Roles\n"; + } + } + + $r->print(<print(< + +
New screenname (shown if you post anonymously): + +
New nickname (shown if you post non-anonymously): + + + +ENDSCREEN +} + +sub verify_and_change_screenname { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; +# Screenname + my $newscreen = $env{'form.screenname'}; + $newscreen=~s/[^ \w]//g; + my $message=''; + if ($newscreen) { + &Apache::lonnet::put('environment',{'screenname' => $newscreen}); + &Apache::lonnet::appenv('environment.screenname' => $newscreen); + $message='Set new screenname to '.$newscreen; + } else { + &Apache::lonnet::del('environment',['screenname']); + &Apache::lonnet::delenv('environment\.screenname'); + $message='Reset screenname'; + } +# Nickname + $message.='
'; + $newscreen = $env{'form.nickname'}; + $newscreen=~s/[^ \w]//g; + if ($newscreen) { + &Apache::lonnet::put('environment',{'nickname' => $newscreen}); + &Apache::lonnet::appenv('environment.nickname' => $newscreen); + $message.='Set new nickname to '.$newscreen; + } else { + &Apache::lonnet::del('environment',['nickname']); + &Apache::lonnet::delenv('environment\.nickname'); + $message.='Reset nickname'; + } + + $r->print(<print(< +
+ +New Forwarding Address(es) (user:domain,user:domain,...): +
+New Message Notification Email Address(es) (joe\@doe.com,jane\@doe.edu,...): +
+New Critical Message Notification Email Address(es) (joe\@doe.com,jane\@doe.edu,...): +$criticalMessageHelp
+ +
+ENDMSG +} + +sub verify_and_change_msgforward { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my $newscreen = ''; + my $message=''; + foreach (split(/\,/,$env{'form.msgforward'})) { + my ($msuser,$msdomain)=split(/[\@\:]/,$_); + $msuser=~s/\W//g; + $msdomain=~s/\W//g; + if (($msuser) && ($msdomain)) { + if (&Apache::lonnet::homeserver($msuser,$msdomain) ne 'no_host') { + $newscreen.=$msuser.':'.$msdomain.','; + } else { + $message.='No such user: '.$msuser.':'.$msdomain.'
'; + } + } + } + $newscreen=~s/\,$//; + if ($newscreen) { + &Apache::lonnet::put('environment',{'msgforward' => $newscreen}); + &Apache::lonnet::appenv('environment.msgforward' => $newscreen); + $message.='Set new message forwarding to '.$newscreen.'
'; + } else { + &Apache::lonnet::del('environment',['msgforward']); + &Apache::lonnet::delenv('environment\.msgforward'); + $message.='Reset message forwarding
'; + } + my $notification=$env{'form.notification'}; + $notification=~s/\s//gs; + if ($notification) { + &Apache::lonnet::put('environment',{'notification' => $notification}); + &Apache::lonnet::appenv('environment.notification' => $notification); + $message.='Set message notification address to '.$notification.'
'; + } else { + &Apache::lonnet::del('environment',['notification']); + &Apache::lonnet::delenv('environment\.notification'); + $message.='Reset message notification
'; + } + my $critnotification=$env{'form.critnotification'}; + $critnotification=~s/\s//gs; + if ($critnotification) { + &Apache::lonnet::put('environment',{'critnotification' => $critnotification}); + &Apache::lonnet::appenv('environment.critnotification' => $critnotification); + $message.='Set critical message notification address to '.$critnotification; + } else { + &Apache::lonnet::del('environment',['critnotification']); + &Apache::lonnet::delenv('environment\.critnotification'); + $message.='Reset critical message notification
'; + } + $r->print(< 'Page Background', + 'tabbg' => 'Header Background', + 'sidebg'=> 'Header Border', + 'font' => 'Font', + 'link' => 'Un-Visited Link', + 'vlink' => 'Visited Link', + 'alink' => 'Active Link'); + my $chtable=''; + foreach my $item (sort(keys(%colortypes))) { + my $curcol=&Apache::loncommon::designparm($function.'.'.$item,$domain); + $chtable.=''.$colortypes{$item}.'      Select'; + } + my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition(); + $r->print(< + + function pclose() { + parmwin=window.open("/adm/rat/empty.html","LONCAPAparms", + "height=350,width=350,scrollbars=no,menubar=no"); + parmwin.close(); + } + + $pjump_def + + function psub() { + pclose(); + if (document.parmform.pres_marker.value!='') { + if (document.parmform.pres_type.value!='') { + eval('document.server.'+ + document.parmform.pres_marker.value+ + '.value=document.parmform.pres_value.value;'); + } + } else { + document.parmform.pres_value.value=''; + document.parmform.pres_marker.value=''; + } + } + + + +
+ + + +
+
+ + +$chtable +
+ + +
+ENDCOL +} + +sub verify_and_change_colors { + my $r = shift; +# figure out colors + my $function='student'; + if ($env{'request.role'}=~/^(cc|in|ta|ep)/) { + $function='coordinator'; + } + if ($env{'request.role'}=~/^(su|dc|ad|li)/) { + $function='admin'; + } + if (($env{'request.role'}=~/^(au|ca)/) || + ($ENV{'REQUEST_URI'}=~/^(\/priv|\~)/)) { + $function='author'; + } + my $domain=&Apache::loncommon::determinedomain(); + my %colortypes=('pgbg' => 'Page Background', + 'tabbg' => 'Header Background', + 'sidebg'=> 'Header Border', + 'font' => 'Font', + 'link' => 'Un-Visited Link', + 'vlink' => 'Visited Link', + 'alink' => 'Active Link'); + + my $message=''; + foreach my $item (keys %colortypes) { + my $color=$env{'form.'.$item}; + my $entry='color.'.$function.'.'.$item; + if (($color=~/^\#[0-9A-Fa-f]{6}$/) && (!$env{'form.resetall'})) { + &Apache::lonnet::put('environment',{$entry => $color}); + &Apache::lonnet::appenv('environment.'.$entry => $color); + $message.='Set '.$colortypes{$item}.' to '.$color.'
'; + } else { + &Apache::lonnet::del('environment',[$entry]); + &Apache::lonnet::delenv('environment\.'.$entry); + $message.='Reset '.$colortypes{$item}.'
'; + } + } + $r->print(< + + +ENDVCCOL +} + +###################################################### +# password handler subroutines # +###################################################### +sub passwordchanger { + # This function is a bit of a mess.... + # Passwords are encrypted using londes.js (DES encryption) + my $r = shift; + my $errormessage = shift; + $errormessage = ($errormessage || ''); + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my $homeserver = $env{'user.home'}; + my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain); + # Check for authentication types that allow changing of the password. + return if ($currentauth !~ /^(unix|internal):/); + # + # Generate keys + my ($lkey_cpass ,$ukey_cpass ) = &des_keys(); + my ($lkey_npass1,$ukey_npass1) = &des_keys(); + my ($lkey_npass2,$ukey_npass2) = &des_keys(); + # Store the keys in the log files + my $lonhost = $r->dir_config('lonHostID'); + my $logtoken=Apache::lonnet::reply('tmpput:' + .$ukey_cpass . $lkey_cpass .'&' + .$ukey_npass1 . $lkey_npass1.'&' + .$ukey_npass2 . $lkey_npass2, + $lonhost); + # Hexify the keys for output as javascript variables + $ukey_cpass = hex($ukey_cpass); + $lkey_cpass = hex($lkey_cpass); + $ukey_npass1= hex($ukey_npass1); + $lkey_npass1= hex($lkey_npass1); + $ukey_npass2= hex($ukey_npass2); + $lkey_npass2= hex($lkey_npass2); + # Output javascript to deal with passwords + # Output DES javascript + my $html=&Apache::lonxml::xmlbegin(); + $r->print($html.""); + { + my $include = $r->dir_config('lonIncludes'); + my $jsh=Apache::File->new($include."/londes.js"); + $r->print(<$jsh>); + } + $r->print(< + + function send() { + uextkey=this.document.client.elements.ukey_cpass.value; + lextkey=this.document.client.elements.lkey_cpass.value; + initkeys(); + + this.document.pserver.elements.currentpass.value + =crypted(this.document.client.elements.currentpass.value); + + uextkey=this.document.client.elements.ukey_npass1.value; + lextkey=this.document.client.elements.lkey_npass1.value; + initkeys(); + this.document.pserver.elements.newpass_1.value + =crypted(this.document.client.elements.newpass_1.value); + + uextkey=this.document.client.elements.ukey_npass2.value; + lextkey=this.document.client.elements.lkey_npass2.value; + initkeys(); + this.document.pserver.elements.newpass_2.value + =crypted(this.document.client.elements.newpass_2.value); + + this.document.pserver.submit(); + } + + +$errormessage + +

+ + +

+ + + + + +
+ +
+ + + + + + + +
Current password:
New password:
Confirm password:
+ +
+ + + + + + +
+

+ENDFORM + # + return; +} + +sub verify_and_change_password { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my $homeserver = $env{'user.home'}; + my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain); + # Check for authentication types that allow changing of the password. + return if ($currentauth !~ /^(unix|internal):/); + # + my $html=&Apache::lonxml::xmlbegin(); + $r->print(< +LON-CAPA Preferences: Change password for $user + +ENDHEADER + # + my $currentpass = $env{'form.currentpass'}; + my $newpass1 = $env{'form.newpass_1'}; + my $newpass2 = $env{'form.newpass_2'}; + my $logtoken = $env{'form.logtoken'}; + # Check for empty data + unless (defined($currentpass) && + defined($newpass1) && + defined($newpass2) ){ + &passwordchanger($r,"

\nERROR". + "Password data was blank.\n

"); + return; + } + # Get the keys + my $lonhost = $r->dir_config('lonHostID'); + my $tmpinfo = Apache::lonnet::reply('tmpget:'.$logtoken,$lonhost); + if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost')) { + # I do not a have a better idea about how to handle this + $r->print(< +ERROR: Unable to retrieve stored token for +password decryption. Please log out and try again. +

+ENDERROR + # Probably should log an error here + return; + } + my ($ckey,$n1key,$n2key)=split(/&/,$tmpinfo); + # + $currentpass = &des_decrypt($ckey ,$currentpass); + $newpass1 = &des_decrypt($n1key,$newpass1); + $newpass2 = &des_decrypt($n2key,$newpass2); + # + if ($newpass1 ne $newpass2) { + &passwordchanger($r, + 'ERROR:'. + 'The new passwords you entered do not match. '. + 'Please try again.'); + return; + } + if (length($newpass1) < 7) { + &passwordchanger($r, + 'ERROR:'. + 'Passwords must be a minimum of 7 characters long. '. + 'Please try again.'); + return; + } + # + # Check for bad characters + my $badpassword = 0; + foreach (split(//,$newpass1)) { + $badpassword = 1 if ((ord($_)<32)||(ord($_)>126)); + } + if ($badpassword) { + # I can't figure out how to enter bad characters on my browser. + &passwordchanger($r,<ERROR: +The password you entered contained illegal characters.
+Valid characters are: space and
+
+!"\#$%&\'()*+,-./0123456789:;<=>?\@
+ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_\`abcdefghijklmnopqrstuvwxyz{|}~
+
+ENDERROR + } + # + # Change the password (finally) + my $result = &Apache::lonnet::changepass + ($user,$domain,$currentpass,$newpass1,$homeserver); + # Inform the user the password has (not?) been changed + if ($result =~ /^ok$/) { + $r->print(<<"ENDTEXT"); +

The password for $user was successfully changed

+ENDTEXT + } else { + # error error: run in circles, scream and shout + $r->print(<The password for $user was not changed +Please make sure your old password was entered correctly. +ENDERROR + } + return; +} + +################################################################ +# discussion display subroutines +################################################################ +sub discussionchanger { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my %userenv = &Apache::lonnet::get + ('environment',['discdisplay','discmarkread']); + my $discdisp = 'allposts'; + my $discmark = 'onmark'; + + if (defined($userenv{'discdisplay'})) { + unless ($userenv{'discdisplay'} eq '') { + $discdisp = $userenv{'discdisplay'}; + } + } + if (defined($userenv{'discmarkread'})) { + unless ($userenv{'discdisplay'} eq '') { + $discmark = $userenv{'discmarkread'}; + } + } + + my $newdisp = 'unread'; + my $newmark = 'ondisp'; + + my $function = &Apache::loncommon::get_users_function(); + my $color = &Apache::loncommon::designparm($function.'.tabbg', + $env{'user.domain'}); + my %lt = &Apache::lonlocal::texthash( + 'pref' => 'Display Preference', + 'curr' => 'Current setting ', + 'actn' => 'Action', + 'sdpf' => 'Set display preferences for discussion posts for both bulletin boards and individual resources in all your courses.', + 'prca' => 'Preferences can be set that determine', + 'whpo' => 'Which posts are displayed when you display a bulletin board or resource, and', + 'unwh' => 'Under what circumstances posts are identfied as "New"', + 'allposts' => 'All posts', + 'unread' => 'New posts only', + 'ondisp' => 'Once displayed', + 'onmark' => 'Once marked as read', + 'disa' => 'Posts displayed?', + 'npmr' => 'New posts cease to be identified as "New"?', + 'thde' => 'The preferences you set here can be overridden within each individual discussion.', + 'chgt' => 'Change to ' + ); + my $dispchange = $lt{'unread'}; + my $markchange = $lt{'ondisp'}; + my $currdisp = $lt{'allposts'}; + my $currmark = $lt{'onmark'}; + + if ($discdisp eq 'unread') { + $dispchange = $lt{'allposts'}; + $currdisp = $lt{'unread'}; + $newdisp = 'allposts'; + } + + if ($discmark eq 'ondisp') { + $markchange = $lt{'onmark'}; + $currmark = $lt{'ondisp'}; + $newmark = 'onmark'; + } + + $r->print(<<"END"); +
+ +
+$lt{'sdpf'}
$lt{'prca'}
  1. $lt{'whpo'}
  2. $lt{'unwh'}
+
+
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + +
$lt{'pref'}$lt{'curr'}$lt{'actn'}?
$lt{'disa'}$lt{$discdisp} $lt{'chgt'} "$dispchange"
$lt{'npmr'}$lt{$discmark} $lt{'chgt'} "$markchange"
+
+
+
+
+ +
+
+Note: $lt{'thde'} +
+END +} + +sub verify_and_change_discussion { + my $r = shift; + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + my $message=''; + if (defined($env{'form.discdisp'}) ) { + my $newdisp = $env{'form.newdisp'}; + if ($newdisp eq 'unread') { + $message .='In discussions: only new posts will be displayed.
'; + &Apache::lonnet::put('environment',{'discdisplay' => $newdisp}); + &Apache::lonnet::appenv('environment.discdisplay' => $newdisp); + } else { + $message .= 'In discussions: all posts will be displayed.
'; + &Apache::lonnet::del('environment',['discdisplay']); + &Apache::lonnet::delenv('environment\.discdisplay'); + } + } + if (defined($env{'form.discmark'}) ) { + my $newmark = $env{'form.newmark'}; + if ($newmark eq 'ondisp') { + $message.='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 { + $message.='In discussions: posts will be identified as "new" until marked as read by the reader.
'; + &Apache::lonnet::del('environment',['discmarkread']); + &Apache::lonnet::delenv('environment\.discmarkread'); + } + } + $r->print(<content_type('text/html'); + my $user = $env{'user.name'}; + my $domain = $env{'user.domain'}; + &Apache::loncommon::content_type($r,'text/html'); + # Some pages contain DES keys and should not be cached. + &Apache::loncommon::no_cache($r); $r->send_http_header; return OK if $r->header_only; + # + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['action','wysiwyg','returnurl']); + # + &Apache::lonhtmlcommon::clear_breadcrumbs(); + &Apache::lonhtmlcommon::add_breadcrumb + ({href => '/adm/preferences', + text => 'Set User Preferences'}); -# --------------------------------------------------- Print login screen header - $r->print(< + my @Options; + # Determine current authentication method + my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain); + if ($currentauth =~ /^(unix|internal):/) { + push (@Options,({ action => 'changepass', + linktext => 'Change Password', + href => '/adm/preferences', + help => 'Change_Password', + subroutine => \&passwordchanger, + breadcrumb => + { href => '/adm/preferences?action=changepass', + text => 'Change Password'}, + }, + { action => 'verify_and_change_pass', + subroutine => \&verify_and_change_password, + breadcrumb => + { href =>'/adm/preferences?action=changepass', + text => 'Change Password'}, + printmenu => 'yes', + })); + } + push (@Options,({ action => 'changescreenname', + linktext => 'Change Screen Name', + href => '/adm/preferences', + help => 'Prefs_Screen_Name_Nickname', + subroutine => \&screennamechanger, + breadcrumb => + { href => '/adm/preferences?action=changescreenname', + text => 'Change Screen Name'}, + }, + { action => 'verify_and_change_screenname', + subroutine => \&verify_and_change_screenname, + breadcrumb => + { href => '/adm/preferences?action=changescreenname', + text => 'Change Screen Name'}, + printmenu => 'yes', + })); + + push (@Options,({ action => 'changemsgforward', + linktext => 'Change Message Forwarding and Notification Addresses', + href => '/adm/preferences', + help => 'Prefs_Forwarding', + breadcrumb => + { href => '/adm/preferences?action=changemsgforward', + text => 'Change Message Forwarding'}, + subroutine => \&msgforwardchanger, + }, + { action => 'verify_and_change_msgforward', + breadcrumb => + { href => '/adm/preferences?action=changemsgforward', + text => 'Change Message Forwarding'}, + printmenu => 'yes', + subroutine => \&verify_and_change_msgforward })); + my $aboutmeaction= + '/adm/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/aboutme'; + push (@Options,{ action => 'none', + linktext => + q{Edit the 'About Me' Personal Information Screen}, + help => 'Prefs_About_Me', + href => $aboutmeaction}); + push (@Options,({ action => 'changecolors', + linktext => 'Change Color Scheme', + href => '/adm/preferences', + help => 'Change_Colors', + breadcrumb => + { href => '/adm/preferences?action=changecolors', + text => 'Change Colors'}, + subroutine => \&colorschanger, + }, + { action => 'verify_and_change_colors', + breadcrumb => + { href => '/adm/preferences?action=changecolors', + text => 'Change Colors'}, + printmenu => 'yes', + subroutine => \&verify_and_change_colors, + })); + push (@Options,({ action => 'changelanguages', + linktext => 'Change Language Preferences', + href => '/adm/preferences', + help => 'Prefs_Language', + breadcrumb=> + { href => '/adm/preferences?action=changelanguages', + text => 'Change Language'}, + subroutine => \&languagechanger, + }, + { action => 'verify_and_change_languages', + breadcrumb=> + {href => '/adm/preferences?action=changelanguages', + text => 'Change Language'}, + printmenu => 'yes', + subroutine=>\&verify_and_change_languages, } + )); + push (@Options,({ action => 'changewysiwyg', + linktext => 'Change WYSIWYG Editor Preferences', + href => '/adm/preferences', + breadcrumb => + { href => '/adm/preferences?action=changewysiwyg', + text => 'Change WYSIWYG Preferences'}, + subroutine => \&wysiwygchanger, + }, + { action => 'set_wysiwyg', + breadcrumb => + { href => '/adm/preferences?action=changewysiwyg', + text => 'Change WYSIWYG Preferences'}, + printmenu => 'yes', + subroutine => \&verify_and_change_wysiwyg, } + )); + push (@Options,({ action => 'changediscussions', + linktext => 'Change Discussion Display Preferences', + href => '/adm/preferences', + help => 'Change_Discussion_Display', + breadcrumb => + { href => '/adm/preferences?action=changediscussions', + text => 'Change Discussion Preferences'}, + subroutine => \&discussionchanger, + }, + { action => 'verify_and_change_discussion', + breadcrumb => + { href => '/adm/preferences?action=changediscussions', + text => 'Change Discussion Preferences'}, + printmenu => 'yes', + subroutine => \&verify_and_change_discussion, } + )); + + push (@Options,({ action => 'changerolespref', + linktext => 'Change Roles Page Preferences', + href => '/adm/preferences', + subroutine => \&rolesprefchanger, + breadcrumb => + { href => '/adm/preferences?action=changerolespref', + text => 'Change Roles Pref'}, + }, + { action => 'verify_and_change_rolespref', + subroutine => \&verify_and_change_rolespref, + breadcrumb => + { href => '/adm/preferences?action=changerolespref', + text => 'Change Roles Preferences'}, + printmenu => 'yes', + })); + + push (@Options,({ action => 'changetexenginepref', + linktext => 'Change How Math Equations Are Displayed', + href => '/adm/preferences', + subroutine => \&texenginechanger, + breadcrumb => + { href => '/adm/preferences?action=changetexenginepref', + text => 'Change Math Pref'}, + }, + { action => 'verify_and_change_texengine', + subroutine => \&verify_and_change_texengine, + breadcrumb => + { href => '/adm/preferences?action=changetexenginepref', + text => 'Change Math Preferences'}, + printmenu => 'yes', + })); + + + if ($env{'user.name'} =~ /^(albertel|fox|foxr|koretemey|korte|hallmat3|turtle)$/) { + push (@Options,({ action => 'debugtoggle', + printmenu => 'yes', + subroutine => \&toggle_debug, + })); + } + my $html=&Apache::lonxml::xmlbegin(); + $r->print(< -The LearningOnline Network with CAPA +LON-CAPA Preferences - -

Preferences

- - - -ENDDOCUMENT +ENDHEADER + my $call = undef; + my $help = undef; + my $printmenu = 'yes'; + foreach my $option (@Options) { + if ($option->{'action'} eq $env{'form.action'}) { + $call = $option->{'subroutine'}; + $printmenu = $option->{'printmenu'}; + if (exists($option->{'breadcrumb'})) { + &Apache::lonhtmlcommon::add_breadcrumb + ($option->{'breadcrumb'}); + } + $help=$option->{'help'}; + } + } + $r->print(&Apache::loncommon::bodytag('Change Preferences')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs + (undef,'Change Preferences',$help)); + if (defined($call)) { + $call->($r); + } + if (($printmenu eq 'yes') && (!$env{'form.returnurl'})) { + my $optionlist = ''; + if ($env{'user.name'} =~ + /^(albertel|kortemey|fox|foxr|korte|hallmat3|turtle)$/ + ) { + push (@Options,({ action => 'debugtoggle', + linktext => 'Toggle Debug Messages', + text => 'Current Debug status is -'. + $env{'user.debug'}.'-.', + href => '/adm/preferences', + printmenu => 'yes', + subroutine => \&toggle_debug, + })); + } + foreach my $option(@Options) { + my $optiontext = ''; + if (exists($option->{'href'})) { + $optiontext .= + ''. + &mt($option->{'linktext'}).''; + } + if (exists($option->{'text'})) { + $optiontext .= ' '.&mt($option->{'text'}); + } + if ($optiontext ne '') { + $optiontext = ''.$optiontext.''; + my $helplink = ' '; + if (exists($option->{'help'})) { + $helplink = &Apache::loncommon::help_open_topic + ($option->{'help'}); + } + $optionlist .= ''. + ''. + ''. + ''; + } + } + $optionlist .= '
'.$helplink.''.$optiontext.'
'; + $r->print($optionlist); + } elsif ($env{'form.returnurl'}) { + $r->print('
'. + &mt('Return').''); + } + $r->print(&Apache::loncommon::endbodytag().''); return OK; -} +} + +sub toggle_debug { + if ($env{'user.debug'}) { + &Apache::lonnet::delenv('user\.debug'); + } else { + &Apache::lonnet::appenv('user.debug' => 1); + } +} 1; __END__