Diff for /loncom/interface/lonmsg.pm between versions 1.239.2.1 and 1.250

version 1.239.2.1, 2016/08/04 22:53:55 version 1.250, 2024/02/08 01:46:23
Line 120  Critical message to a user Line 120  Critical message to a user
   
 New routine that respects "forward" and calls old routine  New routine that respects "forward" and calls old routine
   
 =item * B<user_crit_msg($user, $domain, $subject, $message, $sendback, $nosentstore, $recipid, $attachmenturl, $permresults)>:   =item * B<user_crit_msg($user, $domain, $subject, $message, $sendback, $toperm, $sentmessage, $nosentstore, $recipid, $attachmenturl, $permresults, $senthide)>: 
     Sends a critical message $message to the $user at $domain.  If $sendback      Sends a critical message $message to the $user at $domain.  If $sendback
     is true,  a receipt will be sent to the current user when $user receives       is true,  a receipt will be sent to the current user when $user receives 
     the message.      the message.
Line 148  New routine that respects "forward" and Line 148  New routine that respects "forward" and
   
 =item * B<user_normal_msg($user, $domain, $subject, $message, $citation,  =item * B<user_normal_msg($user, $domain, $subject, $message, $citation,
        $baseurl, $attachmenturl, $toperm, $sentmessage, $symb, $restitle,         $baseurl, $attachmenturl, $toperm, $sentmessage, $symb, $restitle,
        $error,$nosentstore,$recipid,$permresults)>:         $error,$nosentstore,$recipid,$permresults,$senthide)>:
  Sends a message to the  $user at $domain, with subject $subject and message $message.   Sends a message to the  $user at $domain, with subject $subject and message $message.
   
     Additionally it will check if the user has a Forwarding address      Additionally it will check if the user has a Forwarding address
Line 200  Returns Line 200  Returns
   
 use strict;  use strict;
 use Apache::lonnet;  use Apache::lonnet;
   use Apache::loncommon;
 use HTML::TokeParser();  use HTML::TokeParser();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Mail::Send;  
 use HTML::Entities;  use HTML::Entities;
 use Encode;  use Encode;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
Line 218  use LONCAPA qw(:DEFAULT :match); Line 218  use LONCAPA qw(:DEFAULT :match);
   
   
 sub packagemsg {  sub packagemsg {
     my ($subject,$message,$citation,$baseurl,$attachmenturl,      my ($subject,$message,$citation,$baseurl,$attachmenturl,$recuser,$recdomain,
  $recuser,$recdomain,$msgid,$type,$crsmsgid,$symb,$error,$recipid)=@_;   $msgid,$type,$crsmsgid,$symb,$error,$recipid,$senthide,$origmsgid)=@_;
     $message =&HTML::Entities::encode($message,'<>&"');      $message =&HTML::Entities::encode($message,'<>&"');
     $citation=&HTML::Entities::encode($citation,'<>&"');      $citation=&HTML::Entities::encode($citation,'<>&"');
     $subject =&HTML::Entities::encode($subject,'<>&"');      $subject =&HTML::Entities::encode($subject,'<>&"');
Line 229  sub packagemsg { Line 229  sub packagemsg {
     #remove machine specification      #remove machine specification
     $attachmenturl =~ s|^https?://[^/]+/|/|;      $attachmenturl =~ s|^https?://[^/]+/|/|;
     $attachmenturl =&HTML::Entities::encode($attachmenturl,'<>&"');      $attachmenturl =&HTML::Entities::encode($attachmenturl,'<>&"');
       if ($senthide) {
           foreach my $item ($subject,$message) {
               if ($item ne '') {
                   $item = 'Not shown due to IP block';
               }
           }
           if ($attachmenturl ne '') {
               $attachmenturl = '';
           }
           if ($citation ne '') {
               $citation = '';
           }
           if ($msgid ne '') {
               $msgid = '';
           }
       }
     my $course_context = &get_course_context();      my $course_context = &get_course_context();
     my $now=time;      my $now=time;
       my $ip = &Apache::lonnet::get_requestor_ip();
     my $msgcount = &get_uniq();      my $msgcount = &get_uniq();
     unless(defined($msgid)) {      unless(defined($msgid)) {
         $msgid = &buildmsgid($now,$subject,$env{'user.name'},$env{'user.domain'},          $msgid = &buildmsgid($now,$subject,$env{'user.name'},$env{'user.domain'},
Line 250  sub packagemsg { Line 267  sub packagemsg {
     }      }
     $result .= '<servername>'.$ENV{'SERVER_NAME'}.'</servername>'.      $result .= '<servername>'.$ENV{'SERVER_NAME'}.'</servername>'.
            '<host>'.$ENV{'HTTP_HOST'}.'</host>'.             '<host>'.$ENV{'HTTP_HOST'}.'</host>'.
    '<client>'.$ENV{'REMOTE_ADDR'}.'</client>'.     '<client>'.$ip.'</client>'.
    '<browsertype>'.$env{'browser.type'}.'</browsertype>'.     '<browsertype>'.$env{'browser.type'}.'</browsertype>'.
    '<browseros>'.$env{'browser.os'}.'</browseros>'.     '<browseros>'.$env{'browser.os'}.'</browseros>'.
    '<browserversion>'.$env{'browser.version'}.'</browserversion>'.     '<browserversion>'.$env{'browser.version'}.'</browserversion>'.
Line 318  sub packagemsg { Line 335  sub packagemsg {
             }              }
         }          }
     }      }
       if ($senthide) {
           $result .= '<senthide>$origmsgid</senthide>';
       }
     return ($msgid,$result);      return ($msgid,$result);
 }  }
   
Line 408  sub unpackmsgid { Line 428  sub unpackmsgid {
     $shortsubj = &unescape($shortsubj);      $shortsubj = &unescape($shortsubj);
     $shortsubj = &HTML::Entities::decode($shortsubj);      $shortsubj = &HTML::Entities::decode($shortsubj);
     $symb = &unescape($symb);      $symb = &unescape($symb);
     if (!defined($processid)) { $fromcid = ''; }  
     my %status=();      my %status=();
     unless ($skipstatus) {      unless ($skipstatus) {
  if (ref($status_cache)) {   if (ref($status_cache)) {
Line 425  sub unpackmsgid { Line 444  sub unpackmsgid {
   
   
 sub sendemail {  sub sendemail {
     my ($to,$subject,$body,$to_uname,$to_udom,$user_lh)=@_;      my ($to,$subject,$body,$to_uname,$to_udom,$user_lh,$attachmenturl)=@_;
     my $senderaddress='';      my $senderaddress='';
     my $replytoaddress='';      my $replytoaddress='';
     my $msgsent;      my $msgsent;
Line 435  sub sendemail { Line 454  sub sendemail {
         $replytoaddress = 'do-not-reply@'.$hostname;          $replytoaddress = 'do-not-reply@'.$hostname;
     } else {      } else {
         my %senderemails;          my %senderemails;
         my $have_sender;          my ($have_sender.$setreplyto);
         if ($env{'form.reply_to_addr'}) {          if ($env{'form.reply_to_addr'}) {
             my ($replytoname,$replytodom) = split(/:/,$env{'form.reply_to_addr'});              my ($replytoname,$replytodom) = split(/:/,$env{'form.reply_to_addr'});
             if (!($replytoname eq $env{'user.name'} && $replytodom eq $env{'user.domain'})) {              if (($replytoname eq $env{'user.name'} && $replytodom eq $env{'user.domain'})) {
                   $setreplyto = 1;
               } else {
                 if (&Apache::lonnet::homeserver($replytoname,$replytodom) ne 'no_host') {                  if (&Apache::lonnet::homeserver($replytoname,$replytodom) ne 'no_host') {
                     %senderemails =                       %senderemails = 
                         &Apache::loncommon::getemails($replytoname,$replytodom);                          &Apache::loncommon::getemails($replytoname,$replytodom);
                     $have_sender = 1;                      $have_sender = 1;
                       $setreplyto = 1;
                 }                  }
             }              }
         }          }
Line 452  sub sendemail { Line 474  sub sendemail {
         foreach my $type ('permanentemail','critnotification','notification') {          foreach my $type ('permanentemail','critnotification','notification') {
             if ($senderemails{$type}) {              if ($senderemails{$type}) {
                 ($senderaddress) = split(/,/,$senderemails{$type});                  ($senderaddress) = split(/,/,$senderemails{$type});
                 last if ($senderaddress);                  if ($senderaddress) {
                       if ($setreplyto) {
                           $replytoaddress = $senderaddress;
                       }
                       last;
                   }
             }              }
         }          }
     }      }
Line 461  sub sendemail { Line 488  sub sendemail {
     "*** ".($senderaddress?&mt_user($user_lh,'You can reply to this e-mail'):&mt_user($user_lh,'Please do not reply to this address.')."\n*** ".      "*** ".($senderaddress?&mt_user($user_lh,'You can reply to this e-mail'):&mt_user($user_lh,'Please do not reply to this address.')."\n*** ".
     &mt_user($user_lh,'A reply will not be received by the recipient!'))."\n\n".$body;      &mt_user($user_lh,'A reply will not be received by the recipient!'))."\n\n".$body;
           
     my $msg = new Mail::Send;      $attachmenturl = &Apache::lonnet::filelocation("",$attachmenturl);
     $msg->to($to);      my $filesize = (stat($attachmenturl))[7];
     $msg->subject('[LON-CAPA] '.$subject);      if ($filesize > 1048576) {
     if ($replytoaddress) {          # Don't send if it exceeds 1 MB.
         $msg->add('Reply-to',$replytoaddress);          print '<p><span class="LC_error">' 
     }              .&mt('Email not sent.  Attachment exceeds permitted length.')
     if ($senderaddress) {              .'</span><br /></p>';
         $msg->add('From',$senderaddress);      } else {
     }          # Otherwise build and send the email
     $msg->add('Content-type','text/plain; charset=UTF-8');          $subject = '[LON-CAPA] '.$subject;
     if (my $fh = $msg->open()) {          &Apache::loncommon::mime_email($senderaddress,$replytoaddress,$to,
  print $fh $body;                                         $subject,$body,'','',$attachmenturl,'','');
  $fh->close;  
         $msgsent = 1;          $msgsent = 1;
     }      }
     return $msgsent;      return $msgsent;
Line 482  sub sendemail { Line 508  sub sendemail {
 # ==================================================== Send notification emails  # ==================================================== Send notification emails
   
 sub sendnotification {  sub sendnotification {
     my ($to,$touname,$toudom,$subj,$crit,$text,$msgid)=@_;      my ($to,$touname,$toudom,$subj,$crit,$text,$msgid,$attachmenturl)=@_;
     my $sender=$env{'environment.firstname'}.' '.$env{'environment.lastname'};      my $sender=$env{'environment.firstname'}.' '.$env{'environment.lastname'};
     unless ($sender=~/\w/) {       unless ($sender=~/\w/) { 
  $sender=$env{'user.name'}.':'.$env{'user.domain'};   $sender=$env{'user.name'}.':'.$env{'user.domain'};
Line 492  sub sendnotification { Line 518  sub sendnotification {
   
     $text=~s/\&lt\;/\</gs;      $text=~s/\&lt\;/\</gs;
     $text=~s/\&gt\;/\>/gs;      $text=~s/\&gt\;/\>/gs;
     my $homeserver = &Apache::lonnet::homeserver($touname,$toudom);      my $touhome = &Apache::lonnet::homeserver($touname,$toudom);
     my $protocol = $Apache::lonnet::protocol{$homeserver};      my $url = &Apache::lonnet::url_prefix('',$toudom,$touhome,'email').
     $protocol = 'http' if ($protocol ne 'https');  
     my $url = $protocol.'://'.&Apache::lonnet::hostname($homeserver).  
               '/adm/email?username='.$touname.'&domain='.$toudom.                '/adm/email?username='.$touname.'&domain='.$toudom.
               '&display='.&escape($msgid);                '&display='.&escape($msgid);
     my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid,      my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid,
Line 539  to access the full message.',$url); Line 563  to access the full message.',$url);
         $subject = $subj;          $subject = $subj;
     }      }
     
     my ($blocked,$blocktext);      my ($blocked,$blocktext,$clientip);
       $clientip = &Apache::lonnet::get_requestor_ip();
     if (!$crit) {      if (!$crit) {
         my %setters;          my %setters;
         my ($startblock,$endblock) =           my ($startblock,$endblock,$triggerblock,$by_ip,$blockdom) = 
             &Apache::loncommon::blockcheck(\%setters,'com',$touname,$toudom);              &Apache::loncommon::blockcheck(\%setters,'com',$clientip,$touname,$toudom);
         if ($startblock && $endblock) {          if ($startblock && $endblock) {
             $blocked = 1;              $blocked = 1;
             my $showstart = &Apache::lonlocal::locallocaltime($startblock);              my $showstart = &Apache::lonlocal::locallocaltime($startblock);
             my $showend = &Apache::lonlocal::locallocaltime($endblock);              my $showend = &Apache::lonlocal::locallocaltime($endblock);
             $blocktext = &mt_user($user_lh,'LON-CAPA messages sent to you between [_1] and [_2] will be inaccessible until the end of this time period, because you are a student in a course with an active communications block.',$showstart,$showend);              $blocktext = &mt_user($user_lh,'LON-CAPA messages sent to you between [_1] and [_2] will be inaccessible until the end of this time period, because you are a student in a course with an active communications block.',$showstart,$showend);
           } elsif ($by_ip) {
               $blocked = 1;
               $blocktext = &mt_user($user_lh,'LON-CAPA messages sent to you will be inaccessible from your IP address [_1], because communication is being blocked for certain IP address(es).',$clientip);
         }          }
     }      }
     if ($userenv{'notifywithhtml'} ne '') {      if ($userenv{'notifywithhtml'} ne '') {
Line 566  to access the full message.',$url); Line 594  to access the full message.',$url);
                 }                  }
                 $body = $bodybegin.$bodysubj.$sendtext.$bodyend;                  $body = $bodybegin.$bodysubj.$sendtext.$bodyend;
             }              }
             if (&sendemail($addr,$subject,$body,$touname,$toudom,$user_lh)) {              if (&sendemail($addr,$subject,$body,$touname,$toudom,$user_lh,$attachmenturl)) {
                 $numsent ++;                  $numsent ++;
             }              }
         }          }
Line 577  to access the full message.',$url); Line 605  to access the full message.',$url);
             my $htmlfree = &make_htmlfree($text);              my $htmlfree = &make_htmlfree($text);
             $body = $bodybegin.$bodysubj.$htmlfree.$bodyend;              $body = $bodybegin.$bodysubj.$htmlfree.$bodyend;
         }          }
         if (&sendemail($to,$subject,$body,$touname,$toudom,$user_lh)) {          if (&sendemail($to,$subject,$body,$touname,$toudom,$user_lh,$attachmenturl)) {
             $numsent ++;              $numsent ++;
         }          }
     }      }
Line 709  sub store_instructor_comment { Line 737  sub store_instructor_comment {
   
 sub user_crit_msg_raw {  sub user_crit_msg_raw {
     my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage,      my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage,
         $nosentstore,$recipid,$attachmenturl,$permresults)=@_;          $nosentstore,$recipid,$attachmenturl,$permresults,$senthide)=@_;
 # Check if allowed missing  # Check if allowed missing
     my ($status,$packed_message);      my ($status,$packed_message);
     my $msgid='undefined';      my $msgid='undefined';
Line 727  sub user_crit_msg_raw { Line 755  sub user_crit_msg_raw {
             $$sentmessage = $packed_message;              $$sentmessage = $packed_message;
         }          }
         if (!$nosentstore) {          if (!$nosentstore) {
             (undef,my $packed_message_no_citation) =              my ($sentmsgid,$packed_message_no_citation) =
             &packagemsg($subject,$message,undef,undef,$attachmenturl,$user,              &packagemsg($subject,$message,undef,undef,$attachmenturl,$user,
                         $domain,$msgid);                          $domain,$msgid,undef,undef,undef,undef,undef,$senthide,$msgid);
             if ($status eq 'ok' || $status eq 'con_delayed') {              if ($status eq 'ok' || $status eq 'con_delayed') {
                 &store_sent_mail($msgid,$packed_message_no_citation);                  if ($senthide && $sentmsgid) {
                       &store_sent_mail($sentmsgid,$packed_message_no_citation);
                   } else {
                       &store_sent_mail($msgid,$packed_message_no_citation);
                   }
             }              }
         }          }
     } else {      } else {
Line 746  sub user_crit_msg_raw { Line 778  sub user_crit_msg_raw {
     my $numperm = 0;      my $numperm = 0;
     my $permlogmsgstatus;      my $permlogmsgstatus;
     if ($critnotify) {      if ($critnotify) {
         $numcrit = &sendnotification($critnotify,$user,$domain,$subject,1,$text,$msgid);          $numcrit = &sendnotification($critnotify,$user,$domain,$subject,1,$text,$msgid,$attachmenturl);
     }      }
     if ($toperm && $permemail) {      if ($toperm && $permemail) {
         if ($critnotify && $numcrit) {          if ($critnotify && $numcrit) {
Line 755  sub user_crit_msg_raw { Line 787  sub user_crit_msg_raw {
             }              }
         }          }
         unless ($numperm) {          unless ($numperm) {
             $numperm = &sendnotification($permemail,$user,$domain,$subject,1,$text,$msgid);              $numperm = &sendnotification($permemail,$user,$domain,$subject,1,$text,$msgid,$attachmenturl);
         }          }
     }      }
     if ($toperm) {      if ($toperm) {
Line 781  sub user_crit_msg_raw { Line 813  sub user_crit_msg_raw {
   
 sub user_crit_msg {  sub user_crit_msg {
     my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage,      my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage,
         $nosentstore,$recipid,$attachmenturl,$permresults)=@_;          $nosentstore,$recipid,$attachmenturl,$permresults,$senthide)=@_;
     my @status;      my @status;
     my %userenv = &Apache::lonnet::get('environment',['msgforward'],      my %userenv = &Apache::lonnet::get('environment',['msgforward'],
                                        $domain,$user);                                         $domain,$user);
Line 792  sub user_crit_msg { Line 824  sub user_crit_msg {
          push(@status,           push(@status,
       &user_crit_msg_raw($forwuser,$forwdomain,$subject,$message,        &user_crit_msg_raw($forwuser,$forwdomain,$subject,$message,
  $sendback,$toperm,$sentmessage,$nosentstore,   $sendback,$toperm,$sentmessage,$nosentstore,
                                  $recipid,$attachmenturl,$permresults));                                   $recipid,$attachmenturl,$permresults,$senthide));
        }         }
     } else {       } else { 
  push(@status,   push(@status,
      &user_crit_msg_raw($user,$domain,$subject,$message,$sendback,       &user_crit_msg_raw($user,$domain,$subject,$message,$sendback,
  $toperm,$sentmessage,$nosentstore,$recipid,   $toperm,$sentmessage,$nosentstore,$recipid,
                                 $attachmenturl,$permresults));                                  $attachmenturl,$permresults,$senthide));
     }      }
     if (wantarray) {      if (wantarray) {
  return @status;   return @status;
Line 847  sub user_crit_received { Line 879  sub user_crit_received {
 sub user_normal_msg_raw {  sub user_normal_msg_raw {
     my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl,      my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl,
         $toperm,$currid,$newid,$sentmessage,$crsmsgid,$symb,$restitle,          $toperm,$currid,$newid,$sentmessage,$crsmsgid,$symb,$restitle,
         $error,$nosentstore,$recipid,$permresults)=@_;          $error,$nosentstore,$recipid,$permresults,$senthide)=@_;
 # Check if allowed missing  # Check if allowed missing
     my ($status,$packed_message);      my ($status,$packed_message);
     my $msgid='undefined';      my $msgid='undefined';
Line 869  sub user_normal_msg_raw { Line 901  sub user_normal_msg_raw {
                          ('email_status',{'recnewemail'=>time},$domain,$user);                           ('email_status',{'recnewemail'=>time},$domain,$user);
 # Into sent-mail folder if sent mail storage required  # Into sent-mail folder if sent mail storage required
        if (!$nosentstore) {         if (!$nosentstore) {
            (undef,my $packed_message_no_citation) =             my ($sentmsgid,$packed_message_no_citation) =
                &packagemsg($subject,$message,undef,$baseurl,$attachmenturl,                 &packagemsg($subject,$message,undef,$baseurl,$attachmenturl,
                            $user,$domain,$currid,undef,$crsmsgid,$symb,$error);                             $user,$domain,$currid,undef,$crsmsgid,$symb,$error,
                              undef,$senthide,$msgid);
            if ($status eq 'ok' || $status eq 'con_delayed') {             if ($status eq 'ok' || $status eq 'con_delayed') {
                &store_sent_mail($msgid,$packed_message_no_citation);                 if ($senthide && $sentmsgid) {
                      &store_sent_mail($sentmsgid,$packed_message_no_citation);
                  } else {
                      &store_sent_mail($msgid,$packed_message_no_citation);
                  }
            }             }
        }         }
        if (ref($newid) eq 'SCALAR') {         if (ref($newid) eq 'SCALAR') {
Line 890  sub user_normal_msg_raw { Line 927  sub user_normal_msg_raw {
        my $numperm = 0;         my $numperm = 0;
        my $permlogmsgstatus;         my $permlogmsgstatus;
        if ($notify) {         if ($notify) {
            $numnotify = &sendnotification($notify,$user,$domain,$subject,0,$text,$msgid);             $numnotify = &sendnotification($notify,$user,$domain,$subject,0,$text,$msgid,$attachmenturl);
        }         }
        if ($toperm && $permemail) {         if ($toperm && $permemail) {
            if ($notify && $numnotify) {             if ($notify && $numnotify) {
Line 900  sub user_normal_msg_raw { Line 937  sub user_normal_msg_raw {
            }             }
            unless ($numperm) {             unless ($numperm) {
                $numperm = &sendnotification($permemail,$user,$domain,$subject,0,                 $numperm = &sendnotification($permemail,$user,$domain,$subject,0,
                                             $text,$msgid);                                              $text,$msgid,$attachmenturl);
            }             }
        }         }
        if ($toperm) {         if ($toperm) {
Line 924  sub user_normal_msg_raw { Line 961  sub user_normal_msg_raw {
 sub user_normal_msg {  sub user_normal_msg {
     my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl,      my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl,
  $toperm,$sentmessage,$symb,$restitle,$error,$nosentstore,$recipid,   $toperm,$sentmessage,$symb,$restitle,$error,$nosentstore,$recipid,
         $permresults)=@_;          $permresults,$senthide)=@_;
     my @status;      my @status;
     my %userenv = &Apache::lonnet::get('environment',['msgforward'],      my %userenv = &Apache::lonnet::get('environment',['msgforward'],
                                        $domain,$user);                                         $domain,$user);
Line 936  sub user_normal_msg { Line 973  sub user_normal_msg {
         &user_normal_msg_raw($forwuser,$forwdomain,$subject,$message,          &user_normal_msg_raw($forwuser,$forwdomain,$subject,$message,
      $citation,$baseurl,$attachmenturl,$toperm,       $citation,$baseurl,$attachmenturl,$toperm,
      undef,undef,$sentmessage,undef,$symb,       undef,undef,$sentmessage,undef,$symb,
                                      $restitle,$error,$nosentstore,$recipid,$permresults));                                       $restitle,$error,$nosentstore,$recipid,
                                        $permresults,$senthide));
         }          }
     } else {      } else {
  push(@status,&user_normal_msg_raw($user,$domain,$subject,$message,   push(@status,&user_normal_msg_raw($user,$domain,$subject,$message,
      $citation,$baseurl,$attachmenturl,$toperm,       $citation,$baseurl,$attachmenturl,$toperm,
      undef,undef,$sentmessage,undef,$symb,       undef,undef,$sentmessage,undef,$symb,
                                      $restitle,$error,$nosentstore,$recipid,$permresults));                                       $restitle,$error,$nosentstore,$recipid,
                                        $permresults,$senthide));
     }      }
     if (wantarray) {      if (wantarray) {
         return @status;          return @status;

Removed from v.1.239.2.1  
changed lines
  Added in v.1.250


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>