--- a/lib/mhamain.pl +++ b/lib/mhamain.pl @@ -73,6 +73,8 @@ TERM TRAP USR1 USR2 VTALRM XCPU XFSZ ); +use Carp; + ############################################################################### ## Public routines ############################################################################### @@ -936,6 +938,16 @@ } else { $ctype = 'text/plain'; } + + ##-----------------------------## + ## Get Custom Archives headers ## + ##-----------------------------## + if (defined($fields->{'x-archives-hash'})) { + $msghash = $fields->{'x-archives-hash'}[0]; + } + if(!defined($msghash)) { + confess("No X-Archives-Hash header in $handle"); + } ## Insure uniqueness of index my $t = $index; @@ -961,6 +973,7 @@ $Subject{$index} = $sub; $MsgHead{$index} = htmlize_header($fields); $ContentType{$index} = $ctype; + $MsgHash{$index} = $msghash; if ($msgid) { $MsgId{$msgid} = $index; $NewMsgId{$msgid} = $index; # Track new message-ids @@ -972,6 +985,7 @@ } else { $IndexNum{$index} = getNewMsgNum(); } + #$MsgHash{$IndexNum{$index}} = $msghash; $Refs{$index} = [ @refs ] if (@refs); @@ -1121,7 +1135,7 @@ my $adding = ($ADD && !$force && !$SINGLE); my $i_p0 = fmt_msgnum($msgnum); - my $filename = msgnum_filename($msgnum); + my $filename = msgnum_filename($index); my $filepathname = join($DIRSEP, $OUTDIR, $filename); my $tmppathname; @@ -1179,7 +1193,9 @@ "\n", "\n"; + commentize($ContentType{$index}), " -->\n", + "\n"; if (defined($Refs{$index})) { foreach (@{$Refs{$index}}) { @@ -1475,8 +1491,9 @@ #&defineIndex2MsgId(); my $msgnum = $IndexNum{$key}; return (undef, undef) if ($msgnum eq ''); - my $filename = join($DIRSEP, $OUTDIR, &msgnum_filename($msgnum)); + my $filename = join($DIRSEP, $OUTDIR, &msgnum_filename($key)); + delete $MsgHash{$key}; delete $ContentType{$key}; delete $Date{$key}; delete $From{$key}; --- a/lib/mhdb.pl +++ b/lib/mhdb.pl @@ -61,6 +61,7 @@ ## Meta-data print_var($db,'ContentType', \%ContentType); +print_var($db,'MsgHash', \%MsgHash); print_var($db,'Date', \%Date); print_var($db,'Derived', \%Derived); print_var($db,'FollowOld', \%Follow); --- a/lib/mhinit.pl +++ b/lib/mhinit.pl @@ -248,6 +248,7 @@ %Follow = (); # Index key to follow-ups %FolCnt = (); # Index key to number of follow-ups %ContentType = (); # Index key to base content-type of message +%MsgHash = (); # Custom hash from header in mail %Icons = (); # Index key to icon URL for content-type %AddIndex = (); # Flags for messages that must be written --- a/lib/mhmsgfile.pl +++ b/lib/mhmsgfile.pl @@ -123,6 +123,10 @@ if (defined($href->{'derived'})) { $Derived{$index} = $href->{'derived'}; } + + if (defined($href->{'archives-hash'})) { + $MsgHash{$index} = $href->{'archives-hash'}; + } $IndexNum{$index} = int($msgnum); --- a/lib/mhopt.pl +++ b/lib/mhopt.pl @@ -798,6 +798,7 @@ delete($MsgId{''}); delete($FollowOld{''}); delete($ContentType{''}); + delete($MsgHash{''}); delete($Refs{''}); # update DOCURL if default old value --- a/lib/mhrcvars.pl +++ b/lib/mhrcvars.pl @@ -225,7 +225,7 @@ } if ($var eq 'MSG') { ## Filename of message page ($lref, $key, $pos) = compute_msg_pos($index, $var, $arg); - $tmp = defined($key) ? &msgnum_filename($IndexNum{$key}) : ""; + $tmp = defined($key) ? &msgnum_filename($key) : ""; last REPLACESW; } if ($var eq 'MSGHFIELD') { ## Message header field @@ -447,7 +447,7 @@ if (!defined($key)) { $tmp = ""; last REPLACESW; } $tmp = qq/name="/ . &fmt_msgnum($IndexNum{$key}) . qq/" href="/ . - &msgnum_filename($IndexNum{$key}) . + &msgnum_filename($key) . qq/"/; last REPLACESW; } @@ -462,7 +462,7 @@ $isurl = 0; ($lref, $key, $pos) = compute_msg_pos($index, $var, $arg); if (!defined($key)) { $tmp = ""; last REPLACESW; } - $tmp = qq/href="/ . &msgnum_filename($IndexNum{$key}) . qq/"/; + $tmp = qq/href="/ . &msgnum_filename($key) . qq/"/; last REPLACESW; } if ($var eq 'IDXFNAME') { ## Filename of index page @@ -760,7 +760,7 @@ $ret = qq|$ret| if $var eq 'SUBJECT' && $arg eq "" && !$mailto; --- a/lib/mhutil.pl +++ b/lib/mhutil.pl @@ -28,6 +28,7 @@ package mhonarc; use MHonArc::RFC822; +use Carp; ## RFC 2369 header fields to check for URLs %HFieldsList = ( @@ -313,16 +314,20 @@ ## Routine to get filename of a message number. ## sub msgnum_filename { - my($fmtstr) = "$MsgPrefix%05d.$HtmlExt"; + my $msgnum = $_[0]; + my($fmtstr) = "$MsgPrefix%s.$HtmlExt"; $fmtstr .= ".gz" if $GzipLinks; - sprintf($fmtstr, $_[0]); + if(!defined($MsgHash{$msgnum})) { + confess("Could not find X-Archives-Hash for msgnum=$msgnum"); + } + sprintf($fmtstr, $MsgHash{$msgnum}); } ##--------------------------------------------------------------------------- ## Routine to get filename of an index ## sub get_filename_from_index { - &msgnum_filename($IndexNum{$_[0]}); + &msgnum_filename($_[0]); } ##---------------------------------------------------------------------------