--- mail2lj/mail2lj.pl 2007/08/14 04:19:50 1.4
+++ 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
@@ -207,7 +210,13 @@ if ( exists $Opt{'comments'} ) {
# with other parameters.
$Opt{'prop_taglist'} = join( ", ", @opt_taglist ) if ( @opt_taglist ) ;
-# Convert all command line options to unicode.
+# Convert $opt_ljcut_text to UTF8.
+if ( defined $opt_ljcut_text ) {
+ $opt_ljcut_text =
+ to_utf8({ -string => $opt_ljcut_text, -charset => $SystemCharset }) ;
+}
+
+# Convert all %Opt command line options to unicode.
# Function href2utf8() uses a reference to input hash, so %Opt is
# being modified "in-place".
href2utf8( \%Opt, $SystemCharset) ;
@@ -222,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" ;
@@ -572,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" ;
@@ -579,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) ;
@@ -602,20 +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.
- 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} ;
- }
+ # Changed by LG - added options to add the plain or HTML-ized 'From'
+ # field to the posted message.
+ #
+ # 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 ;
@@ -626,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;