Annotation of loncom/interface/lonpreferences.pm, revision 1.168
1.1 www 1: # The LearningOnline Network
2: # Preferences
3: #
1.168 ! www 4: # $Id: lonpreferences.pm,v 1.167 2009/07/09 19:28:36 droeschl 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.136 schafran 1359: 'changepass' => 'Save');
1.99 www 1360:
1.164 bisitz 1361: my $output = '<form name="client">'
1362: .&Apache::lonhtmlcommon::start_pick_box();
1.94 raeburn 1363: if ($caller eq 'reset_by_email') {
1.164 bisitz 1364: $output .= &Apache::lonhtmlcommon::row_title(
1365: '<label for="email">'.$lt{'email'}.'</label>')
1366: .'<input type="text" name="email" size="30" />'
1367: .&Apache::lonhtmlcommon::row_closure()
1368: .&Apache::lonhtmlcommon::row_title(
1369: '<label for="uname">'.$lt{'username'}.'</label>')
1370: .'<input type="text" name="uname" size="15" />'
1371: .'<input type="hidden" name="currentpass" value="'.$currentpass.'" />'
1372: .&Apache::lonhtmlcommon::row_closure()
1373: .&Apache::lonhtmlcommon::row_title(
1374: '<label for="udom">'.$lt{'domain'}.'</label>')
1375: .&Apache::loncommon::select_dom_form($defdom,'udom')
1376: .&Apache::lonhtmlcommon::row_closure();
1.94 raeburn 1377: } else {
1.164 bisitz 1378: $output .= &Apache::lonhtmlcommon::row_title(
1379: '<label for="currentpass">'.$lt{'currentpass'}.'</label>')
1380: .'<input type="password" name="currentpass" size="10"/>'
1381: .&Apache::lonhtmlcommon::row_closure();
1382: }
1383: $output .= &Apache::lonhtmlcommon::row_title(
1384: '<label for="newpass_1">'.$lt{'newpass'}.'</label>')
1385: .'<input type="password" name="newpass_1" size="10" />'
1386: .&Apache::lonhtmlcommon::row_closure()
1387: .&Apache::lonhtmlcommon::row_title(
1388: '<label for="newpass_2">'.$lt{'confirmpass'}.'</label>')
1389: .'<input type="password" name="newpass_2" size="10" />'
1390: .&Apache::lonhtmlcommon::row_closure(1)
1391: .&Apache::lonhtmlcommon::end_pick_box();
1392: $output .= '<p><input type="button" value="'.$lt{'changepass'}.'" onClick="send();" /></p>'
1393: .qq|
1.94 raeburn 1394: <input type="hidden" name="ukey_cpass" value="$hexkey->{'ukey_cpass'}" />
1395: <input type="hidden" name="lkey_cpass" value="$hexkey->{'lkey_cpass'}" />
1396: <input type="hidden" name="ukey_npass1" value="$hexkey->{'ukey_npass1'}" />
1397: <input type="hidden" name="lkey_npass1" value="$hexkey->{'lkey_npass1'}" />
1398: <input type="hidden" name="ukey_npass2" value="$hexkey->{'ukey_npass2'}" />
1399: <input type="hidden" name="lkey_npass2" value="$hexkey->{'lkey_npass2'}" />
1.3 matthew 1400: </form>
1401: </p>
1.164 bisitz 1402: |;
1.94 raeburn 1403: return $output;
1404: }
1405:
1406: sub server_form {
1407: my ($logtoken,$caller,$mailtoken) = @_;
1408: my $action = '/adm/preferences';
1409: if ($caller eq 'reset_by_email') {
1410: $action = '/adm/resetpw';
1411: }
1412: my $output = qq|
1413: <form name="pserver" action="$action" method="post">
1414: <input type="hidden" name="logtoken" value="$logtoken" />
1415: <input type="hidden" name="currentpass" value="" />
1416: <input type="hidden" name="newpass_1" value="" />
1417: <input type="hidden" name="newpass_2" value="" />
1418: |;
1419: if ($caller eq 'reset_by_email') {
1420: $output .= qq|
1421: <input type="hidden" name="token" value="$mailtoken" />
1422: <input type="hidden" name="uname" value="" />
1423: <input type="hidden" name="udom" value="" />
1424:
1425: |;
1426: }
1427: $output .= qq|
1428: <input type="hidden" name="action" value="verify_and_change_pass" />
1429: </form>
1430: |;
1431: return $output;
1.3 matthew 1432: }
1433:
1434: sub verify_and_change_password {
1.94 raeburn 1435: my ($r,$caller,$mailtoken) = @_;
1436: my ($user,$domain,$homeserver);
1437: if ($caller eq 'reset_by_email') {
1438: $user = $env{'form.uname'};
1439: $domain = $env{'form.udom'};
1440: if ($user ne '' && $domain ne '') {
1441: $homeserver = &Apache::lonnet::homeserver($user,$domain);
1442: if ($homeserver eq 'no_host') {
1.99 www 1443: &passwordchanger($r,"<p>\n<span class='LC_error'>".
1444: &mt("Invalid username and/or domain")."</span>\n</p>",
1.94 raeburn 1445: $caller,$mailtoken);
1446: return 1;
1447: }
1448: } else {
1.99 www 1449: &passwordchanger($r,"<p>\n<span class='LC_error'>".
1450: &mt("Username and domain were blank")."</span>\n</p>",
1.94 raeburn 1451: $caller,$mailtoken);
1452: return 1;
1453: }
1454: } else {
1455: $user = $env{'user.name'};
1456: $domain = $env{'user.domain'};
1457: $homeserver = $env{'user.home'};
1458: }
1.3 matthew 1459: my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);
1.4 matthew 1460: # Check for authentication types that allow changing of the password.
1.94 raeburn 1461: if ($currentauth !~ /^(unix|internal):/) {
1462: if ($caller eq 'reset_by_email') {
1.99 www 1463: &passwordchanger($r,"<p>\n<span class='LC_error'>".
1464: &mt("Authentication type for this user can not be changed by this mechanism").
1465: "</span>\n</p>",
1.94 raeburn 1466: $caller,$mailtoken);
1467: return 1;
1468: } else {
1469: return;
1470: }
1471: }
1.3 matthew 1472: #
1.59 albertel 1473: my $currentpass = $env{'form.currentpass'};
1474: my $newpass1 = $env{'form.newpass_1'};
1475: my $newpass2 = $env{'form.newpass_2'};
1476: my $logtoken = $env{'form.logtoken'};
1.3 matthew 1477: # Check for empty data
1.4 matthew 1478: unless (defined($currentpass) &&
1479: defined($newpass1) &&
1480: defined($newpass2) ){
1.99 www 1481: &passwordchanger($r,"<p>\n<span class='LC_error'>".
1482: &mt("One or more password fields were blank").
1483: "</span>\n</p>",$caller,$mailtoken);
1.3 matthew 1484: return;
1485: }
1.16 albertel 1486: # Get the keys
1487: my $lonhost = $r->dir_config('lonHostID');
1.3 matthew 1488: my $tmpinfo = Apache::lonnet::reply('tmpget:'.$logtoken,$lonhost);
1489: if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost')) {
1.4 matthew 1490: # I do not a have a better idea about how to handle this
1.94 raeburn 1491: my $tryagain_text = &mt('Please log out and try again.');
1492: if ($caller eq 'reset_by_email') {
1493: $tryagain_text = &mt('Please try again later.');
1494: }
1.101 albertel 1495: my $unable=&mt("Unable to retrieve saved token for password decryption");
1.3 matthew 1496: $r->print(<<ENDERROR);
1497: <p>
1.99 www 1498: <span class="LC_error">$unable. $tryagain_text</span>
1.3 matthew 1499: </p>
1500: ENDERROR
1.4 matthew 1501: # Probably should log an error here
1.75 albertel 1502: return 1;
1.3 matthew 1503: }
1504: my ($ckey,$n1key,$n2key)=split(/&/,$tmpinfo);
1.4 matthew 1505: #
1.17 matthew 1506: $currentpass = &des_decrypt($ckey ,$currentpass);
1507: $newpass1 = &des_decrypt($n1key,$newpass1);
1508: $newpass2 = &des_decrypt($n2key,$newpass2);
1.94 raeburn 1509: #
1510: if ($caller eq 'reset_by_email') {
1511: my %data = &Apache::lonnet::tmpget($mailtoken);
1.117 raeburn 1512: if (keys(%data) == 0) {
1513: &passwordchanger($r,
1514: '<span class="LC_error">'.
1515: &mt('Could not verify current authentication.').' '.
1516: &mt('Please try again.').'</span>',$caller,$mailtoken);
1517: return 1;
1518: }
1.94 raeburn 1519: if ($currentpass ne $data{'temppasswd'}) {
1520: &passwordchanger($r,
1.99 www 1521: '<span class="LC_error">'.
1.110 bisitz 1522: &mt('Could not verify current authentication.').' '.
1523: &mt('Please try again.').'</span>',$caller,$mailtoken);
1.94 raeburn 1524: return 1;
1525: }
1526: }
1.3 matthew 1527: if ($newpass1 ne $newpass2) {
1.4 matthew 1528: &passwordchanger($r,
1.99 www 1529: '<span class="LC_error">'.
1.110 bisitz 1530: &mt('The new passwords you entered do not match.').' '.
1531: &mt('Please try again.').'</span>',$caller,$mailtoken);
1.75 albertel 1532: return 1;
1.4 matthew 1533: }
1534: if (length($newpass1) < 7) {
1535: &passwordchanger($r,
1.99 www 1536: '<span class="LC_error">'.
1.110 bisitz 1537: &mt('Passwords must be a minimum of 7 characters long.').' '.
1538: &mt('Please try again.').'</span>',$caller,$mailtoken);
1.75 albertel 1539: return 1;
1.3 matthew 1540: }
1.4 matthew 1541: #
1542: # Check for bad characters
1543: my $badpassword = 0;
1544: foreach (split(//,$newpass1)) {
1545: $badpassword = 1 if ((ord($_)<32)||(ord($_)>126));
1546: }
1547: if ($badpassword) {
1548: # I can't figure out how to enter bad characters on my browser.
1.99 www 1549: my $errormessage ='<span class="LC_error">'.
1.110 bisitz 1550: &mt('The password you entered contained illegal characters.').'<br />'.
1.99 www 1551: &mt('Valid characters are').(<<"ENDERROR");
1552: : space and <br />
1.4 matthew 1553: <pre>
1554: !"\#$%&\'()*+,-./0123456789:;<=>?\@
1555: ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_\`abcdefghijklmnopqrstuvwxyz{|}~
1.99 www 1556: </pre></span>
1.4 matthew 1557: ENDERROR
1.94 raeburn 1558: &passwordchanger($r,$errormessage,$caller,$mailtoken);
1559: return 1;
1.4 matthew 1560: }
1561: #
1562: # Change the password (finally)
1563: my $result = &Apache::lonnet::changepass
1.94 raeburn 1564: ($user,$domain,$currentpass,$newpass1,$homeserver,$caller);
1.4 matthew 1565: # Inform the user the password has (not?) been changed
1.126 droeschl 1566: my $message;
1.4 matthew 1567: if ($result =~ /^ok$/) {
1.158 bisitz 1568: $message = &Apache::lonhtmlcommon::confirm_success(&mt('The password for user [_1] was successfully changed.','<i>'.$user.'<i>'));
1.144 raeburn 1569: if ($caller eq 'reset_by_email') {
1570: $r->print($message.'<br />');
1571: } else {
1572: &print_main_menu($r, $message);
1573: }
1.4 matthew 1574: } else {
1575: # error error: run in circles, scream and shout
1.154 www 1576: $message = &Apache::lonhtmlcommon::confirm_success(
1.158 bisitz 1577: &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 1578: unless ($caller eq 'reset_by_email') {
1.158 bisitz 1579: $message=&Apache::loncommon::confirmwrapper($message);
1.144 raeburn 1580: &print_main_menu($r, $message);
1581: }
1.75 albertel 1582: return 1;
1.4 matthew 1583: }
1584: return;
1.3 matthew 1585: }
1586:
1.42 raeburn 1587: ################################################################
1588: # discussion display subroutines
1589: ################################################################
1590: sub discussionchanger {
1591: my $r = shift;
1.126 droeschl 1592: Apache::lonhtmlcommon::add_breadcrumb(
1593: { href => '/adm/preferences?action=changediscussions',
1594: text => 'Change Discussion Preferences'});
1.147 schafran 1595: $r->print(Apache::loncommon::start_page('Message Management'));
1.126 droeschl 1596: $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Discussion Preferences'));
1.59 albertel 1597: my $user = $env{'user.name'};
1598: my $domain = $env{'user.domain'};
1.42 raeburn 1599: my %userenv = &Apache::lonnet::get
1.43 raeburn 1600: ('environment',['discdisplay','discmarkread']);
1601: my $discdisp = 'allposts';
1602: my $discmark = 'onmark';
1603:
1604: if (defined($userenv{'discdisplay'})) {
1605: unless ($userenv{'discdisplay'} eq '') {
1606: $discdisp = $userenv{'discdisplay'};
1607: }
1608: }
1609: if (defined($userenv{'discmarkread'})) {
1610: unless ($userenv{'discdisplay'} eq '') {
1611: $discmark = $userenv{'discmarkread'};
1612: }
1613: }
1614:
1615: my $newdisp = 'unread';
1616: my $newmark = 'ondisp';
1617:
1618: my $function = &Apache::loncommon::get_users_function();
1619: my $color = &Apache::loncommon::designparm($function.'.tabbg',
1.59 albertel 1620: $env{'user.domain'});
1.43 raeburn 1621: my %lt = &Apache::lonlocal::texthash(
1622: 'pref' => 'Display Preference',
1623: 'curr' => 'Current setting ',
1624: 'actn' => 'Action',
1.135 schafran 1625: 'sdpf' => 'Set display preferences for discussion posts for both discussion boards and individual resources in all your courses.',
1.43 raeburn 1626: 'prca' => 'Preferences can be set that determine',
1.135 schafran 1627: 'whpo' => 'Which posts are displayed when you display a discussion board or resource, and',
1.43 raeburn 1628: 'unwh' => 'Under what circumstances posts are identfied as "New"',
1629: 'allposts' => 'All posts',
1630: 'unread' => 'New posts only',
1631: 'ondisp' => 'Once displayed',
1632: 'onmark' => 'Once marked as read',
1633: 'disa' => 'Posts displayed?',
1634: 'npmr' => 'New posts cease to be identified as "New"?',
1635: 'thde' => 'The preferences you set here can be overridden within each individual discussion.',
1636: 'chgt' => 'Change to '
1637: );
1638: my $dispchange = $lt{'unread'};
1639: my $markchange = $lt{'ondisp'};
1640: my $currdisp = $lt{'allposts'};
1641: my $currmark = $lt{'onmark'};
1642:
1643: if ($discdisp eq 'unread') {
1644: $dispchange = $lt{'allposts'};
1645: $currdisp = $lt{'unread'};
1646: $newdisp = 'allposts';
1647: }
1648:
1649: if ($discmark eq 'ondisp') {
1650: $markchange = $lt{'onmark'};
1651: $currmark = $lt{'ondisp'};
1652: $newmark = 'onmark';
1.42 raeburn 1653: }
1.43 raeburn 1654:
1655: $r->print(<<"END");
1.88 albertel 1656: <form name="prefs" action="/adm/preferences" method="post">
1.42 raeburn 1657: <input type="hidden" name="action" value="verify_and_change_discussion" />
1658: <br />
1.87 albertel 1659: $lt{'sdpf'}<br /> $lt{'prca'} <ol><li>$lt{'whpo'}</li><li>$lt{'unwh'}</li></ol>
1.82 albertel 1660: END
1.158 bisitz 1661:
1662: $r->print('<p class="LC_info">'.$lt{'thde'}.'</p>');
1663:
1.82 albertel 1664: $r->print(&Apache::loncommon::start_data_table());
1665: $r->print(<<"END");
1666: <tr>
1667: <th>$lt{'pref'}</th>
1668: <th>$lt{'curr'}</th>
1669: <th>$lt{'actn'}?</th>
1.43 raeburn 1670: </tr>
1.82 albertel 1671: END
1672: $r->print(&Apache::loncommon::start_data_table_row());
1673: $r->print(<<"END");
1.43 raeburn 1674: <td>$lt{'disa'}</td>
1675: <td>$lt{$discdisp}</td>
1.82 albertel 1676: <td><label><input type="checkbox" name="discdisp" /><input type="hidden" name="newdisp" value="$newdisp" /> $lt{'chgt'} "$dispchange"</label></td>
1677: END
1678: $r->print(&Apache::loncommon::end_data_table_row().
1679: &Apache::loncommon::start_data_table_row());
1680: $r->print(<<"END");
1.43 raeburn 1681: <td>$lt{'npmr'}</td>
1682: <td>$lt{$discmark}</td>
1.82 albertel 1683: <td><label><input type="checkbox" name="discmark" /><input type="hidden" name="newmark" value="$newmark" /> $lt{'chgt'} "$markchange"</label></td>
1.43 raeburn 1684: </tr>
1.82 albertel 1685: END
1686: $r->print(&Apache::loncommon::end_data_table_row().
1687: &Apache::loncommon::end_data_table());
1.142 zhu 1688:
1.158 bisitz 1689: $r->print('<br />'
1690: .'<input type="submit" name="sub" value="'.&mt('Save').'" />'
1691: .'</form>'
1692: );
1.42 raeburn 1693: }
1694:
1695: sub verify_and_change_discussion {
1696: my $r = shift;
1.59 albertel 1697: my $user = $env{'user.name'};
1698: my $domain = $env{'user.domain'};
1.42 raeburn 1699: my $message='';
1.59 albertel 1700: if (defined($env{'form.discdisp'}) ) {
1701: my $newdisp = $env{'form.newdisp'};
1.43 raeburn 1702: if ($newdisp eq 'unread') {
1.110 bisitz 1703: $message .=&mt('In discussions: only new posts will be displayed.').'<br />';
1.43 raeburn 1704: &Apache::lonnet::put('environment',{'discdisplay' => $newdisp});
1.116 raeburn 1705: &Apache::lonnet::appenv({'environment.discdisplay' => $newdisp});
1.43 raeburn 1706: } else {
1.110 bisitz 1707: $message .= &mt('In discussions: all posts will be displayed.').'<br />';
1.43 raeburn 1708: &Apache::lonnet::del('environment',['discdisplay']);
1.139 raeburn 1709: &Apache::lonnet::delenv('environment.discdisplay');
1.43 raeburn 1710: }
1711: }
1.59 albertel 1712: if (defined($env{'form.discmark'}) ) {
1713: my $newmark = $env{'form.newmark'};
1.43 raeburn 1714: if ($newmark eq 'ondisp') {
1.152 www 1715: $message.=&Apache::lonhtmlcommon::confirm_success(&mt('In discussions: new posts will be cease to be identified as "NEW" after display.')).'<br />';
1.43 raeburn 1716: &Apache::lonnet::put('environment',{'discmarkread' => $newmark});
1.116 raeburn 1717: &Apache::lonnet::appenv({'environment.discmarkread' => $newmark});
1.43 raeburn 1718: } else {
1.152 www 1719: $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 1720: &Apache::lonnet::del('environment',['discmarkread']);
1.139 raeburn 1721: &Apache::lonnet::delenv('environment.discmarkread');
1.43 raeburn 1722: }
1.42 raeburn 1723: }
1.158 bisitz 1724: $message=&Apache::loncommon::confirmwrapper($message);
1.152 www 1725: &print_main_menu($r, $message);
1.42 raeburn 1726: }
1727:
1.63 raeburn 1728: ################################################################
1729: # Subroutines for page display on course access (Course Coordinators)
1730: ################################################################
1731: sub coursedisplaychanger {
1732: my $r = shift;
1.152 www 1733: &Apache::lonhtmlcommon::add_breadcrumb(
1.126 droeschl 1734: { href => '/adm/preferences?action=changecourseinit',
1735: text => 'Change Course Init. Pref.'});
1736: $r->print(Apache::loncommon::start_page('Change Course Initialization Preference'));
1737: $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Course Init. Pref.'));
1.63 raeburn 1738: my $user = $env{'user.name'};
1739: my $domain = $env{'user.domain'};
1.66 albertel 1740: my %userenv = &Apache::lonnet::get('environment',['course_init_display']);
1.71 raeburn 1741: my $currvalue = 'whatsnew';
1.73 albertel 1742: my $firstselect = '';
1743: my $whatsnewselect = 'checked="checked"';
1.71 raeburn 1744: if (exists($userenv{'course_init_display'})) {
1745: if ($userenv{'course_init_display'} eq 'firstres') {
1746: $currvalue = 'firstres';
1.73 albertel 1747: $firstselect = 'checked="checked"';
1748: $whatsnewselect = '';
1.71 raeburn 1749: }
1.63 raeburn 1750: }
1.134 bisitz 1751: my %pagenames = &Apache::lonlocal::texthash(
1.71 raeburn 1752: firstres => 'First resource',
1.143 hauer 1753: whatsnew => "What's New Page",
1.71 raeburn 1754: );
1.134 bisitz 1755: my $whatsnew_off=&mt('Display the [_1]first resource[_2] in the course.','<b>','</b>');
1.143 hauer 1756: 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 1757:
1.134 bisitz 1758: $r->print('<br /><b>'
1759: .&mt('Set the default page to be displayed when you select a course role')
1760: .'</b> '
1761: .&mt('(Currently: [_1])',$pagenames{$currvalue})
1762: .'<br />'
1.143 hauer 1763: .&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 1764: .'<br /><br />'
1765: );
1.63 raeburn 1766: $r->print(<<ENDLSCREEN);
1.88 albertel 1767: <form name="prefs" action="/adm/preferences" method="post">
1.63 raeburn 1768: <input type="hidden" name="action" value="verify_and_change_coursepage" />
1.72 albertel 1769: <br />
1.65 albertel 1770: <label><input type="radio" name="newdisp" value="firstres" $firstselect /> $whatsnew_off</label><br />
1.70 raeburn 1771: <label><input type="radio" name="newdisp" value="whatsnew" $whatsnewselect /> $whatsnew_on</label><input type="hidden" name="refpage" value="$env{'form.refpage'}" />
1.63 raeburn 1772: ENDLSCREEN
1.140 schafran 1773: $r->print('<br /><br /><input type="submit" value="'.&mt('Save').'" />
1.63 raeburn 1774: </form>');
1775: }
1776:
1777: sub verify_and_change_coursepage {
1778: my $r = shift;
1779: my $message='';
1780: my %lt = &Apache::lonlocal::texthash(
1.70 raeburn 1781: 'defs' => 'Default now set',
1.71 raeburn 1782: 'when' => 'when you select a course role from the roles screen',
1.63 raeburn 1783: 'ywbt' => 'you will be taken to the start of the course.',
1784: 'apwb' => 'a page will be displayed that lists items in the course that may require action from you.',
1785: 'gtts' => 'Go to the start of the course',
1.146 hauer 1786: 'dasp' => "Display the What's New Page",
1.63 raeburn 1787: );
1788: my $newdisp = $env{'form.newdisp'};
1.70 raeburn 1789: $message = '<b>'.$lt{'defs'}.'</b>: '.$lt{'when'}.', ';
1.63 raeburn 1790: if ($newdisp eq 'firstres') {
1.87 albertel 1791: $message .= $lt{'ywbt'}.'<br />';
1.63 raeburn 1792: &Apache::lonnet::put('environment',{'course_init_display' => $newdisp});
1.116 raeburn 1793: &Apache::lonnet::appenv({'environment.course_init_display' => $newdisp});
1.63 raeburn 1794: } else {
1.87 albertel 1795: $message .= $lt{'apwb'}.'<br />';
1.63 raeburn 1796: &Apache::lonnet::del('environment',['course_init_display']);
1.139 raeburn 1797: &Apache::lonnet::delenv('environment.course_init_display');
1.63 raeburn 1798: }
1.70 raeburn 1799: my $refpage = $env{'form.refpage'};
1.63 raeburn 1800: if (($env{'request.course.fn'}) && ($env{'request.course.id'})) {
1801: if ($newdisp eq 'firstres') {
1802: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1803: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
1804: my ($furl,$ferr)=
1805: &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
1806: $message .= '<br /><font size="+1"><a href="'.$furl.'">'.$lt{'gtts'}.' <i>'.&mt('now').'</i></a></font>';
1807: } else {
1.70 raeburn 1808: $message .= '<br /><font size="+1"><a href="/adm/whatsnew?refpage='.
1809: $refpage.'">'.$lt{'dasp'}.'</a></font>';
1.63 raeburn 1810: }
1811: }
1.152 www 1812: &print_main_menu($r, &Apache::lonhtmlcommon::confirm_success($message));
1.63 raeburn 1813: }
1814:
1.126 droeschl 1815: sub print_main_menu {
1816: my ($r, $message) = @_;
1817: # Determine current authentication method
1818: my $user = $env{'user.name'};
1819: my $domain = $env{'user.domain'};
1820: my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);
1821:
1822: # build the data structure for menu generation
1823: my $aboutmeurl='/adm/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/aboutme';
1824: my $role = ($env{'user.adv'} ? 'Roles' : 'Course');
1.131 raeburn 1825: my %permissions;
1826: if (&Apache::lonnet::usertools_access($user,$domain,'aboutme')) {
1827: $permissions{'aboutme'} = 'F';
1828: }
1.126 droeschl 1829: my @menu=
1830: ({ categorytitle=>'Personal Data',
1831: items =>[
1.141 weissno 1832: { linktext => 'Personal Information Page',
1.126 droeschl 1833: url => $aboutmeurl,
1.131 raeburn 1834: permission => $permissions{'aboutme'},
1.126 droeschl 1835: #help => 'Prefs_About_Me',
1836: icon => 'system-users.png',
1837: linktitle => 'Edit information about yourself that should be displayed on your public profile.'
1838: },
1839: { linktext => 'Screen Name',
1840: url => '/adm/preferences?action=changescreenname',
1841: permission => 'F',
1842: #help => 'Prefs_Screen_Name_Nickname',
1843: icon => 'preferences-desktop-font.png',
1844: linktitle => 'Change the name that is displayed in your posts.'
1845: },
1846: ]
1847: },
1848: { categorytitle=>'Page Display Settings',
1849: items =>[
1850: { linktext => 'Color Scheme',
1851: url => '/adm/preferences?action=changecolors',
1852: permission => 'F',
1853: #help => 'Change_Colors',
1854: icon => 'preferences-desktop-theme.png',
1855: linktitle => 'Change LON-CAPA default colors.'
1856: },
1857: { linktext => 'Menu Display',
1858: url => '/adm/preferences?action=changeicons',
1859: permission => 'F',
1860: #help => '',
1861: icon => 'preferences-system-windows.png',
1862: linktitle => 'Change whether the menus are displayed with buttons, icons or icons and text.'
1863: }
1864:
1865: ]
1866: },
1867: { categorytitle=>'Content Display Settings',
1868: items =>[
1869: { linktext => 'Language',
1870: url => '/adm/preferences?action=changelanguages',
1871: permission => 'F',
1872: #help => 'Prefs_Language',
1873: icon => 'preferences-desktop-locale.png',
1.127 droeschl 1874: linktitle => 'Choose the default language for this user.'
1.126 droeschl 1875: },
1.128 droeschl 1876: { linktext => 'WYSIWYG Editor',
1.126 droeschl 1877: url => '/adm/preferences?action=changewysiwyg',
1878: permission => 'F',
1879: #help => '',
1880: icon => 'edit-select-all.png',
1881: linktitle => 'Enable or disable the WYSIWYG-Editor.'
1882: },
1.128 droeschl 1883: { linktext => $role.' Page',
1.126 droeschl 1884: url => '/adm/preferences?action=changerolespref',
1885: permission => 'F',
1886: #help => '',
1887: icon => 'sctr.png',
1888: linktitle => 'Configure the roles hotlist.'
1889: },
1.127 droeschl 1890: { linktext => 'Display of Scientific Equations',
1.126 droeschl 1891: url => '/adm/preferences?action=changetexenginepref',
1892: permission => 'F',
1893: #help => '',
1894: icon => 'stat.png',
1.127 droeschl 1895: linktitle => 'Change how Scientific Equations are displayed.'
1.126 droeschl 1896: },
1897: ]
1898: },
1.128 droeschl 1899: { categorytitle=>'Message Management',
1900: items =>[
1.153 www 1901: { linktext => 'Messages & Notifications',
1.128 droeschl 1902: url => '/adm/preferences?action=changemsgforward',
1903: permission => 'F',
1904: #help => 'Prefs_Messages',
1905: icon => 'mail-reply-all.png',
1906: linktitle => 'Change messageforwarding or notifications settings.'
1907: },
1908: { linktext => 'Discussion Display',
1909: url => '/adm/preferences?action=changediscussions',
1910: permission => 'F',
1911: #help => 'Change_Discussion_Display',
1912: icon => 'mail-message-new.png',
1.135 schafran 1913: linktitle => 'Set display preferences for discussion posts for both discussion boards and individual resources in all your courses.'
1.128 droeschl 1914: },
1915: ]
1916: },
1.126 droeschl 1917: { categorytitle=>'Other',
1918: items =>[
1.153 www 1919: { linktext => 'Register Response Devices ("Clickers")',
1.126 droeschl 1920: url => '/adm/preferences?action=changeclicker',
1921: permission => 'F',
1922: #help => '',
1923: icon => 'network-workgroup.png',
1924: linktitle => 'Register your clicker.'
1925: },
1926: ]
1927: },
1928: );
1929:
1930: if ($currentauth =~ /^(unix|internal):/) {
1931: push(@{ $menu[0]->{items} }, {
1932: linktext => 'Password',
1933: url => '/adm/preferences?action=changepass',
1934: permission => 'F',
1935: #help => 'Change_Password',
1936: icon => 'emblem-readonly.png',
1937: linktitle => 'Change your password.',
1938: });
1939: }
1940: if ($env{'environment.remote'} eq 'off') {
1941: push(@{ $menu[1]->{items} }, {
1942: linktext => 'Launch Remote Control',
1.167 droeschl 1943: url => '/adm/remote?url=/adm/preferences&action=launch',
1.126 droeschl 1944: permission => 'F',
1945: #help => '',
1946: icon => 'network-wireless.png',
1947: linktitle => 'Launch the remote control for LON-CAPA.',
1948: });
1949: }else{
1950: push(@{ $menu[1]->{items} }, {
1951: linktext => 'Collapse Remote Control',
1.167 droeschl 1952: url => '/adm/remote?url=/adm/preferences&action=collapse',
1.126 droeschl 1953: permission => 'F',
1954: #help => '',
1955: icon => 'network-wireless.png',
1956: linktitle => 'Collapse the remote control for LON-CAPA.',
1957: });
1958: }
1959: my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au']);
1960: if (keys(%author_roles) > 0) {
1961: push(@{ $menu[4]->{items} }, {
1962: linktext => 'Restrict Domain Coordinator Access',
1963: url => '/adm/preferences?action=changedomcoord',
1964: permission => 'F',
1965: #help => '',
1966: icon => 'system-lock-screen.png',
1967: linktitle => 'Restrict domain coordinator access.',
1968: });
1969: }
1970:
1971: if (&Apache::lonnet::allowed('whn',$env{'request.course.id'})
1972: || &Apache::lonnet::allowed('whn',$env{'request.course.id'}.'/'
1973: .$env{'request.course.sec'})) {
1974: push(@{ $menu[4]->{items} }, {
1.128 droeschl 1975: linktext => 'Course Initialization',
1.126 droeschl 1976: url => '/adm/preferences?action=changecourseinit',
1977: permission => 'F',
1978: #help => '',
1979: icon => 'edit-copy.png',
1980: linktitle => 'Set the default page to be displayed when you select a course role.',
1981: });
1982:
1983: }
1984: if ($env{'user.name'} =~ /^(albertel|fox|foxr|kortemey|korte|raeburn)$/) {
1985: push(@{ $menu[4]->{items} }, {
1986: linktext => 'Toggle Debug Messages (Current:'.$env{'user.debug'}.')',
1987: url => '/adm/preferences?action=debugtoggle',
1988: permission => 'F',
1989: #help => '',
1990: icon => 'blog.png',
1991: linktitle => 'Toggle Debug Messages.',
1992: });
1993: }
1994:
1.147 schafran 1995: $r->print(&Apache::loncommon::start_page('My Space'));
1.126 droeschl 1996: $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Preferences'));
1997: $r->print($message);
1998: $r->print(Apache::lonhtmlcommon::generate_menu(@menu));
1999: $r->print(Apache::loncommon::end_page());
2000: }
1.63 raeburn 2001:
1.4 matthew 2002: ######################################################
2003: # other handler subroutines #
2004: ######################################################
2005:
1.3 matthew 2006: ################################################################
2007: # Main handler #
2008: ################################################################
1.126 droeschl 2009: sub handler {
2010: my $r = shift;
2011: Apache::loncommon::content_type($r,'text/html');
2012: # Some pages contain DES keys and should not be cached.
2013: Apache::loncommon::no_cache($r);
2014: $r->send_http_header;
2015: return OK if $r->header_only;
2016: #
2017: Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
2018: ['action','wysiwyg','returnurl','refpage']);
2019: #
2020: Apache::lonhtmlcommon::clear_breadcrumbs();
2021: Apache::lonhtmlcommon::add_breadcrumb
2022: ({href => '/adm/preferences',
1.150 droeschl 2023: text => 'Set User Preferences',
2024: help =>
2025: 'Prefs_About_Me,Prefs_Language,Prefs_Screen_Name_Nickname,Change_Colors,Change_Password,Prefs_Messages,Change_Discussion_Display'});
1.126 droeschl 2026: if(!exists $env{'form.action'}) {
1.150 droeschl 2027: &print_main_menu($r);
1.126 droeschl 2028: }elsif($env{'form.action'} eq 'changepass'){
2029: &passwordchanger($r);
2030: }elsif($env{'form.action'} eq 'verify_and_change_pass'){
2031: &verify_and_change_password($r);
2032: }elsif($env{'form.action'} eq 'changescreenname'){
2033: &screennamechanger($r);
2034: }elsif($env{'form.action'} eq 'verify_and_change_screenname'){
2035: &verify_and_change_screenname($r);
2036: }elsif($env{'form.action'} eq 'changemsgforward'){
2037: &msgforwardchanger($r);
2038: }elsif($env{'form.action'} eq 'verify_and_change_msgforward'){
2039: &verify_and_change_msgforward($r);
2040: }elsif($env{'form.action'} eq 'changecolors'){
2041: &colorschanger($r);
2042: }elsif($env{'form.action'} eq 'verify_and_change_colors'){
2043: &verify_and_change_colors($r);
2044: }elsif($env{'form.action'} eq 'changelanguages'){
2045: &languagechanger($r);
2046: }elsif($env{'form.action'} eq 'verify_and_change_languages'){
2047: &verify_and_change_languages($r);
2048: }elsif($env{'form.action'} eq 'changewysiwyg'){
2049: &wysiwygchanger($r);
2050: }elsif($env{'form.action'} eq 'set_wysiwyg'){
2051: &verify_and_change_wysiwyg($r);
2052: }elsif($env{'form.action'} eq 'changediscussions'){
2053: &discussionchanger($r);
2054: }elsif($env{'form.action'} eq 'verify_and_change_discussion'){
2055: &verify_and_change_discussion($r);
2056: }elsif($env{'form.action'} eq 'changerolespref'){
2057: &rolesprefchanger($r);
2058: }elsif($env{'form.action'} eq 'verify_and_change_rolespref'){
2059: &verify_and_change_rolespref($r);
2060: }elsif($env{'form.action'} eq 'changetexenginepref'){
2061: &texenginechanger($r);
2062: }elsif($env{'form.action'} eq 'verify_and_change_texengine'){
2063: &verify_and_change_texengine($r);
2064: }elsif($env{'form.action'} eq 'changeicons'){
2065: &iconchanger($r);
2066: }elsif($env{'form.action'} eq 'verify_and_change_icons'){
2067: &verify_and_change_icons($r);
2068: }elsif($env{'form.action'} eq 'changeclicker'){
2069: &clickerchanger($r);
2070: }elsif($env{'form.action'} eq 'verify_and_change_clicker'){
2071: &verify_and_change_clicker($r);
2072: }elsif($env{'form.action'} eq 'changedomcoord'){
2073: &domcoordchanger($r);
2074: }elsif($env{'form.action'} eq 'verify_and_change_domcoord'){
2075: &verify_and_change_domcoord($r);
2076: }elsif($env{'form.action'} eq 'lockwarning'){
2077: &lockwarning($r);
2078: }elsif($env{'form.action'} eq 'verify_and_change_locks'){
2079: &verify_and_change_lockwarning($r);
2080: }elsif($env{'form.action'} eq 'changecourseinit'){
2081: &coursedisplaychanger($r);
2082: }elsif($env{'form.action'} eq 'verify_and_change_coursepage'){
2083: &verify_and_change_coursepage($r);
2084: }elsif($env{'form.action'} eq 'debugtoggle'){
1.154 www 2085: &toggle_debug();
2086: &print_main_menu($r);
1.126 droeschl 2087: }
2088:
1.165 bisitz 2089: # Properly end the HTML page of all preference pages
2090: # started in each sub routine
2091: # Exception: print_main_menu has its own end_page call
2092: unless (!exists $env{'form.action'} ||
2093: $env{'form.action'} eq 'debugtoggle') {
2094: $r->print(&Apache::loncommon::end_page());
2095: }
2096:
1.126 droeschl 2097: return OK;
1.35 matthew 2098: }
2099:
2100: sub toggle_debug {
1.59 albertel 2101: if ($env{'user.debug'}) {
1.139 raeburn 2102: &Apache::lonnet::delenv('user.debug');
1.35 matthew 2103: } else {
1.116 raeburn 2104: &Apache::lonnet::appenv({'user.debug' => 1});
1.35 matthew 2105: }
1.13 www 2106: }
1.1 www 2107:
2108: 1;
2109: __END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>