[rt-devel] RT::Template not unfolding long header lines

Bruce Campbell bruce_campbell at ripe.net
Wed Jan 16 10:49:25 EST 2002


	Was Re: [rt-users] bad rfc822 field name? (fwd)

On Wed, 28 Nov 2001, matt carter wrote:

> i have done some further investigation of my problem and it would appear
> that pine may be the culprit. i was hoping some other people may have an
> opinion on this, and an appropriate way to deal with.
>
> my suggestion would be to check for presence of : on the line before we
> assume its part of a new header line?

Looking at this old problem (which we're getting at the moment, which
throws mh for a merry dance), it seems to be in RT::Template being rather
silly about headers ( and I'm a tad busy to go and force Jesse to write 'I
will not write a mail-parser without understanding mail standards' several
thousand times ;) )

RFC822 cites:

     3.1.1.  LONG HEADER FIELDS

        Each header field can be viewed as a single, logical  line  of
        ASCII  characters,  comprising  a field-name and a field-body.
        For convenience, the field-body  portion  of  this  conceptual
        entity  can be split into a multiple-line representation; this
        is called "folding".  The general rule is that wherever  there
        may  be  linear-white-space  (NOT  simply  LWSP-chars), a CRLF
        immediately followed by AT LEAST one LWSP-char may instead  be
        inserted.  Thus, the single line

            To:  "Joe & J. Harvey" <ddd @Org>, JJV @ BBN

        can be represented as:

            To:  "Joe & J. Harvey" <ddd @ Org>,
                    JJV at BBN

[more examples]

             The process of moving  from  this  folded   multiple-line
        representation  of a header field to its single line represen-
        tation is called "unfolding".  Unfolding  is  accomplished  by
        regarding   CRLF   immediately  followed  by  a  LWSP-char  as
        equivalent to the LWSP-char.

So, pulling a sample out of our hat, we have a multi-line subject header
as follows:

	Subject: here is a sample of SPAM Filth and Depravity that I have
	  received either, from your service, from a service that you host,
	  solicitoring replies to your service. In my country, this kind of
	  email is illegal. please investigate.

Line 292 of RT::Template builds up the MIME::Entity based on a
split(/\n/).  Ok, but theres no joining of header lines that have been
folded.

So, if we change the loop to read:

  if ($headers) {
    my $prevkey = undef;
    foreach $header (split(/\n/,$headers)) {
      if( $header =~ /^\s+/ && defined( $prevkey) ){
        # This is a continuation.
        # Although implied in the docs, "-1" as the index to add doesn't
        # seem to work as wanted.  Use replace.
        $self->{'MIMEObj'}->head->add( $prevkey, $self->{'MIMEObj'}->head->get( $prevkey ) . $header );
        # Note that technically we should be doing get($prevkey) . "\r\n" . $header
        # and then calling unfold() as the above could lead to strange
	# numbers of spaces.
      }else{
        (my $key, my $value) = (split(/: /,$header,2));
        chomp $key;
        chomp $value;
        $self->{'MIMEObj'}->head->fold_length($key,10000);
        $self->{'MIMEObj'}->head->add($key, $value);
        # Cache the key in case it continues.
        $prevkey = $key;
      }
    }
    # Unfold all the headers if still needed.
    $self->{'MIMEObj'}->head->unfold();
  }

Applying this change to RT::Template results no more complaints about bad
RFC822 headers ;)

Other portions of the RT code base also exhibit certain confusion about
folded headers.

-- 
                             Bruce Campbell                            RIPE
                                    RIPE 41                             NCC
                       Jan 14-18, Amsterdam                      Operations





More information about the Rt-devel mailing list