--- loncom/interface/lonmsg.pm 2000/10/31 22:31:37 1.5 +++ loncom/interface/lonmsg.pm 2001/08/03 14:54:52 1.13 @@ -10,7 +10,10 @@ # # 10/05 Gerd Kortemeyer) # -# 10/19,10/20,10/30 Gerd Kortemeyer +# 10/19,10/20,10/30, +# 02/06/01 Gerd Kortemeyer +# 07/27 Guy Albertelli +# 07/27,07/28,07/30,08/03 Gerd Kortemeyer package Apache::lonmsg; @@ -23,15 +26,21 @@ use Apache::Constants qw(:common); # ===================================================================== Package sub packagemsg { - my ($subject,$message)=@_; + my ($subject,$message,$citation)=@_; $message=~s/\/\>\;/g; + $citation=~s/\/\>\;/g; $subject=~s/\/\>\;/g; my $now=time; $msgcount++; - my $msgid=$now.'_'.$ENV{'user.name'}.'_'. - $ENV{'user.domain'}.'_'.$msgcount.'_'.$$; + my $partsubj=$subject; + $partsubj=&Apache::lonnet::escape($partsubj); + $partsubj=substr($partsubj,0,50); + my $msgid=&Apache::lonnet::escape( + $now.':'.$partsubj.':'.$ENV{'user.name'}.':'. + $ENV{'user.domain'}.':'.$msgcount.':'.$$); return $msgid, ''.$ENV{'user.name'}.''. ''.$ENV{'user.domain'}.''. @@ -49,7 +58,8 @@ sub packagemsg { ''.$ENV{'request.role'}.''. ''.$ENV{'request.filename'}.''. ''.$msgid.''. - ''.$message.''; + ''.$message.''. + ''.$citation.''; } # ================================================== Unpack message into a hash @@ -69,6 +79,18 @@ sub unpackagemsg { return %content; } +# ======================================================= Get info out of msgid + +sub unpackmsgid { + my $msgid=&Apache::lonnet::unescape(shift); + my ($sendtime,$shortsubj,$fromname,$fromdomain)=split(/\:/, + &Apache::lonnet::unescape($msgid)); + my %status=&Apache::lonnet::get('email_status',[$msgid]); + if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; } + unless ($status{$msgid}) { $status{$msgid}='new'; } + return ($sendtime,$shortsubj,$fromname,$fromdomain,$status{$msgid}); +} + # =============================== Automated message to the author of a resource sub author_res_msg { @@ -121,8 +143,9 @@ sub user_crit_msg { # =================================================== Critical message received sub user_crit_received { - my $message=shift; - my %contents=&unpackagemsg($message); + my $msgid=shift; + my %message=&Apache::lonnet::get('critical',[$msgid]); + my %contents=&unpackagemsg($message{$msgid}); my $status='rec: '. &user_normal_msg($contents{'sendername'},$contents{'senderdomain'}, 'Receipt: '.$ENV{'user.name'}.' at '.$ENV{'user.domain'}, @@ -131,19 +154,21 @@ sub user_crit_received { $contents{'subject'}.'" dated '.$contents{'time'}.".\n\n" .'Message ID: '.$contents{'msgid'}); $status.=' trans: '. - &Apache::lonnet::put('nohist_email',$contents{'msgid'} => $message); + &Apache::lonnet::put( + 'nohist_email',{$contents{'msgid'} => $message{$msgid}}); $status.=' del: '. - &Apache::lonnet::del('critical',$contents{'msgid'}); + &Apache::lonnet::del('critical',[$contents{'msgid'}]); &Apache::lonnet::log($ENV{'user.domain'},$ENV{'user.name'}, $ENV{'user.home'},'Received critical message '. $contents{'msgid'}. ', '.$status); + return $status; } # ======================================================== Normal communication sub user_normal_msg { - my ($user,$domain,$subject,$message)=@_; + my ($user,$domain,$subject,$message,$citation)=@_; # Check if allowed missing my $status=''; my $msgid='undefined'; @@ -151,7 +176,7 @@ sub user_normal_msg { my $homeserver=&Apache::lonnet::homeserver($user,$domain); if ($homeserver ne 'no_host') { my $msgid; - ($msgid,$message)=&packagemsg($subject,$message); + ($msgid,$message)=&packagemsg($subject,$message,$citation); $status=&Apache::lonnet::critical( 'put:'.$domain.':'.$user.':nohist_email:'. &Apache::lonnet::escape($msgid).'='. @@ -165,6 +190,67 @@ sub user_normal_msg { return $status; } +# =============================================================== Status Change + +sub statuschange { + my ($msgid,$newstatus)=@_; + my %status=&Apache::lonnet::get('email_status',[$msgid]); + if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; } + unless ($status{$msgid}) { $status{$msgid}='new'; } + unless (($status{$msgid} eq 'replied') || + ($status{$msgid} eq 'forwarded')) { + &Apache::lonnet::put('email_status',{$msgid => $newstatus}); + } +} +# ==================================================== Display Critical Message + +sub discrit { + my $r=shift; + $r->print('

Critical Messages

'. + '
'. + ''); + my %what=&Apache::lonnet::dump('critical'); + map { + my %content=&unpackagemsg($what{$_}); + $content{'message'}=~s/\n/\/g; + $r->print('
From: '.$content{'sendername'}.'@'. + $content{'senderdomain'}.' ('.$content{'time'}. + ')
'.$content{'message'}.'
'. + ''. + ''); + } sort keys %what; + $r->print(''); +} + +# =============================================================== Compose reply + +sub comprep { + my ($r,$msgid)=@_; + my %message=&Apache::lonnet::get('nohist_email',[$msgid]); + my %content=&unpackagemsg($message{$msgid}); + my $quotemsg='> '.$content{'message'}; + $quotemsg=~s/\r/\n/g; + $quotemsg=~s/\f/\n/g; + $quotemsg=~s/\n+/\n\> /g; + my $subject='Re: '.$content{'subject'}; + my $dispcrit=''; + if (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { + $dispcrit= + ' Send as critical message

'; + } + $r->print(<<"ENDREPLY"); +

+ +Subject:

+

+$dispcrit + +

+ENDREPLY +} + # ===================================================================== Handler sub handler { @@ -177,11 +263,122 @@ sub handler { return OK if $r->header_only; +# --------------------------- Get query string for limited number of parameters + + map { + my ($name, $value) = split(/=/,$_); + $value =~ tr/+/ /; + $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; + if (($name eq 'display') || ($name eq 'replyto') || + ($name eq 'forward') || ($name eq 'mark') || + ($name eq 'sendreply') || ($name eq 'compose') || + ($name eq 'sendmail') || ($name eq 'critical')) { + unless ($ENV{'form.'.$name}) { + $ENV{'form.'.$name}=$value; + } + } + } (split(/&/,$ENV{'QUERY_STRING'})); + # --------------------------------------------------------------- Render Output $r->print('EMail and Messaging'); - $r->print(''); + $r->print( + ''); $r->print('

EMail

'); + if ($ENV{'form.display'}) { + my $msgid=$ENV{'form.display'}; + &statuschange($msgid,'read'); + my %message=&Apache::lonnet::get('nohist_email',[$msgid]); + my %content=&unpackagemsg($message{$msgid}); + $r->print('Subject: '.$content{'subject'}. + '
From: '.$content{'sendername'}.' at '. + $content{'senderdomain'}. + '
Time: '.$content{'time'}.'
Functions: '. + 'Reply
'.
+             $content{'message'}.'

'.$content{'citation'}); + } elsif ($ENV{'form.replyto'}) { + &comprep($r,$ENV{'form.replyto'}); + } elsif ($ENV{'form.sendreply'}) { + my $msgid=$ENV{'form.sendreply'}; + my %message=&Apache::lonnet::get('nohist_email',[$msgid]); + my %content=&unpackagemsg($message{$msgid}); + &statuschange($msgid,'replied'); + if (($ENV{'form.critmsg'}) && + (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) { + $r->print('Sending critical: '. + &user_crit_msg($content{'sendername'}, + $content{'senderdomain'}, + $ENV{'form.subject'}, + $ENV{'form.message'})); + } else { + $r->print('Sending: '.&user_normal_msg($content{'sendername'}, + $content{'senderdomain'}, + $ENV{'form.subject'}, + $ENV{'form.message'})); + } + } elsif ($ENV{'form.confirm'}) { + map { + if ($_=~/^form\.rec\_(.*)$/) { + $r->print('Confirming Receipt: '. + &user_crit_received($1).'
'); + } + if ($_=~/^form\.reprec\_(.*)$/) { + my $msgid=$1; + $r->print('Confirming Receipt: '. + &user_crit_received($msgid).'
'); + &comprep($r,$msgid); + } + } keys %ENV; + &discrit($r); + } elsif ($ENV{'form.critical'}) { + &discrit($r); + } elsif ($ENV{'form.forward'}) { + } elsif ($ENV{'form.mark'}) { + } elsif ($ENV{'form.compose'}) { + my $dispcrit=''; + if (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { + $dispcrit= + ' Send as critical message

'; + } + $r->print(<<"ENDCOMP"); +

+ +Subject:

+

+$dispcrit + +

+ENDCOMP + } elsif ($ENV{'form.sendmail'}) { + } else { + $r->print(''. + ''); + map { + my ($sendtime,$shortsubj,$fromname,$fromdomain,$status)= + &Apache::lonmsg::unpackmsgid($_); + if ($status eq 'new') { + $r->print(''); + } elsif ($status eq 'read') { + $r->print(''); + } elsif ($status eq 'replied') { + $r->print(''); + } else { + $r->print(''); + } + $r->print(''); + } sort split(/\&/,&Apache::lonnet::reply('keys:'. + $ENV{'user.domain'}.':'. + $ENV{'user.name'}.':nohist_email', + $ENV{'user.home'})); + $r->print('
 DateUsernameDomainSubjectStatus
Open'.localtime($sendtime).''. + $fromname.''.$fromdomain.''. + &Apache::lonnet::unescape($shortsubj).''. + $status.'
'); + + } $r->print(''); return OK;