![]() ![]() | ![]() |
- mode <head> </headh> <</body> elimination
1: # The LearningOnline Network 2: # Preferences 3: # 4: # $Id: lonpreferences.pm,v 1.76 2006/03/15 22:11:04 albertel Exp $ 5: # 6: # Copyright Michigan State University Board of Trustees 7: # 8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA). 9: # 10: # LON-CAPA is free software; you can redistribute it and/or modify 11: # it under the terms of the GNU General Public License as published by 12: # the Free Software Foundation; either version 2 of the License, or 13: # (at your option) any later version. 14: # 15: # LON-CAPA is distributed in the hope that it will be useful, 16: # but WITHOUT ANY WARRANTY; without even the implied warranty of 17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18: # GNU General Public License for more details. 19: # 20: # You should have received a copy of the GNU General Public License 21: # along with LON-CAPA; if not, write to the Free Software 22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 23: # 24: # /home/httpd/html/adm/gpl.txt 25: # 26: # http://www.lon-capa.org/ 27: # 28: # This package uses the "londes.js" javascript code. 29: # 30: # TODOs that have to be completed: 31: # interface with lonnet to change the password 32: 33: package Apache::lonpreferences; 34: 35: use strict; 36: use Apache::Constants qw(:common); 37: use Apache::File; 38: use Crypt::DES; 39: use DynaLoader; # for Crypt::DES version 40: use Apache::loncommon(); 41: use Apache::lonhtmlcommon(); 42: use Apache::lonlocal; 43: use Apache::lonnet; 44: 45: # 46: # Write lonnet::passwd to do the call below. 47: # Use: 48: # my $answer=reply("encrypt:passwd:$udom:$uname:$upass",$tryserver); 49: # 50: ################################################## 51: # password associated functions # 52: ################################################## 53: sub des_keys { 54: # Make a new key for DES encryption. 55: # Each key has two parts which are returned separately. 56: # Please note: Each key must be passed through the &hex function 57: # before it is output to the web browser. The hex versions cannot 58: # be used to decrypt. 59: my @hexstr=('0','1','2','3','4','5','6','7', 60: '8','9','a','b','c','d','e','f'); 61: my $lkey=''; 62: for (0..7) { 63: $lkey.=$hexstr[rand(15)]; 64: } 65: my $ukey=''; 66: for (0..7) { 67: $ukey.=$hexstr[rand(15)]; 68: } 69: return ($lkey,$ukey); 70: } 71: 72: sub des_decrypt { 73: my ($key,$cyphertext) = @_; 74: my $keybin=pack("H16",$key); 75: my $cypher; 76: if ($Crypt::DES::VERSION>=2.03) { 77: $cypher=new Crypt::DES $keybin; 78: } else { 79: $cypher=new DES $keybin; 80: } 81: my $plaintext= 82: $cypher->decrypt(unpack("a8",pack("H16",substr($cyphertext,0,16)))); 83: $plaintext.= 84: $cypher->decrypt(unpack("a8",pack("H16",substr($cyphertext,16,16)))); 85: $plaintext=substr($plaintext,1,ord(substr($plaintext,0,1)) ); 86: return $plaintext; 87: } 88: 89: ################################################################ 90: # Handler subroutines # 91: ################################################################ 92: 93: ################################################################ 94: # Language Change Subroutines # 95: ################################################################ 96: 97: sub wysiwygchanger { 98: my $r = shift; 99: my %userenv = &Apache::lonnet::get 100: ('environment',['wysiwygeditor']); 101: my $offselect=''; 102: my $onselect='checked="1"'; 103: if ($userenv{'wysiwygeditor'}) { 104: $onselect=''; 105: $offselect='checked="1"'; 106: } 107: my $switchoff=&mt('Disable WYSIWYG editor'); 108: my $switchon=&mt('Enable WYSIWYG editor'); 109: $r->print(<<ENDLSCREEN); 110: <form name="server" action="/adm/preferences" method="post"> 111: <input type="hidden" name="action" value="set_wysiwyg" /> 112: <br /> 113: <label><input type="radio" name="wysiwyg" value="off" $onselect /> $switchoff</label><br /> 114: <label><input type="radio" name="wysiwyg" value="on" $offselect /> $switchon</label> 115: ENDLSCREEN 116: $r->print('<br /><input type="submit" value="'.&mt('Change').'" />'); 117: } 118: 119: 120: sub verify_and_change_wysiwyg { 121: my $r = shift; 122: my $newsetting=$env{'form.wysiwyg'}; 123: &Apache::lonnet::put('environment',{'wysiwygeditor' => $newsetting}); 124: &Apache::lonnet::appenv('environment.wysiwygeditor' => $newsetting); 125: $r->print('<p>'.&mt('Setting WYSIWYG editor to:').' '.&mt($newsetting).'</p>'); 126: } 127: 128: ################################################################ 129: # Language Change Subroutines # 130: ################################################################ 131: sub languagechanger { 132: my $r = shift; 133: my $user = $env{'user.name'}; 134: my $domain = $env{'user.domain'}; 135: my %userenv = &Apache::lonnet::get 136: ('environment',['languages']); 137: my $language=$userenv{'languages'}; 138: 139: my $pref=&mt('Preferred language'); 140: my %langchoices=('' => 'No language preference'); 141: foreach (&Apache::loncommon::languageids()) { 142: if (&Apache::loncommon::supportedlanguagecode($_)) { 143: $langchoices{&Apache::loncommon::supportedlanguagecode($_)} 144: = &Apache::loncommon::plainlanguagedescription($_); 145: } 146: } 147: my $selectionbox=&Apache::loncommon::select_form($language,'language', 148: %langchoices); 149: $r->print(<<ENDLSCREEN); 150: <form name="server" action="/adm/preferences" method="post"> 151: <input type="hidden" name="action" value="verify_and_change_languages" /> 152: <br />$pref: $selectionbox 153: ENDLSCREEN 154: $r->print('<br /><input type="submit" value="'.&mt('Change').'" />'); 155: } 156: 157: 158: sub verify_and_change_languages { 159: my $r = shift; 160: my $user = $env{'user.name'}; 161: my $domain = $env{'user.domain'}; 162: # Screenname 163: my $newlanguage = $env{'form.language'}; 164: $newlanguage=~s/[^\-\w]//g; 165: my $message=''; 166: if ($newlanguage) { 167: &Apache::lonnet::put('environment',{'languages' => $newlanguage}); 168: &Apache::lonnet::appenv('environment.languages' => $newlanguage); 169: $message='Set new preferred languages to '.$newlanguage; 170: } else { 171: &Apache::lonnet::del('environment',['languages']); 172: &Apache::lonnet::delenv('environment\.languages'); 173: $message='Reset preferred language'; 174: } 175: $r->print(<<ENDVCSCREEN); 176: $message 177: ENDVCSCREEN 178: } 179: 180: ################################################################ 181: # Tex Engine Change Subroutines # 182: ################################################################ 183: sub texenginechanger { 184: my $r = shift; 185: my $user = $env{'user.name'}; 186: my $domain = $env{'user.domain'}; 187: my %userenv = &Apache::lonnet::get('environment',['texengine']); 188: my $texengine=$userenv{'texengine'}; 189: 190: my $pref=&mt('Preferred method to display Math'); 191: my %mathchoices=('' => 'Default', 192: 'tth' => 'TeX to HTML', 193: #'ttm' => 'TeX to MathML', 194: 'jsMath' => 'jsMath', 195: 'mimetex' => 'Convert to Images' 196: ); 197: my $selectionbox=&Apache::loncommon::select_form($texengine,'texengine', 198: %mathchoices); 199: my $jsMath_start=&Apache::lontexconvert::jsMath_header(); 200: my $change=&mt('Change'); 201: $r->print(<<ENDLSCREEN); 202: <br /> 203: 204: <form name="server" action="/adm/preferences" method="post"> 205: <input type="hidden" name="action" value="verify_and_change_texengine" /> 206: <p>$pref: $selectionbox</p> 207: <p><input type="submit" value="$change" /></p> 208: </form> 209: Examples: 210: <p> TeX to HTML <br /> 211: <iframe src="/res/adm/pages/math_example.tex?buttons=no&mode=tth" width="400" hieght="200"></iframe> 212: </p> 213: <p>jsMath <br /> 214: $jsMath_start 215: <script type="text/javascript"> 216: if (jsMath.nofonts == 1) { 217: document.writeln 218: ('<center><div style="padding: 10; border-style: solid; border-width:3;' 219: +' border-color: #DD0000; background-color: #FFF8F8; width: 75%; text-align: left">' 220: +'<small><font color="#AA0000"><b>Warning:</b> ' 221: +'It looks like you don\\\'t have the TeX math fonts installed. ' 222: +'The jsMath example on this page may not look right without them. ' 223: +'The <a href="http://www.math.union.edu/locate/jsMath/" target="_blank"> ' 224: +'jsMath Home Page</a> has information on how to download the ' 225: +'needed fonts. In the meantime, jsMath will do the best it can ' 226: +'with the fonts you have, but it may not be pretty and some equations ' 227: +'may not be rendered correctly. ' 228: +'</font></small></div></center>'); 229: } 230: </script> 231: <iframe src="/res/adm/pages/math_example.tex?buttons=no&mode=jsMath" width="400" hieght="200"></iframe> 232: 233: </p> 234: <p> Convert to Images <br /> 235: <br /> 236: <iframe src="/res/adm/pages/math_example.tex?buttons=no&mode=mimetex" width="400" hieght="200"></iframe> 237: </p> 238: ENDLSCREEN 239: if ($env{'environment.texengine'} ne 'jsMath') { 240: $r->print('<script type="text/javascript">jsMath.Process()</script>'); 241: } 242: } 243: 244: 245: sub verify_and_change_texengine { 246: my $r = shift; 247: my $user = $env{'user.name'}; 248: my $domain = $env{'user.domain'}; 249: # Screenname 250: my $newtexengine = $env{'form.texengine'}; 251: $newtexengine=~s/[^\-\w]//g; 252: if ($newtexengine eq 'ttm') { 253: &Apache::lonnet::appenv('browser.mathml' => 1); 254: } else { 255: if ($env{'environment.texengine'} eq 'ttm') { 256: &Apache::lonnet::appenv('browser.mathml' => 0); 257: } 258: } 259: my $message=''; 260: if ($newtexengine) { 261: &Apache::lonnet::put('environment',{'texengine' => $newtexengine}); 262: &Apache::lonnet::appenv('environment.texengine' => $newtexengine); 263: $message='Set new preferred math display to '.$newtexengine; 264: } else { 265: &Apache::lonnet::del('environment',['texengine']); 266: &Apache::lonnet::delenv('environment\.texengine'); 267: $message='Reset preferred math display.'; 268: } 269: 270: 271: $r->print(<<ENDVCSCREEN); 272: $message 273: ENDVCSCREEN 274: } 275: 276: ################################################################ 277: # Roles Page Preference Change Subroutines # 278: ################################################################ 279: sub rolesprefchanger { 280: my $r = shift; 281: my $user = $env{'user.name'}; 282: my $domain = $env{'user.domain'}; 283: my %userenv = &Apache::lonnet::get 284: ('environment',['recentroles','recentrolesn']); 285: my $hotlist_flag=$userenv{'recentroles'}; 286: my $hotlist_n=$userenv{'recentrolesn'}; 287: my $checked; 288: if ($hotlist_flag) { 289: $checked = 'checked="checked"'; 290: } 291: 292: if (!$hotlist_n) { $hotlist_n=3; } 293: my $options; 294: for (my $i=1; $i<10; $i++) { 295: my $select; 296: if ($hotlist_n == $i) { $select = 'selected="selected"'; } 297: $options .= "<option $select>$i</option>\n"; 298: } 299: 300: $r->print(<<ENDSCREEN); 301: <p>Some LON-CAPA users have a long list of roles. The Recent Roles Hotlist 302: feature keeps track of the last N roles which have been 303: visited and places a table of these at the top of the roles page. 304: People with very few roles should leave this feature disabled. 305: </p> 306: 307: <form name="server" action="/adm/preferences" method="post"> 308: <input type="hidden" name="action" value="verify_and_change_rolespref" /> 309: <br />Enable Recent Roles Hotlist: 310: <input type="checkbox" $checked name="recentroles" value="true" /> 311: <br />Number of roles in Hotlist: 312: <select name="recentrolesn" size="1"> 313: $options 314: </select> 315: <br /> 316: <input type="submit" value="Change" /> 317: </form> 318: ENDSCREEN 319: } 320: 321: sub verify_and_change_rolespref { 322: my $r = shift; 323: my $user = $env{'user.name'}; 324: my $domain = $env{'user.domain'}; 325: # Recent Roles Hotlist Flag 326: my $hotlist_flag = $env{'form.recentroles'}; 327: my $hotlist_n = $env{'form.recentrolesn'}; 328: my $message=''; 329: if ($hotlist_flag) { 330: &Apache::lonnet::put('environment',{'recentroles' => $hotlist_flag}); 331: &Apache::lonnet::appenv('environment.recentroles' => $hotlist_flag); 332: $message='Recent Roles Hotlist is Enabled'; 333: } else { 334: &Apache::lonnet::del('environment',['recentroles']); 335: &Apache::lonnet::delenv('environment\.recentroles'); 336: $message='Recent Roles Hotlist is Disabled'; 337: } 338: if ($hotlist_n) { 339: &Apache::lonnet::put('environment',{'recentrolesn' => $hotlist_n}); 340: &Apache::lonnet::appenv('environment.recentrolesn' => $hotlist_n); 341: if ($hotlist_flag) { 342: $message.="<br />Display $hotlist_n Most Recent Roles\n"; 343: } 344: } 345: 346: $r->print(<<ENDRPSCREEN); 347: $message 348: ENDRPSCREEN 349: } 350: 351: 352: 353: ################################################################ 354: # Anonymous Discussion Name Change Subroutines # 355: ################################################################ 356: sub screennamechanger { 357: my $r = shift; 358: my $user = $env{'user.name'}; 359: my $domain = $env{'user.domain'}; 360: my %userenv = &Apache::lonnet::get 361: ('environment',['screenname','nickname']); 362: my $screenname=$userenv{'screenname'}; 363: my $nickname=$userenv{'nickname'}; 364: $r->print(<<ENDSCREEN); 365: <form name="server" action="/adm/preferences" method="post"> 366: <input type="hidden" name="action" value="verify_and_change_screenname" /> 367: <br />New screenname (shown if you post anonymously): 368: <input type="text" size="20" value="$screenname" name="screenname" /> 369: <br />New nickname (shown if you post non-anonymously): 370: <input type="text" size="20" value="$nickname" name="nickname" /> 371: <input type="submit" value="Change" /> 372: </form> 373: ENDSCREEN 374: } 375: 376: sub verify_and_change_screenname { 377: my $r = shift; 378: my $user = $env{'user.name'}; 379: my $domain = $env{'user.domain'}; 380: # Screenname 381: my $newscreen = $env{'form.screenname'}; 382: $newscreen=~s/[^ \w]//g; 383: my $message=''; 384: if ($newscreen) { 385: &Apache::lonnet::put('environment',{'screenname' => $newscreen}); 386: &Apache::lonnet::appenv('environment.screenname' => $newscreen); 387: $message='Set new screenname to '.$newscreen; 388: } else { 389: &Apache::lonnet::del('environment',['screenname']); 390: &Apache::lonnet::delenv('environment\.screenname'); 391: $message='Reset screenname'; 392: } 393: # Nickname 394: $message.='<br />'; 395: $newscreen = $env{'form.nickname'}; 396: $newscreen=~s/[^ \w]//g; 397: if ($newscreen) { 398: &Apache::lonnet::put('environment',{'nickname' => $newscreen}); 399: &Apache::lonnet::appenv('environment.nickname' => $newscreen); 400: $message.='Set new nickname to '.$newscreen; 401: } else { 402: &Apache::lonnet::del('environment',['nickname']); 403: &Apache::lonnet::delenv('environment\.nickname'); 404: $message.='Reset nickname'; 405: } 406: &Apache::lonnet::devalidate_cache_new('namescache',$user.':'.$domain); 407: $r->print(<<ENDVCSCREEN); 408: $message 409: ENDVCSCREEN 410: } 411: 412: ################################################################ 413: # Message Forward # 414: ################################################################ 415: 416: sub msgforwardchanger { 417: my $r = shift; 418: my $user = $env{'user.name'}; 419: my $domain = $env{'user.domain'}; 420: my %userenv = &Apache::lonnet::get('environment',['msgforward','notification','critnotification']); 421: my $msgforward=$userenv{'msgforward'}; 422: my $notification=$userenv{'notification'}; 423: my $critnotification=$userenv{'critnotification'}; 424: my $forwardingHelp = Apache::loncommon::help_open_topic("Prefs_Forwarding", 425: "What are forwarding ". 426: "and notification ". 427: "addresses"); 428: my $criticalMessageHelp = Apache::loncommon::help_open_topic("Course_Critical_Message", 429: "What are critical messages"); 430: 431: $r->print(<<ENDMSG); 432: $forwardingHelp <br /> 433: <form name="server" action="/adm/preferences" method="post"> 434: <input type="hidden" name="action" value="verify_and_change_msgforward" /> 435: New Forwarding Address(es) (<tt>user:domain,user:domain,...</tt>): 436: <input type="text" size="40" value="$msgforward" name="msgforward" /><hr /> 437: New Message Notification Email Address(es) (<tt>joe\@doe.com,jane\@doe.edu,...</tt>): 438: <input type="text" size="40" value="$notification" name="notification" /><hr /> 439: New Critical Message Notification Email Address(es) (<tt>joe\@doe.com,jane\@doe.edu,...</tt>): 440: <input type="text" size="40" value="$critnotification" name="critnotification" />$criticalMessageHelp<hr /> 441: <input type="submit" value="Change" /> 442: </form> 443: ENDMSG 444: } 445: 446: sub verify_and_change_msgforward { 447: my $r = shift; 448: my $user = $env{'user.name'}; 449: my $domain = $env{'user.domain'}; 450: my $newscreen = ''; 451: my $message=''; 452: foreach (split(/\,/,$env{'form.msgforward'})) { 453: my ($msuser,$msdomain)=split(/[\@\:]/,$_); 454: $msuser=~s/\W//g; 455: $msdomain=~s/\W//g; 456: if (($msuser) && ($msdomain)) { 457: if (&Apache::lonnet::homeserver($msuser,$msdomain) ne 'no_host') { 458: $newscreen.=$msuser.':'.$msdomain.','; 459: } else { 460: $message.='No such user: '.$msuser.':'.$msdomain.'<br>'; 461: } 462: } 463: } 464: $newscreen=~s/\,$//; 465: if ($newscreen) { 466: &Apache::lonnet::put('environment',{'msgforward' => $newscreen}); 467: &Apache::lonnet::appenv('environment.msgforward' => $newscreen); 468: $message.='Set new message forwarding to '.$newscreen.'<br />'; 469: } else { 470: &Apache::lonnet::del('environment',['msgforward']); 471: &Apache::lonnet::delenv('environment\.msgforward'); 472: $message.='Reset message forwarding<br />'; 473: } 474: my $notification=$env{'form.notification'}; 475: $notification=~s/\s//gs; 476: if ($notification) { 477: &Apache::lonnet::put('environment',{'notification' => $notification}); 478: &Apache::lonnet::appenv('environment.notification' => $notification); 479: $message.='Set message notification address to '.$notification.'<br />'; 480: } else { 481: &Apache::lonnet::del('environment',['notification']); 482: &Apache::lonnet::delenv('environment\.notification'); 483: $message.='Reset message notification<br />'; 484: } 485: my $critnotification=$env{'form.critnotification'}; 486: $critnotification=~s/\s//gs; 487: if ($critnotification) { 488: &Apache::lonnet::put('environment',{'critnotification' => $critnotification}); 489: &Apache::lonnet::appenv('environment.critnotification' => $critnotification); 490: $message.='Set critical message notification address to '.$critnotification; 491: } else { 492: &Apache::lonnet::del('environment',['critnotification']); 493: &Apache::lonnet::delenv('environment\.critnotification'); 494: $message.='Reset critical message notification<br />'; 495: } 496: $r->print(<<ENDVCMSG); 497: $message 498: ENDVCMSG 499: } 500: 501: ################################################################ 502: # Colors # 503: ################################################################ 504: 505: sub colorschanger { 506: my $r = shift; 507: # figure out colors 508: my $function='student'; 509: if ($env{'request.role'}=~/^(cc|in|ta|ep)/) { 510: $function='coordinator'; 511: } 512: if ($env{'request.role'}=~/^(su|dc|ad|li)/) { 513: $function='admin'; 514: } 515: if (($env{'request.role'}=~/^(au|ca)/) || 516: ($ENV{'REQUEST_URI'}=~/^(\/priv|\~)/)) { 517: $function='author'; 518: } 519: my $domain=&Apache::loncommon::determinedomain(); 520: my %colortypes=('pgbg' => 'Page Background', 521: 'tabbg' => 'Header Background', 522: 'sidebg'=> 'Header Border', 523: 'font' => 'Font', 524: 'link' => 'Un-Visited Link', 525: 'vlink' => 'Visited Link', 526: 'alink' => 'Active Link'); 527: my $chtable=''; 528: foreach my $item (sort(keys(%colortypes))) { 529: my $curcol=&Apache::loncommon::designparm($function.'.'.$item,$domain); 530: $chtable.='<tr><td>'.$colortypes{$item}.'</td><td bgcolor="'.$curcol. 531: '"> </td><td><input name="'.$item. 532: '" size="10" value="'.$curcol. 533: '" /></td><td><a href="javascript:pjump('."'color_custom','".$colortypes{$item}. 534: "','".$curcol."','" 535: .$item."','parmform.pres','psub'".');">Select</a></td></tr>'; 536: } 537: my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition(); 538: $r->print(<<ENDCOL); 539: <script> 540: 541: function pclose() { 542: parmwin=window.open("/adm/rat/empty.html","LONCAPAparms", 543: "height=350,width=350,scrollbars=no,menubar=no"); 544: parmwin.close(); 545: } 546: 547: $pjump_def 548: 549: function psub() { 550: pclose(); 551: if (document.parmform.pres_marker.value!='') { 552: if (document.parmform.pres_type.value!='') { 553: eval('document.server.'+ 554: document.parmform.pres_marker.value+ 555: '.value=document.parmform.pres_value.value;'); 556: } 557: } else { 558: document.parmform.pres_value.value=''; 559: document.parmform.pres_marker.value=''; 560: } 561: } 562: 563: 564: </script> 565: <form name="parmform"> 566: <input type="hidden" name="pres_marker" /> 567: <input type="hidden" name="pres_type" /> 568: <input type="hidden" name="pres_value" /> 569: </form> 570: <form name="server" action="/adm/preferences" method="post"> 571: <input type="hidden" name="action" value="verify_and_change_colors" /> 572: <table border="2"> 573: $chtable 574: </table> 575: <input type="submit" value="Change Custom Colors" /> 576: <input type="submit" name="resetall" value="Reset All Colors to Default" /> 577: </form> 578: ENDCOL 579: } 580: 581: sub verify_and_change_colors { 582: my $r = shift; 583: # figure out colors 584: my $function='student'; 585: if ($env{'request.role'}=~/^(cc|in|ta|ep)/) { 586: $function='coordinator'; 587: } 588: if ($env{'request.role'}=~/^(su|dc|ad|li)/) { 589: $function='admin'; 590: } 591: if (($env{'request.role'}=~/^(au|ca)/) || 592: ($ENV{'REQUEST_URI'}=~/^(\/priv|\~)/)) { 593: $function='author'; 594: } 595: my $domain=&Apache::loncommon::determinedomain(); 596: my %colortypes=('pgbg' => 'Page Background', 597: 'tabbg' => 'Header Background', 598: 'sidebg'=> 'Header Border', 599: 'font' => 'Font', 600: 'link' => 'Un-Visited Link', 601: 'vlink' => 'Visited Link', 602: 'alink' => 'Active Link'); 603: 604: my $message=''; 605: foreach my $item (keys %colortypes) { 606: my $color=$env{'form.'.$item}; 607: my $entry='color.'.$function.'.'.$item; 608: if (($color=~/^\#[0-9A-Fa-f]{6}$/) && (!$env{'form.resetall'})) { 609: &Apache::lonnet::put('environment',{$entry => $color}); 610: &Apache::lonnet::appenv('environment.'.$entry => $color); 611: $message.='Set '.$colortypes{$item}.' to '.$color.'<br />'; 612: } else { 613: &Apache::lonnet::del('environment',[$entry]); 614: &Apache::lonnet::delenv('environment\.'.$entry); 615: $message.='Reset '.$colortypes{$item}.'<br />'; 616: } 617: } 618: $r->print(<<ENDVCCOL); 619: $message 620: <form name="client" action="/adm/preferences" method="post"> 621: <input type="hidden" name="action" value="changecolors" /> 622: </form> 623: ENDVCCOL 624: } 625: 626: ###################################################### 627: # password handler subroutines # 628: ###################################################### 629: sub passwordchanger { 630: # This function is a bit of a mess.... 631: # Passwords are encrypted using londes.js (DES encryption) 632: my $r = shift; 633: my $errormessage = shift; 634: $errormessage = ($errormessage || ''); 635: my $user = $env{'user.name'}; 636: my $domain = $env{'user.domain'}; 637: my $homeserver = $env{'user.home'}; 638: my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain); 639: # Check for authentication types that allow changing of the password. 640: return if ($currentauth !~ /^(unix|internal):/); 641: # 642: # Generate keys 643: my ($lkey_cpass ,$ukey_cpass ) = &des_keys(); 644: my ($lkey_npass1,$ukey_npass1) = &des_keys(); 645: my ($lkey_npass2,$ukey_npass2) = &des_keys(); 646: # Store the keys in the log files 647: my $lonhost = $r->dir_config('lonHostID'); 648: my $logtoken=Apache::lonnet::reply('tmpput:' 649: .$ukey_cpass . $lkey_cpass .'&' 650: .$ukey_npass1 . $lkey_npass1.'&' 651: .$ukey_npass2 . $lkey_npass2, 652: $lonhost); 653: # Hexify the keys for output as javascript variables 654: $ukey_cpass = hex($ukey_cpass); 655: $lkey_cpass = hex($lkey_cpass); 656: $ukey_npass1= hex($ukey_npass1); 657: $lkey_npass1= hex($lkey_npass1); 658: $ukey_npass2= hex($ukey_npass2); 659: $lkey_npass2= hex($lkey_npass2); 660: # Output javascript to deal with passwords 661: # Output DES javascript 662: { 663: my $include = $r->dir_config('lonIncludes'); 664: my $jsh=Apache::File->new($include."/londes.js"); 665: $r->print(<$jsh>); 666: } 667: $r->print(<<ENDFORM); 668: <script language="JavaScript"> 669: 670: function send() { 671: uextkey=this.document.client.elements.ukey_cpass.value; 672: lextkey=this.document.client.elements.lkey_cpass.value; 673: initkeys(); 674: 675: this.document.pserver.elements.currentpass.value 676: =crypted(this.document.client.elements.currentpass.value); 677: 678: uextkey=this.document.client.elements.ukey_npass1.value; 679: lextkey=this.document.client.elements.lkey_npass1.value; 680: initkeys(); 681: this.document.pserver.elements.newpass_1.value 682: =crypted(this.document.client.elements.newpass_1.value); 683: 684: uextkey=this.document.client.elements.ukey_npass2.value; 685: lextkey=this.document.client.elements.lkey_npass2.value; 686: initkeys(); 687: this.document.pserver.elements.newpass_2.value 688: =crypted(this.document.client.elements.newpass_2.value); 689: 690: this.document.pserver.submit(); 691: } 692: 693: </script> 694: $errormessage 695: 696: <p> 697: <!-- We separate the forms into 'server' and 'client' in order to 698: ensure that unencrypted passwords will not be sent out by a 699: crappy browser --> 700: 701: <form name="pserver" action="/adm/preferences" method="post"> 702: <input type="hidden" name="logtoken" value="$logtoken" /> 703: <input type="hidden" name="action" value="verify_and_change_pass" /> 704: <input type="hidden" name="currentpass" value="" /> 705: <input type="hidden" name="newpass_1" value="" /> 706: <input type="hidden" name="newpass_2" value="" /> 707: </form> 708: 709: <form name="client" > 710: <table> 711: <tr><td align="right"> Current password: </td> 712: <td><input type="password" name="currentpass" size="10"/> </td></tr> 713: <tr><td align="right"> New password: </td> 714: <td><input type="password" name="newpass_1" size="10" /> </td></tr> 715: <tr><td align="right"> Confirm password: </td> 716: <td><input type="password" name="newpass_2" size="10" /> </td></tr> 717: <tr><td colspan="2" align="center"> 718: <input type="button" value="Change Password" onClick="send();"> 719: </table> 720: <input type="hidden" name="ukey_cpass" value="$ukey_cpass" /> 721: <input type="hidden" name="lkey_cpass" value="$lkey_cpass" /> 722: <input type="hidden" name="ukey_npass1" value="$ukey_npass1" /> 723: <input type="hidden" name="lkey_npass1" value="$lkey_npass1" /> 724: <input type="hidden" name="ukey_npass2" value="$ukey_npass2" /> 725: <input type="hidden" name="lkey_npass2" value="$lkey_npass2" /> 726: </form> 727: </p> 728: ENDFORM 729: # 730: return; 731: } 732: 733: sub verify_and_change_password { 734: my $r = shift; 735: my $user = $env{'user.name'}; 736: my $domain = $env{'user.domain'}; 737: my $homeserver = $env{'user.home'}; 738: my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain); 739: # Check for authentication types that allow changing of the password. 740: return if ($currentauth !~ /^(unix|internal):/); 741: # 742: my $currentpass = $env{'form.currentpass'}; 743: my $newpass1 = $env{'form.newpass_1'}; 744: my $newpass2 = $env{'form.newpass_2'}; 745: my $logtoken = $env{'form.logtoken'}; 746: # Check for empty data 747: unless (defined($currentpass) && 748: defined($newpass1) && 749: defined($newpass2) ){ 750: &passwordchanger($r,"<p>\n<font color='#ff0000'>ERROR</font>". 751: "Password data was blank.\n</p>"); 752: return; 753: } 754: # Get the keys 755: my $lonhost = $r->dir_config('lonHostID'); 756: my $tmpinfo = Apache::lonnet::reply('tmpget:'.$logtoken,$lonhost); 757: if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost')) { 758: # I do not a have a better idea about how to handle this 759: $r->print(<<ENDERROR); 760: <p> 761: <font color="#ff0000">ERROR:</font> Unable to retrieve stored token for 762: password decryption. Please log out and try again. 763: </p> 764: ENDERROR 765: # Probably should log an error here 766: return 1; 767: } 768: my ($ckey,$n1key,$n2key)=split(/&/,$tmpinfo); 769: # 770: $currentpass = &des_decrypt($ckey ,$currentpass); 771: $newpass1 = &des_decrypt($n1key,$newpass1); 772: $newpass2 = &des_decrypt($n2key,$newpass2); 773: # 774: if ($newpass1 ne $newpass2) { 775: &passwordchanger($r, 776: '<font color="#ff0000">ERROR:</font>'. 777: 'The new passwords you entered do not match. '. 778: 'Please try again.'); 779: return 1; 780: } 781: if (length($newpass1) < 7) { 782: &passwordchanger($r, 783: '<font color="#ff0000">ERROR:</font>'. 784: 'Passwords must be a minimum of 7 characters long. '. 785: 'Please try again.'); 786: return 1; 787: } 788: # 789: # Check for bad characters 790: my $badpassword = 0; 791: foreach (split(//,$newpass1)) { 792: $badpassword = 1 if ((ord($_)<32)||(ord($_)>126)); 793: } 794: if ($badpassword) { 795: # I can't figure out how to enter bad characters on my browser. 796: &passwordchanger($r,<<ENDERROR); 797: <font color="#ff0000">ERROR:</font> 798: The password you entered contained illegal characters.<br /> 799: Valid characters are: space and <br /> 800: <pre> 801: !"\#$%&\'()*+,-./0123456789:;<=>?\@ 802: ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_\`abcdefghijklmnopqrstuvwxyz{|}~ 803: </pre> 804: ENDERROR 805: } 806: # 807: # Change the password (finally) 808: my $result = &Apache::lonnet::changepass 809: ($user,$domain,$currentpass,$newpass1,$homeserver); 810: # Inform the user the password has (not?) been changed 811: if ($result =~ /^ok$/) { 812: $r->print(<<"ENDTEXT"); 813: <h2>The password for $user was successfully changed</h2> 814: ENDTEXT 815: } else { 816: # error error: run in circles, scream and shout 817: $r->print(<<ENDERROR); 818: <h2><font color="#ff0000">The password for $user was not changed</font></h2> 819: Please make sure your old password was entered correctly. 820: ENDERROR 821: return 1; 822: } 823: return; 824: } 825: 826: ################################################################ 827: # discussion display subroutines 828: ################################################################ 829: sub discussionchanger { 830: my $r = shift; 831: my $user = $env{'user.name'}; 832: my $domain = $env{'user.domain'}; 833: my %userenv = &Apache::lonnet::get 834: ('environment',['discdisplay','discmarkread']); 835: my $discdisp = 'allposts'; 836: my $discmark = 'onmark'; 837: 838: if (defined($userenv{'discdisplay'})) { 839: unless ($userenv{'discdisplay'} eq '') { 840: $discdisp = $userenv{'discdisplay'}; 841: } 842: } 843: if (defined($userenv{'discmarkread'})) { 844: unless ($userenv{'discdisplay'} eq '') { 845: $discmark = $userenv{'discmarkread'}; 846: } 847: } 848: 849: my $newdisp = 'unread'; 850: my $newmark = 'ondisp'; 851: 852: my $function = &Apache::loncommon::get_users_function(); 853: my $color = &Apache::loncommon::designparm($function.'.tabbg', 854: $env{'user.domain'}); 855: my %lt = &Apache::lonlocal::texthash( 856: 'pref' => 'Display Preference', 857: 'curr' => 'Current setting ', 858: 'actn' => 'Action', 859: 'sdpf' => 'Set display preferences for discussion posts for both bulletin boards and individual resources in all your courses.', 860: 'prca' => 'Preferences can be set that determine', 861: 'whpo' => 'Which posts are displayed when you display a bulletin board or resource, and', 862: 'unwh' => 'Under what circumstances posts are identfied as "New"', 863: 'allposts' => 'All posts', 864: 'unread' => 'New posts only', 865: 'ondisp' => 'Once displayed', 866: 'onmark' => 'Once marked as read', 867: 'disa' => 'Posts displayed?', 868: 'npmr' => 'New posts cease to be identified as "New"?', 869: 'thde' => 'The preferences you set here can be overridden within each individual discussion.', 870: 'chgt' => 'Change to ' 871: ); 872: my $dispchange = $lt{'unread'}; 873: my $markchange = $lt{'ondisp'}; 874: my $currdisp = $lt{'allposts'}; 875: my $currmark = $lt{'onmark'}; 876: 877: if ($discdisp eq 'unread') { 878: $dispchange = $lt{'allposts'}; 879: $currdisp = $lt{'unread'}; 880: $newdisp = 'allposts'; 881: } 882: 883: if ($discmark eq 'ondisp') { 884: $markchange = $lt{'onmark'}; 885: $currmark = $lt{'ondisp'}; 886: $newmark = 'onmark'; 887: } 888: 889: $r->print(<<"END"); 890: <form name="server" action="/adm/preferences" method="post"> 891: <input type="hidden" name="action" value="verify_and_change_discussion" /> 892: <br /> 893: $lt{'sdpf'}<br/> $lt{'prca'} <ol><li>$lt{'whpo'}</li><li>$lt{'unwh'}</li></ol> 894: <br /> 895: <br /> 896: <table border="0" cellpadding="0" cellspacing="0"> 897: <tr> 898: <td width="100%" bgcolor="#000000"> 899: <table width="100%" border="0" cellpadding="1" cellspacing="0"> 900: <tr> 901: <td width="100%" bgcolor="#000000"> 902: <table border="0" cellpadding="3" cellspacing="3" bgcolor="#FFFFFF"> 903: <tr bgcolor="$color"> 904: <td><b>$lt{'pref'}</b></td> 905: <td><b>$lt{'curr'}</b></td> 906: <td><b>$lt{'actn'}?</b></td> 907: </tr> 908: <tr bgcolor="#dddddd"> 909: <td>$lt{'disa'}</td> 910: <td>$lt{$discdisp}</td> 911: <td><input type="checkbox" name="discdisp" /><input type="hidden" name="newdisp" value="$newdisp" /> $lt{'chgt'} "$dispchange"</td> 912: </tr><tr bgcolor="#eeeeee"> 913: <td>$lt{'npmr'}</td> 914: <td>$lt{$discmark}</td> 915: <td><input type="checkbox" name="discmark" /><input type="hidden" name="newmark" value="$newmark" /> $lt{'chgt'} "$markchange"</td> 916: </tr> 917: </table> 918: </td> 919: </tr> 920: </table> 921: </td> 922: </tr> 923: </table> 924: <br /> 925: <br /> 926: <input type="submit" name="sub" value="Store Changes" /> 927: <br /> 928: <br /> 929: Note: $lt{'thde'} 930: </form> 931: END 932: } 933: 934: sub verify_and_change_discussion { 935: my $r = shift; 936: my $user = $env{'user.name'}; 937: my $domain = $env{'user.domain'}; 938: my $message=''; 939: if (defined($env{'form.discdisp'}) ) { 940: my $newdisp = $env{'form.newdisp'}; 941: if ($newdisp eq 'unread') { 942: $message .='In discussions: only new posts will be displayed.<br/>'; 943: &Apache::lonnet::put('environment',{'discdisplay' => $newdisp}); 944: &Apache::lonnet::appenv('environment.discdisplay' => $newdisp); 945: } else { 946: $message .= 'In discussions: all posts will be displayed.<br/>'; 947: &Apache::lonnet::del('environment',['discdisplay']); 948: &Apache::lonnet::delenv('environment\.discdisplay'); 949: } 950: } 951: if (defined($env{'form.discmark'}) ) { 952: my $newmark = $env{'form.newmark'}; 953: if ($newmark eq 'ondisp') { 954: $message.='In discussions: new posts will be cease to be identified as "new" after display.<br/>'; 955: &Apache::lonnet::put('environment',{'discmarkread' => $newmark}); 956: &Apache::lonnet::appenv('environment.discmarkread' => $newmark); 957: } else { 958: $message.='In discussions: posts will be identified as "new" until marked as read by the reader.<br/>'; 959: &Apache::lonnet::del('environment',['discmarkread']); 960: &Apache::lonnet::delenv('environment\.discmarkread'); 961: } 962: } 963: $r->print(<<ENDVCSCREEN); 964: $message 965: ENDVCSCREEN 966: } 967: 968: ################################################################ 969: # Subroutines for page display on course access (Course Coordinators) 970: ################################################################ 971: sub coursedisplaychanger { 972: my $r = shift; 973: my $user = $env{'user.name'}; 974: my $domain = $env{'user.domain'}; 975: my %userenv = &Apache::lonnet::get('environment',['course_init_display']); 976: my $currvalue = 'whatsnew'; 977: my $firstselect = ''; 978: my $whatsnewselect = 'checked="checked"'; 979: if (exists($userenv{'course_init_display'})) { 980: if ($userenv{'course_init_display'} eq 'firstres') { 981: $currvalue = 'firstres'; 982: $firstselect = 'checked="checked"'; 983: $whatsnewselect = ''; 984: } 985: } 986: my %pagenames = ( 987: firstres => 'First resource', 988: whatsnew => "What's new page", 989: ); 990: my $whatsnew_off=&mt('Display the [_1] in the course.','<b>first resource</b>'); 991: my $whatsnew_on=&mt('Display the "[_1]" page - a summary of items in the course which require attention.',"<b>What's New</b>"); 992: 993: $r->print('<br /><b>'.&mt('Set the default page to be displayed when you select a course role').'</b> '.&mt('(Currently: [_1])',$pagenames{$currvalue}).'<br />'.&mt('The global user preference you set for your courses can be overridden in an individual course by setting a course specific setting via the "[_1]" page in the course',"<i>What's New</i>").'<br /><br />'); 994: $r->print(<<ENDLSCREEN); 995: <form name="server" action="/adm/preferences" method="post"> 996: <input type="hidden" name="action" value="verify_and_change_coursepage" /> 997: <br /> 998: <label><input type="radio" name="newdisp" value="firstres" $firstselect /> $whatsnew_off</label><br /> 999: <label><input type="radio" name="newdisp" value="whatsnew" $whatsnewselect /> $whatsnew_on</label><input type="hidden" name="refpage" value="$env{'form.refpage'}" /> 1000: ENDLSCREEN 1001: $r->print('<br /><br /><input type="submit" value="'.&mt('Change').'" /> 1002: </form>'); 1003: } 1004: 1005: sub verify_and_change_coursepage { 1006: my $r = shift; 1007: my $message=''; 1008: my %lt = &Apache::lonlocal::texthash( 1009: 'defs' => 'Default now set', 1010: 'when' => 'when you select a course role from the roles screen', 1011: 'ywbt' => 'you will be taken to the start of the course.', 1012: 'apwb' => 'a page will be displayed that lists items in the course that may require action from you.', 1013: 'gtts' => 'Go to the start of the course', 1014: 'dasp' => "Display the What's New page listing course action items", 1015: ); 1016: my $newdisp = $env{'form.newdisp'}; 1017: $message = '<b>'.$lt{'defs'}.'</b>: '.$lt{'when'}.', '; 1018: if ($newdisp eq 'firstres') { 1019: $message .= $lt{'ywbt'}.'<br/>'; 1020: &Apache::lonnet::put('environment',{'course_init_display' => $newdisp}); 1021: &Apache::lonnet::appenv('environment.course_init_display' => $newdisp); 1022: } else { 1023: $message .= $lt{'apwb'}.'<br/>'; 1024: &Apache::lonnet::del('environment',['course_init_display']); 1025: &Apache::lonnet::delenv('environment\.course_init_display'); 1026: } 1027: my $refpage = $env{'form.refpage'}; 1028: if (($env{'request.course.fn'}) && ($env{'request.course.id'})) { 1029: if ($newdisp eq 'firstres') { 1030: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; 1031: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; 1032: my ($furl,$ferr)= 1033: &Apache::lonuserstate::readmap($cdom.'/'.$cnum); 1034: $message .= '<br /><font size="+1"><a href="'.$furl.'">'.$lt{'gtts'}.' <i>'.&mt('now').'</i></a></font>'; 1035: } else { 1036: $message .= '<br /><font size="+1"><a href="/adm/whatsnew?refpage='. 1037: $refpage.'">'.$lt{'dasp'}.'</a></font>'; 1038: } 1039: } 1040: $r->print(<<ENDVCSCREEN); 1041: $message 1042: <br /><br /> 1043: ENDVCSCREEN 1044: } 1045: 1046: 1047: ###################################################### 1048: # other handler subroutines # 1049: ###################################################### 1050: 1051: ################################################################ 1052: # Main handler # 1053: ################################################################ 1054: sub handler { 1055: my $r = shift; 1056: my $user = $env{'user.name'}; 1057: my $domain = $env{'user.domain'}; 1058: &Apache::loncommon::content_type($r,'text/html'); 1059: # Some pages contain DES keys and should not be cached. 1060: &Apache::loncommon::no_cache($r); 1061: $r->send_http_header; 1062: return OK if $r->header_only; 1063: # 1064: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, 1065: ['action','wysiwyg','returnurl','refpage']); 1066: # 1067: &Apache::lonhtmlcommon::clear_breadcrumbs(); 1068: &Apache::lonhtmlcommon::add_breadcrumb 1069: ({href => '/adm/preferences', 1070: text => 'Set User Preferences'}); 1071: 1072: my @Options; 1073: # Determine current authentication method 1074: my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain); 1075: if ($currentauth =~ /^(unix|internal):/) { 1076: push (@Options,({ action => 'changepass', 1077: linktext => 'Change Password', 1078: href => '/adm/preferences', 1079: help => 'Change_Password', 1080: subroutine => \&passwordchanger, 1081: breadcrumb => 1082: { href => '/adm/preferences?action=changepass', 1083: text => 'Change Password'}, 1084: }, 1085: { action => 'verify_and_change_pass', 1086: subroutine => \&verify_and_change_password, 1087: breadcrumb => 1088: { href =>'/adm/preferences?action=changepass', 1089: text => 'Change Password'}, 1090: printmenu => 'not_on_error', 1091: })); 1092: } 1093: push (@Options,({ action => 'changescreenname', 1094: linktext => 'Change Screen Name', 1095: href => '/adm/preferences', 1096: help => 'Prefs_Screen_Name_Nickname', 1097: subroutine => \&screennamechanger, 1098: breadcrumb => 1099: { href => '/adm/preferences?action=changescreenname', 1100: text => 'Change Screen Name'}, 1101: }, 1102: { action => 'verify_and_change_screenname', 1103: subroutine => \&verify_and_change_screenname, 1104: breadcrumb => 1105: { href => '/adm/preferences?action=changescreenname', 1106: text => 'Change Screen Name'}, 1107: printmenu => 'yes', 1108: })); 1109: 1110: push (@Options,({ action => 'changemsgforward', 1111: linktext => 'Change Message Forwarding and Notification Addresses', 1112: href => '/adm/preferences', 1113: help => 'Prefs_Forwarding', 1114: breadcrumb => 1115: { href => '/adm/preferences?action=changemsgforward', 1116: text => 'Change Message Forwarding'}, 1117: subroutine => \&msgforwardchanger, 1118: }, 1119: { action => 'verify_and_change_msgforward', 1120: breadcrumb => 1121: { href => '/adm/preferences?action=changemsgforward', 1122: text => 'Change Message Forwarding'}, 1123: printmenu => 'yes', 1124: subroutine => \&verify_and_change_msgforward })); 1125: my $aboutmeaction= 1126: '/adm/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/aboutme'; 1127: push (@Options,{ action => 'none', 1128: linktext => 1129: q{Edit the 'About Me' Personal Information Screen}, 1130: help => 'Prefs_About_Me', 1131: href => $aboutmeaction}); 1132: push (@Options,({ action => 'changecolors', 1133: linktext => 'Change Color Scheme', 1134: href => '/adm/preferences', 1135: help => 'Change_Colors', 1136: breadcrumb => 1137: { href => '/adm/preferences?action=changecolors', 1138: text => 'Change Colors'}, 1139: subroutine => \&colorschanger, 1140: }, 1141: { action => 'verify_and_change_colors', 1142: breadcrumb => 1143: { href => '/adm/preferences?action=changecolors', 1144: text => 'Change Colors'}, 1145: printmenu => 'yes', 1146: subroutine => \&verify_and_change_colors, 1147: })); 1148: push (@Options,({ action => 'changelanguages', 1149: linktext => 'Change Language Preferences', 1150: href => '/adm/preferences', 1151: help => 'Prefs_Language', 1152: breadcrumb=> 1153: { href => '/adm/preferences?action=changelanguages', 1154: text => 'Change Language'}, 1155: subroutine => \&languagechanger, 1156: }, 1157: { action => 'verify_and_change_languages', 1158: breadcrumb=> 1159: {href => '/adm/preferences?action=changelanguages', 1160: text => 'Change Language'}, 1161: printmenu => 'yes', 1162: subroutine=>\&verify_and_change_languages, } 1163: )); 1164: push (@Options,({ action => 'changewysiwyg', 1165: linktext => 'Change WYSIWYG Editor Preferences', 1166: href => '/adm/preferences', 1167: breadcrumb => 1168: { href => '/adm/preferences?action=changewysiwyg', 1169: text => 'Change WYSIWYG Preferences'}, 1170: subroutine => \&wysiwygchanger, 1171: }, 1172: { action => 'set_wysiwyg', 1173: breadcrumb => 1174: { href => '/adm/preferences?action=changewysiwyg', 1175: text => 'Change WYSIWYG Preferences'}, 1176: printmenu => 'yes', 1177: subroutine => \&verify_and_change_wysiwyg, } 1178: )); 1179: push (@Options,({ action => 'changediscussions', 1180: linktext => 'Change Discussion Display Preferences', 1181: href => '/adm/preferences', 1182: help => 'Change_Discussion_Display', 1183: breadcrumb => 1184: { href => '/adm/preferences?action=changediscussions', 1185: text => 'Change Discussion Preferences'}, 1186: subroutine => \&discussionchanger, 1187: }, 1188: { action => 'verify_and_change_discussion', 1189: breadcrumb => 1190: { href => '/adm/preferences?action=changediscussions', 1191: text => 'Change Discussion Preferences'}, 1192: printmenu => 'yes', 1193: subroutine => \&verify_and_change_discussion, } 1194: )); 1195: 1196: push (@Options,({ action => 'changerolespref', 1197: linktext => 'Change Roles Page Preferences', 1198: href => '/adm/preferences', 1199: subroutine => \&rolesprefchanger, 1200: breadcrumb => 1201: { href => '/adm/preferences?action=changerolespref', 1202: text => 'Change Roles Pref'}, 1203: }, 1204: { action => 'verify_and_change_rolespref', 1205: subroutine => \&verify_and_change_rolespref, 1206: breadcrumb => 1207: { href => '/adm/preferences?action=changerolespref', 1208: text => 'Change Roles Preferences'}, 1209: printmenu => 'yes', 1210: })); 1211: 1212: push (@Options,({ action => 'changetexenginepref', 1213: linktext => 'Change How Math Equations Are Displayed', 1214: href => '/adm/preferences', 1215: subroutine => \&texenginechanger, 1216: breadcrumb => 1217: { href => '/adm/preferences?action=changetexenginepref', 1218: text => 'Change Math Pref'}, 1219: }, 1220: { action => 'verify_and_change_texengine', 1221: subroutine => \&verify_and_change_texengine, 1222: breadcrumb => 1223: { href => '/adm/preferences?action=changetexenginepref', 1224: text => 'Change Math Preferences'}, 1225: printmenu => 'yes', 1226: })); 1227: if (&Apache::lonnet::allowed('whn',$env{'request.course.id'}) 1228: || &Apache::lonnet::allowed('whn',$env{'request.course.id'}.'/' 1229: .$env{'request.course.sec'})) { 1230: push (@Options,({ action => 'changecourseinit', 1231: linktext => 'Change Course Initialization Preference', 1232: href => '/adm/preferences', 1233: subroutine => \&coursedisplaychanger, 1234: breadcrumb => 1235: { href => '/adm/preferences?action=changecourseinit', 1236: text => 'Change Course Init. Pref.'}, 1237: }, 1238: { action => 'verify_and_change_coursepage', 1239: breadcrumb => 1240: { href => '/adm/preferences?action=changecourseinit', text => 'Change Course Initialization Preference'}, 1241: printmenu => 'yes', 1242: subroutine => \&verify_and_change_coursepage, 1243: })); 1244: } 1245: 1246: if ($env{'user.name'} =~ /^(albertel|fox|foxr|koretemey|korte|hallmat3|turtle|raeburn)$/) { 1247: push (@Options,({ action => 'debugtoggle', 1248: printmenu => 'yes', 1249: subroutine => \&toggle_debug, 1250: })); 1251: } 1252: 1253: $r->print(&Apache::loncommon::start_page('Change Preferences')); 1254: 1255: my $call = undef; 1256: my $help = undef; 1257: my $printmenu = 'yes'; 1258: foreach my $option (@Options) { 1259: if ($option->{'action'} eq $env{'form.action'}) { 1260: $call = $option->{'subroutine'}; 1261: $printmenu = $option->{'printmenu'}; 1262: if (exists($option->{'breadcrumb'})) { 1263: &Apache::lonhtmlcommon::add_breadcrumb 1264: ($option->{'breadcrumb'}); 1265: } 1266: $help=$option->{'help'}; 1267: } 1268: } 1269: $r->print(&Apache::lonhtmlcommon::breadcrumbs 1270: (undef,'Change Preferences',$help)); 1271: my $error; 1272: if (defined($call)) { 1273: $error = $call->($r); 1274: } 1275: if ( ( ($printmenu eq 'yes') 1276: || ($printmenu eq 'not_on_error' && !$error) ) 1277: && (!$env{'form.returnurl'})) { 1278: my $optionlist = '<table cellpadding="5">'; 1279: if ($env{'user.name'} =~ 1280: /^(albertel|kortemey|fox|foxr|korte|hallmat3|turtle|raeburn)$/ 1281: ) { 1282: push (@Options,({ action => 'debugtoggle', 1283: linktext => 'Toggle Debug Messages', 1284: text => 'Current Debug status is -'. 1285: $env{'user.debug'}.'-.', 1286: href => '/adm/preferences', 1287: printmenu => 'yes', 1288: subroutine => \&toggle_debug, 1289: })); 1290: } 1291: foreach my $option(@Options) { 1292: my $optiontext = ''; 1293: if (exists($option->{'href'})) { 1294: $optiontext .= 1295: '<a href="'.$option->{'href'}. 1296: '?action='.$option->{'action'}.'">'. 1297: &mt($option->{'linktext'}).'</a>'; 1298: } 1299: if (exists($option->{'text'})) { 1300: $optiontext .= ' '.&mt($option->{'text'}); 1301: } 1302: if ($optiontext ne '') { 1303: $optiontext = '<font size="+1">'.$optiontext.'</font>'; 1304: my $helplink = ' '; 1305: if (exists($option->{'help'})) { 1306: $helplink = &Apache::loncommon::help_open_topic 1307: ($option->{'help'}); 1308: } 1309: $optionlist .= '<tr>'. 1310: '<td>'.$helplink.'</td>'. 1311: '<td>'.$optiontext.'</td>'. 1312: '</tr>'; 1313: } 1314: } 1315: $optionlist .= '</table>'; 1316: $r->print($optionlist); 1317: } elsif ($env{'form.returnurl'}) { 1318: $r->print('<br /><a href="'.$env{'form.returnurl'}.'"><font size="+1">'. 1319: &mt('Return').'</font></a>'); 1320: } 1321: $r->print(&Apache::loncommon::end_page()); 1322: return OK; 1323: } 1324: 1325: sub toggle_debug { 1326: if ($env{'user.debug'}) { 1327: &Apache::lonnet::delenv('user\.debug'); 1328: } else { 1329: &Apache::lonnet::appenv('user.debug' => 1); 1330: } 1331: } 1332: 1333: 1; 1334: __END__