--- loncom/interface/lonmsg.pm 2008/11/28 14:36:50 1.216 +++ loncom/interface/lonmsg.pm 2024/02/08 03:09:10 1.239.2.5 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging # -# $Id: lonmsg.pm,v 1.216 2008/11/28 14:36:50 raeburn Exp $ +# $Id: lonmsg.pm,v 1.239.2.5 2024/02/08 03:09:10 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -120,7 +120,7 @@ Critical message to a user New routine that respects "forward" and calls old routine -=item * B: +=item * B: 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 the message. @@ -148,7 +148,7 @@ New routine that respects "forward" and =item * B: + $error,$nosentstore,$recipid,$permresults,$senthide)>: 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 @@ -194,8 +194,6 @@ Returns %to - a hash, which keys are addresses of users to send messages to the keys will look like name:domain -=item user_lang() - =back =cut @@ -205,6 +203,8 @@ use Apache::lonnet; use HTML::TokeParser(); use Apache::lonlocal; use Mail::Send; +use HTML::Entities; +use Encode; use LONCAPA qw(:DEFAULT :match); { @@ -218,19 +218,36 @@ use LONCAPA qw(:DEFAULT :match); sub packagemsg { - my ($subject,$message,$citation,$baseurl,$attachmenturl, - $recuser,$recdomain,$msgid,$type,$crsmsgid,$symb,$error,$recipid)=@_; + my ($subject,$message,$citation,$baseurl,$attachmenturl,$recuser,$recdomain, + $msgid,$type,$crsmsgid,$symb,$error,$recipid,$senthide,$origmsgid)=@_; $message =&HTML::Entities::encode($message,'<>&"'); $citation=&HTML::Entities::encode($citation,'<>&"'); $subject =&HTML::Entities::encode($subject,'<>&"'); #remove machine specification - $baseurl =~ s|^http://[^/]+/|/|; + $baseurl =~ s|^https?://[^/]+/|/|; $baseurl =&HTML::Entities::encode($baseurl,'<>&"'); #remove machine specification - $attachmenturl =~ s|^http://[^/]+/|/|; + $attachmenturl =~ s|^https?://[^/]+/|/|; $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 $now=time; + my $ip = &Apache::lonnet::get_requestor_ip(); my $msgcount = &get_uniq(); unless(defined($msgid)) { $msgid = &buildmsgid($now,$subject,$env{'user.name'},$env{'user.domain'}, @@ -250,7 +267,7 @@ sub packagemsg { } $result .= ''.$ENV{'SERVER_NAME'}.''. ''.$ENV{'HTTP_HOST'}.''. - ''.$ENV{'REMOTE_ADDR'}.''. + ''.$ip.''. ''.$env{'browser.type'}.''. ''.$env{'browser.os'}.''. ''.$env{'browser.version'}.''. @@ -318,6 +335,9 @@ sub packagemsg { } } } + if ($senthide) { + $result .= '$origmsgid'; + } return ($msgid,$result); } @@ -397,10 +417,14 @@ sub buildmsgid { } sub unpackmsgid { - my ($msgid,$folder,$skipstatus,$status_cache)=@_; + my ($msgid,$folder,$skipstatus,$status_cache,$onlycid)=@_; $msgid=&unescape($msgid); my ($sendtime,$shortsubj,$fromname,$fromdomain,$count,$fromcid, $processid,$symb,$error) = split(/\:/,&unescape($msgid)); + if (!defined($processid)) { $fromcid = ''; } + if (($onlycid) && ($onlycid ne $fromcid)) { + return ($sendtime,'',$fromname,$fromdomain,'',$fromcid,'',$error); + } $shortsubj = &unescape($shortsubj); $shortsubj = &HTML::Entities::decode($shortsubj); $symb = &unescape($symb); @@ -422,25 +446,65 @@ sub unpackmsgid { sub sendemail { my ($to,$subject,$body,$to_uname,$to_udom,$user_lh)=@_; - my %senderemails=&Apache::loncommon::getemails(); my $senderaddress=''; - foreach my $type ('notification','permanentemail','critnotification') { - if ($senderemails{$type}) { - $senderaddress=$senderemails{$type}; - } + my $replytoaddress=''; + my $msgsent; + if ($env{'form.can_reply'} eq 'N') { + my $lonhost = $Apache::lonnet::perlvar{'lonHostID'}; + my $hostname = &Apache::lonnet::hostname($lonhost); + $replytoaddress = 'do-not-reply@'.$hostname; + } else { + my %senderemails; + my ($have_sender,$setreplyto); + if ($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'})) { + $setreplyto = 1; + } else { + if (&Apache::lonnet::homeserver($replytoname,$replytodom) ne 'no_host') { + %senderemails = + &Apache::loncommon::getemails($replytoname,$replytodom); + $have_sender = 1; + $setreplyto = 1; + } + } + } + if (!$have_sender) { + %senderemails=&Apache::loncommon::getemails(); + } + foreach my $type ('permanentemail','critnotification','notification') { + if ($senderemails{$type}) { + ($senderaddress) = split(/,/,$senderemails{$type}); + if ($senderaddress) { + if ($setreplyto) { + $replytoaddress = $senderaddress; + } + last; + } + } + } } $body= - "*** ".&mt_user($user_lh,'This is an automatic message generated by the LON-CAPA system.')."\n". - "*** ".($senderaddress?&mt_user($user_lh,'You can reply to this message'):&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,'This is an automatic e-mail generated by the LON-CAPA system.')."\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; + my $msg = new Mail::Send; $msg->to($to); $msg->subject('[LON-CAPA] '.$subject); - if ($senderaddress) { $msg->add('Reply-to',$senderaddress); $msg->add('From',$senderaddress); } + if ($replytoaddress) { + $msg->add('Reply-to',$replytoaddress); + } + if ($senderaddress) { + $msg->add('From',$senderaddress); + } + $msg->add('Content-type','text/plain; charset=UTF-8'); if (my $fh = $msg->open()) { print $fh $body; $fh->close; + $msgsent = 1; } + return $msgsent; } # ==================================================== Send notification emails @@ -452,16 +516,20 @@ sub sendnotification { $sender=$env{'user.name'}.':'.$env{'user.domain'}; } my $critical=($crit?' critical':''); + my $numsent = 0; $text=~s/\<\;/\/gs; - my $url='http://'. - &Apache::lonnet::hostname(&Apache::lonnet::homeserver($touname,$toudom)). - '/adm/email?username='.$touname.'&domain='.$toudom; + my $homeserver = &Apache::lonnet::homeserver($touname,$toudom); + my $protocol = $Apache::lonnet::protocol{$homeserver}; + $protocol = 'http' if ($protocol ne 'https'); + my $url = $protocol.'://'.&Apache::lonnet::hostname($homeserver). + '/adm/email?username='.$touname.'&domain='.$toudom. + '&display='.&escape($msgid); my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid, $symb,$error) = &Apache::lonmsg::unpackmsgid($msgid); my ($coursetext,$body,$bodybegin,$bodysubj,$bodyend); - my $user_lh = &user_lang($touname,$toudom,$fromcid); + my $user_lh = &Apache::loncommon::user_lang($touname,$toudom,$fromcid); if ($fromcid ne '') { $coursetext = "\n".&mt_user($user_lh,'Course').': '; if ($env{'course.'.$fromcid.'.description'} ne '') { @@ -494,43 +562,71 @@ sub sendnotification { to access the full message.',$url); my %userenv = &Apache::lonnet::get('environment',['notifywithhtml'],$toudom,$touname); - my $subject = &mt_user($user_lh,"'New' $critical message from ").$sender; + my $subject = &mt_user($user_lh,"'New'$critical message from [_1]",$sender); + unless ($subj eq '') { + $subject = $subj; + } - my ($blocked,$blocktext); + my ($blocked,$blocktext,$clientip); + $clientip = &Apache::lonnet::get_requestor_ip(); if (!$crit) { my %setters; - my ($startblock,$endblock) = - &Apache::loncommon::blockcheck(\%setters,'com',$touname,$toudom); + my ($startblock,$endblock,$triggerblock,$by_ip,$blockdom) = + &Apache::loncommon::blockcheck(\%setters,'com',$clientip,$touname,$toudom); if ($startblock && $endblock) { $blocked = 1; my $showstart = &Apache::lonlocal::locallocaltime($startblock); 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); + } 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 '') { my @htmlexcerpt = split(/,/,$userenv{'notifywithhtml'}); + my $htmlfree = &make_htmlfree($text); foreach my $addr (@recipients) { if ($blocked) { $body = $bodybegin."\n".$blocktext."\n".$bodyend; } else { - my $sendtext = $text; + my $sendtext; if (!grep/^\Q$addr\E/,@htmlexcerpt) { - $sendtext =~ s/\<\/*[^\>]+\>//gs; + $sendtext = $htmlfree; + } else { + $sendtext = $text; } $body = $bodybegin.$bodysubj.$sendtext.$bodyend; } - &sendemail($addr,$subject,$body,$touname,$toudom,$user_lh); + if (&sendemail($addr,$subject,$body,$touname,$toudom,$user_lh)) { + $numsent ++; + } } } else { if ($blocked) { $body = $bodybegin."\n".$blocktext."\n".$bodyend; } else { - $text =~ s/\<\/*[^\>]+\>//gs; - $body = $bodybegin.$bodysubj.$text.$bodyend; + my $htmlfree = &make_htmlfree($text); + $body = $bodybegin.$bodysubj.$htmlfree.$bodyend; + } + if (&sendemail($to,$subject,$body,$touname,$toudom,$user_lh)) { + $numsent ++; } - &sendemail($to,$subject,$body,$touname,$toudom,$user_lh); } + return $numsent; +} + +sub make_htmlfree { + my ($text) = @_; + $text =~ s/\<\/*[^\>]+\>//gs; + $text = &HTML::Entities::decode($text); + $text = &Encode::encode('utf8',$text); + return $text; +} + +sub mynewmail{ + &newmail(); + return $env{'user.mailcheck.lastnewmessagetime'} > $env{'user.mailcheck.lastvisit'}; } @@ -538,6 +634,7 @@ sub newmail { if ((time-$env{'user.mailcheck.time'})>300) { my %what=&Apache::lonnet::get('email_status',['recnewemail']); &Apache::lonnet::appenv({'user.mailcheck.time'=>time}); + &Apache::lonnet::appenv({'user.mailcheck.lastnewmessagetime'=> $what{'recnewemail'}}); if ($what{'recnewemail'}>0) { return 1; } } return 0; @@ -573,9 +670,9 @@ sub retrieve_author_res_msg { my ($domain,$author)=($url=~/^($match_domain)\/($match_username)\//); my %errormsgs=&Apache::lonnet::dump('nohist_res_msgs',$domain,$author); my $msgs=''; - foreach (keys %errormsgs) { - if ($_=~/^\Q$url\E\_\d+$/) { - my %content=&unpackagemsg($errormsgs{$_}); + foreach my $msg (keys(%errormsgs)) { + if ($msg =~ /^\Q$url\E\_\d+$/) { + my %content=&unpackagemsg($errormsgs{$msg}); $msgs.='

'. $content{'time'}.': '.$content{'message'}. '

'; @@ -593,9 +690,9 @@ sub del_url_author_res_msg { $url=&Apache::lonnet::declutter($url); my ($domain,$author)=($url=~/^($match_domain)\/($match_username)\//); my @delmsgs=(); - foreach (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { - if ($_=~/^\Q$url\E\_\d+$/) { - push (@delmsgs,$_); + foreach my $msg (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { + if ($msg =~ /^\Q$url\E\_\d+$/) { + push (@delmsgs,$msg); } } return &Apache::lonnet::del('nohist_res_msgs',\@delmsgs,$domain,$author); @@ -607,9 +704,9 @@ sub clear_author_res_msg { $url=&Apache::lonnet::declutter($url); my ($domain,$author)=($url=~/^($match_domain)\/($match_username)\//); my @delmsgs=(); - foreach (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { - if ($_=~/^\Q$url\E/) { - push (@delmsgs,$_); + foreach my $msg (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { + if ($msg =~ /^\Q$url\E/) { + push (@delmsgs,$msg); } } return &Apache::lonnet::del('nohist_res_msgs',\@delmsgs,$domain,$author); @@ -620,8 +717,8 @@ sub clear_author_res_msg { sub all_url_author_res_msg { my ($author,$domain)=@_; my %returnhash=(); - foreach (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { - $_=~/^(.+)\_\d+/; + foreach my $msg (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) { + $msg =~ /^(.+)\_\d+/; $returnhash{$1}=1; } return %returnhash; @@ -644,7 +741,7 @@ sub store_instructor_comment { sub user_crit_msg_raw { my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage, - $nosentstore,$recipid,$attachmenturl)=@_; + $nosentstore,$recipid,$attachmenturl,$permresults,$senthide)=@_; # Check if allowed missing my ($status,$packed_message); my $msgid='undefined'; @@ -662,11 +759,15 @@ sub user_crit_msg_raw { $$sentmessage = $packed_message; } if (!$nosentstore) { - (undef,my $packed_message_no_citation) = + my ($sentmsgid,$packed_message_no_citation) = &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') { - &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 { @@ -675,22 +776,40 @@ sub user_crit_msg_raw { # Notifications my %userenv = &Apache::loncommon::getemails($user,$domain); - if ($userenv{'critnotification'}) { - &sendnotification($userenv{'critnotification'},$user,$domain,$subject,1, - $text,$msgid); - } - if ($toperm && $userenv{'permanentemail'}) { - &sendnotification($userenv{'permanentemail'},$user,$domain,$subject,1, - $text,$msgid); + my $critnotify = $userenv{'critnotification'}; + my $permemail = $userenv{'permanentemail'}; + my $numcrit = 0; + my $numperm = 0; + my $permlogmsgstatus; + if ($critnotify) { + $numcrit = &sendnotification($critnotify,$user,$domain,$subject,1,$text,$msgid); + } + if ($toperm && $permemail) { + if ($critnotify && $numcrit) { + if (grep(/^\Q$permemail\E/,split(/,/,$critnotify))) { + $numperm = 1; + } + } + unless ($numperm) { + $numperm = &sendnotification($permemail,$user,$domain,$subject,1,$text,$msgid); + } + } + if ($toperm) { + $permlogmsgstatus = '. Perm. email log status '. + &Apache::lonnet::log($env{'user.domain'},$env{'user.name'},$env{'user.home'}, + "Perm. e-mail count $numperm for $user at $domain"); + if (ref($permresults) eq 'HASH') { + $permresults->{"$user:$domain"} = $numperm; + } } # Log this &Apache::lonnet::logthis( - 'Sending critical email '.$msgid. + 'Sending critical '.$msgid. ', log status: '. &Apache::lonnet::log($env{'user.domain'},$env{'user.name'}, $env{'user.home'}, - 'Sending critical '.$msgid.' to '.$user.' at '.$domain.' with status: ' - .$status)); + 'Sending critical '.$msgid.' to '.$user.' at '.$domain.' with status ' + .$status).$permlogmsgstatus); return $status; } @@ -698,7 +817,7 @@ sub user_crit_msg_raw { sub user_crit_msg { my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage, - $nosentstore,$recipid,$attachmenturl)=@_; + $nosentstore,$recipid,$attachmenturl,$permresults,$senthide)=@_; my @status; my %userenv = &Apache::lonnet::get('environment',['msgforward'], $domain,$user); @@ -709,13 +828,13 @@ sub user_crit_msg { push(@status, &user_crit_msg_raw($forwuser,$forwdomain,$subject,$message, $sendback,$toperm,$sentmessage,$nosentstore, - $recipid,$attachmenturl)); + $recipid,$attachmenturl,$permresults,$senthide)); } } else { push(@status, &user_crit_msg_raw($user,$domain,$subject,$message,$sendback, $toperm,$sentmessage,$nosentstore,$recipid, - $attachmenturl)); + $attachmenturl,$permresults,$senthide)); } if (wantarray) { return @status; @@ -764,7 +883,7 @@ sub user_crit_received { sub user_normal_msg_raw { my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl, $toperm,$currid,$newid,$sentmessage,$crsmsgid,$symb,$restitle, - $error,$nosentstore,$recipid)=@_; + $error,$nosentstore,$recipid,$permresults,$senthide)=@_; # Check if allowed missing my ($status,$packed_message); my $msgid='undefined'; @@ -786,11 +905,16 @@ sub user_normal_msg_raw { ('email_status',{'recnewemail'=>time},$domain,$user); # Into sent-mail folder if sent mail storage required if (!$nosentstore) { - (undef,my $packed_message_no_citation) = + my ($sentmsgid,$packed_message_no_citation) = &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') { - &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') { @@ -801,19 +925,37 @@ sub user_normal_msg_raw { } # Notifications my %userenv = &Apache::loncommon::getemails($user,$domain); - if ($userenv{'notification'}) { - &sendnotification($userenv{'notification'},$user,$domain,$subject,0, - $text,$msgid); + my $notify = $userenv{'notification'}; + my $permemail = $userenv{'permanentemail'}; + my $numnotify = 0; + my $numperm = 0; + my $permlogmsgstatus; + if ($notify) { + $numnotify = &sendnotification($notify,$user,$domain,$subject,0,$text,$msgid); + } + if ($toperm && $permemail) { + if ($notify && $numnotify) { + if (grep(/^\Q$permemail\E/,split(/,/,$notify))) { + $numperm = 1; + } + } + unless ($numperm) { + $numperm = &sendnotification($permemail,$user,$domain,$subject,0, + $text,$msgid); + } } - if ($toperm && $userenv{'permanentemail'}) { - if ((!$userenv{'notification'}) || ($userenv{'notification'} ne $userenv{'permanentemail'})) { - &sendnotification($userenv{'permanentemail'},$user,$domain,$subject,0, - $text,$msgid); + if ($toperm) { + $permlogmsgstatus = '. Perm. email log status '. + &Apache::lonnet::log($env{'user.domain'},$env{'user.name'},$env{'user.home'}, + "Perm. e-mail count $numperm for $user at $domain"); + if (ref($permresults) eq 'HASH') { + $permresults->{"$user:$domain"} = $numperm; } } &Apache::lonnet::log($env{'user.domain'},$env{'user.name'}, $env{'user.home'}, - 'Sending '.$msgid.' to '.$user.' at '.$domain.' with status: '.$status); + 'Sending '.$msgid.' to '.$user.' at '.$domain.' with status '.$status. + $permlogmsgstatus); } else { $status='no_host'; } @@ -822,25 +964,28 @@ sub user_normal_msg_raw { sub user_normal_msg { my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl, - $toperm,$sentmessage,$symb,$restitle,$error,$nosentstore,$recipid)=@_; + $toperm,$sentmessage,$symb,$restitle,$error,$nosentstore,$recipid, + $permresults,$senthide)=@_; my @status; my %userenv = &Apache::lonnet::get('environment',['msgforward'], $domain,$user); my $msgforward=$userenv{'msgforward'}; if ($msgforward) { - foreach (split(/\,/,$msgforward)) { - my ($forwuser,$forwdomain)=split(/\:/,$_); + foreach my $fwd (split(/\,/,$msgforward)) { + my ($forwuser,$forwdomain)=split(/\:/,$fwd); push(@status, &user_normal_msg_raw($forwuser,$forwdomain,$subject,$message, $citation,$baseurl,$attachmenturl,$toperm, undef,undef,$sentmessage,undef,$symb, - $restitle,$error,$nosentstore,$recipid)); + $restitle,$error,$nosentstore,$recipid, + $permresults,$senthide)); } } else { push(@status,&user_normal_msg_raw($user,$domain,$subject,$message, $citation,$baseurl,$attachmenturl,$toperm, undef,undef,$sentmessage,undef,$symb, - $restitle,$error,$nosentstore,$recipid)); + $restitle,$error,$nosentstore,$recipid, + $permresults,$senthide)); } if (wantarray) { return @status; @@ -849,7 +994,9 @@ sub user_normal_msg { } sub process_sent_mail { - my ($msgsubj,$subj_prefix,$numsent,$stamp,$msgname,$msgdom,$msgcount,$context,$pid,$savemsg,$recusers,$recudoms,$baseurl,$attachmenturl,$symb,$error,$senderuname,$senderdom,$recipid) = @_; + my ($msgsubj,$subj_prefix,$numsent,$stamp,$msgname,$msgdom,$msgcount, + $context,$pid,$savemsg,$recusers,$recudoms,$baseurl,$attachmenturl, + $symb,$error,$senderuname,$senderdom,$recipid) = @_; my $sentsubj; if ($numsent > 1) { $sentsubj = $subj_prefix.' ('.$numsent.' sent) '.$msgsubj; @@ -937,7 +1084,9 @@ sub secapply { my $rec=shift; my $defaultflag=shift; $rec=~s/\s+//g; - $rec=~s/\@/\:/g; + unless ($rec =~ /\:/) { + $rec=~s/\@/\:/g; + } my ($adr,$sections_or_groups)=($rec=~/^([^\(]+)\(([^\)]+)\)/); if ($sections_or_groups) { foreach my $item (split(/\;/,$sections_or_groups)) { @@ -996,28 +1145,6 @@ sub decide_receiver { return ($typestyle,%to); } -sub user_lang { - my ($touname,$toudom,$fromcid) = @_; - my @userlangs; - if (($fromcid ne '') && ($env{'course.'.$fromcid.'.languages'} ne '')) { - @userlangs=(@userlangs,split(/\s*(\,|\;|\:)\s*/, - $env{'course.'.$fromcid.'.languages'})); - } else { - my %langhash = &Apache::lonnet::get('environment',['languages'],$toudom,$touname); - if ($langhash{'languages'} ne '') { - @userlangs = split(/\s*(\,|\;|\:)\s*/,$langhash{'languages'}); - } else { - my %domdefs = &Apache::lonnet::get_domain_defaults($toudom); - if ($domdefs{'lang_def'} ne '') { - @userlangs = ($domdefs{'lang_def'}); - } - } - } - my @languages=&Apache::lonlocal::get_genlanguages(@userlangs); - my $user_lh = Apache::localize->get_handle(@languages); - return $user_lh; -} - 1; __END__