--- loncom/interface/lonpreferences.pm	2008/01/20 22:38:06	1.112
+++ loncom/interface/lonpreferences.pm	2008/05/12 23:47:43	1.118
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Preferences
 #
-# $Id: lonpreferences.pm,v 1.112 2008/01/20 22:38:06 raeburn Exp $
+# $Id: lonpreferences.pm,v 1.118 2008/05/12 23:47:43 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -123,7 +123,7 @@ sub verify_and_change_wysiwyg {
     my $r = shift;
     my $newsetting=$env{'form.wysiwyg'};
     &Apache::lonnet::put('environment',{'wysiwygeditor' => $newsetting});
-    &Apache::lonnet::appenv('environment.wysiwygeditor' => $newsetting);
+    &Apache::lonnet::appenv({'environment.wysiwygeditor' => $newsetting});
     $r->print('<p>'.&mt('Setting WYSIWYG editor to:').' '.&mt($newsetting).'</p>');
 }
 
@@ -167,7 +167,7 @@ sub verify_and_change_languages {
     my $message='';
     if ($newlanguage) {
         &Apache::lonnet::put('environment',{'languages' => $newlanguage});
-        &Apache::lonnet::appenv('environment.languages' => $newlanguage);
+        &Apache::lonnet::appenv({'environment.languages' => $newlanguage});
         $message=&mt('Set new preferred languages to ').'<tt>"'.$newlanguage.'"</tt>.';
     } else {
         &Apache::lonnet::del('environment',['languages']);
@@ -252,16 +252,16 @@ sub verify_and_change_texengine {
     my $newtexengine  = $env{'form.texengine'};
     $newtexengine=~s/[^\-\w]//g;
     if ($newtexengine eq 'ttm') {
-	&Apache::lonnet::appenv('browser.mathml' => 1);
+	&Apache::lonnet::appenv({'browser.mathml' => 1});
     } else {
 	if ($env{'environment.texengine'} eq 'ttm') {
-	    &Apache::lonnet::appenv('browser.mathml' => 0);
+	    &Apache::lonnet::appenv({'browser.mathml' => 0});
 	}
     }
     my $message='';
     if ($newtexengine) {
         &Apache::lonnet::put('environment',{'texengine' => $newtexengine});
-        &Apache::lonnet::appenv('environment.texengine' => $newtexengine);
+        &Apache::lonnet::appenv({'environment.texengine' => $newtexengine});
         $message=&mt('Set new preferred math display to ').'<tt>"'.$newtexengine.'"</tt>.';
     } else {
         &Apache::lonnet::del('environment',['texengine']);
@@ -400,7 +400,7 @@ sub verify_and_change_rolespref {
     my $message='<hr />';
     if ($hotlist_flag) {
         &Apache::lonnet::put('environment',{'recentroles' => $hotlist_flag});
-        &Apache::lonnet::appenv('environment.recentroles' => $hotlist_flag);
+        &Apache::lonnet::appenv({'environment.recentroles' => $hotlist_flag});
         $message=&mt('Recent '.$role.'s Hotlist is Enabled');
     } else {
         &Apache::lonnet::del('environment',['recentroles']);
@@ -409,7 +409,7 @@ sub verify_and_change_rolespref {
     }
     if ($hotlist_n) {
         &Apache::lonnet::put('environment',{'recentrolesn' => $hotlist_n});
-        &Apache::lonnet::appenv('environment.recentrolesn' => $hotlist_n);
+        &Apache::lonnet::appenv({'environment.recentrolesn' => $hotlist_n});
         if ($hotlist_flag) {
             $message.="<br />".
 		&mt('Display [_1] Most Recent '.$role.'s',$hotlist_n)."\n";
@@ -495,7 +495,7 @@ sub verify_and_change_screenname {
     my $message='';
     if ($newscreen) {
         &Apache::lonnet::put('environment',{'screenname' => $newscreen});
-        &Apache::lonnet::appenv('environment.screenname' => $newscreen);
+        &Apache::lonnet::appenv({'environment.screenname' => $newscreen});
         $message=&mt('Set new screenname to ').'<tt>"'.$newscreen.'."</tt>.';
     } else {
         &Apache::lonnet::del('environment',['screenname']);
@@ -508,7 +508,7 @@ sub verify_and_change_screenname {
     $newscreen=~s/[^ \w]//g;
     if ($newscreen) {
         &Apache::lonnet::put('environment',{'nickname' => $newscreen});
-        &Apache::lonnet::appenv('environment.nickname' => $newscreen);
+        &Apache::lonnet::appenv({'environment.nickname' => $newscreen});
         $message.=&mt('Set new nickname to ').'<tt>"'.$newscreen.'"</tt>.';
     } else {
         &Apache::lonnet::del('environment',['nickname']);
@@ -563,7 +563,7 @@ sub verify_and_change_icons {
     my $newicons  = $env{'form.menumode'};
 
     &Apache::lonnet::put('environment',{'icons' => $newicons});
-    &Apache::lonnet::appenv('environment.icons' => $newicons);
+    &Apache::lonnet::appenv({'environment.icons' => $newicons});
     $r->print(&mt('Set menu mode to [_1].',$newicons));
 }
 
@@ -581,7 +581,7 @@ sub clickerchanger {
     $clickers=~s/\,/\n/gs;
     my $text=&mt('Enter response device ("clicker") numbers');
     my $change=&mt('Register');
-    my $helplink=&Apache::loncommon::help_open_topic('Clicker_Registration', 'Locating your clicker ID');
+    my $helplink=&Apache::loncommon::help_open_topic('Clicker_Registration',&mt('Locating your clicker ID'));
     $r->print(<<ENDSCREEN);
 <form name="prefs" action="/adm/preferences" method="post">
 <input type="hidden" name="action" value="verify_and_change_clicker" />
@@ -605,10 +605,46 @@ sub verify_and_change_clicker {
     $newclickers=~s/^\,//;
     $newclickers=~s/\,$//;
     &Apache::lonnet::put('environment',{'clickers' => $newclickers});
-    &Apache::lonnet::appenv('environment.clickers' => $newclickers);
+    &Apache::lonnet::appenv({'environment.clickers' => $newclickers});
     $r->print(&mt('Registering clickers: [_1]',$newclickers));
 }
 
+#################################################################
+##                      Lock Subroutines                        #
+#################################################################
+
+sub lockwarning {
+    my $r = shift;
+    my $title=&mt('Action locked');
+    my $texttop=&mt('LON-CAPA is currently performing the following actions:');
+    my $textbottom=&mt('Changing roles or logging out may result in data corruption.');
+    my ($num,%which)=&Apache::lonnet::get_locks();
+    my $which='';
+    foreach my $id (keys %which) {
+       $which.='<li>'.$which{$id}.'</li>';
+    }
+    my $change=&mt('Override');
+    $r->print(<<ENDSCREEN);
+<form name="prefs" action="/adm/preferences" method="post">
+<input type="hidden" name="action" value="verify_and_change_locks" />
+<h1>$title</h1>
+$texttop
+<ul>
+$which
+</ul>
+$textbottom
+<input type="submit" value="$change" />
+</form>
+ENDSCREEN
+}
+
+sub verify_and_change_lockwarning {
+    my $r = shift;
+    &Apache::lonnet::remove_all_locks();
+    $r->print(&mt('Cleared locks.'));
+}
+
+
 ################################################################
 #         Message Forward                                      #
 ################################################################
@@ -624,6 +660,7 @@ sub msgforwardchanger {
                                           crit  => 'Critical only',
                                           reg   => 'Non-critical only',
                                           foad  => 'Forwarding Address(es)',
+                                          noti  => 'Notification E-mail Address(es)', 
                                           foad_exmpl => 'e.g. <tt>userA:domain1,userB:domain2,...</tt>',
                                           mnot  => 'Email Address(es) which should be notified about new LON-CAPA messages', # old: 'Message Notification Email Address(es)',
                                           mnot_exmpl => 'e.g. <tt>joe@doe.com</tt>',
@@ -633,10 +670,9 @@ sub msgforwardchanger {
                                           toen => "To enter multiple addresses, enter one address at a time, click 'Change' and then add the next one", 
                                           prme => 'Back to preferences menu',
                                         );
-    my $forwardingHelp = Apache::loncommon::help_open_topic("Prefs_Forwarding",
-							    &mt("What are forwarding and notification addresses?"));
-    my $criticalMessageHelp = Apache::loncommon::help_open_topic("Course_Critical_Message",
-								 &mt("What are critical messages?"));
+    my $forwardingHelp = &Apache::loncommon::help_open_topic("Prefs_Forwarding");
+    my $notificationHelp = &Apache::loncommon::help_open_topic("Prefs_Notification");
+    my $criticalMessageHelp = &Apache::loncommon::help_open_topic("Course_Critical_Message");
     my @allow_html = split(/,/,$userenv{'notifywithhtml'});
     my %allnot = &get_notifications(\%userenv);
     my $validatescript = &Apache::lonhtmlcommon::javascript_valid_email();
@@ -699,12 +735,12 @@ $validatescript
     $r->print(<<ENDMSG);
 $jscript
 $message
-$forwardingHelp
+<h3>$lt{'foad'} $forwardingHelp</h3>
 <form name="prefs" action="/adm/preferences" method="post">
 <input type="hidden" name="action" value="verify_and_change_msgforward" />
 $lt{'foad'} ($lt{'foad_exmpl'}):
-<input type="text" size="40" value="$msgforward" name="msgforward" /><hr />
-$criticalMessageHelp
+<input type="text" size="40" value="$msgforward" name="msgforward" /><br />
+<h3>$lt{'noti'} $notificationHelp</h3>
 $lt{'mnot'} ($lt{'mnot_exmpl'}):<br />
 ENDMSG
     my @sortforwards = sort (keys(%allnot));
@@ -713,7 +749,8 @@ ENDMSG
                  '<th>&nbsp;</th>'.
                  '<th>'.&mt('Action').'</th>'.
                  '<th>'.&mt('Notification address').'</th><th>'.
-                 &mt('Types of message for which notification is sent').'</th><th>'.
+                 &mt('Types of message for which notification is sent').
+                 $criticalMessageHelp.'</th><th>'.
                  &mt('Excerpt retains HTML tags in message').'</th>'.
                  &Apache::loncommon::end_data_table_header_row();
     my $num = 0;
@@ -796,7 +833,7 @@ ENDMSG
     $num ++;
     $r->print($output);
     $r->print(qq|
-<hr />
+<br /><hr />
 <input type="hidden" name="numnotify" value="$num" />
 <input type="button" value="$lt{'chg'}" onclick="javascript:validate()" />
 <input type="button" value="$lt{'prme'}" onclick="location.href='/adm/preferences'" />
@@ -840,7 +877,7 @@ sub verify_and_change_msgforward {
     $newscreen=~s/\,$//;
     if ($newscreen) {
         &Apache::lonnet::put('environment',{'msgforward' => $newscreen});
-        &Apache::lonnet::appenv('environment.msgforward' => $newscreen);
+        &Apache::lonnet::appenv({'environment.msgforward' => $newscreen});
         $message .= &mt('Set message forwarding to ').'<tt>"'.$newscreen.'"</tt>.'
                     .'<br />';
     } else {
@@ -881,7 +918,7 @@ sub verify_and_change_msgforward {
     $notify_with_html =~ s/\s//gs;
     if ($notification) {
         &Apache::lonnet::put('environment',{'notification' => $notification});
-        &Apache::lonnet::appenv('environment.notification' => $notification);
+        &Apache::lonnet::appenv({'environment.notification' => $notification});
         $message.=&mt('Set non-critical message notification address(es) to ').'<tt>"'.$notification.'"</tt>.<br />';
     } else {
         &Apache::lonnet::del('environment',['notification']);
@@ -890,7 +927,7 @@ sub verify_and_change_msgforward {
     }
     if ($critnotification) {
         &Apache::lonnet::put('environment',{'critnotification' => $critnotification});
-        &Apache::lonnet::appenv('environment.critnotification' => $critnotification);
+        &Apache::lonnet::appenv({'environment.critnotification' => $critnotification});
         $message.=&mt('Set critical message notification address(es) to ').'<tt>"'.$critnotification.'"</tt>.<br />';
     } else {
         &Apache::lonnet::del('environment',['critnotification']);
@@ -900,7 +937,7 @@ sub verify_and_change_msgforward {
     if ($critnotification || $notification) {
         if ($notify_with_html) {
             &Apache::lonnet::put('environment',{'notifywithhtml' => $notify_with_html});
-            &Apache::lonnet::appenv('environment.notifywithhtml' => $notify_with_html);
+            &Apache::lonnet::appenv({'environment.notifywithhtml' => $notify_with_html});
             $message.=&mt('Set address(es) to receive excerpts with html retained ').'<tt>"'.$notify_with_html.'"</tt>.';
         } else {
             &Apache::lonnet::del('environment',['notifywithhtml']);
@@ -1016,7 +1053,7 @@ sub verify_and_change_colors {
         my $entry='color.'.$function.'.'.$item;
 	if (($color=~/^\#[0-9A-Fa-f]{6}$/) && (!$env{'form.resetall'})) {
 	    &Apache::lonnet::put('environment',{$entry => $color});
-	    &Apache::lonnet::appenv('environment.'.$entry => $color);
+	    &Apache::lonnet::appenv({'environment.'.$entry => $color});
 	    $message.=&mt('Set '.$colortypes{$item}.' to ').'<tt>"'.$color.'"</tt>.<br />';
 	} else {
 	    &Apache::lonnet::del('environment',[$entry]);
@@ -1026,7 +1063,7 @@ sub verify_and_change_colors {
     }
     my $now = time;
     &Apache::lonnet::put('environment',{'color.timestamp' => $now});
-    &Apache::lonnet::appenv('environment.color.timestamp' => $now);
+    &Apache::lonnet::appenv({'environment.color.timestamp' => $now});
 
     $r->print(<<ENDVCCOL);
 $message
@@ -1164,7 +1201,7 @@ sub jscript_send {
 sub client_form {
     my ($caller,$hexkey,$currentpass,$defdom) = @_;
     my %lt=&Apache::lonlocal::texthash(
-                'email' => 'EMail Address',
+                'email' => 'E-mail Address',
                 'username' => 'Username',
                 'domain' => 'Domain',
                 'currentpass' => 'Current Password',
@@ -1185,7 +1222,7 @@ sub client_form {
      <input type="text" name="uname" size="15" />
      <input type="hidden" name="currentpass" value="$currentpass" />
     </td></tr>
-<tr><td class="LC_preferences_labeltext"><label for="udom">$lt{'udom'}</label>:</td>
+<tr><td class="LC_preferences_labeltext"><label for="udom">$lt{'domain'}</label>:</td>
     <td>
 |;
         $output .= &Apache::loncommon::select_dom_form($defdom,'udom').'
@@ -1324,6 +1361,13 @@ ENDERROR
     #
     if ($caller eq 'reset_by_email') {
         my %data = &Apache::lonnet::tmpget($mailtoken);
+        if (keys(%data) == 0) {
+            &passwordchanger($r,
+                         '<span class="LC_error">'.
+                         &mt('Could not verify current authentication.').'  '.
+                         &mt('Please try again.').'</span>',$caller,$mailtoken);
+            return 1;
+        }
         if ($currentpass ne $data{'temppasswd'}) {
             &passwordchanger($r,
                          '<span class="LC_error">'.
@@ -1498,7 +1542,7 @@ sub verify_and_change_discussion {
         if ($newdisp eq 'unread') {
             $message .=&mt('In discussions: only new posts will be displayed.').'<br />';
             &Apache::lonnet::put('environment',{'discdisplay' => $newdisp});
-            &Apache::lonnet::appenv('environment.discdisplay' => $newdisp);
+            &Apache::lonnet::appenv({'environment.discdisplay' => $newdisp});
         } else {
             $message .= &mt('In discussions: all posts will be displayed.').'<br />';
             &Apache::lonnet::del('environment',['discdisplay']);
@@ -1510,7 +1554,7 @@ sub verify_and_change_discussion {
         if ($newmark eq 'ondisp') {
            $message.=&mt('In discussions: new posts will be cease to be identified as "NEW" after display.').'<br />';
             &Apache::lonnet::put('environment',{'discmarkread' => $newmark});
-            &Apache::lonnet::appenv('environment.discmarkread' => $newmark);
+            &Apache::lonnet::appenv({'environment.discmarkread' => $newmark});
         } else {
             $message.=&mt('In discussions: posts will be identified as "NEW" until marked as read by the reader.').'<br />';
             &Apache::lonnet::del('environment',['discmarkread']);
@@ -1575,7 +1619,7 @@ sub verify_and_change_coursepage {
     if ($newdisp eq 'firstres') {
         $message .= $lt{'ywbt'}.'<br />';
         &Apache::lonnet::put('environment',{'course_init_display' => $newdisp});
-        &Apache::lonnet::appenv('environment.course_init_display' => $newdisp);
+        &Apache::lonnet::appenv({'environment.course_init_display' => $newdisp});
     } else {
         $message .= $lt{'apwb'}.'<br />';
         &Apache::lonnet::del('environment',['course_init_display']);
@@ -1667,16 +1711,17 @@ sub handler {
     push (@Options,({ action   => 'changemsgforward',
                       linktext => 'Change Message Forwarding and Notification Email Addresses',
                       href     => '/adm/preferences',
-                      help     => 'Prefs_Forwarding',
+                      help     => 'Prefs_Messages',
                       breadcrumb => 
                           { href => '/adm/preferences?action=changemsgforward',
-                            text => 'Change Message Forwarding'},
+                            text => 'Change Message Forwarding/Notification'},
                       subroutine => \&msgforwardchanger,
                       },
                     { action => 'verify_and_change_msgforward',
+                      help   => 'Prefs_Messages',
                       breadcrumb => 
                           { href => '/adm/preferences?action=changemsgforward',
-                            text => 'Change Message Forwarding'},
+                            text => 'Change Message Forwarding/Notification'},
                       printmenu => 'no',
                       subroutine => \&verify_and_change_msgforward }));
     my $aboutmeaction=
@@ -1816,7 +1861,7 @@ sub handler {
                       href     => '/adm/preferences',
                       subroutine => \&clickerchanger,
                       breadcrumb =>
-                          { href => '/adm/preferences?action=changeicons',
+                          { href => '/adm/preferences?action=changeclicker',
                             text => 'Register Clicker'},
                       },
                     { action   => 'verify_and_change_clicker',
@@ -1827,6 +1872,20 @@ sub handler {
                       printmenu => 'yes',
                       }));
 
+    push (@Options,({ action   => 'lockwarning',
+                      subroutine => \&lockwarning,
+                      breadcrumb =>
+                          { href => '/adm/preferences?action=lockwarning',
+                            text => 'Lock Warnings'},
+                      },
+                    { action   => 'verify_and_change_locks',
+                      subroutine => \&verify_and_change_lockwarning,
+                      breadcrumb =>
+                          { href => '/adm/preferences?action=lockwarning',
+                            text => 'Lockwarnings'},
+                      printmenu => 'yes',
+                      }));
+
 
     if (&Apache::lonnet::allowed('whn',$env{'request.course.id'})
 	|| &Apache::lonnet::allowed('whn',$env{'request.course.id'}.'/'
@@ -1930,7 +1989,7 @@ sub toggle_debug {
     if ($env{'user.debug'}) {
         &Apache::lonnet::delenv('user\.debug');
     } else {
-        &Apache::lonnet::appenv('user.debug' => 1);
+        &Apache::lonnet::appenv({'user.debug' => 1});
     }
 }