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