--- mail2lj/mail2lj.pl 2007/08/13 15:06:38 1.3
+++ 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
@@ -139,6 +142,7 @@ my $Parse = GetOptions( \%Opt,
'prop_opt_backdated|backdated|back-dated|backdate|back-date|back!',
'subject|subj|s=s',
'taglist|tags|tag|t=s' => \@opt_taglist, # Will tweak
+ 'notaglist|notags|notag|not|no-taglist|no-tags|no-tag|no-t' => sub {undef @opt_taglist},
'usejournal|use-journal|use|journal|j=s',
'prop_current_mood|current_mood|mood=s',
'prop_current_music|current_music|music=s',
@@ -206,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) ;
@@ -221,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" ;
@@ -522,7 +537,12 @@ sub post_body2href {
# Changed by LG - added 'tags' option.
} elsif ($var =~ /^tags?$/ || $var eq "taglist") {
- $req_data->{prop_taglist} = $val;
+ $req_data->{prop_taglist} = $val;
+
+ # Changed by LG - added 'notags' option. Empty the preceding
+ # taglist if set to true, otherwise do nothing
+ } elsif ($var =~ /^no-?tags?$/ || $var eq "no-?taglist") {
+ $req_data->{prop_taglist} = "" if $val =~ /^\s*((on)|(yes))\s*$/i ;
# Anything else - just assign.
} else {
@@ -566,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" ;
@@ -573,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) ;
@@ -596,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 ;
@@ -620,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;
@@ -898,6 +957,12 @@ Options:
single or double quotes to protect from the shell. Multiple
'-t' options are allowed and taglists will be combined.
+--notaglist, --notags
+ Unsets all previously defined tags. Thus, a call to
+ $shortname ... --tags X --tags Y ... --notags --tags Z
+ will yield a taglist consisting of just "Z". This option is
+ rarely needed and added only for the sake of completeness.
+
-d DATE, --date DATE
Label posting with this date. Date should be in LiveJournal's
format: DD.MM.YYYY HH:mm. If absent, current date/time is used.
@@ -1007,6 +1072,7 @@ command line options), they should look
Security: private
Subject: Rzhevskij zhiv!
Tags: Junk, Viva Rzhevskij!
+ Notags: yes # Clears all preceding tags
Formatted: on # Or equivalent "Autoformat: off"
Usejournal: gusary
Mood: okay