--- mail2lj/mail2lj.pl 2007/08/14 06:13:58 1.6 +++ mail2lj/mail2lj.pl 2007/08/14 20:59:15 1.7 @@ -77,6 +77,9 @@ my $host = $ENV{MAIL2LJ_DOMAIN} || "ledo # my $home = $ENV{HOME} || "/home/mail2lj" ; # Changed by LG my $home = $ENV{HOME} || "/tmp/mail2lj" ; +# Changed by LG - added because sometimes procmail doesn't set $USER. +my $SysUser = $ENV{USER} || $ENV{LOGNAME} || getpwuid($>) || $> ; + # Changed by LG. Specifies the default incoming and outgoing charset for # all e-mails (i.e, the posts CONTENT and the script replies). # For incoming mails, the MIME header is analyzed and actual MIME charset @@ -228,14 +231,19 @@ my $alias = shift @ARGV || "none" ; my $mp = new MIME::Parser() or die "new MIME::Parser(): $!\n" ; -# Changed by LG - changed directory. +# Changed by LG - changed directory to be user and process-specific. # $mp->output_dir("$home/mimetmp") ; -$mp->output_dir("/tmp/mimetmp-".$ENV{USER}) ; +$mp->output_dir("/tmp/mimetmp-" . $SysUser . "-$$") ; mkdir $mp->output_dir if not -d $mp->output_dir ; # Create it if missing # Get the whole mail. +# Changed by LG - added removal of output directory. my $me = $mp->parse(\*STDIN) ; -END { $me && $me->purge() } ; +END { $me and $me->purge() ; + rmdir $mp->output_dir if -d $mp->output_dir + or print STDERR "Error removing $mp->output_dir: $!\n" ; + } ; + # Changed by LG - different log file name. # open(STDERR, ">>$home/generic.log") or die "open(`log'): $!\n" ; @@ -578,6 +586,17 @@ sub hdr2utf8 { return $r ; } + +# Changed by LG - added this subroutine for a shortcut call to to_utf8(). +# All it does is conversion of a string to utf8. +sub str2utf8 { + my ($s, $e) = @_; + my $r = "" ; + + $r .= to_utf8({ -string => $s, -charset => $e }) ; + return $r ; +} + sub post_me2req { my ($me, $e, $hints) = @_ ; my $mebh = $me->bodyhandle() or die "post_message(): no body?\n" ; @@ -585,9 +604,8 @@ sub post_me2req { my $charset = $mehh->mime_attr("content-type.charset") || $e ; my $subject = hdr2utf8($me->get('Subject') || "", $charset) ; chomp $subject ; # Changed by LG - - # Changed by LG - my $from = hdr2utf8($me->get('From') || "", $charset) ; + # Changed by LG. + my $from = hdr2utf8($me->get('From') || "", $charset) ; chomp $from ; my $hr = href2utf8(post_body2href($mebh->open("r")), $charset) ; @@ -608,29 +626,49 @@ sub post_me2req { # Changed by LG - removed prefixing. # $hr->{subject} = "[mail2lj] " . $hr->{subject} ; - # Changed by LG - added options to add the 'From' field to the - # posted message. + # Changed by LG - added options to add the plain or HTML-ized 'From' + # field to the posted message. # - # NOTE: $from is already in UTF8. Strictly speaking, everything - # that we add to it MUST ALSO BE IN UTF8 (i.e. you need to run - # a to_utf8() function on it). But since all I'm adding is in - # ISO-8859-1 lower ASCII characters (which are guaranteed to - # have the same values in UTF8 as in plain ISO-8859-1), I'm - # cheating here and taking a shortcut. If you want to add - # something non-ASCII, you MUST convert it to UTF8 first! - # Be forewarned! - if ( $opt_addfrom ) { - $hr->{event} = "From: $from" . "\n\n" . $hr->{event} ; - } elsif ( $opt_addfromh ) { - my $html_from = "From: $from" ; - $html_from =~ s/\@/[_\@_]/g ; - $hr->{event} = $html_from . "\n\n" . $hr->{event} ; - } + # NOTE: $from is already in UTF8, but the "From:" and HTML tags are + # not. Strictly speaking, everything that goes to $hr->{event} + # MUST ALSO BE IN UTF8. A cheating shortcut is possible: + # since all lower ASCII characters are guaranteed to have + # the same values in UTF8 as in plain ISO-8859-1, you could + # possibly stick ASCII strings to $from without risk. But in + # order to add something non-ASCII, you absolutely MUST convert + # it to UTF8 first! To avoid the risk of forgetting this, the + # following substitutions are done in a _proper_ (albeit + # somewhat awkward) way. + if ( $opt_addfrom || $opt_addfromh ) { + + # Assemble the added From string in UTF8. + my $added_from ; + if ( $opt_addfrom ) { + $added_from = str2utf8("From: ", "ISO-8859-1") + . $from . str2utf8("\n\n", "ISO-8859-1") ; + } elsif ( $opt_addfromh ) { + $added_from = str2utf8("From: ", "ISO-8859-1" ) + . $from + . str2utf8("\n\n", "ISO-8859-1") ; + } + + # Obfuscate the address. + my $olddog = str2utf8("\@", "ISO-8859-1") ; # @ in utf8 + my $newdog = str2utf8("[_\@_]", "ISO-8859-1") ; # [_@_] in utf8 + $added_from =~ s/$olddog/$newdog/g ; # Obfuscate + $hr->{event} = $added_from . $hr->{event} ; # And append + } # Changed by LG - added an option to preserve (html-ize) multiple # spaces and tabs (convert '\t' to eight ' ' and convert # multiple continuous spaces into sequence of '  '). # Lines with tabs are additionally wrapped in ... tags. + # + # NOTE: These tags should be in UTF8. But since HTML tags themselves + # are *certainly* in lower ASCII, we can safely stick them on + # top of the existing UTF8 post. But if you dare to add + # anything more than ASCII-markup, you'd better str2utf8() it + # first! See note in the $opt_addfrom/$opt_addfromh processing above. if ( $opt_keepspaces ) { $hr->{event} =~ s/^(.*\t.*)$/$1<\/nobr>/gm ; $hr->{event} =~ s/\t/\ \ \ \ \ \ \ \ /g ; @@ -641,7 +679,7 @@ sub post_me2req { # Change by BV - added the option to put lj-cut after '--cut XX' lines # # Tweaked by LG - only adding lj-cut if more than $ljcut_delta lines - # is left in the posting. + # is left in the posting. Also added $opt_ljcut_text. # if ($opt_ljcut>0) { my $nlines = scalar( my @junk=split( /\n/, $hr->{event}, -1) ) - 1;