Annotation of loncom/interface/lonpreferences.pm, revision 1.171
1.1 www 1: # The LearningOnline Network
2: # Preferences
3: #
1.171 ! raeburn 4: # $Id: lonpreferences.pm,v 1.170 2009/09/08 22:17:02 bisitz Exp $
1.2 albertel 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: #
1.3 matthew 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:
1.1 www 33: package Apache::lonpreferences;
34:
35: use strict;
1.86 albertel 36: use LONCAPA;
1.1 www 37: use Apache::Constants qw(:common);
1.3 matthew 38: use Apache::File;
39: use Crypt::DES;
40: use DynaLoader; # for Crypt::DES version
1.4 matthew 41: use Apache::loncommon();
1.23 matthew 42: use Apache::lonhtmlcommon();
1.32 www 43: use Apache::lonlocal;
1.59 albertel 44: use Apache::lonnet;
1.95 albertel 45: use LONCAPA();
1.3 matthew 46:
47: #
48: # Write lonnet::passwd to do the call below.
49: # Use:
50: # my $answer=reply("encrypt:passwd:$udom:$uname:$upass",$tryserver);
51: #
52: ##################################################
53: # password associated functions #
54: ##################################################
55: sub des_keys {
1.4 matthew 56: # Make a new key for DES encryption.
1.36 www 57: # Each key has two parts which are returned separately.
1.4 matthew 58: # Please note: Each key must be passed through the &hex function
59: # before it is output to the web browser. The hex versions cannot
60: # be used to decrypt.
1.3 matthew 61: my @hexstr=('0','1','2','3','4','5','6','7',
62: '8','9','a','b','c','d','e','f');
63: my $lkey='';
64: for (0..7) {
65: $lkey.=$hexstr[rand(15)];
66: }
67: my $ukey='';
68: for (0..7) {
69: $ukey.=$hexstr[rand(15)];
70: }
71: return ($lkey,$ukey);
72: }
73:
74: sub des_decrypt {
75: my ($key,$cyphertext) = @_;
76: my $keybin=pack("H16",$key);
77: my $cypher;
78: if ($Crypt::DES::VERSION>=2.03) {
79: $cypher=new Crypt::DES $keybin;
80: } else {
81: $cypher=new DES $keybin;
82: }
83: my $plaintext=
84: $cypher->decrypt(unpack("a8",pack("H16",substr($cyphertext,0,16))));
85: $plaintext.=
86: $cypher->decrypt(unpack("a8",pack("H16",substr($cyphertext,16,16))));
1.4 matthew 87: $plaintext=substr($plaintext,1,ord(substr($plaintext,0,1)) );
1.3 matthew 88: return $plaintext;
89: }
90:
1.4 matthew 91: ################################################################
92: # Handler subroutines #
93: ################################################################
1.9 matthew 94:
95: ################################################################
1.28 www 96: # Language Change Subroutines #
97: ################################################################
1.44 www 98:
99: sub wysiwygchanger {
100: my $r = shift;
1.126 droeschl 101: Apache::lonhtmlcommon::add_breadcrumb(
102: { href => '/adm/preferences?action=changewysiwyg',
103: text => 'Change WYSIWYG Preferences'});
1.147 schafran 104: $r->print(Apache::loncommon::start_page('Content Display Settings'));
1.126 droeschl 105: $r->print(Apache::lonhtmlcommon::breadcrumbs('Change WYSIWYG Preferences'));
106:
1.44 www 107: my %userenv = &Apache::lonnet::get
108: ('environment',['wysiwygeditor']);
1.78 albertel 109: my $onselect='checked="checked"';
1.44 www 110: my $offselect='';
1.77 albertel 111: if ($userenv{'wysiwygeditor'} eq 'on') {
1.44 www 112: $onselect='';
1.78 albertel 113: $offselect='checked="checked"';
1.44 www 114: }
115: my $switchoff=&mt('Disable WYSIWYG editor');
116: my $switchon=&mt('Enable WYSIWYG editor');
1.124 www 117: my $warning='';
118: if ($env{'user.adv'}) {
119: $warning.="<p>".&mt("The WYSIWYG editor only supports simple HTML and is in many cases unsuited for advanced authoring. In a number of cases, it may destroy advanced authoring involving LaTeX and script function calls.")."</p>";
120: }
1.44 www 121: $r->print(<<ENDLSCREEN);
1.88 albertel 122: <form name="prefs" action="/adm/preferences" method="post">
1.44 www 123: <input type="hidden" name="action" value="set_wysiwyg" />
1.124 www 124: $warning
1.44 www 125: <br />
1.65 albertel 126: <label><input type="radio" name="wysiwyg" value="off" $onselect /> $switchoff</label><br />
127: <label><input type="radio" name="wysiwyg" value="on" $offselect /> $switchon</label>
1.44 www 128: ENDLSCREEN
1.136 schafran 129: $r->print('<br /><input type="submit" value="'.&mt('Save').'" />');
1.44 www 130: }
131:
132:
133: sub verify_and_change_wysiwyg {
134: my $r = shift;
1.59 albertel 135: my $newsetting=$env{'form.wysiwyg'};
1.44 www 136: &Apache::lonnet::put('environment',{'wysiwygeditor' => $newsetting});
1.116 raeburn 137: &Apache::lonnet::appenv({'environment.wysiwygeditor' => $newsetting});
1.158 bisitz 138: my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('WYSIWYG Editor').'</i>','<tt>'.&mt($newsetting).'</tt>'));
139: $message=&Apache::loncommon::confirmwrapper($message);
140: &print_main_menu($r,$message);
1.44 www 141: }
142:
143: ################################################################
144: # Language Change Subroutines #
145: ################################################################
1.28 www 146: sub languagechanger {
147: my $r = shift;
1.126 droeschl 148:
149: Apache::lonhtmlcommon::add_breadcrumb(
150: { href => '/adm/preferences?action=changelanguages',
1.127 droeschl 151: text => 'Change Language'});
1.147 schafran 152: $r->print(Apache::loncommon::start_page('Content Display Settings'));
1.126 droeschl 153: $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Language'));
1.59 albertel 154: my $user = $env{'user.name'};
155: my $domain = $env{'user.domain'};
1.28 www 156: my %userenv = &Apache::lonnet::get
1.32 www 157: ('environment',['languages']);
1.29 www 158: my $language=$userenv{'languages'};
1.32 www 159:
1.33 www 160: my $pref=&mt('Preferred language');
161: my %langchoices=('' => 'No language preference');
162: foreach (&Apache::loncommon::languageids()) {
163: if (&Apache::loncommon::supportedlanguagecode($_)) {
164: $langchoices{&Apache::loncommon::supportedlanguagecode($_)}
165: = &Apache::loncommon::plainlanguagedescription($_);
166: }
167: }
168: my $selectionbox=&Apache::loncommon::select_form($language,'language',
169: %langchoices);
1.28 www 170: $r->print(<<ENDLSCREEN);
1.88 albertel 171: <form name="prefs" action="/adm/preferences" method="post">
1.28 www 172: <input type="hidden" name="action" value="verify_and_change_languages" />
1.33 www 173: <br />$pref: $selectionbox
1.28 www 174: ENDLSCREEN
1.136 schafran 175: $r->print('<br /><input type="submit" value="'.&mt('Save').'" />');
1.28 www 176: }
177:
178:
179: sub verify_and_change_languages {
180: my $r = shift;
1.59 albertel 181: my $user = $env{'user.name'};
182: my $domain = $env{'user.domain'};
1.28 www 183: # Screenname
1.59 albertel 184: my $newlanguage = $env{'form.language'};
1.28 www 185: $newlanguage=~s/[^\-\w]//g;
186: my $message='';
187: if ($newlanguage) {
1.29 www 188: &Apache::lonnet::put('environment',{'languages' => $newlanguage});
1.116 raeburn 189: &Apache::lonnet::appenv({'environment.languages' => $newlanguage});
1.158 bisitz 190: $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Preferred language').'</i>','<tt>"'.$newlanguage.'"</tt>.'));
1.28 www 191: } else {
1.29 www 192: &Apache::lonnet::del('environment',['languages']);
1.139 raeburn 193: &Apache::lonnet::delenv('environment.languages');
1.158 bisitz 194: $message=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]','<i>'.&mt('Preferred language').'</i>'));
1.28 www 195: }
1.158 bisitz 196: $message=&Apache::loncommon::confirmwrapper($message);
1.132 raeburn 197: &Apache::loncommon::flush_langs_cache($user,$domain);
1.152 www 198: &print_main_menu($r, $message);
1.28 www 199: }
200:
1.50 albertel 201: ################################################################
1.54 albertel 202: # Tex Engine Change Subroutines #
203: ################################################################
204: sub texenginechanger {
205: my $r = shift;
1.126 droeschl 206: Apache::lonhtmlcommon::add_breadcrumb(
207: { href => '/adm/preferences?action=changetexenginepref',
208: text => 'Change How Math Equations Are Displayed'});
1.147 schafran 209: $r->print(Apache::loncommon::start_page('Content Display Settings'));
1.126 droeschl 210: $r->print(Apache::lonhtmlcommon::breadcrumbs('Change How Math Equations Are Displayed'));
1.59 albertel 211: my $user = $env{'user.name'};
212: my $domain = $env{'user.domain'};
1.54 albertel 213: my %userenv = &Apache::lonnet::get('environment',['texengine']);
214: my $texengine=$userenv{'texengine'};
215:
1.69 albertel 216: my %mathchoices=('' => 'Default',
1.123 bisitz 217: 'tth' => 'tth (TeX to HTML)',
1.64 albertel 218: #'ttm' => 'TeX to MathML',
1.54 albertel 219: 'jsMath' => 'jsMath',
1.168 www 220: 'mimetex' => 'mimetex (Convert to Images)',
221: 'raw' => 'Raw (Screen Reader)'
1.54 albertel 222: );
223: my $selectionbox=&Apache::loncommon::select_form($texengine,'texengine',
224: %mathchoices);
1.67 albertel 225: my $jsMath_start=&Apache::lontexconvert::jsMath_header();
1.123 bisitz 226: my %lt=&Apache::lonlocal::texthash(
227: 'headline' => 'Change Math Preferences',
228: 'preftxt' => 'Preferred method to display Math',
1.136 schafran 229: 'change' => 'Save',
1.123 bisitz 230: 'exmpl' => 'Examples',
231: 'jsmath' => 'jsMath:',
232: 'tth' => 'tth (TeX to HTML):',
233: 'mimetex' => 'mimetex (Convert to Images):',
234: );
235:
1.162 bisitz 236: my $jsMathWarning='<p>'
237: .'<div class="LC_warning">'
238: .&mt("It looks like you don't have the TeX math fonts installed.")
239: .'</div>'
240: .'<div>'
241: .&mt('The jsMath example on this page may not look right without them. '
242: .'The [_1]jsMath Home Page[_2] has information on how to download the '
243: .'needed fonts. In the meantime, jsMath will do the best it can '
244: .'with the fonts you have, but it may not be pretty and some equations '
245: .'may not be rendered correctly.'
246: ,'<a href="http://www.math.union.edu/locate/jsMath/" target="_blank">'
247: ,'</a>')
248: .'</div>'
249: .'</p>';
250:
1.54 albertel 251: $r->print(<<ENDLSCREEN);
1.123 bisitz 252: <h2>$lt{'headline'}</h2>
1.88 albertel 253: <form name="prefs" action="/adm/preferences" method="post">
1.54 albertel 254: <input type="hidden" name="action" value="verify_and_change_texengine" />
1.123 bisitz 255: <p>
1.136 schafran 256: $lt{'preftxt'}: $selectionbox
257: <br />
258: <input type="submit" value="$lt{'change'}" />
1.123 bisitz 259: </p>
1.54 albertel 260: </form>
1.123 bisitz 261: <br />
262: <hr />
263: $lt{'exmpl'}
264:
265: <h3>$lt{'jsmath'}</h3>
266: <p>
1.67 albertel 267: $jsMath_start
1.148 bisitz 268: <script type="text/javascript" language="JavaScript">
1.54 albertel 269: if (jsMath.nofonts == 1) {
1.162 bisitz 270: document.writeln($jsMathWarning);
1.54 albertel 271: }
272: </script>
1.122 www 273: <iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=jsMath" width="400" height="120"></iframe>
1.123 bisitz 274: </p>
1.54 albertel 275:
1.123 bisitz 276: <h3>$lt{'mimetex'}</h3>
277: <p>
278: <iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=mimetex" width="400" height="100"></iframe>
1.67 albertel 279: </p>
1.123 bisitz 280:
281: <h3>$lt{'tth'}</h3>
282: <p>
283: <iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=tth" width="400" height="200"></iframe>
1.67 albertel 284: </p>
1.54 albertel 285: ENDLSCREEN
1.59 albertel 286: if ($env{'environment.texengine'} ne 'jsMath') {
1.148 bisitz 287: $r->print('<script type="text/javascript" language="JavaScript">jsMath.Process()</script>');
1.55 albertel 288: }
1.54 albertel 289: }
290:
291:
292: sub verify_and_change_texengine {
293: my $r = shift;
1.59 albertel 294: my $user = $env{'user.name'};
295: my $domain = $env{'user.domain'};
1.54 albertel 296: # Screenname
1.59 albertel 297: my $newtexengine = $env{'form.texengine'};
1.54 albertel 298: $newtexengine=~s/[^\-\w]//g;
1.56 albertel 299: if ($newtexengine eq 'ttm') {
1.116 raeburn 300: &Apache::lonnet::appenv({'browser.mathml' => 1});
1.56 albertel 301: } else {
1.59 albertel 302: if ($env{'environment.texengine'} eq 'ttm') {
1.116 raeburn 303: &Apache::lonnet::appenv({'browser.mathml' => 0});
1.56 albertel 304: }
305: }
1.54 albertel 306: my $message='';
307: if ($newtexengine) {
308: &Apache::lonnet::put('environment',{'texengine' => $newtexengine});
1.116 raeburn 309: &Apache::lonnet::appenv({'environment.texengine' => $newtexengine});
1.158 bisitz 310: $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Preferred method to display Math').'</i>','<tt>"'.$newtexengine.'"</tt>'));
1.54 albertel 311: } else {
312: &Apache::lonnet::del('environment',['texengine']);
1.139 raeburn 313: &Apache::lonnet::delenv('environment.texengine');
1.158 bisitz 314: $message=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]','<i>'.&mt('Preferred method to display Math').'</i>'));
1.54 albertel 315: }
1.158 bisitz 316: $message=&Apache::loncommon::confirmwrapper($message);
1.152 www 317: &print_main_menu($r, $message);
1.54 albertel 318: }
319:
320: ################################################################
1.50 albertel 321: # Roles Page Preference Change Subroutines #
322: ################################################################
323: sub rolesprefchanger {
324: my $r = shift;
1.96 albertel 325: my $role = ($env{'user.adv'} ? 'Role' : 'Course');
326: my $lc_role = ($env{'user.adv'} ? 'role' : 'course');
1.59 albertel 327: my $user = $env{'user.name'};
328: my $domain = $env{'user.domain'};
1.50 albertel 329: my %userenv = &Apache::lonnet::get
330: ('environment',['recentroles','recentrolesn']);
1.126 droeschl 331: Apache::lonhtmlcommon::add_breadcrumb(
332: { href => '/adm/preferences?action=changerolespref',
333: text => 'Change '.$role.' Page Pref'});
1.147 schafran 334: $r->print(Apache::loncommon::start_page('Content Display Settings'));
1.126 droeschl 335: $r->print(Apache::lonhtmlcommon::breadcrumbs('Change '.$role.' Page Pref'));
1.50 albertel 336: my $hotlist_flag=$userenv{'recentroles'};
337: my $hotlist_n=$userenv{'recentrolesn'};
338: my $checked;
339: if ($hotlist_flag) {
340: $checked = 'checked="checked"';
341: }
342:
343: if (!$hotlist_n) { $hotlist_n=3; }
344: my $options;
345: for (my $i=1; $i<10; $i++) {
346: my $select;
347: if ($hotlist_n == $i) { $select = 'selected="selected"'; }
348: $options .= "<option $select>$i</option>\n";
349: }
350:
1.89 albertel 351: # Get list of recent roles and display with checkbox in front
352: my $roles_check_list = '';
353: my $role_key='';
354: if ($env{'environment.recentroles'}) {
355: my %recent_roles =
356: &Apache::lonhtmlcommon::get_recent('roles',$env{'environment.recentrolesn'});
1.91 albertel 357: my %frozen_roles =
358: &Apache::lonhtmlcommon::get_recent_frozen('roles',$env{'environment.recentrolesn'});
1.89 albertel 359:
1.93 albertel 360: my %role_text = &rolespref_get_role_text([keys(%recent_roles)]);
1.92 albertel 361: my @sorted_roles = sort {$role_text{$a} cmp $role_text{$b}} keys(%role_text);
362:
1.89 albertel 363: $roles_check_list .=
364: &Apache::loncommon::start_data_table().
365: &Apache::loncommon::start_data_table_header_row().
1.96 albertel 366: "<th>".&mt('Freeze '.$role)."</th>".
367: "<th>".&mt($role)."</td>".
1.89 albertel 368: &Apache::loncommon::end_data_table_header_row().
369: "\n";
370: my $count;
1.92 albertel 371: foreach $role_key (@sorted_roles) {
1.89 albertel 372: my $checked = "";
373: my $value = $recent_roles{$role_key};
1.91 albertel 374: if ($frozen_roles{$role_key}) {
1.159 bisitz 375: $checked = ' checked="checked"';
1.89 albertel 376: }
377: $count++;
378: $roles_check_list .=
379: &Apache::loncommon::start_data_table_row().
380: '<td class="LC_table_cell_checkbox">'.
1.159 bisitz 381: "<input type=\"checkbox\"$checked name=\"freezeroles\"".
1.89 albertel 382: " id=\"freezeroles$count\" value=\"$role_key\" /></td>".
383: "<td><label for=\"freezeroles$count\">".
1.92 albertel 384: "$role_text{$role_key}</label></td>".
1.89 albertel 385: &Apache::loncommon::end_data_table_row(). "\n";
386: }
387: $roles_check_list .= "</table>\n";
388: }
389:
390: $r->print('
1.96 albertel 391: <p>'.&mt('Some LON-CAPA users have a long list of '.$lc_role.'s. The Recent '.$role.'s Hotlist feature keeps track of the last N '.$lc_role.'s which have been visited and places a table of these at the top of the '.$lc_role.'s page. People with very few '.$lc_role.'s should leave this feature disabled.').'
1.50 albertel 392: </p>
1.160 bisitz 393: <form name="prefs" action="/adm/preferences" method="post">
1.50 albertel 394: <input type="hidden" name="action" value="verify_and_change_rolespref" />
1.96 albertel 395: <br /><label>'.&mt('Enable Recent '.$role.'s Hotlist:').'
1.159 bisitz 396: <input type="checkbox"'.$checked.' name="recentroles" value="true" /></label>
1.96 albertel 397: <br />'.&mt('Number of '.$role.'s in Hotlist:').'
1.50 albertel 398: <select name="recentrolesn" size="1">
1.89 albertel 399: '.$options.'
1.50 albertel 400: </select>
1.96 albertel 401: <p>'.&mt('This list below can be used to <q>freeze</q> '.$lc_role.'s on your screen. Those marked as frozen will not be removed from the list, even if they have not been used recently.').'
1.89 albertel 402: </p>
403: '.$roles_check_list.'
1.50 albertel 404: <br />
1.136 schafran 405: <input type="submit" value="'.&mt('Save').'" />
1.89 albertel 406: </form>');
1.50 albertel 407: }
408:
1.92 albertel 409: sub rolespref_get_role_text {
410: # Get a line of text for each role
411: my ($roles) = @_;
412: my %roletext = ();
413:
414: foreach my $item (@$roles) {
415: # get course information
416: my ($role,$rest) = split(/\./, $item);
1.93 albertel 417: my $trole = "";
418: $trole = &Apache::lonnet::plaintext($role);
1.92 albertel 419: my ($tdomain,$other,$tsection)= split(/\//,Apache::lonnet::declutter($rest));
420: my $tother = '-';
1.93 albertel 421: if ($role =~ /^(cc|st|in|ta|ep|cr)/ ) {
1.92 albertel 422: my %newhash=&Apache::lonnet::coursedescription($tdomain."_".$other);
423: $tother = " - ".$newhash{'description'};
424: } elsif ($role =~ /dc/) {
425: $tother = "";
426: } else {
427: $tother = " - $other";
428: }
429:
430: my $section="";
431: if ($tsection) {
432: $section = " - Section/Group: $tsection";
433: }
434: $roletext{$item} = $tdomain." - ".$trole.$tother.$section;
435: }
436: return %roletext;
437: }
438:
1.50 albertel 439: sub verify_and_change_rolespref {
440: my $r = shift;
1.96 albertel 441: my $role = ($env{'user.adv'} ? 'Role' : 'Course');
1.59 albertel 442: my $user = $env{'user.name'};
443: my $domain = $env{'user.domain'};
1.50 albertel 444: # Recent Roles Hotlist Flag
1.59 albertel 445: my $hotlist_flag = $env{'form.recentroles'};
446: my $hotlist_n = $env{'form.recentrolesn'};
1.89 albertel 447: my $message='<hr />';
1.50 albertel 448: if ($hotlist_flag) {
449: &Apache::lonnet::put('environment',{'recentroles' => $hotlist_flag});
1.116 raeburn 450: &Apache::lonnet::appenv({'environment.recentroles' => $hotlist_flag});
1.96 albertel 451: $message=&mt('Recent '.$role.'s Hotlist is Enabled');
1.50 albertel 452: } else {
453: &Apache::lonnet::del('environment',['recentroles']);
1.139 raeburn 454: &Apache::lonnet::delenv('environment.recentroles');
1.96 albertel 455: $message=&mt('Recent '.$role.'s Hotlist is Disabled');
1.50 albertel 456: }
457: if ($hotlist_n) {
458: &Apache::lonnet::put('environment',{'recentrolesn' => $hotlist_n});
1.116 raeburn 459: &Apache::lonnet::appenv({'environment.recentrolesn' => $hotlist_n});
1.50 albertel 460: if ($hotlist_flag) {
1.90 albertel 461: $message.="<br />".
1.96 albertel 462: &mt('Display [_1] Most Recent '.$role.'s',$hotlist_n)."\n";
1.89 albertel 463: }
464: }
465:
466: # Get list of froze roles and list of recent roles
467: my @freeze_list = &Apache::loncommon::get_env_multiple('form.freezeroles');
468: my %freeze = ();
1.92 albertel 469: my %roletext = ();
470:
1.89 albertel 471: foreach my $key (@freeze_list) {
1.91 albertel 472: $freeze{$key}='1';
1.89 albertel 473: }
1.92 albertel 474:
1.89 albertel 475: my %recent_roles =
476: &Apache::lonhtmlcommon::get_recent('roles',$env{'environment.recentrolesn'});
1.91 albertel 477: my %frozen_roles =
478: &Apache::lonhtmlcommon::get_recent_frozen('roles',$env{'environment.recentrolesn'});
1.92 albertel 479: my %role_text = &rolespref_get_role_text([keys(%recent_roles)]);
1.89 albertel 480:
481: # Unset any roles that were previously frozen but aren't in list
482: foreach my $role_key (sort(keys(%recent_roles))) {
1.91 albertel 483: if (($frozen_roles{$role_key}) && (!exists($freeze{$role_key}))) {
1.158 bisitz 484: $message .= "<br />".&Apache::lonhtmlcommon::confirm_success(&mt('Unfreezing '.$role.': [_1]','<i>'.$role_text{$role_key}.'</i>'));
1.91 albertel 485: &Apache::lonhtmlcommon::store_recent('roles',$role_key,' ',0);
1.89 albertel 486: }
487: }
488:
489: # Freeze selected roles
490: foreach my $role_key (@freeze_list) {
1.91 albertel 491: if (!$frozen_roles{$role_key}) {
1.154 www 492: $message .= "<br />".
1.158 bisitz 493: &Apache::lonhtmlcommon::confirm_success(&mt('Freezing '.$role.': [_1]','<i>'.$role_text{$role_key}.'</i>'));
1.89 albertel 494: &Apache::lonhtmlcommon::store_recent('roles',
1.91 albertel 495: $role_key,' ',1);
1.50 albertel 496: }
497: }
1.158 bisitz 498: $message=&Apache::loncommon::confirmwrapper($message);
1.152 www 499: &print_main_menu($r, $message);
1.50 albertel 500: }
501:
502:
1.28 www 503:
504: ################################################################
1.9 matthew 505: # Anonymous Discussion Name Change Subroutines #
506: ################################################################
1.5 www 507: sub screennamechanger {
508: my $r = shift;
1.59 albertel 509: my $user = $env{'user.name'};
510: my $domain = $env{'user.domain'};
1.14 www 511: my %userenv = &Apache::lonnet::get
512: ('environment',['screenname','nickname']);
1.6 www 513: my $screenname=$userenv{'screenname'};
1.14 www 514: my $nickname=$userenv{'nickname'};
1.126 droeschl 515: Apache::lonhtmlcommon::add_breadcrumb(
516: { href => '/adm/preferences?action=changescreenname',
517: text => 'Change Screen Name'});
1.147 schafran 518: $r->print(Apache::loncommon::start_page('Personal Data'));
1.126 droeschl 519: $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Screen Name'));
1.133 bisitz 520: $r->print('<p>'
521: .&mt('Change the name that is displayed in your posts.')
522: .'</p>'
523: );
524: $r->print('<form name="prefs" action="/adm/preferences" method="post">'
525: .'<input type="hidden" name="action" value="verify_and_change_screenname" />'
526: .&Apache::lonhtmlcommon::start_pick_box()
1.158 bisitz 527: .&Apache::lonhtmlcommon::row_title(&mt('Screenname').' '.&mt('(shown if you post anonymously)'))
1.133 bisitz 528: .'<input type="text" size="20" value="'.$screenname.'" name="screenname" />'
529: .&Apache::lonhtmlcommon::row_closure()
1.158 bisitz 530: .&Apache::lonhtmlcommon::row_title(&mt('Nickname').' '.&mt('(shown if you post non-anonymously)'))
1.133 bisitz 531: .'<input type="text" size="20" value="'.$nickname.'" name="nickname" />'
532: .&Apache::lonhtmlcommon::row_closure()
533: .&Apache::lonhtmlcommon::row_title()
534: .'<input type="submit" value="'.&mt('Save').'" />'
535: .&Apache::lonhtmlcommon::row_closure(1)
536: .&Apache::lonhtmlcommon::end_pick_box()
537: .'</form>'
538: );
1.5 www 539: }
1.6 www 540:
541: sub verify_and_change_screenname {
542: my $r = shift;
1.59 albertel 543: my $user = $env{'user.name'};
544: my $domain = $env{'user.domain'};
1.14 www 545: # Screenname
1.59 albertel 546: my $newscreen = $env{'form.screenname'};
1.14 www 547: $newscreen=~s/[^ \w]//g;
1.6 www 548: my $message='';
549: if ($newscreen) {
1.7 www 550: &Apache::lonnet::put('environment',{'screenname' => $newscreen});
1.116 raeburn 551: &Apache::lonnet::appenv({'environment.screenname' => $newscreen});
1.161 bisitz 552: $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Screenname').'</i>','<tt>"'.$newscreen.'"</tt>'));
1.6 www 553: } else {
554: &Apache::lonnet::del('environment',['screenname']);
1.139 raeburn 555: &Apache::lonnet::delenv('environment.screenname');
1.158 bisitz 556: $message=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]','<i>'.&mt('Screenname').'</i>'));
1.6 www 557: }
1.14 www 558: # Nickname
559: $message.='<br />';
1.59 albertel 560: $newscreen = $env{'form.nickname'};
1.14 www 561: $newscreen=~s/[^ \w]//g;
562: if ($newscreen) {
563: &Apache::lonnet::put('environment',{'nickname' => $newscreen});
1.116 raeburn 564: &Apache::lonnet::appenv({'environment.nickname' => $newscreen});
1.161 bisitz 565: $message.=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Nickname').'</i>','<tt>"'.$newscreen.'"</tt>'));
1.14 www 566: } else {
567: &Apache::lonnet::del('environment',['nickname']);
1.139 raeburn 568: &Apache::lonnet::delenv('environment.nickname');
1.158 bisitz 569: $message.=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]','<i>'.&mt('Nickname').'</i>'));
1.14 www 570: }
1.68 www 571: &Apache::lonnet::devalidate_cache_new('namescache',$user.':'.$domain);
1.158 bisitz 572: $message=&Apache::loncommon::confirmwrapper($message);
1.152 www 573: &print_main_menu($r, $message);
1.20 www 574: }
575:
576: ################################################################
1.98 www 577: # Icon Subroutines #
578: ################################################################
579: sub iconchanger {
580: my $r = shift;
1.154 www 581: &Apache::lonhtmlcommon::add_breadcrumb(
1.126 droeschl 582: { href => '/adm/preferences?action=changeicons',
583: text => 'Change Main Menu'});
1.147 schafran 584: $r->print(Apache::loncommon::start_page('Page Display Settings'));
1.126 droeschl 585: $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Main Menu'));
586:
1.98 www 587: my $user = $env{'user.name'};
588: my $domain = $env{'user.domain'};
589: my %userenv = &Apache::lonnet::get
590: ('environment',['icons']);
591: my $iconic='checked="checked"';
592: my $classic='';
1.100 www 593: my $onlyicon='';
1.98 www 594: if ($userenv{'icons'} eq 'classic') {
595: $classic='checked="checked"';
596: $iconic='';
597: }
1.100 www 598: if ($userenv{'icons'} eq 'iconsonly') {
599: $onlyicon='checked="checked"';
600: $iconic='';
601: }
602: my $useicons=&mt('Use icons and text');
603: my $usebuttons=&mt('Use buttons and text');
604: my $useicononly=&mt('Use icons only');
1.136 schafran 605: my $change=&mt('Save');
1.98 www 606: $r->print(<<ENDSCREEN);
607: <form name="prefs" action="/adm/preferences" method="post">
608: <input type="hidden" name="action" value="verify_and_change_icons" />
609: <label><input type="radio" name="menumode" value="iconic" $iconic /> $useicons</label><br />
610: <label><input type="radio" name="menumode" value="classic" $classic /> $usebuttons</label><br />
1.100 www 611: <label><input type="radio" name="menumode" value="iconsonly" $onlyicon /> $useicononly</label><br />
1.98 www 612: <input type="submit" value="$change" />
613: </form>
614: ENDSCREEN
615: }
616:
617: sub verify_and_change_icons {
618: my $r = shift;
619: my $user = $env{'user.name'};
620: my $domain = $env{'user.domain'};
1.158 bisitz 621: my $newicons = $env{'form.menumode'};
1.98 www 622:
623: &Apache::lonnet::put('environment',{'icons' => $newicons});
1.116 raeburn 624: &Apache::lonnet::appenv({'environment.icons' => $newicons});
1.158 bisitz 625: my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Menu Display').'</i>','<tt>'.$newicons.'</tt>'));
626: $message=&Apache::loncommon::confirmwrapper($message);
627: &print_main_menu($r, $message);
1.98 www 628: }
629:
630: ################################################################
1.105 www 631: # Clicker Subroutines #
632: ################################################################
633:
634: sub clickerchanger {
635: my $r = shift;
1.152 www 636: &Apache::lonhtmlcommon::add_breadcrumb(
1.126 droeschl 637: { href => '/adm/preferences?action=changeclicker',
638: text => 'Register Clicker'});
1.147 schafran 639: $r->print(Apache::loncommon::start_page('Other'));
1.126 droeschl 640: $r->print(Apache::lonhtmlcommon::breadcrumbs('Register Clicker'));
1.105 www 641: my $user = $env{'user.name'};
642: my $domain = $env{'user.domain'};
643: my %userenv = &Apache::lonnet::get
644: ('environment',['clickers']);
645: my $clickers=$userenv{'clickers'};
646: $clickers=~s/\,/\n/gs;
647: my $text=&mt('Enter response device ("clicker") numbers');
1.151 bisitz 648: my $change=&mt('Save');
1.114 bisitz 649: my $helplink=&Apache::loncommon::help_open_topic('Clicker_Registration',&mt('Locating your clicker ID'));
1.105 www 650: $r->print(<<ENDSCREEN);
651: <form name="prefs" action="/adm/preferences" method="post">
652: <input type="hidden" name="action" value="verify_and_change_clicker" />
1.151 bisitz 653: <label>$helplink<br /><br />$text<br />
1.108 www 654: <textarea name="clickers" rows="5" cols="20">$clickers</textarea>
1.105 www 655: </label>
1.151 bisitz 656: <br />
1.105 www 657: <input type="submit" value="$change" />
658: </form>
659: ENDSCREEN
660: }
661:
662: sub verify_and_change_clicker {
663: my $r = shift;
664: my $user = $env{'user.name'};
665: my $domain = $env{'user.domain'};
666: my $newclickers = $env{'form.clickers'};
1.108 www 667: $newclickers=~s/[^\w\:\-]+/\,/gs;
1.105 www 668: $newclickers=~tr/a-z/A-Z/;
1.108 www 669: $newclickers=~s/[\:\-]+/\-/g;
670: $newclickers=~s/\,+/\,/g;
1.105 www 671: $newclickers=~s/^\,//;
672: $newclickers=~s/\,$//;
673: &Apache::lonnet::put('environment',{'clickers' => $newclickers});
1.116 raeburn 674: &Apache::lonnet::appenv({'environment.clickers' => $newclickers});
1.158 bisitz 675: my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Registering clickers: [_1]',$newclickers));
676: $message=&Apache::loncommon::confirmwrapper($message);
677: &print_main_menu($r, $message);
1.105 www 678: }
679:
1.119 www 680: ################################################################
681: # Domcoord Access Subroutines #
682: ################################################################
683:
684: sub domcoordchanger {
685: my $r = shift;
1.154 www 686: &Apache::lonhtmlcommon::add_breadcrumb(
1.126 droeschl 687: { href => '/adm/preferences?action=changedomcoord',
688: text => 'Restrict Domain Coordinator Access'});
689: $r->print(Apache::loncommon::start_page('Restrict Domain Coordinator Access'));
690: $r->print(Apache::lonhtmlcommon::breadcrumbs('Restrict Domain Coordinator Access'));
1.119 www 691: my $user = $env{'user.name'};
692: my $domain = $env{'user.domain'};
693: my %userenv = &Apache::lonnet::get
1.120 www 694: ('environment',['domcoord.author']);
1.119 www 695: my $constchecked='';
696: if ($userenv{'domcoord.author'} eq 'blocked') {
1.159 bisitz 697: $constchecked=' checked="checked"';
1.119 www 698: }
1.120 www 699: my $text=&mt('By default, the Domain Coordinator can enter your construction space.');
1.119 www 700: my $construction=&mt('Block access to construction space');
1.136 schafran 701: my $change=&mt('Save');
1.119 www 702: $r->print(<<ENDSCREEN);
703: <form name="prefs" action="/adm/preferences" method="post">
704: <input type="hidden" name="action" value="verify_and_change_domcoord" />
705: $text<br />
1.159 bisitz 706: <label><input type="checkbox" name="construction"$constchecked />$construction</label><br />
1.119 www 707: <input type="submit" value="$change" />
708: </form>
709: ENDSCREEN
710: }
711:
712: sub verify_and_change_domcoord {
713: my $r = shift;
714: my $user = $env{'user.name'};
715: my $domain = $env{'user.domain'};
1.120 www 716: my %domcoord=('domcoord.author' => '');
1.119 www 717: if ($env{'form.construction'}) { $domcoord{'domcoord.author'}='blocked'; }
718: &Apache::lonnet::put('environment',\%domcoord);
1.120 www 719: &Apache::lonnet::appenv({'environment.domcoord.author' => $domcoord{'domcoord.author'}});
1.158 bisitz 720: my $status='';
721: if ($domcoord{'domcoord.author'} eq 'blocked') {
722: $status=&mt('on');
723: } else {
724: $status=&mt('off');
725: }
726: my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Block access to construction space').'</i>','<tt>'.$status.'</tt>'));
727: $message=&Apache::loncommon::confirmwrapper($message);
728: &print_main_menu($r,$message);
1.119 www 729: }
730:
1.118 www 731: #################################################################
732: ## Lock Subroutines #
733: #################################################################
734:
735: sub lockwarning {
736: my $r = shift;
737: my $title=&mt('Action locked');
738: my $texttop=&mt('LON-CAPA is currently performing the following actions:');
739: my $textbottom=&mt('Changing roles or logging out may result in data corruption.');
740: my ($num,%which)=&Apache::lonnet::get_locks();
741: my $which='';
742: foreach my $id (keys %which) {
743: $which.='<li>'.$which{$id}.'</li>';
744: }
745: my $change=&mt('Override');
746: $r->print(<<ENDSCREEN);
747: <form name="prefs" action="/adm/preferences" method="post">
748: <input type="hidden" name="action" value="verify_and_change_locks" />
749: <h1>$title</h1>
750: $texttop
751: <ul>
752: $which
753: </ul>
754: $textbottom
755: <input type="submit" value="$change" />
756: </form>
757: ENDSCREEN
758: }
759:
760: sub verify_and_change_lockwarning {
761: my $r = shift;
762: &Apache::lonnet::remove_all_locks();
763: $r->print(&mt('Cleared locks.'));
764: }
765:
766:
1.105 www 767: ################################################################
1.20 www 768: # Message Forward #
769: ################################################################
770:
771: sub msgforwardchanger {
1.102 raeburn 772: my ($r,$message) = @_;
1.59 albertel 773: my $user = $env{'user.name'};
774: my $domain = $env{'user.domain'};
1.102 raeburn 775: my %userenv = &Apache::lonnet::get('environment',['msgforward','notification','critnotification','notifywithhtml']);
1.20 www 776: my $msgforward=$userenv{'msgforward'};
1.102 raeburn 777: my %lt = &Apache::lonlocal::texthash(
778: all => 'All',
779: crit => 'Critical only',
780: reg => 'Non-critical only',
781: foad => 'Forwarding Address(es)',
1.113 raeburn 782: noti => 'Notification E-mail Address(es)',
1.110 bisitz 783: foad_exmpl => 'e.g. <tt>userA:domain1,userB:domain2,...</tt>',
1.130 schafran 784: mnot => 'E-mail Address(es) which should be notified about new LON-CAPA messages',
785: # old: 'Message Notification Email Address(es)',
1.110 bisitz 786: mnot_exmpl => 'e.g. <tt>joe@doe.com</tt>',
1.136 schafran 787: chg => 'Save',
1.104 raeburn 788: email => 'The e-mail address entered in row ',
1.102 raeburn 789: notv => 'is not a valid e-mail address',
1.103 raeburn 790: toen => "To enter multiple addresses, enter one address at a time, click 'Change' and then add the next one",
1.136 schafran 791: prme => 'Back',
1.102 raeburn 792: );
1.126 droeschl 793: Apache::lonhtmlcommon::add_breadcrumb(
794: { href => '/adm/preferences?action=changemsgforward',
795: text => 'Change Message Forwarding/Notification'});
1.147 schafran 796: $r->print(Apache::loncommon::start_page('Message Management'));
1.126 droeschl 797: $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Message Forwarding/Notification'));
1.113 raeburn 798: my $forwardingHelp = &Apache::loncommon::help_open_topic("Prefs_Forwarding");
799: my $notificationHelp = &Apache::loncommon::help_open_topic("Prefs_Notification");
800: my $criticalMessageHelp = &Apache::loncommon::help_open_topic("Course_Critical_Message");
1.102 raeburn 801: my @allow_html = split(/,/,$userenv{'notifywithhtml'});
802: my %allnot = &get_notifications(\%userenv);
803: my $validatescript = &Apache::lonhtmlcommon::javascript_valid_email();
804: my $jscript = qq|
1.148 bisitz 805: <script type="text/javascript" language="JavaScript">
1.102 raeburn 806: function validate() {
807: for (var i=0; i<document.prefs.numnotify.value; i++) {
1.104 raeburn 808: var checkaddress = 0;
1.102 raeburn 809: var addr = document.prefs.elements['address_'+i].value;
1.104 raeburn 810: var rownum = i+1;
1.102 raeburn 811: if (i < document.prefs.numnotify.value-1) {
1.104 raeburn 812: if (document.prefs.elements['modify_notify_'+i].checked) {
1.102 raeburn 813: checkaddress = 1;
1.104 raeburn 814: }
1.102 raeburn 815: } else {
816: if (document.prefs.elements['add_notify_'+i].checked == true) {
817: checkaddress = 1;
818: }
819: }
1.104 raeburn 820: if (checkaddress == 1) {
1.102 raeburn 821: var addr = document.prefs.elements['address_'+i].value;
822: if (validmail(document.prefs.elements['address_'+i]) == false) {
1.104 raeburn 823: var multimsg = '';
824: if (addr.indexOf(",") >= 0) {
825: multimsg = "\\n($lt{'toen'}).";
826: }
1.110 bisitz 827: alert("$lt{'email'} "+rownum+" ('"+addr+"') $lt{'notv'}."+multimsg);
1.102 raeburn 828: return;
829: }
830: }
831: }
832: document.prefs.submit();
833: }
1.104 raeburn 834:
835: function address_changes (adnum) {
836: if (!document.prefs.elements['del_notify_'+adnum].checked) {
837: document.prefs.elements['modify_notify_'+adnum].checked = true;
838: }
839: }
840:
841: function new_address(adnum) {
842: document.prefs.elements['add_notify_'+adnum].checked = true;
843: }
844:
845: function delete_address(adnum) {
846: if (document.prefs.elements['del_notify_'+adnum].checked) {
847: document.prefs.elements['modify_notify_'+adnum].checked = false;
848: }
849: }
850:
851: function modify_address(adnum) {
852: if (document.prefs.elements['modify_notify_'+adnum].checked) {
853: document.prefs.elements['del_notify_'+adnum].checked = false;
854: }
855: }
856:
1.102 raeburn 857: $validatescript
858: </script>
859: |;
1.20 www 860: $r->print(<<ENDMSG);
1.102 raeburn 861: $jscript
862: $message
1.113 raeburn 863: <h3>$lt{'foad'} $forwardingHelp</h3>
1.88 albertel 864: <form name="prefs" action="/adm/preferences" method="post">
1.20 www 865: <input type="hidden" name="action" value="verify_and_change_msgforward" />
1.110 bisitz 866: $lt{'foad'} ($lt{'foad_exmpl'}):
1.113 raeburn 867: <input type="text" size="40" value="$msgforward" name="msgforward" /><br />
868: <h3>$lt{'noti'} $notificationHelp</h3>
1.110 bisitz 869: $lt{'mnot'} ($lt{'mnot_exmpl'}):<br />
1.102 raeburn 870: ENDMSG
871: my @sortforwards = sort (keys(%allnot));
872: my $output = &Apache::loncommon::start_data_table().
873: &Apache::loncommon::start_data_table_header_row().
1.104 raeburn 874: '<th> </th>'.
1.102 raeburn 875: '<th>'.&mt('Action').'</th>'.
876: '<th>'.&mt('Notification address').'</th><th>'.
1.113 raeburn 877: &mt('Types of message for which notification is sent').
878: $criticalMessageHelp.'</th><th>'.
1.104 raeburn 879: &mt('Excerpt retains HTML tags in message').'</th>'.
1.102 raeburn 880: &Apache::loncommon::end_data_table_header_row();
881: my $num = 0;
1.104 raeburn 882: my $counter = 1;
1.102 raeburn 883: foreach my $item (@sortforwards) {
884: $output .= &Apache::loncommon::start_data_table_row().
1.104 raeburn 885: '<td><b>'.$counter.'</b></td>'.
886: '<td><span class="LC_nobreak"><label>'.
887: '<input type="checkbox" name="modify_notify_'.
888: $num.'" onclick="javscript:modify_address('."'$num'".')" />'.
889: &mt('Modify').'</label></span> '.
890: '<span class="LC_nobreak"><label>'.
891: '<input type="checkbox" name="del_notify_'.$num.
892: '" onclick="javscript:delete_address('."'$num'".')" />'.
893: &mt('Delete').'</label></span></td>'.
1.102 raeburn 894: '<td><input type="text" value="'.$item.'" name="address_'.
1.104 raeburn 895: $num.'" onFocus="javascript:address_changes('."'$num'".
896: ')" /></td><td>';
1.102 raeburn 897: my %chk;
898: if (defined($allnot{$item}{'crit'})) {
899: if (defined($allnot{$item}{'reg'})) {
900: $chk{'all'} = 'checked="checked" ';
901: } else {
902: $chk{'crit'} = 'checked="checked" ';
903: }
904: } else {
905: $chk{'reg'} = 'checked="checked" ';
906: }
907: foreach my $type ('all','crit','reg') {
908: $output .= '<span class="LC_nobreak"><label>'.
909: '<input type="radio" name="notify_type_'.$num.
1.104 raeburn 910: '" value="'.$type.'" '.$chk{$type}.
911: ' onchange="javascript:address_changes('."'$num'".')" />'.
912: $lt{$type}.'</label></span> ';
1.102 raeburn 913: }
914: my $htmlon = '';
915: my $htmloff = '';
916: if (grep/^\Q$item\E/,@allow_html) {
917: $htmlon = 'checked="checked" ';
918: } else {
919: $htmloff = 'checked="checked" ';
920: }
921: $output .= '</td><td><label><input type="radio" name="html_'.$num.
1.104 raeburn 922: '" value="1" '.$htmlon.
923: ' onchange="javascript:address_changes('."'$num'".')" />'.
924: &mt('Yes').'</label> '.
1.102 raeburn 925: '<label><input type="radio" name="html_'.$num.'" value="0" '.
1.104 raeburn 926: $htmloff. ' onchange="javascript:address_changes('."'$num'".
927: ')" />'.
928: &mt('No').'</label></td>'.
1.102 raeburn 929: &Apache::loncommon::end_data_table_row();
930: $num ++;
1.104 raeburn 931: $counter ++;
1.102 raeburn 932: }
933: my %defchk = (
934: all => 'checked="checked" ',
935: crit => '',
936: reg => '',
937: );
938: $output .= &Apache::loncommon::start_data_table_row().
1.104 raeburn 939: '<td><b>'.$counter.'</b></td>'.
940: '<td><span class="LC_nobreak"><label>'.
941: '<input type="checkbox" name="add_notify_'.$num.
942: '" value="1" />'.&mt('Add new address').'</label></span></td>'.
1.102 raeburn 943: '<td><input type="text" value="" name="address_'.$num.
1.104 raeburn 944: '" onFocus="javascript:new_address('."'$num'".')" /></td><td>';
1.102 raeburn 945: foreach my $type ('all','crit','reg') {
946: $output .= '<span class="LC_nobreak"><label>'.
947: '<input type="radio" name="notify_type_'.$num.
948: '" value="'.$type.'" '.$defchk{$type}.'/>'.
949: $lt{$type}.'</label></span> ';
950: }
951: $output .= '</td><td><label><input type="radio" name="html_'.$num.
952: '" value="1" />'.&mt('Yes').'</label> '.
953: '<label><input type="radio" name="html_'.$num.'" value="0" '.
954: ' checked="checked" />'.
955: &mt('No').'</label></td>'.
956: &Apache::loncommon::end_data_table_row().
957: &Apache::loncommon::end_data_table();
958: $num ++;
959: $r->print($output);
960: $r->print(qq|
1.113 raeburn 961: <br /><hr />
1.102 raeburn 962: <input type="hidden" name="numnotify" value="$num" />
1.136 schafran 963: <input type="button" value="$lt{'prme'}" onclick="location.href='/adm/preferences'" />
1.102 raeburn 964: <input type="button" value="$lt{'chg'}" onclick="javascript:validate()" />
1.20 www 965: </form>
1.102 raeburn 966: |);
967:
968: }
969:
970: sub get_notifications {
971: my ($userenv) = @_;
972: my %allnot;
973: my @critnot = split(/,/,$userenv->{'critnotification'});
974: my @regnot = split(/,/,$userenv->{'notification'});
975: foreach my $item (@critnot) {
976: $allnot{$item}{crit} = 1;
977: }
978: foreach my $item (@regnot) {
979: $allnot{$item}{reg} = 1;
980: }
981: return %allnot;
1.20 www 982: }
983:
984: sub verify_and_change_msgforward {
985: my $r = shift;
1.59 albertel 986: my $user = $env{'user.name'};
987: my $domain = $env{'user.domain'};
1.20 www 988: my $newscreen = '';
989: my $message='';
1.59 albertel 990: foreach (split(/\,/,$env{'form.msgforward'})) {
1.20 www 991: my ($msuser,$msdomain)=split(/[\@\:]/,$_);
1.95 albertel 992: $msuser = &LONCAPA::clean_username($msuser);
993: $msdomain = &LONCAPA::clean_domain($msdomain);
1.20 www 994: if (($msuser) && ($msdomain)) {
995: if (&Apache::lonnet::homeserver($msuser,$msdomain) ne 'no_host') {
996: $newscreen.=$msuser.':'.$msdomain.',';
997: } else {
1.163 bisitz 998: $message.= &mt('No such user: ').'<tt>'.$msuser.':'.$msdomain.'</tt><br />';
1.20 www 999: }
1000: }
1001: }
1002: $newscreen=~s/\,$//;
1003: if ($newscreen) {
1004: &Apache::lonnet::put('environment',{'msgforward' => $newscreen});
1.116 raeburn 1005: &Apache::lonnet::appenv({'environment.msgforward' => $newscreen});
1.110 bisitz 1006: $message .= &mt('Set message forwarding to ').'<tt>"'.$newscreen.'"</tt>.'
1007: .'<br />';
1.20 www 1008: } else {
1009: &Apache::lonnet::del('environment',['msgforward']);
1.139 raeburn 1010: &Apache::lonnet::delenv('environment.msgforward');
1.102 raeburn 1011: $message.= &mt("Set message forwarding to 'off'.").'<br />';
1.20 www 1012: }
1.102 raeburn 1013: my $critnotification;
1014: my $notification;
1015: my $notify_with_html;
1016: my $lastnotify = $env{'form.numnotify'}-1;
1.104 raeburn 1017: my $totaladdresses = 0;
1.102 raeburn 1018: for (my $i=0; $i<$env{'form.numnotify'}; $i++) {
1019: if ((!defined($env{'form.del_notify_'.$i})) &&
1.104 raeburn 1020: ((($i==$lastnotify) && ($env{'form.add_notify_'.$lastnotify} == 1)) ||
1.102 raeburn 1021: ($i<$lastnotify))) {
1022: if (defined($env{'form.address_'.$i})) {
1023: if ($env{'form.notify_type_'.$i} eq 'all') {
1024: $critnotification .= $env{'form.address_'.$i}.',';
1025: $notification .= $env{'form.address_'.$i}.',';
1026: } elsif ($env{'form.notify_type_'.$i} eq 'crit') {
1027: $critnotification .= $env{'form.address_'.$i}.',';
1028: } elsif ($env{'form.notify_type_'.$i} eq 'reg') {
1029: $notification .= $env{'form.address_'.$i}.',';
1030: }
1031: if ($env{'form.html_'.$i} eq '1') {
1032: $notify_with_html .= $env{'form.address_'.$i}.',';
1033: }
1.104 raeburn 1034: $totaladdresses ++;
1.102 raeburn 1035: }
1036: }
1037: }
1038: $critnotification =~ s/,$//;
1039: $critnotification=~s/\s//gs;
1040: $notification =~ s/,$//;
1.20 www 1041: $notification=~s/\s//gs;
1.102 raeburn 1042: $notify_with_html =~ s/,$//;
1043: $notify_with_html =~ s/\s//gs;
1.20 www 1044: if ($notification) {
1045: &Apache::lonnet::put('environment',{'notification' => $notification});
1.116 raeburn 1046: &Apache::lonnet::appenv({'environment.notification' => $notification});
1.110 bisitz 1047: $message.=&mt('Set non-critical message notification address(es) to ').'<tt>"'.$notification.'"</tt>.<br />';
1.20 www 1048: } else {
1049: &Apache::lonnet::del('environment',['notification']);
1.139 raeburn 1050: &Apache::lonnet::delenv('environment.notification');
1.110 bisitz 1051: $message.=&mt("Set non-critical message notification to 'off'.").'<br />';
1.20 www 1052: }
1053: if ($critnotification) {
1054: &Apache::lonnet::put('environment',{'critnotification' => $critnotification});
1.116 raeburn 1055: &Apache::lonnet::appenv({'environment.critnotification' => $critnotification});
1.110 bisitz 1056: $message.=&mt('Set critical message notification address(es) to ').'<tt>"'.$critnotification.'"</tt>.<br />';
1.20 www 1057: } else {
1058: &Apache::lonnet::del('environment',['critnotification']);
1.139 raeburn 1059: &Apache::lonnet::delenv('environment.critnotification');
1.110 bisitz 1060: $message.=&mt("Set critical message notification to 'off'.").'<br />';
1.102 raeburn 1061: }
1062: if ($critnotification || $notification) {
1063: if ($notify_with_html) {
1064: &Apache::lonnet::put('environment',{'notifywithhtml' => $notify_with_html});
1.116 raeburn 1065: &Apache::lonnet::appenv({'environment.notifywithhtml' => $notify_with_html});
1.110 bisitz 1066: $message.=&mt('Set address(es) to receive excerpts with html retained ').'<tt>"'.$notify_with_html.'"</tt>.';
1.102 raeburn 1067: } else {
1068: &Apache::lonnet::del('environment',['notifywithhtml']);
1.139 raeburn 1069: &Apache::lonnet::delenv('environment.notifywithhtml');
1.104 raeburn 1070: if ($totaladdresses == 1) {
1071: $message.=&mt("Set notification address to receive excerpts with html stripped.");
1072: } else {
1073: $message.=&mt("Set all notification addresses to receive excerpts with html stripped.");
1074: }
1.102 raeburn 1075: }
1076: } else {
1077: &Apache::lonnet::del('environment',['notifywithhtml']);
1.139 raeburn 1078: &Apache::lonnet::delenv('environment.notifywithhtml');
1.102 raeburn 1079: }
1080: if ($message) {
1081: $message .= '<br /><hr />';
1.20 www 1082: }
1.109 albertel 1083: &Apache::loncommon::flush_email_cache($user,$domain);
1.102 raeburn 1084: &msgforwardchanger($r,$message);
1.6 www 1085: }
1086:
1.12 www 1087: ################################################################
1.19 www 1088: # Colors #
1.12 www 1089: ################################################################
1090:
1.19 www 1091: sub colorschanger {
1.12 www 1092: my $r = shift;
1.126 droeschl 1093: Apache::lonhtmlcommon::add_breadcrumb(
1094: { href => '/adm/preferences?action=changecolors',
1095: text => 'Change Colors'});
1.147 schafran 1096: $r->print(Apache::loncommon::start_page('Page Display Settings'));
1.126 droeschl 1097: $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Colors'));
1.19 www 1098: # figure out colors
1.80 albertel 1099: my $function=&Apache::loncommon::get_users_function();
1.19 www 1100: my $domain=&Apache::loncommon::determinedomain();
1.157 bisitz 1101: my %colortypes=&Apache::lonlocal::texthash(
1102: 'pgbg' => 'Page Background Color',
1103: 'tabbg' => 'Header Background Color',
1104: 'sidebg' => 'Header Border Color',
1105: 'font' => 'Font Color',
1106: 'fontmenu' => 'Font Menu Color',
1107: 'link' => 'Un-Visited Link Color',
1108: 'vlink' => 'Visited Link Color',
1109: 'alink' => 'Active Link Color',
1110: );
1.82 albertel 1111: my $start_data_table = &Apache::loncommon::start_data_table();
1.19 www 1112: my $chtable='';
1.22 matthew 1113: foreach my $item (sort(keys(%colortypes))) {
1.19 www 1114: my $curcol=&Apache::loncommon::designparm($function.'.'.$item,$domain);
1.82 albertel 1115: $chtable.=&Apache::loncommon::start_data_table_row().
1.83 albertel 1116: '<td>'.$colortypes{$item}.'</td><td style="background: '.$curcol.
1.19 www 1117: '"> </td><td><input name="'.$item.
1.21 www 1118: '" size="10" value="'.$curcol.
1119: '" /></td><td><a href="javascript:pjump('."'color_custom','".$colortypes{$item}.
1.19 www 1120: "','".$curcol."','"
1.157 bisitz 1121: .$item."','parmform.pres','psub'".');">'.&mt('Select').'</a></td>'.
1.83 albertel 1122: &Apache::loncommon::end_data_table_row()."\n";
1.19 www 1123: }
1.82 albertel 1124: my $end_data_table = &Apache::loncommon::end_data_table();
1.23 matthew 1125: my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
1.157 bisitz 1126: my $savebutton = &mt('Save');
1127: my $resetbutton = &mt('Reset All');
1128: my $resetbuttondesc = &mt('Reset All Colors to Default');
1.19 www 1129: $r->print(<<ENDCOL);
1.148 bisitz 1130: <script type="text/javascript" language="JavaScript">
1.19 www 1131:
1132: function pclose() {
1133: parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
1134: "height=350,width=350,scrollbars=no,menubar=no");
1135: parmwin.close();
1136: }
1137:
1.23 matthew 1138: $pjump_def
1.19 www 1139:
1140: function psub() {
1141: pclose();
1142: if (document.parmform.pres_marker.value!='') {
1.21 www 1143: if (document.parmform.pres_type.value!='') {
1.77 albertel 1144: eval('document.prefs.'+
1.21 www 1145: document.parmform.pres_marker.value+
1.19 www 1146: '.value=document.parmform.pres_value.value;');
1.21 www 1147: }
1.19 www 1148: } else {
1149: document.parmform.pres_value.value='';
1150: document.parmform.pres_marker.value='';
1151: }
1152: }
1153:
1154:
1155: </script>
1.21 www 1156: <form name="parmform">
1157: <input type="hidden" name="pres_marker" />
1158: <input type="hidden" name="pres_type" />
1159: <input type="hidden" name="pres_value" />
1160: </form>
1.88 albertel 1161: <form name="prefs" action="/adm/preferences" method="post">
1.19 www 1162: <input type="hidden" name="action" value="verify_and_change_colors" />
1.82 albertel 1163: $start_data_table
1.19 www 1164: $chtable
1.82 albertel 1165: $end_data_table
1.19 www 1166: </table>
1.157 bisitz 1167: <p>
1168: <input type="submit" value="$savebutton" />
1169: <input type="submit" name="resetall" value="$resetbutton" title="$resetbuttondesc" />
1170: </p>
1.12 www 1171: </form>
1.19 www 1172: ENDCOL
1.12 www 1173: }
1174:
1.19 www 1175: sub verify_and_change_colors {
1.12 www 1176: my $r = shift;
1.19 www 1177: # figure out colors
1.80 albertel 1178: my $function=&Apache::loncommon::get_users_function();
1.19 www 1179: my $domain=&Apache::loncommon::determinedomain();
1.157 bisitz 1180: my %colortypes=&Apache::lonlocal::texthash(
1181: 'pgbg' => 'Page Background Color',
1182: 'tabbg' => 'Header Background Color',
1183: 'sidebg' => 'Header Border Color',
1184: 'font' => 'Font Color',
1185: 'fontmenu' => 'Font Menu Color',
1186: 'link' => 'Un-Visited Link Color',
1187: 'vlink' => 'Visited Link Color',
1188: 'alink' => 'Active Link Color',
1189: );
1.19 www 1190:
1.12 www 1191: my $message='';
1.21 www 1192: foreach my $item (keys %colortypes) {
1.59 albertel 1193: my $color=$env{'form.'.$item};
1.21 www 1194: my $entry='color.'.$function.'.'.$item;
1.59 albertel 1195: if (($color=~/^\#[0-9A-Fa-f]{6}$/) && (!$env{'form.resetall'})) {
1.21 www 1196: &Apache::lonnet::put('environment',{$entry => $color});
1.116 raeburn 1197: &Apache::lonnet::appenv({'environment.'.$entry => $color});
1.157 bisitz 1198: $message.=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.$colortypes{$item}.'</i>','<tt>"'.$color.'"</tt>'))
1199: .'<br />';
1.21 www 1200: } else {
1201: &Apache::lonnet::del('environment',[$entry]);
1.138 schafran 1202: &Apache::lonnet::delenv('environment.'.$entry);
1.157 bisitz 1203: $message.=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]','<i>'.$colortypes{$item}.'</i>'))
1204: .'<br />';
1.21 www 1205: }
1206: }
1.158 bisitz 1207: $message=&Apache::loncommon::confirmwrapper($message);
1.157 bisitz 1208:
1.84 albertel 1209: my $now = time;
1210: &Apache::lonnet::put('environment',{'color.timestamp' => $now});
1.116 raeburn 1211: &Apache::lonnet::appenv({'environment.color.timestamp' => $now});
1.84 albertel 1212:
1.152 www 1213: &print_main_menu($r, $message);
1.12 www 1214: }
1215:
1.4 matthew 1216: ######################################################
1217: # password handler subroutines #
1218: ######################################################
1.3 matthew 1219: sub passwordchanger {
1.94 raeburn 1220: my ($r,$errormessage,$caller,$mailtoken) = @_;
1.4 matthew 1221: # This function is a bit of a mess....
1.3 matthew 1222: # Passwords are encrypted using londes.js (DES encryption)
1.4 matthew 1223: $errormessage = ($errormessage || '');
1.94 raeburn 1224: my ($user,$domain,$currentpass,$defdom);
1.152 www 1225: &Apache::lonhtmlcommon::add_breadcrumb(
1.126 droeschl 1226: { href => '/adm/preferences?action=changepass',
1227: text => 'Change Password'});
1.144 raeburn 1228: unless ($caller eq 'reset_by_email') {
1.147 schafran 1229: $r->print(Apache::loncommon::start_page('Personal Data'));
1.144 raeburn 1230: $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Password'));
1231: }
1.94 raeburn 1232: if ((!defined($caller)) || ($caller eq 'preferences')) {
1233: $user = $env{'user.name'};
1234: $domain = $env{'user.domain'};
1235: if (!defined($caller)) {
1236: $caller = 'preferences';
1237: }
1238: } elsif ($caller eq 'reset_by_email') {
1239: $defdom = $r->dir_config('lonDefDomain');
1240: my %data = &Apache::lonnet::tmpget($mailtoken);
1241: if (keys(%data) == 0) {
1.155 bisitz 1242: $r->print(&mt('Sorry, the URL you provided to complete the reset of your password was invalid. Either the token included in the URL has been deleted or the URL you provided was invalid. Please submit a [_1]new request[_2] for a password reset, and follow the link to the new URL included in the e-mail that will be sent to you, to allow you to enter a new password.'
1243: ,'<a href="/adm/resetpw">','</a>')
1244: );
1.94 raeburn 1245: return;
1246: }
1247: if (defined($data{time})) {
1248: if (time - $data{'time'} < 7200) {
1249: $user = $data{'username'};
1250: $domain = $data{'domain'};
1251: $currentpass = $data{'temppasswd'};
1252: } else {
1253: $r->print(&mt('Sorry, the token generated when you requested a password reset has expired.').'<br />');
1254: return;
1255: }
1256: } else {
1257: $r->print(&mt('Sorry, the URL generated when you requested reset of your password contained incomplete information.').'<br />');
1258: return;
1259: }
1260: } else {
1261: $r->print(&mt('Page requested in unexpected context').'<br />');
1262: return;
1263: }
1.3 matthew 1264: my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);
1265: # Check for authentication types that allow changing of the password.
1266: return if ($currentauth !~ /^(unix|internal):/);
1267: #
1268: # Generate keys
1269: my ($lkey_cpass ,$ukey_cpass ) = &des_keys();
1270: my ($lkey_npass1,$ukey_npass1) = &des_keys();
1271: my ($lkey_npass2,$ukey_npass2) = &des_keys();
1.4 matthew 1272: # Store the keys in the log files
1.3 matthew 1273: my $lonhost = $r->dir_config('lonHostID');
1274: my $logtoken=Apache::lonnet::reply('tmpput:'
1275: .$ukey_cpass . $lkey_cpass .'&'
1276: .$ukey_npass1 . $lkey_npass1.'&'
1277: .$ukey_npass2 . $lkey_npass2,
1278: $lonhost);
1.4 matthew 1279: # Hexify the keys for output as javascript variables
1.94 raeburn 1280: my %hexkey;
1281: $hexkey{'ukey_cpass'} = hex($ukey_cpass);
1282: $hexkey{'lkey_cpass'} = hex($lkey_cpass);
1283: $hexkey{'ukey_npass1'} = hex($ukey_npass1);
1284: $hexkey{'lkey_npass1'} = hex($lkey_npass1);
1285: $hexkey{'ukey_npass2'} = hex($ukey_npass2);
1286: $hexkey{'lkey_npass2'} = hex($lkey_npass2);
1.3 matthew 1287: # Output javascript to deal with passwords
1.4 matthew 1288: # Output DES javascript
1.3 matthew 1289: {
1290: my $include = $r->dir_config('lonIncludes');
1291: my $jsh=Apache::File->new($include."/londes.js");
1292: $r->print(<$jsh>);
1293: }
1.94 raeburn 1294: $r->print(&jscript_send($caller));
1.3 matthew 1295: $r->print(<<ENDFORM);
1.94 raeburn 1296: $errormessage
1297:
1298: <p>
1299: <!-- We separate the forms into 'server' and 'client' in order to
1300: ensure that unencrypted passwords will not be sent out by a
1301: crappy browser -->
1302: ENDFORM
1303: $r->print(&server_form($logtoken,$caller,$mailtoken));
1304: $r->print(&client_form($caller,\%hexkey,$currentpass,$defdom));
1305:
1306: #
1307: return;
1308: }
1309:
1310: sub jscript_send {
1311: my ($caller) = @_;
1312: my $output = qq|
1.148 bisitz 1313: <script type="text/javascript" language="JavaScript">
1.3 matthew 1314:
1315: function send() {
1316: uextkey=this.document.client.elements.ukey_cpass.value;
1317: lextkey=this.document.client.elements.lkey_cpass.value;
1318: initkeys();
1319:
1.52 raeburn 1320: this.document.pserver.elements.currentpass.value
1.3 matthew 1321: =crypted(this.document.client.elements.currentpass.value);
1322:
1323: uextkey=this.document.client.elements.ukey_npass1.value;
1324: lextkey=this.document.client.elements.lkey_npass1.value;
1325: initkeys();
1.52 raeburn 1326: this.document.pserver.elements.newpass_1.value
1.3 matthew 1327: =crypted(this.document.client.elements.newpass_1.value);
1328:
1329: uextkey=this.document.client.elements.ukey_npass2.value;
1330: lextkey=this.document.client.elements.lkey_npass2.value;
1331: initkeys();
1.52 raeburn 1332: this.document.pserver.elements.newpass_2.value
1.3 matthew 1333: =crypted(this.document.client.elements.newpass_2.value);
1.94 raeburn 1334: |;
1335: if ($caller eq 'reset_by_email') {
1336: $output .= qq|
1337: this.document.pserver.elements.uname.value =
1338: this.document.client.elements.uname.value;
1339: this.document.pserver.elements.udom.value =
1340: this.document.client.elements.udom.options[this.document.client.elements.udom.selectedIndex].value;
1341: |;
1342: }
1343: $ output .= qq|
1.52 raeburn 1344: this.document.pserver.submit();
1.3 matthew 1345: }
1346: </script>
1.94 raeburn 1347: |;
1348: }
1.3 matthew 1349:
1.94 raeburn 1350: sub client_form {
1351: my ($caller,$hexkey,$currentpass,$defdom) = @_;
1.99 www 1352: my %lt=&Apache::lonlocal::texthash(
1.115 raeburn 1353: 'email' => 'E-mail Address',
1.99 www 1354: 'username' => 'Username',
1355: 'domain' => 'Domain',
1356: 'currentpass' => 'Current Password',
1357: 'newpass' => 'New Password',
1358: 'confirmpass' => 'Confirm Password',
1.169 raeburn 1359: 'changepass' => 'Save',
1360: );
1.99 www 1361:
1.164 bisitz 1362: my $output = '<form name="client">'
1363: .&Apache::lonhtmlcommon::start_pick_box();
1.94 raeburn 1364: if ($caller eq 'reset_by_email') {
1.164 bisitz 1365: $output .= &Apache::lonhtmlcommon::row_title(
1366: '<label for="email">'.$lt{'email'}.'</label>')
1367: .'<input type="text" name="email" size="30" />'
1368: .&Apache::lonhtmlcommon::row_closure()
1369: .&Apache::lonhtmlcommon::row_title(
1370: '<label for="uname">'.$lt{'username'}.'</label>')
1371: .'<input type="text" name="uname" size="15" />'
1372: .'<input type="hidden" name="currentpass" value="'.$currentpass.'" />'
1373: .&Apache::lonhtmlcommon::row_closure()
1374: .&Apache::lonhtmlcommon::row_title(
1375: '<label for="udom">'.$lt{'domain'}.'</label>')
1376: .&Apache::loncommon::select_dom_form($defdom,'udom')
1377: .&Apache::lonhtmlcommon::row_closure();
1.94 raeburn 1378: } else {
1.164 bisitz 1379: $output .= &Apache::lonhtmlcommon::row_title(
1380: '<label for="currentpass">'.$lt{'currentpass'}.'</label>')
1381: .'<input type="password" name="currentpass" size="10"/>'
1382: .&Apache::lonhtmlcommon::row_closure();
1383: }
1384: $output .= &Apache::lonhtmlcommon::row_title(
1385: '<label for="newpass_1">'.$lt{'newpass'}.'</label>')
1386: .'<input type="password" name="newpass_1" size="10" />'
1387: .&Apache::lonhtmlcommon::row_closure()
1388: .&Apache::lonhtmlcommon::row_title(
1389: '<label for="newpass_2">'.$lt{'confirmpass'}.'</label>')
1390: .'<input type="password" name="newpass_2" size="10" />'
1391: .&Apache::lonhtmlcommon::row_closure(1)
1392: .&Apache::lonhtmlcommon::end_pick_box();
1393: $output .= '<p><input type="button" value="'.$lt{'changepass'}.'" onClick="send();" /></p>'
1394: .qq|
1.94 raeburn 1395: <input type="hidden" name="ukey_cpass" value="$hexkey->{'ukey_cpass'}" />
1396: <input type="hidden" name="lkey_cpass" value="$hexkey->{'lkey_cpass'}" />
1397: <input type="hidden" name="ukey_npass1" value="$hexkey->{'ukey_npass1'}" />
1398: <input type="hidden" name="lkey_npass1" value="$hexkey->{'lkey_npass1'}" />
1399: <input type="hidden" name="ukey_npass2" value="$hexkey->{'ukey_npass2'}" />
1400: <input type="hidden" name="lkey_npass2" value="$hexkey->{'lkey_npass2'}" />
1.3 matthew 1401: </form>
1402: </p>
1.164 bisitz 1403: |;
1.94 raeburn 1404: return $output;
1405: }
1406:
1407: sub server_form {
1408: my ($logtoken,$caller,$mailtoken) = @_;
1409: my $action = '/adm/preferences';
1410: if ($caller eq 'reset_by_email') {
1411: $action = '/adm/resetpw';
1412: }
1413: my $output = qq|
1414: <form name="pserver" action="$action" method="post">
1415: <input type="hidden" name="logtoken" value="$logtoken" />
1416: <input type="hidden" name="currentpass" value="" />
1417: <input type="hidden" name="newpass_1" value="" />
1418: <input type="hidden" name="newpass_2" value="" />
1419: |;
1420: if ($caller eq 'reset_by_email') {
1421: $output .= qq|
1422: <input type="hidden" name="token" value="$mailtoken" />
1423: <input type="hidden" name="uname" value="" />
1424: <input type="hidden" name="udom" value="" />
1425:
1426: |;
1427: }
1428: $output .= qq|
1429: <input type="hidden" name="action" value="verify_and_change_pass" />
1430: </form>
1431: |;
1432: return $output;
1.3 matthew 1433: }
1434:
1435: sub verify_and_change_password {
1.94 raeburn 1436: my ($r,$caller,$mailtoken) = @_;
1437: my ($user,$domain,$homeserver);
1438: if ($caller eq 'reset_by_email') {
1439: $user = $env{'form.uname'};
1440: $domain = $env{'form.udom'};
1441: if ($user ne '' && $domain ne '') {
1442: $homeserver = &Apache::lonnet::homeserver($user,$domain);
1443: if ($homeserver eq 'no_host') {
1.99 www 1444: &passwordchanger($r,"<p>\n<span class='LC_error'>".
1445: &mt("Invalid username and/or domain")."</span>\n</p>",
1.94 raeburn 1446: $caller,$mailtoken);
1447: return 1;
1448: }
1449: } else {
1.99 www 1450: &passwordchanger($r,"<p>\n<span class='LC_error'>".
1451: &mt("Username and domain were blank")."</span>\n</p>",
1.94 raeburn 1452: $caller,$mailtoken);
1453: return 1;
1454: }
1455: } else {
1456: $user = $env{'user.name'};
1457: $domain = $env{'user.domain'};
1458: $homeserver = $env{'user.home'};
1459: }
1.3 matthew 1460: my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);
1.4 matthew 1461: # Check for authentication types that allow changing of the password.
1.94 raeburn 1462: if ($currentauth !~ /^(unix|internal):/) {
1463: if ($caller eq 'reset_by_email') {
1.99 www 1464: &passwordchanger($r,"<p>\n<span class='LC_error'>".
1465: &mt("Authentication type for this user can not be changed by this mechanism").
1466: "</span>\n</p>",
1.94 raeburn 1467: $caller,$mailtoken);
1468: return 1;
1469: } else {
1470: return;
1471: }
1472: }
1.3 matthew 1473: #
1.59 albertel 1474: my $currentpass = $env{'form.currentpass'};
1475: my $newpass1 = $env{'form.newpass_1'};
1476: my $newpass2 = $env{'form.newpass_2'};
1477: my $logtoken = $env{'form.logtoken'};
1.3 matthew 1478: # Check for empty data
1.4 matthew 1479: unless (defined($currentpass) &&
1480: defined($newpass1) &&
1481: defined($newpass2) ){
1.99 www 1482: &passwordchanger($r,"<p>\n<span class='LC_error'>".
1483: &mt("One or more password fields were blank").
1484: "</span>\n</p>",$caller,$mailtoken);
1.3 matthew 1485: return;
1486: }
1.16 albertel 1487: # Get the keys
1488: my $lonhost = $r->dir_config('lonHostID');
1.3 matthew 1489: my $tmpinfo = Apache::lonnet::reply('tmpget:'.$logtoken,$lonhost);
1490: if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost')) {
1.4 matthew 1491: # I do not a have a better idea about how to handle this
1.94 raeburn 1492: my $tryagain_text = &mt('Please log out and try again.');
1493: if ($caller eq 'reset_by_email') {
1494: $tryagain_text = &mt('Please try again later.');
1495: }
1.101 albertel 1496: my $unable=&mt("Unable to retrieve saved token for password decryption");
1.3 matthew 1497: $r->print(<<ENDERROR);
1498: <p>
1.99 www 1499: <span class="LC_error">$unable. $tryagain_text</span>
1.3 matthew 1500: </p>
1501: ENDERROR
1.4 matthew 1502: # Probably should log an error here
1.75 albertel 1503: return 1;
1.3 matthew 1504: }
1505: my ($ckey,$n1key,$n2key)=split(/&/,$tmpinfo);
1.4 matthew 1506: #
1.17 matthew 1507: $currentpass = &des_decrypt($ckey ,$currentpass);
1508: $newpass1 = &des_decrypt($n1key,$newpass1);
1509: $newpass2 = &des_decrypt($n2key,$newpass2);
1.94 raeburn 1510: #
1511: if ($caller eq 'reset_by_email') {
1512: my %data = &Apache::lonnet::tmpget($mailtoken);
1.117 raeburn 1513: if (keys(%data) == 0) {
1514: &passwordchanger($r,
1515: '<span class="LC_error">'.
1516: &mt('Could not verify current authentication.').' '.
1517: &mt('Please try again.').'</span>',$caller,$mailtoken);
1518: return 1;
1519: }
1.94 raeburn 1520: if ($currentpass ne $data{'temppasswd'}) {
1521: &passwordchanger($r,
1.99 www 1522: '<span class="LC_error">'.
1.110 bisitz 1523: &mt('Could not verify current authentication.').' '.
1524: &mt('Please try again.').'</span>',$caller,$mailtoken);
1.94 raeburn 1525: return 1;
1526: }
1527: }
1.3 matthew 1528: if ($newpass1 ne $newpass2) {
1.4 matthew 1529: &passwordchanger($r,
1.99 www 1530: '<span class="LC_error">'.
1.110 bisitz 1531: &mt('The new passwords you entered do not match.').' '.
1532: &mt('Please try again.').'</span>',$caller,$mailtoken);
1.75 albertel 1533: return 1;
1.4 matthew 1534: }
1535: if (length($newpass1) < 7) {
1536: &passwordchanger($r,
1.99 www 1537: '<span class="LC_error">'.
1.110 bisitz 1538: &mt('Passwords must be a minimum of 7 characters long.').' '.
1539: &mt('Please try again.').'</span>',$caller,$mailtoken);
1.75 albertel 1540: return 1;
1.3 matthew 1541: }
1.4 matthew 1542: #
1543: # Check for bad characters
1544: my $badpassword = 0;
1545: foreach (split(//,$newpass1)) {
1546: $badpassword = 1 if ((ord($_)<32)||(ord($_)>126));
1547: }
1548: if ($badpassword) {
1549: # I can't figure out how to enter bad characters on my browser.
1.99 www 1550: my $errormessage ='<span class="LC_error">'.
1.110 bisitz 1551: &mt('The password you entered contained illegal characters.').'<br />'.
1.99 www 1552: &mt('Valid characters are').(<<"ENDERROR");
1553: : space and <br />
1.4 matthew 1554: <pre>
1555: !"\#$%&\'()*+,-./0123456789:;<=>?\@
1556: ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_\`abcdefghijklmnopqrstuvwxyz{|}~
1.99 www 1557: </pre></span>
1.4 matthew 1558: ENDERROR
1.94 raeburn 1559: &passwordchanger($r,$errormessage,$caller,$mailtoken);
1560: return 1;
1.4 matthew 1561: }
1562: #
1563: # Change the password (finally)
1564: my $result = &Apache::lonnet::changepass
1.94 raeburn 1565: ($user,$domain,$currentpass,$newpass1,$homeserver,$caller);
1.4 matthew 1566: # Inform the user the password has (not?) been changed
1.126 droeschl 1567: my $message;
1.4 matthew 1568: if ($result =~ /^ok$/) {
1.170 bisitz 1569: $message = &Apache::lonhtmlcommon::confirm_success(&mt('The password for user [_1] was successfully changed.','<i>'.$user.'</i>'));
1.144 raeburn 1570: if ($caller eq 'reset_by_email') {
1571: $r->print($message.'<br />');
1572: } else {
1573: &print_main_menu($r, $message);
1574: }
1.4 matthew 1575: } else {
1576: # error error: run in circles, scream and shout
1.154 www 1577: $message = &Apache::lonhtmlcommon::confirm_success(
1.158 bisitz 1578: &mt("The password for user [_1] was not changed.",'<i>'.$user.'</i>').' '.&mt('Please make sure your old password was entered correctly.'),1);
1.144 raeburn 1579: unless ($caller eq 'reset_by_email') {
1.158 bisitz 1580: $message=&Apache::loncommon::confirmwrapper($message);
1.144 raeburn 1581: &print_main_menu($r, $message);
1582: }
1.75 albertel 1583: return 1;
1.4 matthew 1584: }
1585: return;
1.3 matthew 1586: }
1587:
1.42 raeburn 1588: ################################################################
1589: # discussion display subroutines
1590: ################################################################
1591: sub discussionchanger {
1592: my $r = shift;
1.126 droeschl 1593: Apache::lonhtmlcommon::add_breadcrumb(
1594: { href => '/adm/preferences?action=changediscussions',
1595: text => 'Change Discussion Preferences'});
1.147 schafran 1596: $r->print(Apache::loncommon::start_page('Message Management'));
1.126 droeschl 1597: $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Discussion Preferences'));
1.59 albertel 1598: my $user = $env{'user.name'};
1599: my $domain = $env{'user.domain'};
1.42 raeburn 1600: my %userenv = &Apache::lonnet::get
1.43 raeburn 1601: ('environment',['discdisplay','discmarkread']);
1602: my $discdisp = 'allposts';
1603: my $discmark = 'onmark';
1604:
1605: if (defined($userenv{'discdisplay'})) {
1606: unless ($userenv{'discdisplay'} eq '') {
1607: $discdisp = $userenv{'discdisplay'};
1608: }
1609: }
1610: if (defined($userenv{'discmarkread'})) {
1.171 ! raeburn 1611: unless ($userenv{'discmarkread'} eq '') {
1.43 raeburn 1612: $discmark = $userenv{'discmarkread'};
1613: }
1614: }
1615:
1616: my $newdisp = 'unread';
1617: my $newmark = 'ondisp';
1618:
1619: my $function = &Apache::loncommon::get_users_function();
1620: my $color = &Apache::loncommon::designparm($function.'.tabbg',
1.59 albertel 1621: $env{'user.domain'});
1.43 raeburn 1622: my %lt = &Apache::lonlocal::texthash(
1623: 'pref' => 'Display Preference',
1624: 'curr' => 'Current setting ',
1625: 'actn' => 'Action',
1.135 schafran 1626: 'sdpf' => 'Set display preferences for discussion posts for both discussion boards and individual resources in all your courses.',
1.43 raeburn 1627: 'prca' => 'Preferences can be set that determine',
1.135 schafran 1628: 'whpo' => 'Which posts are displayed when you display a discussion board or resource, and',
1.43 raeburn 1629: 'unwh' => 'Under what circumstances posts are identfied as "New"',
1630: 'allposts' => 'All posts',
1631: 'unread' => 'New posts only',
1632: 'ondisp' => 'Once displayed',
1633: 'onmark' => 'Once marked as read',
1634: 'disa' => 'Posts displayed?',
1635: 'npmr' => 'New posts cease to be identified as "New"?',
1636: 'thde' => 'The preferences you set here can be overridden within each individual discussion.',
1637: 'chgt' => 'Change to '
1638: );
1639: my $dispchange = $lt{'unread'};
1640: my $markchange = $lt{'ondisp'};
1641: my $currdisp = $lt{'allposts'};
1642: my $currmark = $lt{'onmark'};
1643:
1644: if ($discdisp eq 'unread') {
1645: $dispchange = $lt{'allposts'};
1646: $currdisp = $lt{'unread'};
1647: $newdisp = 'allposts';
1648: }
1649:
1650: if ($discmark eq 'ondisp') {
1651: $markchange = $lt{'onmark'};
1652: $currmark = $lt{'ondisp'};
1653: $newmark = 'onmark';
1.42 raeburn 1654: }
1.171 ! raeburn 1655:
1.43 raeburn 1656: $r->print(<<"END");
1.88 albertel 1657: <form name="prefs" action="/adm/preferences" method="post">
1.42 raeburn 1658: <input type="hidden" name="action" value="verify_and_change_discussion" />
1659: <br />
1.87 albertel 1660: $lt{'sdpf'}<br /> $lt{'prca'} <ol><li>$lt{'whpo'}</li><li>$lt{'unwh'}</li></ol>
1.82 albertel 1661: END
1.158 bisitz 1662:
1663: $r->print('<p class="LC_info">'.$lt{'thde'}.'</p>');
1664:
1.82 albertel 1665: $r->print(&Apache::loncommon::start_data_table());
1666: $r->print(<<"END");
1667: <tr>
1668: <th>$lt{'pref'}</th>
1669: <th>$lt{'curr'}</th>
1670: <th>$lt{'actn'}?</th>
1.43 raeburn 1671: </tr>
1.82 albertel 1672: END
1673: $r->print(&Apache::loncommon::start_data_table_row());
1674: $r->print(<<"END");
1.43 raeburn 1675: <td>$lt{'disa'}</td>
1676: <td>$lt{$discdisp}</td>
1.82 albertel 1677: <td><label><input type="checkbox" name="discdisp" /><input type="hidden" name="newdisp" value="$newdisp" /> $lt{'chgt'} "$dispchange"</label></td>
1678: END
1679: $r->print(&Apache::loncommon::end_data_table_row().
1680: &Apache::loncommon::start_data_table_row());
1681: $r->print(<<"END");
1.43 raeburn 1682: <td>$lt{'npmr'}</td>
1683: <td>$lt{$discmark}</td>
1.82 albertel 1684: <td><label><input type="checkbox" name="discmark" /><input type="hidden" name="newmark" value="$newmark" /> $lt{'chgt'} "$markchange"</label></td>
1.43 raeburn 1685: </tr>
1.82 albertel 1686: END
1687: $r->print(&Apache::loncommon::end_data_table_row().
1688: &Apache::loncommon::end_data_table());
1.142 zhu 1689:
1.158 bisitz 1690: $r->print('<br />'
1691: .'<input type="submit" name="sub" value="'.&mt('Save').'" />'
1692: .'</form>'
1693: );
1.42 raeburn 1694: }
1695:
1696: sub verify_and_change_discussion {
1697: my $r = shift;
1.59 albertel 1698: my $user = $env{'user.name'};
1699: my $domain = $env{'user.domain'};
1.42 raeburn 1700: my $message='';
1.59 albertel 1701: if (defined($env{'form.discdisp'}) ) {
1702: my $newdisp = $env{'form.newdisp'};
1.43 raeburn 1703: if ($newdisp eq 'unread') {
1.171 ! raeburn 1704: $message .=&Apache::lonhtmlcommon::confirm_success(&mt('In discussions: only new posts will be displayed.')).'<br />';
1.43 raeburn 1705: &Apache::lonnet::put('environment',{'discdisplay' => $newdisp});
1.116 raeburn 1706: &Apache::lonnet::appenv({'environment.discdisplay' => $newdisp});
1.43 raeburn 1707: } else {
1.171 ! raeburn 1708: $message .= &Apache::lonhtmlcommon::confirm_success(&mt('In discussions: all posts will be displayed.')).'<br />';
1.43 raeburn 1709: &Apache::lonnet::del('environment',['discdisplay']);
1.139 raeburn 1710: &Apache::lonnet::delenv('environment.discdisplay');
1.43 raeburn 1711: }
1712: }
1.59 albertel 1713: if (defined($env{'form.discmark'}) ) {
1714: my $newmark = $env{'form.newmark'};
1.43 raeburn 1715: if ($newmark eq 'ondisp') {
1.152 www 1716: $message.=&Apache::lonhtmlcommon::confirm_success(&mt('In discussions: new posts will be cease to be identified as "NEW" after display.')).'<br />';
1.43 raeburn 1717: &Apache::lonnet::put('environment',{'discmarkread' => $newmark});
1.116 raeburn 1718: &Apache::lonnet::appenv({'environment.discmarkread' => $newmark});
1.43 raeburn 1719: } else {
1.152 www 1720: $message.=&Apache::lonhtmlcommon::confirm_success(&mt('In discussions: posts will be identified as "NEW" until marked as read by the reader.')).'<br />';
1.43 raeburn 1721: &Apache::lonnet::del('environment',['discmarkread']);
1.139 raeburn 1722: &Apache::lonnet::delenv('environment.discmarkread');
1.43 raeburn 1723: }
1.42 raeburn 1724: }
1.158 bisitz 1725: $message=&Apache::loncommon::confirmwrapper($message);
1.152 www 1726: &print_main_menu($r, $message);
1.42 raeburn 1727: }
1728:
1.63 raeburn 1729: ################################################################
1730: # Subroutines for page display on course access (Course Coordinators)
1731: ################################################################
1732: sub coursedisplaychanger {
1733: my $r = shift;
1.152 www 1734: &Apache::lonhtmlcommon::add_breadcrumb(
1.126 droeschl 1735: { href => '/adm/preferences?action=changecourseinit',
1736: text => 'Change Course Init. Pref.'});
1737: $r->print(Apache::loncommon::start_page('Change Course Initialization Preference'));
1738: $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Course Init. Pref.'));
1.63 raeburn 1739: my $user = $env{'user.name'};
1740: my $domain = $env{'user.domain'};
1.66 albertel 1741: my %userenv = &Apache::lonnet::get('environment',['course_init_display']);
1.71 raeburn 1742: my $currvalue = 'whatsnew';
1.73 albertel 1743: my $firstselect = '';
1744: my $whatsnewselect = 'checked="checked"';
1.71 raeburn 1745: if (exists($userenv{'course_init_display'})) {
1746: if ($userenv{'course_init_display'} eq 'firstres') {
1747: $currvalue = 'firstres';
1.73 albertel 1748: $firstselect = 'checked="checked"';
1749: $whatsnewselect = '';
1.71 raeburn 1750: }
1.63 raeburn 1751: }
1.134 bisitz 1752: my %pagenames = &Apache::lonlocal::texthash(
1.71 raeburn 1753: firstres => 'First resource',
1.143 hauer 1754: whatsnew => "What's New Page",
1.71 raeburn 1755: );
1.134 bisitz 1756: my $whatsnew_off=&mt('Display the [_1]first resource[_2] in the course.','<b>','</b>');
1.143 hauer 1757: my $whatsnew_on=&mt("Display the [_1]What's New Page[_2] - a summary of items in the course which require attention.",'<b>','</b>');
1.63 raeburn 1758:
1.134 bisitz 1759: $r->print('<br /><b>'
1760: .&mt('Set the default page to be displayed when you select a course role')
1761: .'</b> '
1762: .&mt('(Currently: [_1])',$pagenames{$currvalue})
1763: .'<br />'
1.143 hauer 1764: .&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]What's New Page[_2] in the course.",'<i>','</i>')
1.134 bisitz 1765: .'<br /><br />'
1766: );
1.63 raeburn 1767: $r->print(<<ENDLSCREEN);
1.88 albertel 1768: <form name="prefs" action="/adm/preferences" method="post">
1.63 raeburn 1769: <input type="hidden" name="action" value="verify_and_change_coursepage" />
1.72 albertel 1770: <br />
1.65 albertel 1771: <label><input type="radio" name="newdisp" value="firstres" $firstselect /> $whatsnew_off</label><br />
1.70 raeburn 1772: <label><input type="radio" name="newdisp" value="whatsnew" $whatsnewselect /> $whatsnew_on</label><input type="hidden" name="refpage" value="$env{'form.refpage'}" />
1.63 raeburn 1773: ENDLSCREEN
1.140 schafran 1774: $r->print('<br /><br /><input type="submit" value="'.&mt('Save').'" />
1.63 raeburn 1775: </form>');
1776: }
1777:
1778: sub verify_and_change_coursepage {
1779: my $r = shift;
1780: my $message='';
1781: my %lt = &Apache::lonlocal::texthash(
1.70 raeburn 1782: 'defs' => 'Default now set',
1.71 raeburn 1783: 'when' => 'when you select a course role from the roles screen',
1.63 raeburn 1784: 'ywbt' => 'you will be taken to the start of the course.',
1785: 'apwb' => 'a page will be displayed that lists items in the course that may require action from you.',
1786: 'gtts' => 'Go to the start of the course',
1.146 hauer 1787: 'dasp' => "Display the What's New Page",
1.63 raeburn 1788: );
1789: my $newdisp = $env{'form.newdisp'};
1.70 raeburn 1790: $message = '<b>'.$lt{'defs'}.'</b>: '.$lt{'when'}.', ';
1.63 raeburn 1791: if ($newdisp eq 'firstres') {
1.87 albertel 1792: $message .= $lt{'ywbt'}.'<br />';
1.63 raeburn 1793: &Apache::lonnet::put('environment',{'course_init_display' => $newdisp});
1.116 raeburn 1794: &Apache::lonnet::appenv({'environment.course_init_display' => $newdisp});
1.63 raeburn 1795: } else {
1.87 albertel 1796: $message .= $lt{'apwb'}.'<br />';
1.63 raeburn 1797: &Apache::lonnet::del('environment',['course_init_display']);
1.139 raeburn 1798: &Apache::lonnet::delenv('environment.course_init_display');
1.63 raeburn 1799: }
1.70 raeburn 1800: my $refpage = $env{'form.refpage'};
1.63 raeburn 1801: if (($env{'request.course.fn'}) && ($env{'request.course.id'})) {
1802: if ($newdisp eq 'firstres') {
1803: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1804: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
1805: my ($furl,$ferr)=
1806: &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
1807: $message .= '<br /><font size="+1"><a href="'.$furl.'">'.$lt{'gtts'}.' <i>'.&mt('now').'</i></a></font>';
1808: } else {
1.70 raeburn 1809: $message .= '<br /><font size="+1"><a href="/adm/whatsnew?refpage='.
1810: $refpage.'">'.$lt{'dasp'}.'</a></font>';
1.63 raeburn 1811: }
1812: }
1.152 www 1813: &print_main_menu($r, &Apache::lonhtmlcommon::confirm_success($message));
1.63 raeburn 1814: }
1815:
1.126 droeschl 1816: sub print_main_menu {
1817: my ($r, $message) = @_;
1818: # Determine current authentication method
1819: my $user = $env{'user.name'};
1820: my $domain = $env{'user.domain'};
1821: my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);
1822:
1823: # build the data structure for menu generation
1824: my $aboutmeurl='/adm/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/aboutme';
1825: my $role = ($env{'user.adv'} ? 'Roles' : 'Course');
1.131 raeburn 1826: my %permissions;
1827: if (&Apache::lonnet::usertools_access($user,$domain,'aboutme')) {
1828: $permissions{'aboutme'} = 'F';
1829: }
1.126 droeschl 1830: my @menu=
1831: ({ categorytitle=>'Personal Data',
1832: items =>[
1.141 weissno 1833: { linktext => 'Personal Information Page',
1.126 droeschl 1834: url => $aboutmeurl,
1.131 raeburn 1835: permission => $permissions{'aboutme'},
1.126 droeschl 1836: #help => 'Prefs_About_Me',
1837: icon => 'system-users.png',
1838: linktitle => 'Edit information about yourself that should be displayed on your public profile.'
1839: },
1840: { linktext => 'Screen Name',
1841: url => '/adm/preferences?action=changescreenname',
1842: permission => 'F',
1843: #help => 'Prefs_Screen_Name_Nickname',
1844: icon => 'preferences-desktop-font.png',
1845: linktitle => 'Change the name that is displayed in your posts.'
1846: },
1847: ]
1848: },
1849: { categorytitle=>'Page Display Settings',
1850: items =>[
1851: { linktext => 'Color Scheme',
1852: url => '/adm/preferences?action=changecolors',
1853: permission => 'F',
1854: #help => 'Change_Colors',
1855: icon => 'preferences-desktop-theme.png',
1856: linktitle => 'Change LON-CAPA default colors.'
1857: },
1858: { linktext => 'Menu Display',
1859: url => '/adm/preferences?action=changeicons',
1860: permission => 'F',
1861: #help => '',
1862: icon => 'preferences-system-windows.png',
1863: linktitle => 'Change whether the menus are displayed with buttons, icons or icons and text.'
1864: }
1865:
1866: ]
1867: },
1868: { categorytitle=>'Content Display Settings',
1869: items =>[
1870: { linktext => 'Language',
1871: url => '/adm/preferences?action=changelanguages',
1872: permission => 'F',
1873: #help => 'Prefs_Language',
1874: icon => 'preferences-desktop-locale.png',
1.127 droeschl 1875: linktitle => 'Choose the default language for this user.'
1.126 droeschl 1876: },
1.128 droeschl 1877: { linktext => 'WYSIWYG Editor',
1.126 droeschl 1878: url => '/adm/preferences?action=changewysiwyg',
1879: permission => 'F',
1880: #help => '',
1881: icon => 'edit-select-all.png',
1882: linktitle => 'Enable or disable the WYSIWYG-Editor.'
1883: },
1.128 droeschl 1884: { linktext => $role.' Page',
1.126 droeschl 1885: url => '/adm/preferences?action=changerolespref',
1886: permission => 'F',
1887: #help => '',
1888: icon => 'sctr.png',
1889: linktitle => 'Configure the roles hotlist.'
1890: },
1.127 droeschl 1891: { linktext => 'Display of Scientific Equations',
1.126 droeschl 1892: url => '/adm/preferences?action=changetexenginepref',
1893: permission => 'F',
1894: #help => '',
1895: icon => 'stat.png',
1.127 droeschl 1896: linktitle => 'Change how Scientific Equations are displayed.'
1.126 droeschl 1897: },
1898: ]
1899: },
1.128 droeschl 1900: { categorytitle=>'Message Management',
1901: items =>[
1.153 www 1902: { linktext => 'Messages & Notifications',
1.128 droeschl 1903: url => '/adm/preferences?action=changemsgforward',
1904: permission => 'F',
1905: #help => 'Prefs_Messages',
1906: icon => 'mail-reply-all.png',
1907: linktitle => 'Change messageforwarding or notifications settings.'
1908: },
1909: { linktext => 'Discussion Display',
1910: url => '/adm/preferences?action=changediscussions',
1911: permission => 'F',
1912: #help => 'Change_Discussion_Display',
1913: icon => 'mail-message-new.png',
1.135 schafran 1914: linktitle => 'Set display preferences for discussion posts for both discussion boards and individual resources in all your courses.'
1.128 droeschl 1915: },
1916: ]
1917: },
1.126 droeschl 1918: { categorytitle=>'Other',
1919: items =>[
1.153 www 1920: { linktext => 'Register Response Devices ("Clickers")',
1.126 droeschl 1921: url => '/adm/preferences?action=changeclicker',
1922: permission => 'F',
1923: #help => '',
1924: icon => 'network-workgroup.png',
1925: linktitle => 'Register your clicker.'
1926: },
1927: ]
1928: },
1929: );
1930:
1931: if ($currentauth =~ /^(unix|internal):/) {
1932: push(@{ $menu[0]->{items} }, {
1933: linktext => 'Password',
1934: url => '/adm/preferences?action=changepass',
1935: permission => 'F',
1936: #help => 'Change_Password',
1937: icon => 'emblem-readonly.png',
1938: linktitle => 'Change your password.',
1939: });
1940: }
1941: if ($env{'environment.remote'} eq 'off') {
1942: push(@{ $menu[1]->{items} }, {
1943: linktext => 'Launch Remote Control',
1.167 droeschl 1944: url => '/adm/remote?url=/adm/preferences&action=launch',
1.126 droeschl 1945: permission => 'F',
1946: #help => '',
1947: icon => 'network-wireless.png',
1948: linktitle => 'Launch the remote control for LON-CAPA.',
1949: });
1950: }else{
1951: push(@{ $menu[1]->{items} }, {
1952: linktext => 'Collapse Remote Control',
1.167 droeschl 1953: url => '/adm/remote?url=/adm/preferences&action=collapse',
1.126 droeschl 1954: permission => 'F',
1955: #help => '',
1956: icon => 'network-wireless.png',
1957: linktitle => 'Collapse the remote control for LON-CAPA.',
1958: });
1959: }
1960: my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au']);
1961: if (keys(%author_roles) > 0) {
1962: push(@{ $menu[4]->{items} }, {
1963: linktext => 'Restrict Domain Coordinator Access',
1964: url => '/adm/preferences?action=changedomcoord',
1965: permission => 'F',
1966: #help => '',
1967: icon => 'system-lock-screen.png',
1968: linktitle => 'Restrict domain coordinator access.',
1969: });
1970: }
1971:
1972: if (&Apache::lonnet::allowed('whn',$env{'request.course.id'})
1973: || &Apache::lonnet::allowed('whn',$env{'request.course.id'}.'/'
1974: .$env{'request.course.sec'})) {
1975: push(@{ $menu[4]->{items} }, {
1.128 droeschl 1976: linktext => 'Course Initialization',
1.126 droeschl 1977: url => '/adm/preferences?action=changecourseinit',
1978: permission => 'F',
1979: #help => '',
1980: icon => 'edit-copy.png',
1981: linktitle => 'Set the default page to be displayed when you select a course role.',
1982: });
1983:
1984: }
1985: if ($env{'user.name'} =~ /^(albertel|fox|foxr|kortemey|korte|raeburn)$/) {
1986: push(@{ $menu[4]->{items} }, {
1987: linktext => 'Toggle Debug Messages (Current:'.$env{'user.debug'}.')',
1988: url => '/adm/preferences?action=debugtoggle',
1989: permission => 'F',
1990: #help => '',
1991: icon => 'blog.png',
1992: linktitle => 'Toggle Debug Messages.',
1993: });
1994: }
1995:
1.147 schafran 1996: $r->print(&Apache::loncommon::start_page('My Space'));
1.126 droeschl 1997: $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Preferences'));
1998: $r->print($message);
1999: $r->print(Apache::lonhtmlcommon::generate_menu(@menu));
2000: $r->print(Apache::loncommon::end_page());
2001: }
1.63 raeburn 2002:
1.4 matthew 2003: ######################################################
2004: # other handler subroutines #
2005: ######################################################
2006:
1.3 matthew 2007: ################################################################
2008: # Main handler #
2009: ################################################################
1.126 droeschl 2010: sub handler {
2011: my $r = shift;
2012: Apache::loncommon::content_type($r,'text/html');
2013: # Some pages contain DES keys and should not be cached.
2014: Apache::loncommon::no_cache($r);
2015: $r->send_http_header;
2016: return OK if $r->header_only;
2017: #
2018: Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
2019: ['action','wysiwyg','returnurl','refpage']);
2020: #
2021: Apache::lonhtmlcommon::clear_breadcrumbs();
2022: Apache::lonhtmlcommon::add_breadcrumb
2023: ({href => '/adm/preferences',
1.150 droeschl 2024: text => 'Set User Preferences',
2025: help =>
2026: 'Prefs_About_Me,Prefs_Language,Prefs_Screen_Name_Nickname,Change_Colors,Change_Password,Prefs_Messages,Change_Discussion_Display'});
1.126 droeschl 2027: if(!exists $env{'form.action'}) {
1.150 droeschl 2028: &print_main_menu($r);
1.126 droeschl 2029: }elsif($env{'form.action'} eq 'changepass'){
2030: &passwordchanger($r);
2031: }elsif($env{'form.action'} eq 'verify_and_change_pass'){
2032: &verify_and_change_password($r);
2033: }elsif($env{'form.action'} eq 'changescreenname'){
2034: &screennamechanger($r);
2035: }elsif($env{'form.action'} eq 'verify_and_change_screenname'){
2036: &verify_and_change_screenname($r);
2037: }elsif($env{'form.action'} eq 'changemsgforward'){
2038: &msgforwardchanger($r);
2039: }elsif($env{'form.action'} eq 'verify_and_change_msgforward'){
2040: &verify_and_change_msgforward($r);
2041: }elsif($env{'form.action'} eq 'changecolors'){
2042: &colorschanger($r);
2043: }elsif($env{'form.action'} eq 'verify_and_change_colors'){
2044: &verify_and_change_colors($r);
2045: }elsif($env{'form.action'} eq 'changelanguages'){
2046: &languagechanger($r);
2047: }elsif($env{'form.action'} eq 'verify_and_change_languages'){
2048: &verify_and_change_languages($r);
2049: }elsif($env{'form.action'} eq 'changewysiwyg'){
2050: &wysiwygchanger($r);
2051: }elsif($env{'form.action'} eq 'set_wysiwyg'){
2052: &verify_and_change_wysiwyg($r);
2053: }elsif($env{'form.action'} eq 'changediscussions'){
2054: &discussionchanger($r);
2055: }elsif($env{'form.action'} eq 'verify_and_change_discussion'){
2056: &verify_and_change_discussion($r);
2057: }elsif($env{'form.action'} eq 'changerolespref'){
2058: &rolesprefchanger($r);
2059: }elsif($env{'form.action'} eq 'verify_and_change_rolespref'){
2060: &verify_and_change_rolespref($r);
2061: }elsif($env{'form.action'} eq 'changetexenginepref'){
2062: &texenginechanger($r);
2063: }elsif($env{'form.action'} eq 'verify_and_change_texengine'){
2064: &verify_and_change_texengine($r);
2065: }elsif($env{'form.action'} eq 'changeicons'){
2066: &iconchanger($r);
2067: }elsif($env{'form.action'} eq 'verify_and_change_icons'){
2068: &verify_and_change_icons($r);
2069: }elsif($env{'form.action'} eq 'changeclicker'){
2070: &clickerchanger($r);
2071: }elsif($env{'form.action'} eq 'verify_and_change_clicker'){
2072: &verify_and_change_clicker($r);
2073: }elsif($env{'form.action'} eq 'changedomcoord'){
2074: &domcoordchanger($r);
2075: }elsif($env{'form.action'} eq 'verify_and_change_domcoord'){
2076: &verify_and_change_domcoord($r);
2077: }elsif($env{'form.action'} eq 'lockwarning'){
2078: &lockwarning($r);
2079: }elsif($env{'form.action'} eq 'verify_and_change_locks'){
2080: &verify_and_change_lockwarning($r);
2081: }elsif($env{'form.action'} eq 'changecourseinit'){
2082: &coursedisplaychanger($r);
2083: }elsif($env{'form.action'} eq 'verify_and_change_coursepage'){
2084: &verify_and_change_coursepage($r);
2085: }elsif($env{'form.action'} eq 'debugtoggle'){
1.154 www 2086: &toggle_debug();
2087: &print_main_menu($r);
1.126 droeschl 2088: }
2089:
1.165 bisitz 2090: # Properly end the HTML page of all preference pages
2091: # started in each sub routine
2092: # Exception: print_main_menu has its own end_page call
2093: unless (!exists $env{'form.action'} ||
2094: $env{'form.action'} eq 'debugtoggle') {
2095: $r->print(&Apache::loncommon::end_page());
2096: }
2097:
1.126 droeschl 2098: return OK;
1.35 matthew 2099: }
2100:
2101: sub toggle_debug {
1.59 albertel 2102: if ($env{'user.debug'}) {
1.139 raeburn 2103: &Apache::lonnet::delenv('user.debug');
1.35 matthew 2104: } else {
1.116 raeburn 2105: &Apache::lonnet::appenv({'user.debug' => 1});
1.35 matthew 2106: }
1.13 www 2107: }
1.1 www 2108:
2109: 1;
2110: __END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>